Maor Lipchuk has uploaded a new change for review. Change subject: core: Add support for copied disk template ......................................................................
core: Add support for copied disk template Add support for copied disk Template so an unregistered Template can be registered with its copied disks Change-Id: Id7514146d26792a361e47d1de820f5233ff9bf40 Bug-Url: https://bugzilla.redhat.com/1138136 Signed-off-by: Maor Lipchuk <mlipc...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmTemplateFromConfigurationCommand.java 1 file changed, 79 insertions(+), 0 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/98/35998/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmTemplateFromConfigurationCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmTemplateFromConfigurationCommand.java index 6044016..d62f4b6 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmTemplateFromConfigurationCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmTemplateFromConfigurationCommand.java @@ -1,6 +1,8 @@ package org.ovirt.engine.core.bll; import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedList; import java.util.List; import org.ovirt.engine.core.common.AuditLogType; @@ -10,10 +12,16 @@ import org.ovirt.engine.core.common.businessentities.DiskImage; import org.ovirt.engine.core.common.businessentities.OvfEntityData; import org.ovirt.engine.core.common.businessentities.VmTemplate; +import org.ovirt.engine.core.common.businessentities.image_storage_domain_map; +import org.ovirt.engine.core.common.vdscommands.GetImagesListVDSCommandParameters; +import org.ovirt.engine.core.common.vdscommands.VDSCommandType; +import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.utils.log.Log; import org.ovirt.engine.core.utils.log.LogFactory; import org.ovirt.engine.core.utils.ovf.OvfReaderException; +import org.ovirt.engine.core.utils.transaction.TransactionMethod; +import org.ovirt.engine.core.utils.transaction.TransactionSupport; @NonTransactiveCommandAttribute public class ImportVmTemplateFromConfigurationCommand<T extends ImportVmTemplateParameters> extends ImportVmTemplateCommand { @@ -95,12 +103,83 @@ public void executeCommand() { super.executeCommand(); if (isImagesAlreadyOnTarget()) { + if (!getImages().isEmpty()) { + findAndSaveDiskCopies(); + } getUnregisteredOVFDataDao().removeEntity(ovfEntityData.getEntityId(), null); } setActionReturnValue(getVmTemplate().getId()); setSucceeded(true); } + private void findAndSaveDiskCopies() { + List<OvfEntityData> ovfEntityDataList = + getUnregisteredOVFDataDao().getByEntityIdAndStorageDomain(ovfEntityData.getEntityId(), null); + List<image_storage_domain_map> copiedTemplateDisks = new LinkedList<>(); + for (OvfEntityData ovfEntityDataFetched : ovfEntityDataList) { + populateDisksCopies(copiedTemplateDisks, + getImages(), + ovfEntityDataFetched.getStorageDomainId()); + } + saveImageStorageDomainMapList(copiedTemplateDisks); + } + + private void populateDisksCopies(List<image_storage_domain_map> copiedTemplateDisks, + List<DiskImage> originalTemplateImages, + Guid storageDomainId) { + List<Guid> imagesContainedInStorageDomain = getImagesGuidFromStorage(storageDomainId, getStoragePoolId()); + for (DiskImage templateDiskImage : originalTemplateImages) { + if (storageDomainId.equals(templateDiskImage.getStorageIds().get(0))) { + // The original Storage Domain was already saved. skipping it. + continue; + } + if (imagesContainedInStorageDomain.contains(templateDiskImage.getId())) { + log.infoFormat("Found a copied image of {0} on Storage Domain id {1}", + templateDiskImage.getId(), + storageDomainId); + image_storage_domain_map imageStorageDomainMap = + new image_storage_domain_map(templateDiskImage.getImageId(), + storageDomainId, + templateDiskImage.getQuotaId(), + templateDiskImage.getDiskProfileId()); + copiedTemplateDisks.add(imageStorageDomainMap); + } + } + } + + private List<Guid> getImagesGuidFromStorage(Guid storageDomainId, Guid storagePoolId) { + List<Guid> imagesList = Collections.emptyList(); + try { + VDSReturnValue imagesListResult = runVdsCommand(VDSCommandType.GetImagesList, + new GetImagesListVDSCommandParameters(storageDomainId, storagePoolId)); + if (imagesListResult.getSucceeded()) { + imagesList = (List<Guid>) imagesListResult.getReturnValue(); + } else { + log.errorFormat("Unable to get images list for storage domain, can not update copied template disks related to Storage Domain id {0}", + storageDomainId); + } + } catch (Exception e) { + log.errorFormat("Unable to get images list for storage domain, can not update copied template disks related to Storage Domain id {0}. error is: {1}", + storageDomainId, + e); + } + return imagesList; + } + + private void saveImageStorageDomainMapList(final List<image_storage_domain_map> copiedTemplateDisks) { + if (!copiedTemplateDisks.isEmpty()) { + TransactionSupport.executeInNewTransaction(new TransactionMethod<Void>() { + @Override + public Void runInTransaction() { + for (image_storage_domain_map imageStorageDomainMap : copiedTemplateDisks) { + getImageStorageDomainMapDao().save(imageStorageDomainMap); + } + return null; + } + }); + } + } + @Override public AuditLogType getAuditLogTypeValue() { return getSucceeded() ? AuditLogType.TEMPLATE_IMPORT_FROM_CONFIGURATION_SUCCESS : -- To view, visit http://gerrit.ovirt.org/35998 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Id7514146d26792a361e47d1de820f5233ff9bf40 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: ovirt-engine-3.5 Gerrit-Owner: Maor Lipchuk <mlipc...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches