Alissa Bonas has uploaded a new change for review. Change subject: core: add ability edit nfs path in webadmin ......................................................................
core: add ability edit nfs path in webadmin Add the option to edit nfs path and the overriden additional options of storage domain (retransmissions, timeout, version) in webadmin UI --> Storage tab. The edit of those properties is available only when the storage domain is in maintenance status and is data/master domain, and for storage of nfs type. These are the only properties which are editable in this status. Edit is still available for storage domains in status Active/Mixed, but only for name and description - like it was before this patch. Change-Id: Ifaff5344ff191d6bdf53cc706c7bb796167a56b3 Signed-off-by: Alissa Bonas <[email protected]> --- A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/UpdateStorageServerConnectionCommand.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java M backend/manager/modules/dal/src/main/resources/bundles/ExecutionMessages.properties M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/NfsStorageModel.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/storage/StorageModel.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/NfsStorageView.java 8 files changed, 154 insertions(+), 45 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/72/12372/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/UpdateStorageServerConnectionCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/UpdateStorageServerConnectionCommand.java new file mode 100644 index 0000000..ef3e5d7 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/UpdateStorageServerConnectionCommand.java @@ -0,0 +1,73 @@ +package org.ovirt.engine.core.bll.storage; + +import org.ovirt.engine.core.bll.LockMessagesMatchUtil; +import org.ovirt.engine.core.common.action.StorageServerConnectionParametersBase; +import org.ovirt.engine.core.common.businessentities.StorageServerConnections; +import org.ovirt.engine.core.common.businessentities.StorageType; +import org.ovirt.engine.core.common.utils.Pair; +import org.ovirt.engine.core.common.validation.NfsMountPointConstraint; +import org.ovirt.engine.core.common.vdscommands.ConnectStorageServerVDSCommandParameters; +import org.ovirt.engine.core.common.vdscommands.VDSCommandType; +import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; +import org.ovirt.engine.core.dal.VdcBllMessages; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Map; + +public class UpdateStorageServerConnectionCommand<T extends StorageServerConnectionParametersBase> extends StorageServerConnectionCommandBase<T> { + StorageServerConnections oldConnection = null; + + public UpdateStorageServerConnectionCommand(T parameters) { + super(parameters); + } + + @Override + protected boolean canDoAction() { + StorageServerConnections connection = getParameters().getStorageServerConnection(); + //Check if the NFS path has a valid format + if (connection.getstorage_type() == StorageType.NFS + && !new NfsMountPointConstraint().isValid(connection.getconnection(), null)) { + return failCanDoAction(VdcBllMessages.VALIDATION_STORAGE_CONNECTION_INVALID); + } + //Check if connection exists by id - otherwise there's nothing to update + String connectionId = connection.getid(); + oldConnection = getDbFacade().getStorageServerConnectionDao().get(connectionId); + if(oldConnection == null) { + return failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_CONNECTION_NOT_EXIST); + } + return super.canDoAction(); + } + + @Override + protected void executeCommand() { + ConnectStorageServerVDSCommandParameters newConnectionParametersForVdsm = new ConnectStorageServerVDSCommandParameters(getParameters().getVdsId(), getParameters() + .getStoragePoolId(), getParameters().getStorageServerConnection().getstorage_type(), + new ArrayList<StorageServerConnections>(Arrays + .asList(getParameters().getStorageServerConnection()))); + + VDSReturnValue returnValueConnect = runVdsCommand(VDSCommandType.ConnectStorageServer,newConnectionParametersForVdsm); + if (returnValueConnect.getSucceeded()) { + getDbFacade().getStorageServerConnectionDao().update(getParameters().getStorageServerConnection()); + //Disconnect the old storage server connection via vdsm - only after update in db to a new connection succeeds + ConnectStorageServerVDSCommandParameters oldConnectionParametersForVdsm = new ConnectStorageServerVDSCommandParameters(getParameters().getVdsId(), getParameters() + .getStoragePoolId(), oldConnection.getstorage_type(), + new ArrayList<StorageServerConnections>(Arrays + .asList(oldConnection))); + runVdsCommand(VDSCommandType.DisconnectStorageServer,oldConnectionParametersForVdsm); + setSucceeded(true); + } + } + + @Override + protected Map<String, Pair<String, String>> getExclusiveLocks() { + return Collections.singletonMap(getParameters().getStorageServerConnection().getid(), LockMessagesMatchUtil.STORAGE); + } + + @Override + protected void setActionMessageParameters() { + addCanDoActionMessage(VdcBllMessages.VAR__ACTION__UPDATE); + addCanDoActionMessage(VdcBllMessages.VAR__TYPE__STORAGE__DOMAIN); + } +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java index ed6cd19..897fc2f 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java @@ -216,6 +216,7 @@ AddExistingNFSStorageDomain(960, ActionGroup.CREATE_STORAGE_DOMAIN, QuotaDependency.NONE), AddExistingSANStorageDomain(961, ActionGroup.CREATE_STORAGE_DOMAIN, QuotaDependency.NONE), AddStorageServerConnection(1000, ActionGroup.CREATE_STORAGE_DOMAIN, QuotaDependency.NONE), + UpdateStorageServerConnection(1001,ActionGroup.CREATE_STORAGE_DOMAIN,QuotaDependency.NONE), DisconnectStorageServerConnection(1002, ActionGroup.CREATE_STORAGE_DOMAIN, QuotaDependency.NONE), ConnectHostToStoragePoolServers(1004, QuotaDependency.NONE), DisconnectHostFromStoragePoolServers(1005, QuotaDependency.NONE), diff --git a/backend/manager/modules/dal/src/main/resources/bundles/ExecutionMessages.properties b/backend/manager/modules/dal/src/main/resources/bundles/ExecutionMessages.properties index 237817b..1836759 100644 --- a/backend/manager/modules/dal/src/main/resources/bundles/ExecutionMessages.properties +++ b/backend/manager/modules/dal/src/main/resources/bundles/ExecutionMessages.properties @@ -61,6 +61,7 @@ job.AddExistingSANStorageDomain=Adding SAN Storage Domain ${Storage} job.AddStorageServerConnection=Connecting Host ${VDS} to Storage server job.DisconnectStorageServerConnection=Disconnecting from Storage server on ${VDS} +job.UpdateStorageServerConnection=Updating storage connection details job.ConnectStorageToVds=Connecting Host ${VDS} to Storage server job.AddVmPoolWithVms=Creating VM Pool ${VmPool} from template ${VmTemplate} job.ChangeDisk=Changing CD-ROM for VM ${VM} diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/NfsStorageModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/NfsStorageModel.java index 62a904d..5cf0c06 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/NfsStorageModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/NfsStorageModel.java @@ -132,22 +132,6 @@ timeout = value; } - private boolean isEditMode; - - public void setIsEditMode(boolean isEditMode) { - boolean isChangable = !isEditMode && (Boolean) getOverride().getEntity(); - getPath().setIsChangable(isChangable); - getOverride().setIsChangable(isChangable); - getVersion().setIsChangable(isChangable); - getRetransmissions().setIsChangable(isChangable); - getTimeout().setIsChangable(isChangable); - this.isEditMode = isEditMode; - } - - public boolean getIsEditMode() { - return isEditMode; - } - static { @@ -187,12 +171,10 @@ private void Override_EntityChanged(EventArgs e) { // Advanced options are editable only if override checkbox is enabled // and the dialog is not editing existing nfs storage. - if (!getIsEditMode()) { - boolean isChangable = (Boolean) getOverride().getEntity(); - getVersion().setIsChangable(isChangable); - getRetransmissions().setIsChangable(isChangable); - getTimeout().setIsChangable(isChangable); - } + boolean isChangeable = (Boolean) getOverride().getEntity(); + getVersion().setIsChangable(isChangeable); + getRetransmissions().setIsChangable(isChangeable); + getTimeout().setIsChangable(isChangeable); } @Override 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 65318b0..6a9904f 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 @@ -123,7 +123,7 @@ { super.UpdateInternal(); - if (!getContainer().isStorageActive()) { + if (!(getContainer().isNewStorage() || getContainer().isStorageActive())) { return; } 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 660c7b1..38188cd 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 @@ -18,6 +18,7 @@ import org.ovirt.engine.core.common.businessentities.NfsVersion; 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; import org.ovirt.engine.core.common.businessentities.StorageServerConnections; @@ -356,17 +357,20 @@ model.getDataCenter().setIsChangable(false); model.getFormat().setIsChangable(false); - boolean isStorageActive = model.isStorageActive(); + boolean isStorageEditable = model.isStorageActive() || model.isNewStorage(); model.getHost().setIsChangable(false); - model.getName().setIsChangable(isStorageActive); - model.getAvailableStorageItems().setIsChangable(isStorageActive); - model.setIsChangable(isStorageActive); + model.getName().setIsChangable(isStorageEditable); + model.getDescription().setIsChangable(isStorageEditable); + model.getAvailableStorageItems().setIsChangable(isStorageEditable); + model.setIsChangable(isStorageEditable); IStorageModel item = null; switch (storage.getstorage_type()) { case NFS: item = PrepareNfsStorageForEdit(storage); + boolean isPathAndOverrideOptsEditable = isNfsPathEditable(storage); + isStorageEditable = isStorageEditable || isPathAndOverrideOptsEditable; break; case FCP: @@ -403,8 +407,9 @@ } } + UICommand command; - if (isStorageActive) { + if (isStorageEditable) { command = new UICommand("OnSave", this); //$NON-NLS-1$ command.setTitle(ConstantsManager.getInstance().getConstants().ok()); command.setIsDefault(true); @@ -427,7 +432,11 @@ { final NfsStorageModel model = new NfsStorageModel(); model.setRole(storage.getstorage_domain_type()); - model.setIsEditMode(true); + + boolean isPathAndOverrideOptsEditable = isNfsPathEditable(storage); + + model.getPath().setIsChangable(isPathAndOverrideOptsEditable); + model.getOverride().setIsChangable(isPathAndOverrideOptsEditable); AsyncDataProvider.GetStorageConnectionById(new AsyncQuery(null, new INewAsyncCallback() { @Override @@ -439,7 +448,6 @@ model.getTimeout().setEntity(connection.getNfsTimeo()); for (Object item : model.getVersion().getItems()) { - EntityModel itemModel = (EntityModel) item; boolean noNfsVersion = itemModel.getEntity() == null && connection.getNfsVersion() == null; boolean foundNfsVersion = itemModel.getEntity() != null && @@ -461,6 +469,10 @@ }), storage.getstorage(), true); return model; + } + + private boolean isNfsPathEditable(storage_domains storage) { + return (storage.getstorage_domain_type() == StorageDomainType.Data || storage.getstorage_domain_type() == StorageDomainType.Master) && storage.getstatus() == StorageDomainStatus.Maintenance; } private IStorageModel PrepareLocalStorageForEdit(storage_domains storage) @@ -530,9 +542,9 @@ { StorageModel storageModel = (StorageModel) getWindow(); storage_domains storage = (storage_domains) getSelectedItem(); - boolean isStorageActive = storageModel.isStorageActive(); + boolean isStorageEditable = storageModel.isStorageActive() || storageModel.isNewStorage(); - if (isStorageActive) { + if (isStorageEditable) { storageModel.getHost().getSelectedItemChangedEvent().addListener(new IEventListener() { @Override public void eventRaised(Event ev, Object sender, EventArgs args) { @@ -1066,12 +1078,15 @@ if (storageDomain == null) { return false; } - + boolean isEditAvailable; boolean isActive = storageDomain.getstorage_domain_shared_status() == StorageDomainSharedStatus.Active || storageDomain.getstorage_domain_shared_status() == StorageDomainSharedStatus.Mixed; + boolean isInMaintenance = (storageDomain.getstatus() == StorageDomainStatus.Maintenance); + boolean isDataDomain = (storageDomain.getstorage_domain_type() == StorageDomainType.Data) || (storageDomain.getstorage_domain_type() == StorageDomainType.Master); boolean isBlockStorage = storageDomain.getstorage_type().isBlockDomain(); - return isBlockStorage ? true : isActive; + isEditAvailable = isActive || isBlockStorage || ( isInMaintenance && isDataDomain) ; + return isEditAvailable; } @Override @@ -1277,6 +1292,9 @@ storageDomain.setDescription((String) model.getDescription().getEntity()); storageDomain.setStorageFormat((StorageFormatType) model.getFormat().getSelectedItem()); + connection = new StorageServerConnections(); + connection.setid(selectedItem.getstorage()); + if (isNew) { AsyncDataProvider.GetStorageDomainsByConnection(new AsyncQuery(this, new INewAsyncCallback() { @@ -1301,19 +1319,49 @@ } else { - Frontend.RunAction(VdcActionType.UpdateStorageDomain, new StorageDomainManagementParameter(storageDomain), + storage_domains storage = (storage_domains) getSelectedItem(); + if(isNfsPathEditable(storage)) { + updateNfsPath(); + } + else { + Frontend.RunAction(VdcActionType.UpdateStorageDomain, new StorageDomainManagementParameter(storageDomain), new IFrontendActionAsyncCallback() { @Override public void Executed(FrontendActionAsyncResult result) { - StorageListModel storageListModel = (StorageListModel) result.getState(); storageListModel.OnFinish(storageListModel.context, true, storageListModel.storageModel); } }, this); + } } } + private void updateNfsPath() { + StorageModel model = (StorageModel) getWindow(); + NfsStorageModel nfsModel = (NfsStorageModel) model.getSelectedItem(); + VDS host = (VDS) model.getHost().getSelectedItem(); + + connection.setconnection(path); + connection.setstorage_type(nfsModel.getType()); + if ((Boolean) nfsModel.getOverride().getEntity()) { + connection.setNfsVersion((NfsVersion) ((EntityModel) nfsModel.getVersion().getSelectedItem()).getEntity()); + connection.setNfsRetrans(nfsModel.getRetransmissions().AsConvertible().nullableShort()); + connection.setNfsTimeo(nfsModel.getTimeout().AsConvertible().nullableShort()); + } + + Frontend.RunAction(VdcActionType.UpdateStorageServerConnection, new StorageServerConnectionParametersBase(connection, host.getId()), + new IFrontendActionAsyncCallback() { + @Override + public void Executed(FrontendActionAsyncResult result) { + StorageListModel storageListModel = (StorageListModel) result.getState(); + storageListModel.OnFinish(storageListModel.context, true, storageListModel.storageModel); + + } + }, this); + } + + public void SaveNewNfsStorage() { StorageModel model = (StorageModel) getWindow(); diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageModel.java index 9724c11..41954ff 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageModel.java @@ -739,8 +739,12 @@ } public boolean isStorageActive() { - return getStorage() == null - || getStorage().getstorage_domain_shared_status() == StorageDomainSharedStatus.Active + return + getStorage().getstorage_domain_shared_status() == StorageDomainSharedStatus.Active || getStorage().getstorage_domain_shared_status() == StorageDomainSharedStatus.Mixed; } + + public boolean isNewStorage() { + return getStorage() == null; + } } diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/NfsStorageView.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/NfsStorageView.java index 7780e41..bbd8208 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/NfsStorageView.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/NfsStorageView.java @@ -172,15 +172,15 @@ EntityModel version = (EntityModel) object.getVersion().getSelectedItem(); versionReadOnlyEditor.asValueBox().setValue(version != null ? version.getTitle() : null); - pathHintLabel.setVisible(object.getPath().getIsAvailable() && !object.getIsEditMode()); + pathHintLabel.setVisible(object.getPath().getIsChangable()); - styleTextBoxEditor(pathEditor, !object.getIsEditMode()); - styleTextBoxEditor(timeoutEditor, !object.getIsEditMode()); - styleTextBoxEditor(retransmissionsEditor, !object.getIsEditMode()); - styleTextBoxEditor(versionReadOnlyEditor, !object.getIsEditMode()); + styleTextBoxEditor(pathEditor, object.getPath().getIsChangable()); + styleTextBoxEditor(timeoutEditor, object.getOverride().getIsChangable()); + styleTextBoxEditor(retransmissionsEditor, object.getOverride().getIsChangable()); + styleTextBoxEditor(versionReadOnlyEditor, object.getOverride().getIsChangable()); - setElementVisibility(versionEditor, !object.getIsEditMode() && object.getVersion().getIsAvailable()); - setElementVisibility(versionReadOnlyEditor, object.getIsEditMode() || !object.getVersion().getIsAvailable()); + setElementVisibility(versionEditor, object.getOverride().getIsChangable()); + setElementVisibility(versionReadOnlyEditor, !object.getOverride().getIsChangable()); setElementVisibility(versionLabel, object.getVersion().getIsAvailable()); setElementVisibility(retransmissionsLabel, object.getRetransmissions().getIsAvailable()); setElementVisibility(timeoutLabel, object.getTimeout().getIsAvailable()); -- To view, visit http://gerrit.ovirt.org/12372 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ifaff5344ff191d6bdf53cc706c7bb796167a56b3 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Alissa Bonas <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
