Daniel Erez has uploaded a new change for review.

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

core: support add template with Cinder disks

Modified AddVmTemplate to support template creation with Cinder disks.

Change-Id: I0390560c3e790c2435216382e586bcbd3a57d4bb
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/AddVmTemplateCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageHandlingCommandBase.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/storage/StorageDomainValidator.java
4 files changed, 80 insertions(+), 4 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/45/39645/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java
index eef0029..aec691c 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java
@@ -10,6 +10,8 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.commons.lang.StringUtils;
@@ -27,6 +29,7 @@
 import org.ovirt.engine.core.bll.utils.PermissionSubject;
 import org.ovirt.engine.core.bll.utils.VmDeviceUtils;
 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.DiskImagesValidator;
 import 
org.ovirt.engine.core.bll.validator.storage.MultipleStorageDomainsValidator;
 import org.ovirt.engine.core.bll.validator.storage.StoragePoolValidator;
@@ -34,6 +37,7 @@
 import org.ovirt.engine.core.common.FeatureSupported;
 import org.ovirt.engine.core.common.VdcObjectType;
 import org.ovirt.engine.core.common.action.AddVmTemplateParameters;
+import org.ovirt.engine.core.common.action.CloneCinderDisksParameters;
 import org.ovirt.engine.core.common.action.CreateImageTemplateParameters;
 import org.ovirt.engine.core.common.action.LockProperties;
 import org.ovirt.engine.core.common.action.LockProperties.Scope;
@@ -59,7 +63,9 @@
 import org.ovirt.engine.core.common.businessentities.VmType;
 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.DiskImage;
+import org.ovirt.engine.core.common.businessentities.storage.DiskStorageType;
 import org.ovirt.engine.core.common.errors.VdcBLLException;
 import org.ovirt.engine.core.common.errors.VdcBllErrors;
 import org.ovirt.engine.core.common.errors.VdcBllMessages;
@@ -94,6 +100,7 @@
     private static Map<Guid, String> updateVmsJobIdMap = new 
ConcurrentHashMap<Guid, String>();
 
     private VmTemplate cachedBaseTemplate;
