Maor Lipchuk has uploaded a new change for review.

Change subject: core: Adding import of unregistered VM template
......................................................................

core: Adding import of unregistered VM template

Adding an unregistered Template using the import command.
The following patch adds the ability to import the Template by adding
new method in OvfHelper and through
ImportVmTemplateFromConfigurationCommand

Change-Id: I4fc184e687cbeebf4aa732c901f98222d5b11097
Signed-off-by: Maor Lipchuk <[email protected]>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmTemplateCommand.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmTemplateFromConfigurationCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/OvfHelper.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
4 files changed, 155 insertions(+), 2 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/81/27581/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmTemplateCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmTemplateCommand.java
index 66c086a..89591d0 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmTemplateCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmTemplateCommand.java
@@ -179,7 +179,7 @@
             retVal = 
validateNoDuplicateDiskImages(getParameters().getImages());
         }
 
-        if (retVal && getParameters().getImages() != null && 
!getParameters().getImages().isEmpty()) {
+        if (retVal && getParameters().getImages() != null && 
!getParameters().getImages().isEmpty() && !isUnregisteredVM()) {
             Map<StorageDomain, Integer> domainMap = 
getSpaceRequirementsForStorageDomains(
                     new 
ArrayList<DiskImage>(getVmTemplate().getDiskImageMap().values()));
             if (domainMap.isEmpty()) {
@@ -301,7 +301,7 @@
         });
 
         boolean doesVmTemplateContainImages = 
!getParameters().getImages().isEmpty();
-        if (doesVmTemplateContainImages) {
+        if (doesVmTemplateContainImages && !isUnregisteredVM()) {
             moveOrCopyAllImageGroups(getVmTemplateId(), 
getParameters().getImages());
         }
 
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
new file mode 100644
index 0000000..a3bea6c
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmTemplateFromConfigurationCommand.java
@@ -0,0 +1,124 @@
+package org.ovirt.engine.core.bll;
+
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.apache.commons.lang.StringUtils;
+import org.ovirt.engine.core.bll.validator.StorageDomainValidator;
+import org.ovirt.engine.core.common.AuditLogType;
+import org.ovirt.engine.core.common.action.AttachDettachVmDiskParameters;
+import org.ovirt.engine.core.common.action.ImportVmTemplateParameters;
+import org.ovirt.engine.core.common.action.VdcActionType;
+import org.ovirt.engine.core.common.action.VdcReturnValueBase;
+import org.ovirt.engine.core.common.businessentities.Disk;
+import org.ovirt.engine.core.common.businessentities.OvfEntityData;
+import org.ovirt.engine.core.common.businessentities.VmTemplate;
+import org.ovirt.engine.core.common.errors.VdcBllMessages;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogDirector;
+import org.ovirt.engine.core.utils.log.Log;
+import org.ovirt.engine.core.utils.log.LogFactory;
+import org.ovirt.engine.core.utils.ovf.OvfReaderException;
+
+@LockIdNameAttribute
+@NonTransactiveCommandAttribute(forceCompensation = true)
+public class ImportVmTemplateFromConfigurationCommand<T extends 
ImportVmTemplateParameters> extends ImportVmTemplateCommand {
+
+    private static final Log log = 
LogFactory.getLog(ImportVmFromConfigurationCommand.class);
+    private Collection<Disk> vmDisksToAttach;
+    OvfEntityData ovfEntityData;
+
+    protected ImportVmTemplateFromConfigurationCommand(Guid commandId) {
+        super(commandId);
+    }
+
+    public ImportVmTemplateFromConfigurationCommand(T parameters) {
+        super(parameters);
+        setCommandShouldBeLogged(false);
+    }
+
+    @Override
+    protected boolean canDoAction() {
+        VmTemplate vmFromConfiguration = getParameters().getVmTemplate();
+        if (vmFromConfiguration != null) {
+            vmFromConfiguration.setVdsGroupId(getParameters().getVdsGroupId());
+            getParameters().setContainerId(vmFromConfiguration.getId());
+        } else {
+            initUnregisteredVM();
+        }
+
+        setVdsGroupId(getParameters().getVdsGroupId());
+        getParameters().setStoragePoolId(getVdsGroup().getStoragePoolId());
+
+        if (isUnregisteredVM()) {
+            if (ovfEntityData == null && 
!getParameters().isImportAsNewEntity()) {
+                // TODO: Add CDA message.
+                return false;
+            }
+
+            setStorageDomainId(ovfEntityData.getStorageDomainId());
+            if (!validate(new 
StorageDomainValidator(getStorageDomain()).isDomainExistAndActive())) {
+                return false;
+            }
+
+            if (!getStorageDomain().getStorageDomainType().isDataDomain()) {
+                addCanDoActionMessage("$domainId " + 
getParameters().getStorageDomainId());
+                addCanDoActionMessage("$domainType " + 
getStorageDomain().getStorageDomainType());
+                
addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_DOMAIN_TYPE_UNSUPPORTED);
+                return false;
+            }
+        }
+
+        return super.canDoAction();
+    }
+
+    private void initUnregisteredVM() {
+        VmTemplate vmFromConfiguration;
+        ovfEntityData = 
getUnregisteredOVFDataDao().getByVmId(getParameters().getContainerId());
+        if (ovfEntityData != null) {
+            try {
+                OvfHelper ovfHelper = new OvfHelper();
+                vmFromConfiguration = 
ovfHelper.readVmTemplateFromOvf(ovfEntityData.getOvfData());
+                
vmFromConfiguration.setVdsGroupId(getParameters().getVdsGroupId());
+                getParameters().setVmTemplate(vmFromConfiguration);
+                
getParameters().setDestDomainId(ovfEntityData.getStorageDomainId());
+                
getParameters().setSourceDomainId(ovfEntityData.getStorageDomainId());
+            } catch (OvfReaderException e) {
+                log.errorFormat("failed to parse a given ovf configuration: 
\n" + ovfEntityData.getOvfData(), e);
+                // 
addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_UNSUPPORTED_OVF);
+            }
+        }
+    }
+
+    @Override
+    public void executeCommand() {
+        super.executeCommand();
+        if (isUnregisteredVM()) {
+            getUnregisteredOVFDataDao().removeEntity(ovfEntityData.getVmId(), 
ovfEntityData.getStorageDomainId());
+        } else if (!vmDisksToAttach.isEmpty()) {
+            AuditLogDirector.log(this, 
attemptToAttachDisksToImportedVm(vmDisksToAttach));
+        }
+        setActionReturnValue(getVm().getId());
+    }
+
+    private AuditLogType attemptToAttachDisksToImportedVm(Collection<Disk> 
disks){
+        List<String> failedDisks = new LinkedList<>();
+        for (Disk disk : disks) {
+            AttachDettachVmDiskParameters params = new 
AttachDettachVmDiskParameters(getVm().getId(),
+                    disk.getId(), disk.getPlugged(), disk.getReadOnly());
+            VdcReturnValueBase returnVal = 
getBackend().runInternalAction(VdcActionType.AttachDiskToVm, params);
+            if (!returnVal.getSucceeded()) {
+                failedDisks.add(disk.getDiskAlias());
+            }
+        }
+
+        if (!failedDisks.isEmpty()) {
+            this.addCustomValue("DiskAliases", StringUtils.join(failedDisks, 
","));
+            return 
AuditLogType.VM_IMPORT_FROM_CONFIGURATION_ATTACH_DISKS_FAILED;
+        }
+
+        return AuditLogType.VM_IMPORT_FROM_CONFIGURATION_EXECUTED_SUCCESSFULLY;
+    }
+
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/OvfHelper.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/OvfHelper.java
index b08088e..9e1ad3c 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/OvfHelper.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/OvfHelper.java
@@ -56,6 +56,34 @@
         return vm;
     }
 
+    /**
+     * parses a given ovf to a VmTemplate, intialized with images and 
interfaces.
+     * @param ovf
+     * @return
+     *        VmTemplate that represents the given ovf data
+     * @throws OvfReaderException
+     */
+    public VmTemplate readVmTemplateFromOvf(String ovf) throws 
OvfReaderException {
+        VmTemplate vmTemplate = new VmTemplate();
+        ArrayList<DiskImage> diskImages = new ArrayList<DiskImage>();
+        ArrayList<VmNetworkInterface> interfaces  = new 
ArrayList<VmNetworkInterface>();
+        ovfManager.ImportTemplate(ovf, vmTemplate, diskImages, interfaces);
+
+        // add images
+        vmTemplate.setImages(diskImages);
+        // add interfaces
+        vmTemplate.setInterfaces(interfaces);
+
+        // add disk map
+        Map<Guid, List<DiskImage>> images = ImagesHandler
+                .getImagesLeaf(diskImages);
+        for (Map.Entry<Guid, List<DiskImage>> entry : images.entrySet()) {
+            List<DiskImage> list = entry.getValue();
+            vmTemplate.getDiskTemplateMap().put(entry.getKey(), 
list.get(list.size() - 1));
+        }
+        return vmTemplate;
+    }
+
     public String generateOvfConfigurationForVm(VM vm) {
         if (VMStatus.ImageLocked != vm.getStatus()) {
             VmHandler.updateDisksFromDb(vm);
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
index c960103..5bd8436 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
@@ -54,6 +54,7 @@
     CloneVm(53, ActionGroup.CREATE_VM, QuotaDependency.BOTH),
     ImportVmFromConfiguration(43, ActionGroup.IMPORT_EXPORT_VM, 
QuotaDependency.NONE),
     UpdateVmVersion(44, QuotaDependency.NONE),
+    ImportVmTemplateFromConfiguration(45, ActionGroup.IMPORT_EXPORT_VM, 
QuotaDependency.NONE),
     // VdsCommands
     AddVds(101, ActionGroup.CREATE_HOST, QuotaDependency.NONE),
     UpdateVds(102, ActionGroup.EDIT_HOST_CONFIGURATION, false, 
QuotaDependency.NONE),


-- 
To view, visit http://gerrit.ovirt.org/27581
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I4fc184e687cbeebf4aa732c901f98222d5b11097
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Maor Lipchuk <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to