Maor Lipchuk has uploaded a new change for review. Change subject: webadmin: Support warnning for import/attach operation ......................................................................
webadmin: Support warnning for import/attach operation 1. Adding properties for the attach/import confirmation module. 2. Add attach warnning in Data center module 3. Adding GUI support in the Storage module to support the confirmation warnning on attach and import Storage Domain command Change-Id: I22f7149e298ab38f816e49184f5d02b4e01e3db6 Bug-Url: https://bugzilla.redhat.com/1138115 Signed-off-by: Maor Lipchuk <[email protected]> --- M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/help/HelpTag.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/datacenters/DataCenterStorageListModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageDataCenterListModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageListModel.java M frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/DataCenterModule.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/StorageModule.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/StorageForceCreatePopupView.ui.xml 8 files changed, 378 insertions(+), 148 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/45/36545/1 diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/help/HelpTag.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/help/HelpTag.java index e0fa2b6..97419ca 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/help/HelpTag.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/help/HelpTag.java @@ -186,6 +186,10 @@ force_storage_domain_creation("force_storage_domain_creation", HelpTagType.WEBADMIN, "Storage Tab > New Domain > Confirm LUNs in Use"), //$NON-NLS-1$ //$NON-NLS-2$ + import_storage_domain_confirmation("import_storage_domain_confirmation", HelpTagType.WEBADMIN, "Storage Tab > Import Domain > Confirm import storage domain"), //$NON-NLS-1$ //$NON-NLS-2$ + + attach_storage_domain_confirmation("attach_storage_domain_confirmation", HelpTagType.WEBADMIN, "Storage main-tab > Data Center sub-tab > Attach > Confirm attach storage domain"), //$NON-NLS-1$ //$NON-NLS-2$ + general("general", HelpTagType.UNKNOWN), //$NON-NLS-1$ gluster_bricks("gluster_bricks", HelpTagType.UNKNOWN), //$NON-NLS-1$ diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/datacenters/DataCenterStorageListModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/datacenters/DataCenterStorageListModel.java index 500f39d..698f3ea 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/datacenters/DataCenterStorageListModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/datacenters/DataCenterStorageListModel.java @@ -1,6 +1,7 @@ package org.ovirt.engine.ui.uicommonweb.models.datacenters; import java.util.ArrayList; +import java.util.List; import org.ovirt.engine.core.common.VdcActionUtils; import org.ovirt.engine.core.common.action.AttachStorageDomainToPoolParameters; @@ -11,6 +12,7 @@ import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.StorageDomain; import org.ovirt.engine.core.common.businessentities.StorageDomainSharedStatus; +import org.ovirt.engine.core.common.businessentities.StorageDomainStatic; import org.ovirt.engine.core.common.businessentities.StorageDomainStatus; import org.ovirt.engine.core.common.businessentities.StorageDomainType; import org.ovirt.engine.core.common.businessentities.StorageFormatType; @@ -163,6 +165,8 @@ { privatepb_remove = value; } + + private ArrayList<StorageDomain> selectedStorageDomains; public DataCenterStorageListModel() { @@ -449,6 +453,7 @@ public void onAttach() { ListModel model = (ListModel) getWindow(); + ArrayList<StorageDomain> selectedDataStorageDomains = new ArrayList<StorageDomain>(); if (getEntity() == null) { @@ -456,26 +461,84 @@ return; } - ArrayList<StorageDomain> items = new ArrayList<StorageDomain>(); - for (EntityModel a : Linq.<EntityModel> cast(model.getItems())) - { - if (a.getIsSelected()) - { - items.add((StorageDomain) a.getEntity()); + selectedStorageDomains = new ArrayList<StorageDomain>(); + for (EntityModel a : Linq.<EntityModel> cast(model.getItems())) { + if (a.getIsSelected()) { + StorageDomain storageDomain = (StorageDomain) a.getEntity(); + selectedStorageDomains.add(storageDomain); + if (storageDomain.getStorageDomainType() == StorageDomainType.Data) { + selectedDataStorageDomains.add(storageDomain); + } } } - if (items.size() > 0) - { - ArrayList<VdcActionParametersBase> pb = new ArrayList<VdcActionParametersBase>(); - for (StorageDomain a : items) - { - pb.add(new AttachStorageDomainToPoolParameters(a.getId(), getEntity().getId())); - } - - Frontend.getInstance().runMultipleAction(VdcActionType.AttachStorageDomainToPool, pb); + if (selectedStorageDomains.isEmpty()) { + cancel(); + return; } + AsyncDataProvider.getStorageDomainsWithAttachedStoragePoolGuid( + new AsyncQuery(this, new INewAsyncCallback() { + @Override + public void onSuccess(Object target, Object returnValue) { + DataCenterStorageListModel dataCenterStorageListModel = (DataCenterStorageListModel) target; + List<StorageDomainStatic> attachedStorageDomains = (List<StorageDomainStatic>) returnValue; + if (!attachedStorageDomains.isEmpty()) { + ConfirmationModel model = new ConfirmationModel(); + dataCenterStorageListModel.setWindow(null); + dataCenterStorageListModel.setWindow(model); + + List<String> stoageDomainNames = new ArrayList<String>(); + for (StorageDomainStatic domain : attachedStorageDomains) { + stoageDomainNames.add(domain.getStorageName()); + } + model.setItems(stoageDomainNames); + + model.setTitle(ConstantsManager.getInstance() + .getConstants() + .storageDomainsAttachedToDataCenterWarningTitle()); + model.setMessage(ConstantsManager.getInstance() + .getConstants() + .storageDomainsAttachedToDataCenterWarningMessage()); + + model.setHelpTag(HelpTag.attach_storage_domain_confirmation); + model.setHashName("attach_storage_domain_confirmation"); //$NON-NLS-1$ + + model.getLatch().setIsAvailable(true); + model.getLatch().setIsChangable(true); + + UICommand onApprove = new UICommand("OnAttachApprove", dataCenterStorageListModel); //$NON-NLS-1$ + onApprove.setTitle(ConstantsManager.getInstance().getConstants().ok()); + onApprove.setIsDefault(true); + model.getCommands().add(onApprove); + + UICommand cancel = new UICommand("Cancel", dataCenterStorageListModel); //$NON-NLS-1$ + cancel.setTitle(ConstantsManager.getInstance().getConstants().cancel()); + cancel.setIsCancel(true); + model.getCommands().add(cancel); + } else { + executeAttachStorageDomains(); + } + } + }), getEntity(), selectedDataStorageDomains); + } + + public void onAttachApprove() { + ConfirmationModel model = (ConfirmationModel) getWindow(); + if (!model.validate()) { + return; + } + + executeAttachStorageDomains(); + } + + public void executeAttachStorageDomains() { + ArrayList<VdcActionParametersBase> pb = new ArrayList<VdcActionParametersBase>(); + for (StorageDomain storageDomain : selectedStorageDomains) { + pb.add(new AttachStorageDomainToPoolParameters(storageDomain.getId(), getEntity().getId( + ))); + } + Frontend.getInstance().runMultipleAction(VdcActionType.AttachStorageDomainToPool, pb); cancel(); } @@ -796,6 +859,10 @@ { onAttach(); } + else if ("OnAttachApprove".equals(command.getName())) //$NON-NLS-1$ + { + onAttachApprove(); + } else if ("OnDetach".equals(command.getName())) //$NON-NLS-1$ { onDetach(); diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageDataCenterListModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageDataCenterListModel.java index 61a8050..d576b81 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageDataCenterListModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageDataCenterListModel.java @@ -13,6 +13,7 @@ import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.StorageDomain; import org.ovirt.engine.core.common.businessentities.StorageDomainSharedStatus; +import org.ovirt.engine.core.common.businessentities.StorageDomainStatic; import org.ovirt.engine.core.common.businessentities.StorageDomainType; import org.ovirt.engine.core.common.businessentities.StoragePool; import org.ovirt.engine.core.common.businessentities.StoragePoolStatus; @@ -31,6 +32,7 @@ import org.ovirt.engine.ui.uicommonweb.models.ConfirmationModel; import org.ovirt.engine.ui.uicommonweb.models.EntityModel; import org.ovirt.engine.ui.uicommonweb.models.ListModel; +import org.ovirt.engine.ui.uicommonweb.models.Model; import org.ovirt.engine.ui.uicommonweb.models.SearchableListModel; import org.ovirt.engine.ui.uicompat.ConstantsManager; import org.ovirt.engine.ui.uicompat.FrontendMultipleActionAsyncResult; @@ -161,6 +163,16 @@ public void setavailableDatacenters(ArrayList<StoragePool> value) { privateavailableDatacenters = value; + } + + private List<StoragePool> selectedDataCentersForAttach; + + public List<StoragePool> getSelectedDataCentersForAttach() { + return selectedDataCentersForAttach; + } + + public void setSelectedDataCentersForAttach(List<StoragePool> selectedDataCentersForAttach) { + this.selectedDataCentersForAttach = selectedDataCentersForAttach; } public StorageDataCenterListModel() @@ -381,55 +393,102 @@ private void onAttach() { - ListModel model = (ListModel) getWindow(); + final ListModel model = (ListModel) getWindow(); - if (model.getProgress() != null) - { + if (model.getProgress() != null) { return; } - if (getEntity() == null) - { + if (getEntity() == null) { cancel(); return; } ArrayList<StoragePool> items = new ArrayList<StoragePool>(); - for (EntityModel a : Linq.<EntityModel> cast(model.getItems())) - { - if (a.getIsSelected()) - { + for (EntityModel a : Linq.<EntityModel>cast(model.getItems())) { + if (a.getIsSelected()) { items.add((StoragePool) a.getEntity()); } } - if (items.size() > 0) - { - model.startProgress(null); - - ArrayList<VdcActionParametersBase> parameters = - new ArrayList<VdcActionParametersBase>(); - for (StoragePool dataCenter : items) - { - parameters.add(new AttachStorageDomainToPoolParameters(getEntity().getId(), dataCenter.getId())); - } - - Frontend.getInstance().runMultipleAction(VdcActionType.AttachStorageDomainToPool, parameters, - new IFrontendMultipleActionAsyncCallback() { - @Override - public void executed(FrontendMultipleActionAsyncResult result) { - - ListModel localModel = (ListModel) result.getState(); - localModel.stopProgress(); - cancel(); - - } - }, model); - } - else - { + if (items.size() == 0) { cancel(); + return; } + + setSelectedDataCentersForAttach(items); + model.startProgress(null); + + if (getEntity().getStorageDomainType() == StorageDomainType.Data) { + StoragePool dataCenter = items.get(0); + ArrayList<StorageDomain> storageDomains = new ArrayList<StorageDomain>(); + storageDomains.add(getEntity()); + + AsyncDataProvider.getStorageDomainsWithAttachedStoragePoolGuid( + new AsyncQuery(this, new INewAsyncCallback() { + @Override + public void onSuccess(Object target, Object returnValue) { + StorageDataCenterListModel storageDataCenterListModel = (StorageDataCenterListModel) target; + List<StorageDomainStatic> attachedStorageDomains = (List<StorageDomainStatic>) returnValue; + if (!attachedStorageDomains.isEmpty()) { + ConfirmationModel model = new ConfirmationModel(); + storageDataCenterListModel.setWindow(null); + storageDataCenterListModel.setWindow(model); + + List<String> stoageDomainNames = new ArrayList<String>(); + for (StorageDomainStatic domain : attachedStorageDomains) { + stoageDomainNames.add(domain.getStorageName()); + } + model.setItems(stoageDomainNames); + + model.setTitle(ConstantsManager.getInstance().getConstants().storageDomainsAttachedToDataCenterWarningTitle()); + model.setMessage(ConstantsManager.getInstance().getConstants().storageDomainsAttachedToDataCenterWarningMessage()); + model.setHelpTag(HelpTag.attach_storage_domain_confirmation); + model.setHashName("attach_storage_domain_confirmation"); //$NON-NLS-1$ + model.getLatch().setIsAvailable(true); + model.getLatch().setIsChangable(true); + + UICommand onApprove = new UICommand("OnAttachApprove", storageDataCenterListModel); //$NON-NLS-1$ + onApprove.setTitle(ConstantsManager.getInstance().getConstants().ok()); + onApprove.setIsDefault(true); + model.getCommands().add(onApprove); + + UICommand cancel = new UICommand("Cancel", storageDataCenterListModel); //$NON-NLS-1$ + cancel.setTitle(ConstantsManager.getInstance().getConstants().cancel()); + cancel.setIsCancel(true); + model.getCommands().add(cancel); + } else { + executeAttachStorageDomains(model); + } + } + }), dataCenter, storageDomains); + } else { + executeAttachStorageDomains(model); + } + } + + public void onAttachApprove() { + ConfirmationModel model = (ConfirmationModel) getWindow(); + if (!model.validate()) { + return; + } + executeAttachStorageDomains(model); + } + + public void executeAttachStorageDomains(Model model) { + ArrayList<VdcActionParametersBase> parameters = new ArrayList<VdcActionParametersBase>(); + for (StoragePool dataCenter : getSelectedDataCentersForAttach()) { + parameters.add(new AttachStorageDomainToPoolParameters(getEntity().getId(), dataCenter.getId())); + } + Frontend.getInstance().runMultipleAction(VdcActionType.AttachStorageDomainToPool, parameters, + new IFrontendMultipleActionAsyncCallback() { + @Override + public void executed(FrontendMultipleActionAsyncResult result) { + ListModel localModel = (ListModel) result.getState(); + localModel.stopProgress(); + cancel(); + } + }, model); } private void detach() @@ -533,30 +592,29 @@ } else { - AsyncDataProvider.getLocalStorageHost(new AsyncQuery(new Object[] { this, getEntity() }, - new INewAsyncCallback() { - @Override - public void onSuccess(Object target, Object returnValue) { + AsyncDataProvider.getLocalStorageHost(new AsyncQuery(new Object[]{this, getEntity()}, + new INewAsyncCallback() { + @Override + public void onSuccess(Object target, Object returnValue) { - Object[] array = (Object[]) target; - StorageDataCenterListModel listModel = (StorageDataCenterListModel) array[0]; - StorageDomain storage = (StorageDomain) array[1]; - VDS locaVds = (VDS) returnValue; - RemoveStorageDomainParameters tempVar = - new RemoveStorageDomainParameters(storage.getId()); - tempVar.setVdsId((locaVds != null ? locaVds.getId() : null)); - tempVar.setDoFormat(true); - RemoveStorageDomainParameters removeStorageDomainParameters = tempVar; - listModel.getremovePrms().add(removeStorageDomainParameters); - if (listModel.getremovePrms().size() + listModel.getdetachPrms().size() == listModel.getSelectedItems() - .size()) - { - Frontend.getInstance().runMultipleAction(VdcActionType.RemoveStorageDomain, - listModel.getremovePrms()); - } + Object[] array = (Object[]) target; + StorageDataCenterListModel listModel = (StorageDataCenterListModel) array[0]; + StorageDomain storage = (StorageDomain) array[1]; + VDS locaVds = (VDS) returnValue; + RemoveStorageDomainParameters tempVar = + new RemoveStorageDomainParameters(storage.getId()); + tempVar.setVdsId((locaVds != null ? locaVds.getId() : null)); + tempVar.setDoFormat(true); + RemoveStorageDomainParameters removeStorageDomainParameters = tempVar; + listModel.getremovePrms().add(removeStorageDomainParameters); + if (listModel.getremovePrms().size() + listModel.getdetachPrms().size() == listModel.getSelectedItems() + .size()) { + Frontend.getInstance().runMultipleAction(VdcActionType.RemoveStorageDomain, + listModel.getremovePrms()); + } - } - }), + } + }), storageDomain.getStoragePoolName()); } @@ -724,6 +782,10 @@ { onAttach(); } + else if ("OnAttachApprove".equals(command.getName())) //$NON-NLS-1$ + { + onAttachApprove(); + } else if ("OnDetach".equals(command.getName())) //$NON-NLS-1$ { onDetach(); 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 eadf378..3e2a0b0 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 @@ -213,6 +213,7 @@ public StorageDomainType domainType = StorageDomainType.values()[0]; public StorageType storageType; public boolean removeConnection; + public List<StorageDomain> storageDomainsToAdd; @Override protected void initDetailModels() @@ -1017,6 +1018,25 @@ setConfirmWindow(null); } + private void cancelImportConfirm() { + cancelConfirm(); + getWindow().stopProgress(); + + if (fileConnection != null) { + Frontend.getInstance().runAction(VdcActionType.DisconnectStorageServerConnection, + new StorageServerConnectionParametersBase(fileConnection, hostId), + new IFrontendActionAsyncCallback() { + @Override + public void executed(FrontendActionAsyncResult result) { + StorageListModel storageListModel = (StorageListModel) result.getState(); + cleanConnection(storageListModel.fileConnection, storageListModel.hostId); + storageListModel.fileConnection = null; + } + }, + this); + } + } + private void cancel() { setWindow(null); @@ -1186,10 +1206,30 @@ { cancelConfirm(); } + else if ("CancelImportConfirm".equals(command.getName())) //$NON-NLS-1$ + { + cancelImportConfirm(); + } else if ("OnImport".equals(command.getName())) //$NON-NLS-1$ { onImport(); } + else if ("OnImportFile".equals(command.getName())) { //$NON-NLS-1$ + if (getConfirmWindow() != null && !((ConfirmationModel) getConfirmWindow()).validate()) + { + return; + } + cancelConfirm(); + getExistingStorageDomainList(); + } + else if ("OnImportSan".equals(command.getName())) { //$NON-NLS-1$ + if (getConfirmWindow() != null && !((ConfirmationModel) getConfirmWindow()).validate()) { + return; + } + cancelConfirm(); + onImportSanDomainApprove(); + } + else if ("OnRemove".equals(command.getName())) //$NON-NLS-1$ { onRemove(); @@ -1913,14 +1953,16 @@ importFileStorageInit(); } - private void importSanStorage(final TaskContext context) - { + private void importSanStorage(final TaskContext context) { this.context = context; - - ArrayList<Object> data = (ArrayList<Object>) context.getState(); StorageModel model = (StorageModel) getWindow(); - storageModel = model.getSelectedItem(); + ImportSanStorageModel importSanStorageModel = (ImportSanStorageModel) storageModel; + checkSanDomainAttachedToDc("OnImportSan", importSanStorageModel.getStorageDomains().getSelectedItems()); //$NON-NLS-1$ + } + + private void onImportSanDomainApprove() { + ArrayList<Object> data = (ArrayList<Object>) context.getState(); hostId = (Guid) data.get(1); ImportSanStorageModel importSanStorageModel = (ImportSanStorageModel) storageModel; @@ -2033,58 +2075,25 @@ tempVar.setMountOptions(glusterModel.getMountOptions().getEntity()); } storageListModel.fileConnection = tempVar; - storageListModel.importFileStorageConnect(); + importFileStorageConnect(); } } }), null, path); } - public void importFileStorageConnect() - { + public void importFileStorageConnect() { Frontend.getInstance().runAction(VdcActionType.AddStorageServerConnection, new StorageServerConnectionParametersBase(fileConnection, hostId), - new IFrontendActionAsyncCallback() { - @Override - public void executed(FrontendActionAsyncResult result) { - - StorageListModel storageListModel = (StorageListModel) result.getState(); + new IFrontendActionAsyncCallback() { + @Override + public void executed(FrontendActionAsyncResult result) { + StorageListModel storageListModel = (StorageListModel) result.getState(); VdcReturnValueBase returnVal = result.getReturnValue(); boolean success = returnVal != null && returnVal.getSucceeded(); - if (success) - { + if (success) { storageListModel.fileConnection.setid((String) returnVal.getActionReturnValue()); - AsyncDataProvider.getExistingStorageDomainList(new AsyncQuery(storageListModel, - new INewAsyncCallback() { - @Override - public void onSuccess(Object target, Object returnValue) { - - StorageListModel storageListModel1 = (StorageListModel) target; - ArrayList<StorageDomain> domains = (ArrayList<StorageDomain>) returnValue; - if (domains != null && !domains.isEmpty()) { - storageListModel1.importFileStorageAddDomain(domains); - } - else { - String errorMessage = domains == null ? - ConstantsManager.getInstance().getConstants() - .failedToRetrieveExistingStorageDomainInformationMsg() : - ConstantsManager.getInstance().getConstants() - .thereIsNoStorageDomainUnderTheSpecifiedPathMsg(); - - postImportFileStorage(storageListModel1.context, - false, - storageListModel1.storageModel, - errorMessage); - - storageListModel1.cleanConnection(storageListModel1.fileConnection, storageListModel1.hostId); - } - } - }), - hostId, - domainType, - storageType, - path); + checkFileDomainAttachedToDc("OnImportFile", storageListModel.fileConnection); //$NON-NLS-1$ } - else - { + else { postImportFileStorage(storageListModel.context, false, storageListModel.storageModel, @@ -2092,15 +2101,46 @@ .getConstants() .failedToRetrieveExistingStorageDomainInformationMsg()); } - } }, this); } - public void importFileStorageAddDomain(ArrayList<StorageDomain> domains) - { - StorageDomain sdToAdd = Linq.firstOrDefault(domains); + private void getExistingStorageDomainList() { + AsyncDataProvider.getExistingStorageDomainList(new AsyncQuery(this, + new INewAsyncCallback() { + @Override + public void onSuccess(Object target, Object returnValue) { + StorageListModel storageListModel = (StorageListModel) target; + ArrayList<StorageDomain> domains = (ArrayList<StorageDomain>) returnValue; + if (domains != null && !domains.isEmpty()) { + storageListModel.storageDomainsToAdd = domains; + addExistingFileStorageDomain(); + } + else { + String errorMessage = domains == null ? + ConstantsManager.getInstance().getConstants() + .failedToRetrieveExistingStorageDomainInformationMsg() : + ConstantsManager.getInstance().getConstants() + .thereIsNoStorageDomainUnderTheSpecifiedPathMsg(); + + postImportFileStorage(storageListModel.context, + false, + storageListModel.storageModel, + errorMessage); + + storageListModel.cleanConnection(storageListModel.fileConnection, storageListModel.hostId); + } + } + }), + hostId, + domainType, + storageType, + path); + } + + public void addExistingFileStorageDomain() { + StorageDomain sdToAdd = Linq.firstOrDefault(storageDomainsToAdd); StorageDomainStatic sdsToAdd = sdToAdd.getStorageStaticData(); StorageDomainManagementParameter params = new StorageDomainManagementParameter(sdsToAdd); @@ -2137,27 +2177,78 @@ public void postImportFileStorage(TaskContext context, boolean isSucceeded, IStorageModel model, String message) { Frontend.getInstance().runAction(VdcActionType.DisconnectStorageServerConnection, - new StorageServerConnectionParametersBase(fileConnection, hostId), - new IFrontendActionAsyncCallback() { - @Override - public void executed(FrontendActionAsyncResult result) { + new StorageServerConnectionParametersBase(fileConnection, hostId), + new IFrontendActionAsyncCallback() { + @Override + public void executed(FrontendActionAsyncResult result) { - VdcReturnValueBase returnValue = result.getReturnValue(); - boolean success = returnValue != null && returnValue.getSucceeded(); - if (success) { - fileConnection = null; + VdcReturnValueBase returnValue = result.getReturnValue(); + boolean success = returnValue != null && returnValue.getSucceeded(); + if (success) { + fileConnection = null; + } + Object[] array = (Object[]) result.getState(); + onFinish((TaskContext) array[0], + (Boolean) array[1], + (IStorageModel) array[2], + (String) array[3]); + } - Object[] array = (Object[]) result.getState(); - onFinish((TaskContext) array[0], - (Boolean) array[1], - (IStorageModel) array[2], - (String) array[3]); - - } - }, - new Object[] {context, isSucceeded, model, message}); + }, + new Object[] {context, isSucceeded, model, message}); } + private void checkSanDomainAttachedToDc(String commandName, List<StorageDomain> storageDomains) { + checkDomainAttachedToDc(commandName, storageDomains, null); + } + + private void checkFileDomainAttachedToDc(String commandName, StorageServerConnections storageServerConnections) { + checkDomainAttachedToDc(commandName, null, storageServerConnections); + } + + private void checkDomainAttachedToDc(String commandName, List<StorageDomain> storageDomains, + StorageServerConnections storageServerConnections) { + final StorageModel storageModel = (StorageModel) getWindow(); + StoragePool storagePool = storageModel.getDataCenter().getSelectedItem(); + + final UICommand okCommand = createOKCommand(commandName); + + if (storagePool.getId().equals(Guid.Empty)) { + okCommand.execute(); + return; + } + + VDS host = storageModel.getHost().getSelectedItem(); + + AsyncDataProvider.getStorageDomainsWithAttachedStoragePoolGuid( + new AsyncQuery(this, new INewAsyncCallback() { + @Override + public void onSuccess(Object target, Object returnValue) { + List<StorageDomainStatic> attachedStorageDomains = (List<StorageDomainStatic>) returnValue; + if (!attachedStorageDomains.isEmpty()) { + ConfirmationModel model = new ConfirmationModel(); + setConfirmWindow(model); + + model.setTitle(ConstantsManager.getInstance().getConstants().storageDomainsAttachedToDataCenterWarningTitle()); + model.setMessage(ConstantsManager.getInstance().getConstants().storageDomainsAttachedToDataCenterWarningMessage()); + model.setHelpTag(HelpTag.import_storage_domain_confirmation); + model.setHashName("import_storage_domain_confirmation"); //$NON-NLS-1$ + + List<String> stoageDomainNames = new ArrayList<String>(); + for (StorageDomainStatic domain : attachedStorageDomains) { + stoageDomainNames.add(domain.getStorageName()); + } + model.setItems(stoageDomainNames); + + UICommand cancelCommand = createCancelCommand("CancelImportConfirm"); //$NON-NLS-1$ + model.getCommands().add(okCommand); + model.getCommands().add(cancelCommand); + } else { + okCommand.execute(); + } + } + }), storagePool, storageDomains, storageServerConnections, host.getId()); + } @Override public void run(TaskContext context) @@ -2299,9 +2390,5 @@ public DiskProfileListModel getDiskProfileListModel() { return diskProfileListModel; - } - - public void setDiskProfileListModel(DiskProfileListModel diskProfileListModel) { - this.diskProfileListModel = diskProfileListModel; } } diff --git a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java index 580c7c5..bf7f134 100644 --- a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java +++ b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java @@ -2355,6 +2355,12 @@ @DefaultStringValue("The following VMs are attached to the instance type") String vmsAttachedToInstanceTypeWarningMessage(); + @DefaultStringValue("Are you sure?") + String storageDomainsAttachedToDataCenterWarningTitle(); + + @DefaultStringValue("Storage Domain(s) are already attached to a Data Center. Approving this operation might cause data corruption if both Data Centers are active.") + String storageDomainsAttachedToDataCenterWarningMessage(); + @DefaultStringValue("If period is specified, bytes per period must be specified as well.") String rngRateInvalid(); diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/DataCenterModule.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/DataCenterModule.java index 5fafb81..8cfb533 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/DataCenterModule.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/DataCenterModule.java @@ -174,7 +174,8 @@ DataCenterStorageListModel.class) { @Override public AbstractModelBoundPopupPresenterWidget<? extends Model, ?> getModelPopup(DataCenterStorageListModel source, - UICommand lastExecutedCommand, Model windowModel) { + UICommand lastExecutedCommand, + Model windowModel) { DataCenterStorageListModel model = getModel(); if (lastExecutedCommand == model.getAttachStorageCommand()) { @@ -190,7 +191,8 @@ @Override public AbstractModelBoundPopupPresenterWidget<? extends ConfirmationModel, ?> getConfirmModelPopup(DataCenterStorageListModel source, UICommand lastExecutedCommand) { - if (lastExecutedCommand == getModel().getDetachCommand()) { + if (lastExecutedCommand == getModel().getDetachCommand() || + lastExecutedCommand.getName().equals("OnAttach")) { //$NON-NLS-1$ ) { return removeConfirmPopupProvider.get(); } else { return super.getConfirmModelPopup(source, lastExecutedCommand); diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/StorageModule.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/StorageModule.java index d5e9296..1e67cf0 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/StorageModule.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/StorageModule.java @@ -97,7 +97,8 @@ if (lastExecutedCommand == getModel().getDestroyCommand()) { return destroyConfirmPopupProvider.get(); } - else if (lastExecutedCommand.getName().equals("OnSave")) { //$NON-NLS-1$ + else if (lastExecutedCommand.getName().equals("OnSave") //$NON-NLS-1$ + || lastExecutedCommand.getName().equals("OnImport")) { //$NON-NLS-1$ return forceCreateConfirmPopupProvider.get(); } else { return super.getConfirmModelPopup(source, lastExecutedCommand); @@ -191,7 +192,8 @@ @Override public AbstractModelBoundPopupPresenterWidget<? extends ConfirmationModel, ?> getConfirmModelPopup(StorageDataCenterListModel source, UICommand lastExecutedCommand) { - if (lastExecutedCommand == getModel().getDetachCommand()) { + if (lastExecutedCommand == getModel().getDetachCommand() || + lastExecutedCommand.getName().equals("OnAttach")) { //$NON-NLS-1$) { return removeConfirmPopupProvider.get(); } else { return super.getConfirmModelPopup(source, lastExecutedCommand); diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/StorageForceCreatePopupView.ui.xml b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/StorageForceCreatePopupView.ui.xml index 10d391e..60df04b 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/StorageForceCreatePopupView.ui.xml +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/StorageForceCreatePopupView.ui.xml @@ -23,7 +23,7 @@ } </ui:style> - <d:SimpleDialogPanel width="700px" height="300px"> + <d:SimpleDialogPanel width="700px" height="320px"> <d:content> <g:FlowPanel addStyleNames="{style.content}"> <g:Label ui:field="warningLabel" addStyleNames="{style.warningLabel}"/> -- To view, visit http://gerrit.ovirt.org/36545 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I22f7149e298ab38f816e49184f5d02b4e01e3db6 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: ovirt-engine-3.5 Gerrit-Owner: Maor Lipchuk <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
