Allon Mureinik has uploaded a new change for review. Change subject: core,webadmin: [WIP] Unifying Move and LiveMigrate ......................................................................
core,webadmin: [WIP] Unifying Move and LiveMigrate Provide a simpler API for moving disks. Created a single MoveDiskCommand which delegates either to the legacy MoveOrCopyDiskCommand with ImageOperation=Move or to the new LiveMigrateDiskCOmmand according to the status of the VM containing it (assuming there is one, and only one, of course). In the UI, each model now returns its own VdcActionType and parameters object instead of the base MoveOrCopyDiskModel pivoting according to the ImageOperation. Change-Id: I632af0b35f369f1d28ebe1963a9938ea1808cba4 Signed-off-by: Allon Mureinik <amure...@redhat.com> --- A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveDiskCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyDiskCommand.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/MoveDiskParameters.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/MoveOrCopyDiskModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/templates/CopyDiskModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/MoveDiskModel.java 8 files changed, 138 insertions(+), 39 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/10/8510/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveDiskCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveDiskCommand.java new file mode 100644 index 0000000..10db5eb --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveDiskCommand.java @@ -0,0 +1,64 @@ +package org.ovirt.engine.core.bll; + +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import org.ovirt.engine.core.bll.utils.PermissionSubject; +import org.ovirt.engine.core.common.action.LiveMigrateDiskParameters; +import org.ovirt.engine.core.common.action.MoveDiskParameters; +import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.common.businessentities.VM; +import org.ovirt.engine.core.common.businessentities.VMStatus; +import org.ovirt.engine.core.compat.Guid; + +@SuppressWarnings("serial") +public class MoveDiskCommand<T extends MoveDiskParameters> extends BaseImagesCommand<T> { + public MoveDiskCommand(Guid commandId) { + super(commandId); + } + + public MoveDiskCommand(T parameters) { + super(parameters); + } + + @Override + protected void executeCommand() { + VM vmWithDisk = getVMByParameterDisk(); + if (vmWithDisk.getstatus() == VMStatus.Up && vmWithDisk.getrun_on_vds() != null && !vmWithDisk.getrun_on_vds().equals(Guid.Empty)) { + getBackend().RunAction(VdcActionType.LiveMigrateDisk, + new LiveMigrateDiskParameters(getImageId(), + getParameters().getSourceDomainId(), + getParameters().getStorageDomainId(), + vmWithDisk.getId())); + } else { + getBackend().RunAction(VdcActionType.MoveOrCopyDisk, getParameters()); + } + } + + @Override + public List<PermissionSubject> getPermissionCheckSubjects() { + // Will be checked in the internal commands + return Collections.<PermissionSubject> emptyList(); + } + + @Override + protected boolean isUserAuthorizedToRunAction() { + // Done in the children + return true; + } + + private VM getVMByParameterDisk() { + Map<Boolean, List<VM>> allVms = getVmDAO().getForDisk(getDiskImage().getId()); + if (allVms.isEmpty()) { + return null; + } + + List<VM> pluggedVms = allVms.get(true); + if (pluggedVms == null || pluggedVms.size() != 1) { + return null; + } + + return pluggedVms.get(0); + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyDiskCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyDiskCommand.java index 020242d..b95af02 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyDiskCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyDiskCommand.java @@ -79,7 +79,8 @@ && checkTemplateInDestStorageDomain() && validateSpaceRequirements() && checkImageConfiguration(canDoActionMessages) - && checkCanBeMoveInVm() && checkIfNeedToBeOverride(); + && checkCanBeMoveInVm() + && checkIfNeedToBeOverride(); } protected boolean isSourceAndDestTheSame() { diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/MoveDiskParameters.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/MoveDiskParameters.java new file mode 100644 index 0000000..75a9bfc --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/MoveDiskParameters.java @@ -0,0 +1,18 @@ +package org.ovirt.engine.core.common.action; + +import org.ovirt.engine.core.common.businessentities.ImageOperation; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.compat.NGuid; + +public class MoveDiskParameters extends MoveOrCopyImageGroupParameters { + private static final long serialVersionUID = 6007874805077449968L; + + public MoveDiskParameters() { + } + + public MoveDiskParameters(Guid imageId, + NGuid sourceDomainId, + Guid destDomainId) { + super(imageId, sourceDomainId, destDomainId, ImageOperation.Move); + } +} 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 db22158..2d1f313 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 @@ -224,6 +224,7 @@ ConnectAllHostsToLun(1008), AddPosixFsStorageDomain(1009, ActionGroup.CREATE_STORAGE_DOMAIN), LiveMigrateDisk(1010), + MoveDisk(1011), // Event Notification AddEventSubscription(1100), 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 61f319d..846ade4 100644 --- a/backend/manager/modules/dal/src/main/resources/bundles/ExecutionMessages.properties +++ b/backend/manager/modules/dal/src/main/resources/bundles/ExecutionMessages.properties @@ -70,6 +70,7 @@ job.SetNonOperationalVds=Setting Host ${VDS} to Non-Operational mode. job.RemoveSnapshot=Removing Snapshot ${Snapshot} of VM ${VM} job.LiveMigrateDisk=Migrating Disk from ${SourceSD} to ${TargetSD} +job.MoveDisk=Moving Disk from ${SourceSD} to ${TargetSD} # Step types step.VALIDATING=Validating diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/MoveOrCopyDiskModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/MoveOrCopyDiskModel.java index 7f0e8e3..0cdaf41 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/MoveOrCopyDiskModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/MoveOrCopyDiskModel.java @@ -3,14 +3,12 @@ import java.util.ArrayList; import java.util.Collections; -import org.ovirt.engine.core.common.action.LiveMigrateDiskParameters; import org.ovirt.engine.core.common.action.MoveOrCopyImageGroupParameters; import org.ovirt.engine.core.common.action.VdcActionParametersBase; 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.common.businessentities.DiskImage; -import org.ovirt.engine.core.common.businessentities.ImageOperation; import org.ovirt.engine.core.common.businessentities.Quota; import org.ovirt.engine.core.common.businessentities.QuotaEnforcementTypeEnum; import org.ovirt.engine.core.common.businessentities.storage_domains; @@ -106,6 +104,13 @@ protected abstract void updateMoveOrCopySingleDiskParameters(ArrayList<VdcActionParametersBase> parameters, DiskModel diskModel); + protected abstract VdcActionType getActionType(); + + protected abstract MoveOrCopyImageGroupParameters createParameters( + Guid sourceStorageDomainGuid, + Guid destStorageDomainGuid, + DiskImage disk); + public MoveOrCopyDiskModel() { allDisks = new ArrayList<DiskModel>(); storageDomains = new ArrayList<storage_domains>(); @@ -137,7 +142,6 @@ storageDomains.add(storage); } } - Collections.sort(storageDomains, new Linq.StorageDomainByNameComparer()); if (!storageDomains.isEmpty()) { @@ -245,14 +249,14 @@ } private void OnMove() { - OnMoveOrCopy(ImageOperation.Move); + OnMoveOrCopy(); } private void OnCopy() { - OnMoveOrCopy(ImageOperation.Copy); + OnMoveOrCopy(); } - protected void OnMoveOrCopy(ImageOperation imageOperation) { + protected void OnMoveOrCopy() { if (this.getProgress() != null) { return; @@ -297,17 +301,13 @@ addMoveOrCopyParameters(parameters, sourceStorageDomainGuid, destStorageDomainGuid, - disk, - imageOperation); + disk); } } StartProgress(null); - VdcActionType actionType = getVmId() == null ? - VdcActionType.MoveOrCopyDisk : VdcActionType.LiveMigrateDisk; - - Frontend.RunMultipleAction(actionType, parameters, + Frontend.RunMultipleAction(getActionType(), parameters, new IFrontendMultipleActionAsyncCallback() { @Override public void Executed(FrontendMultipleActionAsyncResult result) { @@ -322,29 +322,12 @@ protected void addMoveOrCopyParameters(ArrayList<VdcActionParametersBase> parameters, Guid sourceStorageDomainGuid, Guid destStorageDomainGuid, - DiskImage disk, - ImageOperation imageOperation) { + DiskImage disk) { - VdcActionParametersBase diskParameters; + MoveOrCopyImageGroupParameters params = createParameters(sourceStorageDomainGuid, destStorageDomainGuid, disk); + params.setQuotaId(disk.getQuotaId()); - if (getVmId() == null) { - diskParameters = - new MoveOrCopyImageGroupParameters(disk.getImageId(), - sourceStorageDomainGuid, - destStorageDomainGuid, - imageOperation); - - ((MoveOrCopyImageGroupParameters) diskParameters).setQuotaId(disk.getQuotaId()); - } - else { - diskParameters = - new LiveMigrateDiskParameters(disk.getImageId(), - sourceStorageDomainGuid, - destStorageDomainGuid, - getVmId()); - } - - parameters.add(diskParameters); + parameters.add(params); } @Override diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/templates/CopyDiskModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/templates/CopyDiskModel.java index 38d7028..bf7709d 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/templates/CopyDiskModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/templates/CopyDiskModel.java @@ -2,7 +2,9 @@ import java.util.ArrayList; +import org.ovirt.engine.core.common.action.MoveOrCopyImageGroupParameters; import org.ovirt.engine.core.common.action.VdcActionParametersBase; +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.common.businessentities.DiskImage; @@ -113,9 +115,23 @@ addMoveOrCopyParameters(parameters, Guid.Empty, storageDomain.getId(), - (DiskImage) diskModel.getDisk(), - ImageOperation.Copy); + (DiskImage) diskModel.getDisk()); } } + @Override + protected VdcActionType getActionType() { + return VdcActionType.MoveOrCopyDisk; + } + + @Override + protected MoveOrCopyImageGroupParameters createParameters(Guid sourceStorageDomainGuid, + Guid destStorageDomainGuid, + DiskImage disk) { + return new MoveOrCopyImageGroupParameters(disk.getImageId(), + sourceStorageDomainGuid, + destStorageDomainGuid, + ImageOperation.Copy); + } + } diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/MoveDiskModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/MoveDiskModel.java index 44fb550..f227e06 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/MoveDiskModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/MoveDiskModel.java @@ -2,11 +2,13 @@ import java.util.ArrayList; +import org.ovirt.engine.core.common.action.MoveDiskParameters; +import org.ovirt.engine.core.common.action.MoveOrCopyImageGroupParameters; import org.ovirt.engine.core.common.action.VdcActionParametersBase; +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.common.businessentities.DiskImage; -import org.ovirt.engine.core.common.businessentities.ImageOperation; import org.ovirt.engine.core.common.businessentities.storage_domains; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.ui.frontend.AsyncQuery; @@ -96,8 +98,21 @@ addMoveOrCopyParameters(parameters, Guid.Empty, selectedStorageDomain.getId(), - (DiskImage) diskModel.getDisk(), - ImageOperation.Move); + (DiskImage) diskModel.getDisk()); + } + + @Override + protected VdcActionType getActionType() { + return VdcActionType.MoveDisk; + } + + @Override + protected MoveOrCopyImageGroupParameters createParameters(Guid sourceStorageDomainGuid, + Guid destStorageDomainGuid, + DiskImage disk) { + return new MoveDiskParameters(disk.getImageId(), + sourceStorageDomainGuid, + destStorageDomainGuid); } } -- To view, visit http://gerrit.ovirt.org/8510 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I632af0b35f369f1d28ebe1963a9938ea1808cba4 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Allon Mureinik <amure...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches