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