Daniel Erez has uploaded a new change for review.

Change subject: core: support add VM from template with Cinder disks
......................................................................

core: support add VM from template with Cinder disks

Modified AddVmCommand and AddVmFromTemplateCommand to
support creating a VM (thin/clone provisioning) from
a template with Cinder disks.

Change-Id: Id1e83b9912e5d861fe8cdbff56be4846901a35bf
Bug-Url: https://bugzilla.redhat.com/1185826
Signed-off-by: Daniel Erez <de...@redhat.com>
---
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/AddVmFromTemplateCommand.java
2 files changed, 64 insertions(+), 8 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/47/39647/1

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 12485e0..ed66a03 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
@@ -8,6 +8,9 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
 import javax.annotation.PostConstruct;
 
 import org.apache.commons.codec.CharEncoding;
@@ -23,15 +26,18 @@
 import org.ovirt.engine.core.bll.quota.QuotaStorageDependent;
 import org.ovirt.engine.core.bll.quota.QuotaVdsDependent;
 import org.ovirt.engine.core.bll.snapshots.SnapshotsManager;
+import org.ovirt.engine.core.bll.tasks.CommandCoordinatorUtil;
 import org.ovirt.engine.core.bll.utils.PermissionSubject;
 import org.ovirt.engine.core.bll.utils.VmDeviceUtils;
 import org.ovirt.engine.core.bll.validator.VmValidationUtils;
 import org.ovirt.engine.core.bll.validator.VmWatchdogValidator;
+import org.ovirt.engine.core.bll.validator.storage.CinderDisksValidator;
 import org.ovirt.engine.core.bll.validator.storage.StorageDomainValidator;
 import org.ovirt.engine.core.common.AuditLogType;
 import org.ovirt.engine.core.common.FeatureSupported;
 import org.ovirt.engine.core.common.VdcObjectType;
 import org.ovirt.engine.core.common.action.AddVmParameters;
+import org.ovirt.engine.core.common.action.CloneCinderDisksParameters;
 import 
org.ovirt.engine.core.common.action.CreateSnapshotFromTemplateParameters;
 import org.ovirt.engine.core.common.action.LockProperties;
 import org.ovirt.engine.core.common.action.LockProperties.Scope;
@@ -69,6 +75,7 @@
 import org.ovirt.engine.core.common.businessentities.network.Network;
 import org.ovirt.engine.core.common.businessentities.network.VmInterfaceType;
 import org.ovirt.engine.core.common.businessentities.network.VmNic;
+import org.ovirt.engine.core.common.businessentities.storage.CinderDisk;
 import org.ovirt.engine.core.common.businessentities.storage.Disk;
 import org.ovirt.engine.core.common.businessentities.storage.DiskImage;
 import org.ovirt.engine.core.common.businessentities.storage.DiskInterface;
@@ -646,13 +653,20 @@
             return failCanDoAction(VdcBllMessages.VM_ID_EXISTS);
         }
 
