Tomas Jelinek has uploaded a new change for review.

Change subject: core: thin vm becomes clone
......................................................................

core: thin vm becomes clone

Change-Id: Icd9782930cc3e3b76fd1cfd32cf78007171cad9e
Signed-off-by: Tomas Jelinek <tjeli...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmAndCloneImageCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneVmCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java
4 files changed, 148 insertions(+), 31 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/63/32463/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmAndCloneImageCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmAndCloneImageCommand.java
index ae9e442..da3c078 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmAndCloneImageCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmAndCloneImageCommand.java
@@ -335,8 +335,12 @@
     protected void executeVmCommand() {
         super.executeVmCommand();
         setVm(null);
-        getVm().setVmtGuid(VmTemplateHandler.BLANK_VM_TEMPLATE_ID);
+        resetVmtGuid();
         getVmStaticDao().update(getVm().getStaticData());
+    }
+
+    protected void resetVmtGuid() {
+        getVm().setVmtGuid(VmTemplateHandler.BLANK_VM_TEMPLATE_ID);
     }
 
     @Override
@@ -394,11 +398,15 @@
 
     @Override
     protected boolean addVmImages() {
+        return doCopyImages(getDiskImagesFromConfiguration(), 
diskInfoDestinationMap);
+    }
+
+    protected boolean doCopyImages(Collection<DiskImage> diskInfos, Map<Guid, 
DiskImage> diskInfoDestinationMap) {
         int numberOfStartedCopyTasks = 0;
         try {
-            if (!getDiskImagesFromConfiguration().isEmpty()) {
+            if (!diskInfos.isEmpty()) {
                 lockEntities();
-                for (DiskImage diskImage : getDiskImagesFromConfiguration()) {
+                for (DiskImage diskImage : diskInfos) {
                     // For illegal image check if it was snapshot as illegal 
(therefore
                     // still exists at DB, or was it erased after snapshot - 
therefore the
                     // query returned to UI an illegal image)
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java
index a5e491f..09a68b3 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java
@@ -198,7 +198,7 @@
         return locks;
     }
 
-    private String getTemplateSharedLockMessage() {
+    protected String getTemplateSharedLockMessage() {
         return new 
StringBuilder(VdcBllMessages.ACTION_TYPE_FAILED_TEMPLATE_IS_USED_FOR_CREATE_VM.name())
                 .append(String.format("$VmName %1$s", getVmName()))
                 .toString();
@@ -716,7 +716,7 @@
         return true;
     }
 
-    private DiskImage makeNewImage(Guid storageId, DiskImage image) {
+    protected DiskImage makeNewImage(Guid storageId, DiskImage image) {
         DiskImage newImage = new DiskImage();
         newImage.setImageId(image.getImageId());
         newImage.setDiskAlias(image.getDiskAlias());
@@ -864,7 +864,7 @@
      * If both the instance type and the template is set, than all the devices 
has to be copied from instance type except the
      * disk devices which has to be copied from the template (since the 
instance type has no disks but the template does have).
      */
-    private void copyDiskDevicesFromTemplate() {
+    protected void copyDiskDevicesFromTemplate() {
         List<VmDevice> disks =
                 DbFacade.getInstance()
                         .getVmDeviceDao()
@@ -981,24 +981,28 @@
     }
 
     protected boolean addVmImages() {
+        return 
doAddImagesFromTemplate(getImagesToCheckDestinationStorageDomains(), 
diskInfoDestinationMap);
+    }
+
+    protected boolean doAddImagesFromTemplate(Collection<DiskImage> 
diskImages, Map<Guid, DiskImage> diskToDestination) {
         if (vmDisksSource.getDiskTemplateMap().size() > 0) {
             if (getVm().getStatus() != VMStatus.Down) {
                 log.error("Cannot add images. VM is not Down");
                 throw new 
VdcBLLException(VdcBllErrors.IRS_IMAGE_STATUS_ILLEGAL);
             }
             VmHandler.lockVm(getVmId());
-            for (DiskImage dit : getImagesToCheckDestinationStorageDomains()) {
+            for (DiskImage dit : diskImages) {
                 CreateSnapshotFromTemplateParameters tempVar = new 
CreateSnapshotFromTemplateParameters(
                         dit.getImageId(), 
getParameters().getVmStaticData().getId());
-                
tempVar.setDestStorageDomainId(diskInfoDestinationMap.get(dit.getId()).getStorageIds().get(0));
-                
tempVar.setDiskAlias(diskInfoDestinationMap.get(dit.getId()).getDiskAlias());
+                
tempVar.setDestStorageDomainId(diskToDestination.get(dit.getId()).getStorageIds().get(0));
+                
tempVar.setDiskAlias(diskToDestination.get(dit.getId()).getDiskAlias());
                 tempVar.setStorageDomainId(dit.getStorageIds().get(0));
                 tempVar.setVmSnapshotId(getVmSnapshotId());
-                tempVar.setParentCommand(VdcActionType.AddVm);
+                tempVar.setParentCommand(getParentActionType());
                 tempVar.setEntityInfo(getParameters().getEntityInfo());
                 tempVar.setParentParameters(getParameters());
-                
tempVar.setQuotaId(diskInfoDestinationMap.get(dit.getId()).getQuotaId());
-                
tempVar.setDiskProfileId(diskInfoDestinationMap.get(dit.getId()).getDiskProfileId());
+                
tempVar.setQuotaId(diskToDestination.get(dit.getId()).getQuotaId());
+                
tempVar.setDiskProfileId(diskToDestination.get(dit.getId()).getDiskProfileId());
                 VdcReturnValueBase result = 
runInternalActionWithTasksContext(VdcActionType.CreateSnapshotFromTemplate, 
tempVar);
 
                 /**
@@ -1016,6 +1020,10 @@
         return true;
     }
 
+    protected VdcActionType getParentActionType() {
+        return VdcActionType.AddVm;
+    }
+
     @Override
     public AuditLogType getAuditLogTypeValue() {
         switch (getActionState()) {
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneVmCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneVmCommand.java
index e269b3a..1b5a04e 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneVmCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneVmCommand.java
@@ -49,12 +49,34 @@
 
         oldVmId = getParameters().getVmId();
         setVmName(getParameters().getVm().getName());
+        setVmTemplateId(getParameters().getVm().getVmtGuid());
 
         // init the parameters only at first instantiation (not subsequent for 
end action)
         if (Guid.isNullOrEmpty(parameters.getNewVmGuid())) {
             setupParameters();
         }
 
+    }
+
+    @Override
+    protected boolean addVmImages() {
+        VmTemplateHandler.updateDisksFromDb(getVmTemplate());
+
+        if (!isTemplateDependent()) {
+            return super.addVmImages();
+        } else {
+            return 
doAddImagesFromTemplate(getVmTemplate().getDiskImageMap().values(), 
diskInfoDestinationMap) &&
+                    doCopyImages(getDiskImagesFromConfiguration(), 
diskInfoDestinationMap);
+        }
+    }
+
+    @Override
+    protected void copyVmDevices() {
+        super.copyVmDevices();
+
+        if (isTemplateDependent()) {
+            copyDiskDevicesFromTemplate();
+        }
     }
 
     @Override
@@ -77,6 +99,11 @@
     protected Map<String, Pair<String, String>> getSharedLocks() {
         Map<String, Pair<String, String>> locks = new HashMap<>();
 
+        if (isTemplateDependent()) {
+            locks.put(getVmTemplateId().toString(),
+                    
LockMessagesMatchUtil.makeLockingPair(LockingGroup.TEMPLATE, 
getTemplateSharedLockMessage()));
+        }
+
         for (DiskImage image: getImagesToCheckDestinationStorageDomains()) {
             locks.put(image.getId().toString(),
                     LockMessagesMatchUtil.makeLockingPair(LockingGroup.DISK, 
getDiskSharedLockMessage()));
@@ -88,21 +115,55 @@
         return locks;
     }
 
+    /**
+     * This is called only by the AddVmAndCloneImageCommand to find the disk 
images to be cloned (not by AddVmCommand to find the images to be snapshotted)
+     *
+     * It returns all the disk images which are not based on the tamplate
+     */
     protected Collection<DiskImage> getDiskImagesFromConfiguration() {
+        if (diskImagesFromConfiguration != null) {
+            return diskImagesFromConfiguration;
+        }
+
+        Collection<DiskImage> vmImages = getAllVmDisks();
+
+        Collection<DiskImage> templateImages = 
getVmTemplate().getDiskTemplateMap().values();
+
+        diskImagesFromConfiguration = new ArrayList<>();
+        for (DiskImage vmImage : vmImages){
+            if (!dependentOnTemplate(templateImages, vmImage)) {
+                diskImagesFromConfiguration.add(vmImage);
+            }
+
+        }
+
+        return diskImagesFromConfiguration;
+    }
+
+    private Collection<DiskImage> getAllVmDisks() {
         VdcQueryReturnValue vdcReturnValue = runInternalQuery(
                 VdcQueryType.GetAllDisksByVmId,
                 new IdQueryParameters(oldVmId));
 
-        List<Disk> loadedImages = vdcReturnValue.getReturnValue() != null ? 
(List<Disk>) vdcReturnValue.getReturnValue() : new ArrayList<Disk>();
+        Collection<Disk> vmDisks = vdcReturnValue.getReturnValue() != null ? 
(List<Disk>) vdcReturnValue.getReturnValue() : new ArrayList<Disk>();
+        return ImagesHandler.filterImageDisks(vmDisks,
+                false,
+                true,
+                true);
+    }
 
-        if (diskImagesFromConfiguration == null) {
-            diskImagesFromConfiguration =
-                    ImagesHandler.filterImageDisks(loadedImages,
-                            false,
-                            true,
-                            true);
+    private boolean dependentOnTemplate(Collection<DiskImage> templateImages, 
DiskImage vmImage) {
+        return findTemplateImage(templateImages, vmImage) != null;
+    }
+
+    private DiskImage findTemplateImage(Collection<DiskImage> templateImages, 
DiskImage vmImage) {
+        for (DiskImage templateImage : templateImages) {
+            if 
(vmImage.getImageTemplateId().equals(templateImage.getImageId())) {
+                return templateImage;
+            }
         }
-        return diskImagesFromConfiguration;
+
+        return null;
     }
 
     @Override
@@ -135,24 +196,37 @@
     @Override
     public VM getVm() {
         if (vm == null) {
-            vm = getVmDAO().get(oldVmId);
-            VmDeviceUtils.setVmDevices(vm.getStaticData());
-            VmHandler.updateDisksFromDb(vm);
-            VmHandler.updateVmGuestAgentVersion(vm);
-            VmHandler.updateNetworkInterfacesFromDb(vm);
-            VmHandler.updateVmInitFromDB(vm.getStaticData(), true);
+            if (Guid.isNullOrEmpty(getParameters().getNewVmGuid())) {
+                vm = getVmDAO().get(oldVmId);
+                VmDeviceUtils.setVmDevices(vm.getStaticData());
+                VmHandler.updateDisksFromDb(vm);
+                VmHandler.updateVmGuestAgentVersion(vm);
+                VmHandler.updateNetworkInterfacesFromDb(vm);
+                VmHandler.updateVmInitFromDB(vm.getStaticData(), true);
 
-            vm.setName(getParameters().getNewName());
-            vm.setId(getVmId());
+                vm.setName(getParameters().getNewName());
+                vm.setId(getVmId());
+            } else {
+                // this is the end-action stage. At this point the VM is 
actually saved and the getVm() is supposed to return it
+                vm = getVmDAO().get(getParameters().getNewVmGuid());
+            }
+
         }
 
         return vm;
     }
 
     private void fillDisksToParameters() {
+        Collection<DiskImage> templateImages = 
getVmTemplate().getDiskTemplateMap().values();
 
-        for (Disk image : getDiskImagesFromConfiguration()) {
-                diskInfoDestinationMap.put(image.getId(), (DiskImage) image);
+        // fills all - both taken from template and directly added to VM
+        for (DiskImage image : getAllVmDisks()) {
+            DiskImage templateImage = findTemplateImage(templateImages, image);
+            if (templateImage != null) {
+                diskInfoDestinationMap.put(templateImage.getId(), 
templateImage);
+            } else {
+                diskInfoDestinationMap.put(image.getId(), image);
+            }
         }
 
         getParameters().setDiskInfoDestinationMap(diskInfoDestinationMap);
@@ -165,7 +239,6 @@
     }
 
     private void attachDisks() {
-
         VdcQueryReturnValue vdcReturnValue = runInternalQuery(
                 VdcQueryType.GetAllDisksByVmId,
                 new IdQueryParameters(oldVmId));
@@ -254,4 +327,31 @@
         vmStatic.setOriginalTemplateGuid(getVm().getOriginalTemplateGuid());
         vmStatic.setOriginalTemplateName(getVm().getOriginalTemplateName());
     }
+
+    @Override
+    protected void resetVmtGuid() {
+        // no need to reset it - the value taken from the VM in DB is already 
correct
+    }
+
+    @Override
+    protected Collection<DiskImage> 
getImagesToCheckDestinationStorageDomains() {
+        Collection<DiskImage> allDisks = new ArrayList<>();
+
+        // add the VM disks
+        allDisks.addAll(getDiskImagesFromConfiguration());
+
+        // add template disks
+        allDisks.addAll(getVmTemplate().getDiskTemplateMap().values());
+
+        return allDisks;
+    }
+
+    @Override
+    protected VdcActionType getParentActionType() {
+        return VdcActionType.CloneVm;
+    }
+
+    private boolean isTemplateDependent() {
+        return !Guid.Empty.equals(getSourceVmFromDb().getVmtGuid());
+    }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java
index f0fcec5..dcd87d5 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java
@@ -303,6 +303,7 @@
 
     @Override
     protected void endSuccessfully() {
+
         endVmCommand();
     }
 


-- 
To view, visit http://gerrit.ovirt.org/32463
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Icd9782930cc3e3b76fd1cfd32cf78007171cad9e
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

Reply via email to