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

Reply via email to