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