+    private Guid vmSnapshotId;
 
     /**
      * Constructor for command creation when compensation is applied on startup
@@ -220,6 +227,12 @@
         return createParams;
     }
 
+    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
     protected void executeCommand() {
         // get vm status from db to check its really down before locking
@@ -274,6 +287,10 @@
             public Void runInTransaction() {
                 addPermission();
                 addVmTemplateImages(srcDeviceIdToTargetDeviceIdMapping);
+                if 
(!addVmTemplateCinderDisks(srcDeviceIdToTargetDeviceIdMapping)) {
+                    setSucceeded(false);
+                    return null;
+                }
                 addVmInterfaces(srcDeviceIdToTargetDeviceIdMapping);
                 Set<GraphicsType> graphicsToSkip = 
getParameters().getGraphicsDevices().keySet();
                 if (isVmInDb) {
@@ -314,7 +331,8 @@
 
         // means that there are no asynchronous tasks to execute and that we 
can
         // end the command synchronously
-        pendingAsyncTasks = !getReturnValue().getVdsmTaskIdList().isEmpty();
+        pendingAsyncTasks = !getReturnValue().getVdsmTaskIdList().isEmpty() ||
+                
!CommandCoordinatorUtil.getChildCommandIds(getCommandId()).isEmpty();
         if (!pendingAsyncTasks) {
             endSuccessfullySynchronous();
         }
@@ -468,7 +486,9 @@
         if (diskInfoDestinationMap != null && 
!diskInfoDestinationMap.isEmpty()) {
             Map<DiskImage, Guid> map = new HashMap<>();
             for (DiskImage diskImage : diskInfoDestinationMap.values()) {
-                map.put(diskImage, diskImage.getStorageIds().get(0));
+                if (diskImage.getDiskStorageType() == DiskStorageType.IMAGE) {
+                    map.put(diskImage, diskImage.getStorageIds().get(0));
+                }
             }
             return validate(DiskProfileHelper.setAndValidateDiskProfiles(map,
                     getStoragePool().getCompatibilityVersion(), 
getCurrentUser()));
@@ -498,7 +518,14 @@
                 return false;
             }
 
+            List<CinderDisk> cinderDisks = 
ImagesHandler.filterDisksBasedOnCinder(mImages);
+            CinderDisksValidator cinderDisksValidator = new 
CinderDisksValidator(cinderDisks);
+            if (!validate(cinderDisksValidator.validateCinderDiskLimits())) {
+                return false;
+            }
+
             List<DiskImage> diskImagesToCheck = 
ImagesHandler.filterImageDisks(mImages, true, false, true);
+            diskImagesToCheck.addAll(cinderDisks);
             DiskImagesValidator diskImagesValidator = new 
DiskImagesValidator(diskImagesToCheck);
             if (!validate(diskImagesValidator.diskImagesNotIllegal()) ||
                     !validate(diskImagesValidator.diskImagesNotLocked())) {
@@ -677,8 +704,35 @@
         }
     }
 
+    protected boolean addVmTemplateCinderDisks(Map<Guid, Guid> 
srcDeviceIdToTargetDeviceIdMapping) {
+        // Create Cinder disk templates
+        List<CinderDisk> cinderDisks = 
ImagesHandler.filterDisksBasedOnCinder(getVm().getDiskMap().values());
+        if (!cinderDisks.isEmpty()) {
+            Future<VdcReturnValueBase> future = 
CommandCoordinatorUtil.executeAsyncCommand(
+                    VdcActionType.CloneCinderDisks,
+                    buildCinderChildCommandParameters(cinderDisks, 
getVmSnapshotId()),
+                    cloneContextAndDetachFromParent());
+            try {
+                VdcReturnValueBase vdcReturnValueBase = future.get();
+                if (vdcReturnValueBase.getSucceeded()) {
+                    Map<Guid, Guid> diskImageMap = 
vdcReturnValueBase.getActionReturnValue();
+                    srcDeviceIdToTargetDeviceIdMapping.putAll(diskImageMap);
+                } else {
+                    getReturnValue().setFault(vdcReturnValueBase.getFault());
+                    log.error("Error cloning Cinder disks for template");
+                    return false;
+                }
+            } catch (InterruptedException | ExecutionException e) {
+                log.error("Error cloning Cinder disks for template");
+                return false;
+            }
+        }
+        return true;
+    }
+
     protected void addVmTemplateImages(Map<Guid, Guid> 
srcDeviceIdToTargetDeviceIdMapping) {
-        for (DiskImage diskImage : mImages) {
+        List<DiskImage> diskImages = ImagesHandler.filterImageDisks(mImages, 
true, false, true);
+        for (DiskImage diskImage : diskImages) {
             // The return value of this action is the 'copyImage' task GUID:
             VdcReturnValueBase retValue = 
Backend.getInstance().runInternalAction(
                     VdcActionType.CreateImageTemplate,
@@ -697,7 +751,7 @@
 
 
     private Guid getVmIdFromImageParameters(){
-        return 
((CreateImageTemplateParameters)getParameters().getImagesParameters().get(0)).getVmId();
+        return getParameters().getMasterVm().getId();
     }
 
     @Override
@@ -951,4 +1005,11 @@
         return 
validate(CpuProfileHelper.setAndValidateCpuProfile(getParameters().getMasterVm(),
                 getVdsGroup().getCompatibilityVersion()));
     }
+
+    private Guid getVmSnapshotId() {
+        if (vmSnapshotId == null) {
+            vmSnapshotId = Guid.newGuid();
+        }
+        return vmSnapshotId;
+    }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java
index f097aca..8255b67 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java
@@ -52,6 +52,7 @@
 import org.ovirt.engine.core.common.businessentities.VmStatic;
 import 
org.ovirt.engine.core.common.businessentities.network.VmNetworkInterface;
 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;
@@ -402,6 +403,8 @@
      */
     public static void filterImageDisksForVM(VM vm) {
         List<DiskImage> filteredDisks = 
ImagesHandler.filterImageDisks(vm.getDiskMap().values(), false, false, true);
+        List<CinderDisk> filteredCinderDisks = 
ImagesHandler.filterDisksBasedOnCinder(vm.getDiskMap().values());
+        filteredDisks.addAll(filteredCinderDisks);
         Collection<? extends Disk> vmDisksToRemove = 
CollectionUtils.subtract(vm.getDiskMap().values(), filteredDisks);
         vm.clearDisks();
         updateDisksForVm(vm, filteredDisks);
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageHandlingCommandBase.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageHandlingCommandBase.java
index a961d31..d74c62f 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageHandlingCommandBase.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageHandlingCommandBase.java
@@ -50,6 +50,8 @@
 
 public abstract class StorageHandlingCommandBase<T extends 
StoragePoolParametersBase> extends CommandBase<T> {
 
+    private CinderBroker cinderBroker;
+
     protected StorageHandlingCommandBase(T parameters, CommandContext 
commandContext) {
         super(parameters, commandContext);
         init(parameters);
@@ -442,4 +444,11 @@
     public VDSReturnValue runVdsCommand(VDSCommandType commandType, 
VDSParametersBase parameters) throws VdcBLLException {
         return super.runVdsCommand(commandType, parameters);
     }
+
+    public CinderBroker getCinderBroker() {
+        if (cinderBroker == null) {
+            cinderBroker = new CinderBroker(getStorageDomainId(), 
getReturnValue().getExecuteFailedMessages());
+        }
+        return cinderBroker;
+    }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/storage/StorageDomainValidator.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/storage/StorageDomainValidator.java
index 7e1d5a6..dcf768a 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/storage/StorageDomainValidator.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/storage/StorageDomainValidator.java
@@ -58,6 +58,9 @@
     }
 
     public ValidationResult isDomainWithinThresholds() {
+        if (storageDomain.getStorageType().isCinderDomain()) {
+            return ValidationResult.VALID;
+        }
         StorageDomainDynamic dynamic = storageDomain.getStorageDynamicData();
         if (dynamic != null
                 && dynamic.getAvailableDiskSize() != null


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

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