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