+        List<CinderDisk> cinderDisks = 
ImagesHandler.filterDisksBasedOnCinder(diskInfoDestinationMap.values());
+        CinderDisksValidator cinderDisksValidator = new 
CinderDisksValidator(cinderDisks);
+        if (!validate(cinderDisksValidator.validateCinderDiskLimits())) {
+            return false;
+        }
+
         return true;
     }
 
     protected boolean setAndValidateDiskProfiles() {
         if (diskInfoDestinationMap != null && 
!diskInfoDestinationMap.isEmpty()) {
             Map<DiskImage, Guid> map = new HashMap<>();
-            for (DiskImage diskImage : diskInfoDestinationMap.values()) {
+            List<DiskImage> diskImages = 
ImagesHandler.filterImageDisks(diskInfoDestinationMap.values(), true, false, 
true);
+            for (DiskImage diskImage : diskImages) {
                 map.put(diskImage, diskImage.getStorageIds().get(0));
             }
             return validate(DiskProfileHelper.setAndValidateDiskProfiles(map,
@@ -1064,7 +1078,9 @@
                 throw new 
VdcBLLException(VdcBllErrors.IRS_IMAGE_STATUS_ILLEGAL);
             }
             VmHandler.lockVm(getVmId());
-            for (DiskImage image : 
getImagesToCheckDestinationStorageDomains()) {
+            Collection<DiskImage> templateDisks = 
getImagesToCheckDestinationStorageDomains();
+            List<DiskImage> diskImages = 
ImagesHandler.filterImageDisks(templateDisks, true, false, true);
+            for (DiskImage image : diskImages) {
                 VdcReturnValueBase result = runInternalActionWithTasksContext(
                         VdcActionType.CreateSnapshotFromTemplate,
                         buildCreateSnapshotFromTemplateParameters(image));
@@ -1080,6 +1096,9 @@
                     srcDiskIdToTargetDiskIdMapping.put(image.getId(), 
newImage.getId());
                 }
             }
+
+            // Clone volumes for Cinder disk templates
+            
addVmCinderDisks(ImagesHandler.filterDisksBasedOnCinder(templateDisks));
         }
         return true;
     }
@@ -1099,6 +1118,27 @@
 
         return tempVar;
     }
+
+    protected void addVmCinderDisks(List<CinderDisk> templateDisks) {
+        List<CinderDisk> cinderDisks = 
ImagesHandler.filterDisksBasedOnCinder(templateDisks);
+        Future<VdcReturnValueBase> future = 
CommandCoordinatorUtil.executeAsyncCommand(
+                VdcActionType.CloneCinderDisks,
+                buildCinderChildCommandParameters(cinderDisks, 
getVmSnapshotId()),
+                cloneContextAndDetachFromParent());
+        try {
+            Map<Guid, Guid> diskImageMap = future.get().getActionReturnValue();
+            srcDiskIdToTargetDiskIdMapping.putAll(diskImageMap);
+        } catch (InterruptedException | ExecutionException e) {
+            log.debug("Exception", e);
+        }
+    }
+
+    private CloneCinderDisksParameters 
buildCinderChildCommandParameters(List<CinderDisk> cinderDisks, Guid 
vmSnapshotId) {
+        CloneCinderDisksParameters createParams = new 
CloneCinderDisksParameters(cinderDisks, vmSnapshotId, diskInfoDestinationMap);
+        
createParams.setParentHasTasks(!getReturnValue().getVdsmTaskIdList().isEmpty());
+        return withRootCommandInfo(createParams, getActionType());
+    }
+
     @Override
     public AuditLogType getAuditLogTypeValue() {
         switch (getActionState()) {
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromTemplateCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromTemplateCommand.java
index f007c74..1e4638c 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromTemplateCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromTemplateCommand.java
@@ -1,5 +1,6 @@
 package org.ovirt.engine.core.bll;
 
+import java.util.Collection;
 import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -7,6 +8,7 @@
 import java.util.Map;
 import java.util.Set;
 
+import org.ovirt.engine.core.bll.context.CommandContext;
 import org.ovirt.engine.core.bll.validator.storage.DiskImagesValidator;
 import org.ovirt.engine.core.bll.validator.storage.StorageDomainValidator;
 import org.ovirt.engine.core.common.AuditLogType;
@@ -41,7 +43,10 @@
     private Map<Guid, Set<Guid>> validDisksDomains;
 
     public AddVmFromTemplateCommand(T parameters) {
-        super(parameters);
+        this(parameters, null);
+    }
+    public AddVmFromTemplateCommand(T parameters, CommandContext 
commandContext) {
+        super(parameters, commandContext);
     }
 
     protected AddVmFromTemplateCommand(Guid commandId) {
@@ -100,7 +105,9 @@
                 throw new 
VdcBLLException(VdcBllErrors.IRS_IMAGE_STATUS_ILLEGAL);
             }
             VmHandler.lockVm(getVm().getDynamicData(), 
getCompensationContext());
-            for (DiskImage disk : 
getVmTemplate().getDiskTemplateMap().values()) {
+            Collection<DiskImage> templateDisks = 
getVmTemplate().getDiskTemplateMap().values();
+            List<DiskImage> diskImages = 
ImagesHandler.filterImageDisks(templateDisks, true, false, true);
+            for (DiskImage disk : diskImages) {
                 VdcReturnValueBase result = runInternalActionWithTasksContext(
                         VdcActionType.CreateCloneOfTemplate,
                         buildCreateCloneOfTemplateParameters(disk)
@@ -114,6 +121,9 @@
                 DiskImage newImage = (DiskImage) result.getActionReturnValue();
                 getSrcDiskIdToTargetDiskIdMapping().put(disk.getId(), 
newImage.getId());
             }
+
+            // Clone volumes for Cinder disk templates
+            
addVmCinderDisks(ImagesHandler.filterDisksBasedOnCinder(templateDisks));
         }
         return true;
     }
@@ -141,7 +151,9 @@
             return false;
         }
 
-        for (DiskImage dit : getVmTemplate().getDiskTemplateMap().values()) {
+        List<DiskImage> templateDiskImages = ImagesHandler.filterImageDisks(
+                getVmTemplate().getDiskTemplateMap().values(), true, false, 
false);
+        for (DiskImage dit : templateDiskImages) {
             if 
(!ImagesHandler.checkImageConfiguration(destStorages.get(diskInfoDestinationMap.get(dit.getId()).getStorageIds().get(0))
                     .getStorageStaticData(),
                     diskInfoDestinationMap.get(dit.getId()),
@@ -184,11 +196,13 @@
     protected boolean verifySourceDomains() {
         Map<Guid, StorageDomain> poolDomainsMap = 
Entities.businessEntitiesById(getPoolDomains());
         EnumSet<StorageDomainStatus> validDomainStatuses = 
EnumSet.of(StorageDomainStatus.Active);
+        List<DiskImage> templateDiskImages = ImagesHandler.filterImageDisks(
+                getImagesToCheckDestinationStorageDomains(), true, false, 
false);
         validDisksDomains =
-                
ImagesHandler.findDomainsInApplicableStatusForDisks(getImagesToCheckDestinationStorageDomains(),
+                
ImagesHandler.findDomainsInApplicableStatusForDisks(templateDiskImages,
                         poolDomainsMap,
                         validDomainStatuses);
-        return validate(new 
DiskImagesValidator(getImagesToCheckDestinationStorageDomains()).diskImagesOnAnyApplicableDomains(
+        return validate(new 
DiskImagesValidator(templateDiskImages).diskImagesOnAnyApplicableDomains(
                 validDisksDomains, poolDomainsMap,
                 
VdcBllMessages.ACTION_TYPE_FAILED_NO_VALID_DOMAINS_STATUS_FOR_TEMPLATE_DISKS, 
validDomainStatuses));
 
@@ -197,7 +211,9 @@
     @Override
     protected void chooseDisksSourceDomains() {
         diskInfoSourceMap = new HashMap<>();
-        for (DiskImage disk : getImagesToCheckDestinationStorageDomains()) {
+        List<DiskImage> templateDiskImages = ImagesHandler.filterImageDisks(
+                getImagesToCheckDestinationStorageDomains(), true, false, 
false);
+        for (DiskImage disk : templateDiskImages) {
             Guid diskId = disk.getId();
             Set<Guid> validDomainsForDisk = validDisksDomains.get(diskId);
             Guid destinationDomain = retrieveDestinationDomainForDisk(diskId);


-- 
To view, visit https://gerrit.ovirt.org/39647
To unsubscribe, visit https://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Id1e83b9912e5d861fe8cdbff56be4846901a35bf
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Daniel Erez <de...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to