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

Reply via email to