Tomas Jelinek has uploaded a new change for review. Change subject: webadmin: Changes in disk popup needed to reuse in VM popup ......................................................................
webadmin: Changes in disk popup needed to reuse in VM popup Change-Id: I52c5d5c7b83dd53cea3a9419656015e6a51bd179 Bug-Url: https://bugzilla.redhat.com/1117489 Signed-off-by: Tomas Jelinek <tjeli...@redhat.com> --- M frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmDiskAttachPopupWidget.java M frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmDiskPopupWidget.java M frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/SanStorageLunToTargetList.java M frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/SanStorageTargetToLunList.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/Linq.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/SanStorageModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageListModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/AbstractDiskModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/AttachDiskModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/EditDiskModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewDiskModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmSnapshotListModel.java M frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/Event.java 14 files changed, 301 insertions(+), 99 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/61/36061/1 diff --git a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmDiskAttachPopupWidget.java b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmDiskAttachPopupWidget.java index f1f64e7..232ea97 100644 --- a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmDiskAttachPopupWidget.java +++ b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmDiskAttachPopupWidget.java @@ -44,6 +44,8 @@ import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.VerticalPanel; +import java.util.List; + public class VmDiskAttachPopupWidget extends AbstractModelBoundPopupWidget<AttachDiskModel> { interface Driver extends SimpleBeanEditorDriver<AttachDiskModel, VmDiskAttachPopupWidget> { @@ -92,9 +94,10 @@ public VmDiskAttachPopupWidget(CommonApplicationConstants constants, CommonApplicationResources resources, CommonApplicationTemplates templates, - boolean isLunDiskEnabled) { + boolean isLunDiskEnabled, + boolean allowMultipleSelection) { this.isNewLunDiskEnabled = isLunDiskEnabled; - initManualWidgets(); + initManualWidgets(allowMultipleSelection); initWidget(ViewUiBinder.uiBinder.createAndBindUi(this)); localize(constants); ViewIdHandler.idHandler.generateAndSetIds(this); @@ -109,10 +112,10 @@ } @SuppressWarnings({ "unchecked", "rawtypes" }) - private void initManualWidgets() { + private void initManualWidgets(boolean allowMultipleSelection) { isPluggedEditor = new EntityModelCheckBoxEditor(Align.RIGHT); - imageDiskTable = new EntityModelCellTable<ListModel>(true); - lunDiskTable = new EntityModelCellTable<ListModel>(true); + imageDiskTable = new EntityModelCellTable<>(allowMultipleSelection); + lunDiskTable = new EntityModelCellTable<>(allowMultipleSelection); } private void initAttachPanelWidget() { @@ -421,7 +424,22 @@ } diskTable.setVisible(true); - diskTable.asEditor().edit(disk.getAttachableDisksMap().get(disk.getDiskStorageType().getEntity())); + ListModel<EntityModel<DiskModel>> disksListModel = disk.getAttachableDisksMap().get(disk.getDiskStorageType().getEntity()); + + // The setting of null and setting back the original value is done to force rendering the selected items. + // The reason it does not work is that the HasDataListModelEditorAdapter.edit() only renders it after the + // change events are fired + EntityModel<DiskModel> selectedModel = disksListModel.getSelectedItem(); + List<EntityModel<DiskModel>> selectedModels = disksListModel.getSelectedItems(); + + disksListModel.setSelectedItem(null); + disksListModel.setSelectedItems(null); + + diskTable.asEditor().edit(disksListModel); + + disksListModel.setSelectedItem(selectedModel); + disksListModel.setSelectedItems(selectedModels); + } @Override diff --git a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmDiskPopupWidget.java b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmDiskPopupWidget.java index 48f265f..077cf03 100644 --- a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmDiskPopupWidget.java +++ b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmDiskPopupWidget.java @@ -1,6 +1,7 @@ package org.ovirt.engine.ui.common.widget.uicommon.popup.vm; import java.util.ArrayList; +import java.util.Collection; import org.ovirt.engine.core.common.businessentities.Disk.DiskStorageType; import org.ovirt.engine.core.common.businessentities.DiskInterface; @@ -329,7 +330,7 @@ diskTypePanel.addRadioButton( constants.internalDisk(), - disk.getIsNew() || disk.getDisk().getDiskStorageType() == DiskStorageType.IMAGE, + disk.getDisk() == null || disk.getDisk().getDiskStorageType() == DiskStorageType.IMAGE, disk.getIsNew(), new ClickHandler() { @Override @@ -341,7 +342,7 @@ diskTypePanel.addRadioButton( constants.externalDisk(), - !disk.getIsNew() && disk.getDisk().getDiskStorageType() == DiskStorageType.LUN, + disk.getDisk() != null && disk.getDisk().getDiskStorageType() == DiskStorageType.LUN, disk.getIsNew(), new ClickHandler() { @Override @@ -352,33 +353,47 @@ } }); - storageModel = new StorageModel(new NewEditStorageModelBehavior()); + if (disk.getStorageModel() == null) { + storageModel = new StorageModel(new NewEditStorageModelBehavior()); - // Create IscsiStorageModel - iscsiStorageModel = new IscsiStorageModel(); - iscsiStorageModel.setContainer(storageModel); + // Create IscsiStorageModel + iscsiStorageModel = new IscsiStorageModel(); + iscsiStorageModel.setContainer(storageModel); + iscsiStorageModel.setIsGrouppedByTarget(true); + iscsiStorageModel.setIgnoreGrayedOut(true); + + // Create FcpStorageModel + fcpStorageModel = new FcpStorageModel(); + fcpStorageModel.setContainer(storageModel); + fcpStorageModel.setIsGrouppedByTarget(false); + fcpStorageModel.setIgnoreGrayedOut(true); + + // Set 'StorageModel' items + ArrayList<IStorageModel> items = new ArrayList<IStorageModel>(); + items.add(iscsiStorageModel); + items.add(fcpStorageModel); + storageModel.setItems(items); + storageModel.setHost(disk.getHost()); + + disk.setStorageModel(storageModel); + } else { + storageModel = disk.getStorageModel(); + + iscsiStorageModel = byType(storageModel.getItems(), IscsiStorageModel.class); + iscsiStorageModel.getPropertyChangedEvent().clearListeners(); + + fcpStorageModel = byType(storageModel.getItems(), FcpStorageModel.class); + fcpStorageModel.getPropertyChangedEvent().clearListeners(); + } + iscsiStorageModel.getPropertyChangedEvent().addListener(progressEventHandler); - iscsiStorageModel.setIsGrouppedByTarget(true); - iscsiStorageModel.setIgnoreGrayedOut(true); + fcpStorageModel.getPropertyChangedEvent().addListener(progressEventHandler); iscsiStorageView = new IscsiStorageView(false, 115, 214, 244, 275, 142, 55, -67); iscsiStorageView.edit(iscsiStorageModel); - // Create FcpStorageModel - fcpStorageModel = new FcpStorageModel(); - fcpStorageModel.setContainer(storageModel); - fcpStorageModel.getPropertyChangedEvent().addListener(progressEventHandler); - fcpStorageModel.setIsGrouppedByTarget(false); - fcpStorageModel.setIgnoreGrayedOut(true); fcpStorageView = new FcpStorageView(false, 278, 240); fcpStorageView.edit(fcpStorageModel); - - // Set 'StorageModel' items - ArrayList<IStorageModel> items = new ArrayList<IStorageModel>(); - items.add(iscsiStorageModel); - items.add(fcpStorageModel); - storageModel.setItems(items); - storageModel.setHost(disk.getHost()); // SelectedItemChangedEvent handlers disk.getStorageType().getSelectedItemChangedEvent().addListener(new IEventListener<EventArgs>() { @@ -395,9 +410,20 @@ } }); + revealStorageView(disk); revealDiskPanel(disk); } + private <T extends IStorageModel> T byType(Collection<IStorageModel> models, Class<T> specific) { + for (IStorageModel model : models) { + if (model.getClass().equals(specific)) { + return (T) model; + } + } + + return null; + } + private void revealDiskPanel(final AbstractDiskModel disk) { boolean isInVm = disk.getVm() != null; diff --git a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/SanStorageLunToTargetList.java b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/SanStorageLunToTargetList.java index a72377c..0bea50a 100644 --- a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/SanStorageLunToTargetList.java +++ b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/SanStorageLunToTargetList.java @@ -126,6 +126,8 @@ if (!lunModel.getIsSelected()) { table.getSelectionModel().setSelected(lunModel, false); + } else { + table.getSelectionModel().setSelected(lunModel, true); } table.redraw(); } @@ -159,6 +161,7 @@ // Update table table.setRowData(items); table.asEditor().edit(listModel); + table.setWidth("100%", true); //$NON-NLS-1$ rootModel.getPropertyChangedEvent().removeListener(lunModelSelectedItemListener); @@ -281,7 +284,12 @@ } table.setRowData(items); + + Object selectedItem = leafModel.getSelectedItem(); + leafModel.setSelectedItem(null); table.asEditor().edit(leafModel); + leafModel.setSelectedItem(selectedItem); + table.setWidth("100%", true); //$NON-NLS-1$ ScrollPanel panel = new ScrollPanel(); diff --git a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/SanStorageTargetToLunList.java b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/SanStorageTargetToLunList.java index 8eac84d..db1b14e 100644 --- a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/SanStorageTargetToLunList.java +++ b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/SanStorageTargetToLunList.java @@ -242,7 +242,11 @@ }, constants.serialSanStorage(), "120px"); //$NON-NLS-1$ table.setRowData(items); + Object selectedItem = leafModel.getSelectedItem(); + leafModel.setSelectedItem(null); table.asEditor().edit(leafModel); + leafModel.setSelectedItem(selectedItem); + table.setWidth("100%", true); //$NON-NLS-1$ if (!multiSelection) { diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/Linq.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/Linq.java index 0799a70..53c785e 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/Linq.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/Linq.java @@ -841,7 +841,7 @@ return diskModel; } - public static ArrayList<DiskModel> disksToDiskModelList(ArrayList<Disk> disks) { + public static ArrayList<DiskModel> disksToDiskModelList(List<Disk> disks) { ArrayList<DiskModel> diskModels = new ArrayList<DiskModel>(); for (Disk disk : disks) { diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java index ee962cd..742940f 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java @@ -2479,7 +2479,7 @@ aQuery); } - public void getAllAttachableDisks(AsyncQuery aQuery, Guid storagePoolId, Guid vmId) { + public void getAllAttachableDisks(AsyncQuery aQuery, Guid storagePoolId, Guid vmId, boolean filterByExplicitValues, int os, Version compatibilityVersion) { aQuery.converterCallback = new IAsyncConverter() { @Override public Object Convert(Object source, AsyncQuery _asyncQuery) @@ -2489,9 +2489,16 @@ }; GetAllAttachableDisks params = new GetAllAttachableDisks(storagePoolId); params.setVmId(vmId); + params.setFilterByExplicitValues(filterByExplicitValues); + params.setOs(os); + params.setVdsGroupCompatibilityVersion(compatibilityVersion); Frontend.getInstance().runQuery(VdcQueryType.GetAllAttachableDisks, params, aQuery); } + public void getAllAttachableDisks(AsyncQuery aQuery, Guid storagePoolId, Guid vmId) { + getAllAttachableDisks(aQuery, storagePoolId, vmId, false, 0, null); + } + public void getPermittedStorageDomainsByStoragePoolId(AsyncQuery aQuery, Guid dataCenterId, ActionGroup actionGroup) { diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/SanStorageModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/SanStorageModel.java index 4076cb0..ddc9f4e 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/SanStorageModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/SanStorageModel.java @@ -1,6 +1,7 @@ package org.ovirt.engine.ui.uicommonweb.models.storage; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import org.ovirt.engine.core.common.businessentities.LUNs; @@ -17,6 +18,7 @@ import org.ovirt.engine.ui.frontend.Frontend; import org.ovirt.engine.ui.frontend.INewAsyncCallback; import org.ovirt.engine.ui.uicommonweb.Linq; +import org.ovirt.engine.ui.uicommonweb.models.EntityModel; import org.ovirt.engine.ui.uicommonweb.models.Model; import org.ovirt.engine.ui.uicompat.ConstantsManager; import org.ovirt.engine.ui.uicompat.Event; @@ -133,6 +135,7 @@ return; } + final List<EntityModel<?>> prevSelected = findSelectedItems(); clearItems(); initializeItems(null, null); @@ -142,7 +145,7 @@ SanStorageModel model = (SanStorageModel) target; VdcQueryReturnValue response = (VdcQueryReturnValue) returnValue; if (response.getSucceeded()) { - model.applyData((ArrayList<LUNs>) response.getReturnValue(), false); + model.applyData((ArrayList<LUNs>) response.getReturnValue(), false, prevSelected); model.setGetLUNsFailure(""); //$NON-NLS-1$ } else { @@ -155,6 +158,18 @@ Frontend.getInstance().runQuery(VdcQueryType.GetDeviceList, new GetDeviceListQueryParameters(host.getId(), getType()), asyncQuery); + } + + private List<EntityModel<?>> findSelectedItems() { + List<EntityModel<?>> res = new ArrayList<>(); + + for (EntityModel<?> item : (Collection<EntityModel<?>>) getItems()) { + if (item.getIsSelected()) { + res.add(item); + } + } + + return res; } private void clearItems() @@ -216,7 +231,7 @@ /** * Creates model items from the provided list of business entities. */ - public void applyData(List<LUNs> source, boolean isIncluded) + public void applyData(List<LUNs> source, boolean isIncluded, List<EntityModel<?>> selectedItems) { ArrayList<LunModel> newItems = new ArrayList<LunModel>(); @@ -237,7 +252,7 @@ lunModel.setIsAccessible(a.getAccessible()); lunModel.setStatus(a.getStatus()); lunModel.setIsIncluded(isIncluded); - lunModel.setIsSelected(isIncluded); + lunModel.setIsSelected(containsLun(lunModel, selectedItems, isIncluded)); lunModel.setEntity(a); // Add LunModel @@ -258,6 +273,22 @@ proposeDiscover(); } + private boolean containsLun(LunModel lunModel, List<EntityModel<?>> models, boolean isIncluded) { + if (models == null) { + return isIncluded; + } + + for (EntityModel<?> model : models) { + if (model instanceof LunModel) { + if (((LunModel) model).getLunId().equals(lunModel.getLunId())) { + return true; + } + } + } + + return false; + } + private ArrayList<SanTargetModel> createTargetModelList(LUNs a) { ArrayList<SanTargetModel> targetModelList = new ArrayList<SanTargetModel>(); if (a.getLunConnections() != null) diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageListModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageListModel.java index fcb785a..16b747e 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageListModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageListModel.java @@ -594,7 +594,7 @@ public void onSuccess(Object target, Object returnValue) { SanStorageModel sanStorageModel = (SanStorageModel) target; ArrayList<LUNs> lunList = (ArrayList<LUNs>) returnValue; - sanStorageModel.applyData(lunList, true); + sanStorageModel.applyData(lunList, true, null); } }, storageModel.getHash()), storage.getStorage(), hostId); } diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/AbstractDiskModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/AbstractDiskModel.java index 9e03180..ad15a19 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/AbstractDiskModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/AbstractDiskModel.java @@ -46,6 +46,7 @@ import org.ovirt.engine.ui.uicommonweb.models.ListModel; import org.ovirt.engine.ui.uicommonweb.models.SystemTreeItemModel; import org.ovirt.engine.ui.uicommonweb.models.storage.SanStorageModel; +import org.ovirt.engine.ui.uicommonweb.models.storage.StorageModel; import org.ovirt.engine.ui.uicommonweb.validation.I18NNameValidation; import org.ovirt.engine.ui.uicommonweb.validation.IValidation; import org.ovirt.engine.ui.uicommonweb.validation.NotEmptyQuotaValidation; @@ -54,6 +55,7 @@ import org.ovirt.engine.ui.uicompat.ConstantsManager; import org.ovirt.engine.ui.uicompat.Event; import org.ovirt.engine.ui.uicompat.EventArgs; +import org.ovirt.engine.ui.uicompat.IFrontendActionAsyncCallback; import org.ovirt.engine.ui.uicompat.UIConstants; public abstract class AbstractDiskModel extends DiskModel @@ -84,6 +86,8 @@ private String hash; private UICommand cancelCommand; private int queryCounter; + + private StorageModel storageModel; public EntityModel<Boolean> getIsWipeAfterDelete() { return isWipeAfterDelete; @@ -319,6 +323,18 @@ @Override public void initialize() { + commonInitialize(); + if (getVm() != null) { + updateBootableDiskAvailable(); + } + } + + public void initialize(List<Disk> currentDisks) { + commonInitialize(); + updateBootableFrom(currentDisks != null ? currentDisks : new ArrayList<Disk>()); + } + + private void commonInitialize() { super.initialize(); setHash(getHashName() + new Date()); @@ -338,11 +354,6 @@ onSaveCommand.setIsDefault(true); getCommands().add(onSaveCommand); getCommands().add(getCancelCommand()); - - // Update data - if (getVm() != null) { - updateBootableDiskAvailable(); - } updateDatacenters(); } @@ -354,10 +365,8 @@ ArrayList<StorageDomain> storageDomains = (ArrayList<StorageDomain>) returnValue; ArrayList<StorageDomain> filteredStorageDomains = new ArrayList<StorageDomain>(); - for (StorageDomain a : storageDomains) - { - if (!a.getStorageDomainType().isIsoOrImportExportDomain() && a.getStatus() == StorageDomainStatus.Active) - { + for (StorageDomain a : storageDomains) { + if (!a.getStorageDomainType().isIsoOrImportExportDomain() && a.getStatus() == StorageDomainStatus.Active) { filteredStorageDomains.add(a); } } @@ -409,7 +418,7 @@ dataCenters.add(dataCenter); } - diskModel.getDataCenter().setItems(dataCenters); + diskModel.getDataCenter().setItems(dataCenters, Linq.firstOrDefault(dataCenters)); if (dataCenters.isEmpty()) { diskModel.setMessage(CONSTANTS.relevantDCnotActive()); @@ -445,28 +454,31 @@ AsyncDataProvider.getInstance().getVmDiskList(new AsyncQuery(this, new INewAsyncCallback() { @Override public void onSuccess(Object target, Object returnValue) { - AbstractDiskModel diskModel = (AbstractDiskModel) target; ArrayList<Disk> disks = (ArrayList<Disk>) returnValue; - - diskModel.getIsBootable().setEntity(true); - if (getDisk() == null || !getDisk().isDiskSnapshot()) { - for (Disk disk : disks) { - if (disk.isBoot() && !disk.equals(getDisk())) { - diskModel.getIsBootable().setEntity(false); - if (!disk.isDiskSnapshot()) { - diskModel.getIsBootable().setChangeProhibitionReason(CONSTANTS.onlyOneBootableDisk()); - diskModel.getIsBootable().setIsChangable(false); - break; - } - } - } - } - - if (!getIsNew()) { - getIsBootable().setEntity(getDisk().isBoot()); - } + updateBootableFrom(disks); } }, getHash()), getVm().getId()); + } + + public void updateBootableFrom(List<Disk> vmDisks) { + getIsBootable().setEntity(true); + getIsBootable().setIsChangable(true); + if (getDisk() == null || !getDisk().isDiskSnapshot()) { + for (Disk disk : vmDisks) { + if (disk.isBoot() && !disk.equals(getDisk())) { + getIsBootable().setEntity(false); + if (!disk.isDiskSnapshot()) { + getIsBootable().setChangeProhibitionReason(CONSTANTS.onlyOneBootableDisk()); + getIsBootable().setIsChangable(false); + break; + } + } + } + } + + if (!getIsNew()) { + getIsBootable().setEntity(getDisk().isBoot()); + } } private void updateShareableDiskEnabled(StoragePool datacenter) { @@ -563,7 +575,7 @@ } // handle disk profile selected item Guid defaultProfileId = - getDisk() != null ? ((DiskImage) getDisk()).getDiskProfileId() : null; + (getDisk() != null && getDisk().getDiskStorageType() == DiskStorageType.IMAGE)? ((DiskImage) getDisk()).getDiskProfileId() : null; if (defaultProfileId != null) { for (DiskProfile profile : diskProfiles) { if (profile.getId().equals(defaultProfileId)) { @@ -754,7 +766,7 @@ return vm.getStatus() == VMStatus.Up || vm.getStatus() == VMStatus.Down || vm.getStatus() == VMStatus.Paused; } - private void datacenter_SelectedItemChanged() { + protected void datacenter_SelectedItemChanged() { StoragePool datacenter = getDataCenter().getSelectedItem(); boolean isInVm = getVm() != null; @@ -847,6 +859,11 @@ } public void onSave() { + flush(); + store(null); + } + + public void flush() { if (getDiskStorageType().getEntity() == DiskStorageType.IMAGE) { DiskImage diskImage = getDiskImage(); if (getQuota().getIsAvailable() && getQuota().getSelectedItem() != null) { @@ -887,6 +904,8 @@ getDisk().setPropagateErrors(PropagateErrors.Off); getDisk().setReadOnly(getIsReadOnly().getIsAvailable() ? getIsReadOnly().getEntity() : null); } + + public abstract void store(IFrontendActionAsyncCallback callback); @Override public void executeCommand(UICommand command) { @@ -953,4 +972,12 @@ stopProgress(); } } + + public StorageModel getStorageModel() { + return storageModel; + } + + public void setStorageModel(StorageModel storageModel) { + this.storageModel = storageModel; + } } diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/AttachDiskModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/AttachDiskModel.java index 06a13c1..024ff38 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/AttachDiskModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/AttachDiskModel.java @@ -11,6 +11,7 @@ import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.Disk; import org.ovirt.engine.core.common.businessentities.Disk.DiskStorageType; +import org.ovirt.engine.core.compat.Version; import org.ovirt.engine.ui.frontend.AsyncQuery; import org.ovirt.engine.ui.frontend.Frontend; import org.ovirt.engine.ui.frontend.INewAsyncCallback; @@ -39,36 +40,91 @@ } @Override + public void flush() { + // no need to do any flush + } + + @Override public void initialize() { super.initialize(); getIsPlugged().setIsAvailable(true); + if (getVm().getId() != null) { + loadAttachableDisks(false, 0, null, null); + } + } + + public void loadAttachableDisks(boolean filterByExplicitValues, int os, Version compatibilityVersion, final Disk prevSelectedDisk) { // Get internal attachable disks AsyncDataProvider.getInstance().getAllAttachableDisks(new AsyncQuery(this, new INewAsyncCallback() { @Override public void onSuccess(Object target, Object returnValue) { - ArrayList<Disk> disks = (ArrayList<Disk>) returnValue; + List<Disk> disks = replaceIfSelected((List<Disk>) returnValue, prevSelectedDisk, DiskStorageType.IMAGE); + Collections.sort(disks, new Linq.DiskByAliasComparer()); ArrayList<DiskModel> diskModels = Linq.disksToDiskModelList(disks); - getAttachableDisksMap().get(DiskStorageType.IMAGE).setItems(Linq.toEntityModelList( - Linq.filterDisksByType(diskModels, Disk.DiskStorageType.IMAGE))); + List<EntityModel<DiskModel>> entities = Linq.toEntityModelList( + Linq.filterDisksByType(diskModels, DiskStorageType.IMAGE)); + + getAttachableDisksMap().get(DiskStorageType.IMAGE).setItems(entities, selectedOrNull(entities, prevSelectedDisk, DiskStorageType.IMAGE)); } - }, getHash()), getVm().getStoragePoolId(), getVm().getId()); + }, getHash()), getVm().getStoragePoolId(), getVm().getId(), filterByExplicitValues, os, compatibilityVersion); // Get external attachable disks AsyncDataProvider.getInstance().getAllAttachableDisks(new AsyncQuery(this, new INewAsyncCallback() { @Override public void onSuccess(Object target, Object returnValue) { - ArrayList<Disk> disks = (ArrayList<Disk>) returnValue; + List<Disk> disks = replaceIfSelected((List<Disk>) returnValue, prevSelectedDisk, DiskStorageType.LUN); Collections.sort(disks, new Linq.DiskByAliasComparer()); ArrayList<DiskModel> diskModels = Linq.disksToDiskModelList(disks); - getAttachableDisksMap().get(DiskStorageType.LUN).setItems(Linq.toEntityModelList( - Linq.filterDisksByType(diskModels, Disk.DiskStorageType.LUN))); + ArrayList<EntityModel<DiskModel>> entities = Linq.toEntityModelList( + Linq.filterDisksByType(diskModels, DiskStorageType.LUN)); + getAttachableDisksMap().get(DiskStorageType.LUN).setItems(entities, selectedOrNull(entities, prevSelectedDisk, DiskStorageType.LUN)); } - }, getHash()), null, getVm().getId()); + }, getHash()), null, getVm().getId(), filterByExplicitValues, os, compatibilityVersion); + } + + private EntityModel<DiskModel> selectedOrNull(List<EntityModel<DiskModel>> list, Disk prevSelected, DiskStorageType diskStorageType) { + if (prevSelected == null) { + return null; + } + + if (prevSelected.getDiskStorageType() != diskStorageType) { + return null; + } + + for (EntityModel<DiskModel> item : list) { + if (item.getEntity().getDisk().getId().equals(prevSelected.getId())) { + return item; + } + } + + return null; + } + + private List<Disk> replaceIfSelected(List<Disk> disksFromServer, Disk prevSelected, DiskStorageType diskStorageType) { + if (prevSelected == null) { + return disksFromServer; + } + + if (prevSelected.getDiskStorageType() != diskStorageType) { + return disksFromServer; + } + + List<Disk> res = new ArrayList<>(); + + for (Disk diskFromServer : disksFromServer) { + if (!diskFromServer.getId().equals(prevSelected.getId())) { + res.add(diskFromServer); + } else { + res.add(prevSelected); + } + } + + return res; } @Override @@ -82,7 +138,7 @@ } @Override - public void onSave() { + public void store(IFrontendActionAsyncCallback callback) { if (getProgress() != null || !validate()) { return; } @@ -121,20 +177,27 @@ private boolean isNoSelection() { for (ListModel<EntityModel<DiskModel>> listModel : attachableDisksMap.values()) { - if (listModel.getSelectedItems() != null && !listModel.getSelectedItems().isEmpty()) { + boolean multipleSelectionSelected = listModel.getSelectedItems() != null && !listModel.getSelectedItems().isEmpty(); + boolean singleSelectionSelected = listModel.getSelectedItem() != null; + if (multipleSelectionSelected || singleSelectionSelected) { return false; } } return true; } - private List<EntityModel<DiskModel>> getSelectedDisks() { + public List<EntityModel<DiskModel>> getSelectedDisks() { List<EntityModel<DiskModel>> selectedDisks = new ArrayList<EntityModel<DiskModel>>(); for (ListModel<EntityModel<DiskModel>> listModel : attachableDisksMap.values()) { if (listModel.getSelectedItems() != null && !listModel.getSelectedItems().isEmpty()) { selectedDisks.addAll(listModel.getSelectedItems()); } + + if (listModel.getSelectedItem() != null) { + selectedDisks.add(listModel.getSelectedItem()); + } } return selectedDisks; } + } diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/EditDiskModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/EditDiskModel.java index fd60a9e..9322dd7 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/EditDiskModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/EditDiskModel.java @@ -3,7 +3,7 @@ import org.ovirt.engine.core.common.VdcActionUtils; import org.ovirt.engine.core.common.action.UpdateVmDiskParameters; import org.ovirt.engine.core.common.action.VdcActionType; -import org.ovirt.engine.core.common.businessentities.Disk.DiskStorageType; +import org.ovirt.engine.core.common.businessentities.Disk; import org.ovirt.engine.core.common.businessentities.DiskImage; import org.ovirt.engine.core.common.businessentities.LunDisk; import org.ovirt.engine.core.common.businessentities.ScsiGenericIO; @@ -43,9 +43,9 @@ getIsSgIoUnfiltered().setEntity(getDisk().getSgio() == ScsiGenericIO.UNFILTERED); getIsReadOnly().setEntity(getDisk().getReadOnly()); - if (getDisk().getDiskStorageType() == DiskStorageType.IMAGE) { + if (getDisk().getDiskStorageType() == Disk.DiskStorageType.IMAGE) { DiskImage diskImage = (DiskImage) getDisk(); - getDiskStorageType().setEntity(DiskStorageType.IMAGE); + getDiskStorageType().setEntity(Disk.DiskStorageType.IMAGE); getSize().setEntity((int) diskImage.getSizeInGigabytes()); getVolumeType().setSelectedItem(diskImage.getVolumeType()); setVolumeFormat(diskImage.getVolumeFormat()); @@ -53,8 +53,22 @@ boolean isExtendImageSizeEnabled = getVm() != null && !diskImage.isDiskSnapshot() && VdcActionUtils.canExecute(Arrays.asList(getVm()), VM.class, VdcActionType.ExtendImageSize); getSizeExtend().setIsChangable(isExtendImageSizeEnabled); + } else { + LunDisk lunDisk = (LunDisk) getDisk(); + getDiskStorageType().setEntity(Disk.DiskStorageType.LUN); + getSize().setEntity(lunDisk.getLun().getDeviceSize()); + getSizeExtend().setIsAvailable(false); + } - Guid storageDomainId = diskImage.getStorageIds().get(0); + updateReadOnlyChangeability(); + } + + @Override + protected void datacenter_SelectedItemChanged() { + super.datacenter_SelectedItemChanged(); + // this needs to be executed after the data center is loaded because the update quota needs both values + if (getDisk().getDiskStorageType() == Disk.DiskStorageType.IMAGE) { + Guid storageDomainId = ((DiskImage) getDisk()).getStorageIds().get(0); AsyncDataProvider.getInstance().getStorageDomainById(new AsyncQuery(this, new INewAsyncCallback() { @Override public void onSuccess(Object target, Object returnValue) { @@ -63,14 +77,8 @@ diskModel.getStorageDomain().setSelectedItem(storageDomain); } }, getHash()), storageDomainId); - } else { - LunDisk lunDisk = (LunDisk) getDisk(); - getDiskStorageType().setEntity(DiskStorageType.LUN); - getSize().setEntity(lunDisk.getLun().getDeviceSize()); - getSizeExtend().setIsAvailable(false); } - updateReadOnlyChangeability(); } @Override @@ -99,22 +107,23 @@ } @Override - public void onSave() { + public void store(IFrontendActionAsyncCallback callback) { if (getProgress() != null || !validate()) { return; } - super.onSave(); + startProgress(null); UpdateVmDiskParameters parameters = new UpdateVmDiskParameters(getVmId(), getDisk().getId(), getDisk()); - Frontend.getInstance().runAction(VdcActionType.UpdateVmDisk, parameters, new IFrontendActionAsyncCallback() { + IFrontendActionAsyncCallback onFinished = callback != null ? callback : new IFrontendActionAsyncCallback() { @Override public void executed(FrontendActionAsyncResult result) { EditDiskModel diskModel = (EditDiskModel) result.getState(); diskModel.stopProgress(); diskModel.cancel(); } - }, this); + }; + Frontend.getInstance().runAction(VdcActionType.UpdateVmDisk, parameters, onFinished, this); } @Override diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewDiskModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewDiskModel.java index 3e361e6..f8912fa 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewDiskModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewDiskModel.java @@ -104,13 +104,8 @@ } @Override - public void onSave() { - if (getProgress() != null || !validate()) { - return; - } - - super.onSave(); - + public void flush() { + super.flush(); if (getDiskStorageType().getEntity() == Disk.DiskStorageType.IMAGE) { DiskImage diskImage = (DiskImage) getDisk(); diskImage.setSizeInGigabytes(getSize().getEntity()); @@ -123,6 +118,13 @@ luns.setLunType(getStorageType().getSelectedItem()); lunDisk.setLun(luns); } + } + + @Override + public void store(IFrontendActionAsyncCallback callback) { + if (getProgress() != null || !validate()) { + return; + } startProgress(null); @@ -133,7 +135,7 @@ parameters.setStorageDomainId(storageDomain.getId()); } - Frontend.getInstance().runAction(VdcActionType.AddDisk, parameters, new IFrontendActionAsyncCallback() { + IFrontendActionAsyncCallback onFinished = callback != null ? callback : new IFrontendActionAsyncCallback() { @Override public void executed(FrontendActionAsyncResult result) { NewDiskModel diskModel = (NewDiskModel) result.getState(); @@ -141,7 +143,9 @@ diskModel.cancel(); postSave(); } - }, this); + }; + + Frontend.getInstance().runAction(VdcActionType.AddDisk, parameters, onFinished, this); } protected void postSave() { diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmSnapshotListModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmSnapshotListModel.java index 94a52f3..565216e 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmSnapshotListModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmSnapshotListModel.java @@ -643,7 +643,7 @@ VM selectedVm = (VM) getEntity(); - UnitVmModel model = new UnitVmModel(new CloneVmFromSnapshotModelBehavior()); + UnitVmModel model = new UnitVmModel(new CloneVmFromSnapshotModelBehavior(), this); model.getVmType().setSelectedItem(selectedVm.getVmType()); model.setIsAdvancedModeLocalStorageKey("wa_snapshot_dialog"); //$NON-NLS-1$ setWindow(model); diff --git a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/Event.java b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/Event.java index e9a0538..b83d995 100644 --- a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/Event.java +++ b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/Event.java @@ -148,6 +148,11 @@ return listeners; } + public void clearListeners() { + listeners.clear(); + contexts.clear(); + } + public void setListeners(List<IEventListener<? super T>> listeners) { this.listeners = listeners; } -- To view, visit http://gerrit.ovirt.org/36061 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I52c5d5c7b83dd53cea3a9419656015e6a51bd179 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Tomas Jelinek <tjeli...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches