Omer Frenkel has uploaded a new change for review. Change subject: AddVmTemplate support and search by template type ......................................................................
AddVmTemplate support and search by template type Change-Id: Iad21690004787093c4a040a8aa41ff17dfa08af0 Signed-off-by: Omer Frenkel <ofren...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddVmTemplateParameters.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/TemplateType.java M backend/manager/modules/searchbackend/src/main/java/org/ovirt/engine/core/searchbackend/VmTemplateConditionFieldAutoCompleter.java 4 files changed, 143 insertions(+), 98 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/82/12282/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java index dcc512f..3488245 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java @@ -25,15 +25,16 @@ import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.VdcReturnValueBase; import org.ovirt.engine.core.common.businessentities.DiskImage; +import org.ovirt.engine.core.common.businessentities.StorageDomain; import org.ovirt.engine.core.common.businessentities.StorageDomainStatus; import org.ovirt.engine.core.common.businessentities.StorageDomainType; +import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VMStatus; import org.ovirt.engine.core.common.businessentities.VmDynamic; import org.ovirt.engine.core.common.businessentities.VmStatic; import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.common.businessentities.VmTemplateStatus; import org.ovirt.engine.core.common.businessentities.permissions; -import org.ovirt.engine.core.common.businessentities.StorageDomain; import org.ovirt.engine.core.common.businessentities.network.VmInterfaceType; import org.ovirt.engine.core.common.businessentities.network.VmNetworkInterface; import org.ovirt.engine.core.common.errors.VdcBLLException; @@ -54,6 +55,7 @@ private final List<DiskImage> mImages = new ArrayList<DiskImage>(); private List<PermissionSubject> permissionCheckSubject; protected Map<Guid, DiskImage> diskInfoDestinationMap; + private boolean isVmInDb; /** * A list of the new disk images which were saved for the Template. @@ -78,8 +80,11 @@ setVdsGroupId(parameterMasterVm.getVdsGroupId()); } if (getVm() != null) { + isVmInDb = true; VmHandler.updateDisksFromDb(getVm()); setStoragePoolId(getVm().getStoragePoolId()); + } else { + setVm(new VM(parameterMasterVm,null,null)); } diskInfoDestinationMap = parameters.getDiskInfoDestinationMap(); if (diskInfoDestinationMap == null) { @@ -104,13 +109,16 @@ @Override protected void executeCommand() { - // get vm status from db to check its really down before locking - VmDynamic vmDynamic = DbFacade.getInstance().getVmDynamicDao().get(getVmId()); - if (vmDynamic.getstatus() != VMStatus.Down) { - throw new VdcBLLException(VdcBllErrors.IRS_IMAGE_STATUS_ILLEGAL); - } + // if template does not have disks, no need to lock + if (!mImages.isEmpty()) { + // get vm status from db to check its really down before locking + VmDynamic vmDynamic = DbFacade.getInstance().getVmDynamicDao().get(getVmId()); + if (vmDynamic.getstatus() != VMStatus.Down) { + throw new VdcBLLException(VdcBllErrors.IRS_IMAGE_STATUS_ILLEGAL); + } - VmHandler.LockVm(vmDynamic, getCompensationContext()); + VmHandler.LockVm(vmDynamic, getCompensationContext()); + } setActionReturnValue(Guid.Empty); setVmTemplateId(Guid.NewGuid()); getParameters().setVmTemplateId(getVmTemplateId()); @@ -132,7 +140,9 @@ addPermission(); AddVmTemplateImages(); List<VmNetworkInterface> vmInterfaces = addVmInterfaces(); - VmDeviceUtils.copyVmDevices(getVmId(), getVmTemplateId(), newDiskImages, vmInterfaces); + if (isVmInDb) { + VmDeviceUtils.copyVmDevices(getVmId(), getVmTemplateId(), newDiskImages, vmInterfaces); + } setSucceeded(true); return null; } @@ -142,21 +152,21 @@ // end the command synchronously boolean pendingAsyncTasks = !getReturnValue().getTaskIdList().isEmpty(); if (!pendingAsyncTasks) { + // TODO: temp hack, need to figure a better way to handle vm is not in db + setVm(null); endSuccessfullySynchronous(); } } @Override protected boolean canDoAction() { - if (getVdsGroup() == null || !getVm().getStoragePoolId().equals(getVdsGroup().getStoragePoolId())) { + if (getVdsGroup() == null) { addCanDoActionMessage(VdcBllMessages.VDS_CLUSTER_IS_NOT_VALID); return false; } for (DiskImage diskImage : getVm().getDiskList()) { mImages.add(diskImage); } - - // TODO: can ImageType be without images? if (!VmHandler.isMemorySizeLegal(getParameters().getMasterVm().getOs(), getParameters().getMasterVm().getMemSizeMb(), getReturnValue().getCanDoActionMessages(), getVdsGroup().getcompatibility_version().toString())) { @@ -167,13 +177,99 @@ return false; } - if (!validateVmNotDuringSnapshot()) { - return false; - } + // images related checks + if (!mImages.isEmpty()) { + if (!getVm().getStoragePoolId().equals(getVdsGroup().getStoragePoolId())) { + addCanDoActionMessage(VdcBllMessages.VDS_CLUSTER_IS_NOT_VALID); + return false; + } - if (getVm().getStatus() != VMStatus.Down) { - addCanDoActionMessage(VdcBllMessages.VMT_CANNOT_CREATE_TEMPLATE_FROM_DOWN_VM.toString()); - return false; + if (!validateVmNotDuringSnapshot()) { + return false; + } + + if (getVm().getStatus() != VMStatus.Down) { + addCanDoActionMessage(VdcBllMessages.VMT_CANNOT_CREATE_TEMPLATE_FROM_DOWN_VM.toString()); + return false; + } + Map<Guid, List<DiskImage>> sourceImageDomainsImageMap = new HashMap<Guid, List<DiskImage>>(); + for (DiskImage image : mImages) { + MultiValueMapUtils.addToMap(image.getStorageIds().get(0), image, sourceImageDomainsImageMap); + if (!diskInfoDestinationMap.containsKey(image.getId())) { + Guid destStorageId = + getParameters().getDestinationStorageDomainId() != null ? getParameters().getDestinationStorageDomainId() + : image.getStorageIds().get(0); + ArrayList<Guid> storageIds = new ArrayList<Guid>(); + storageIds.add(destStorageId); + image.setStorageIds(storageIds); + diskInfoDestinationMap.put(image.getId(), image); + } + } + + if (!validate(new StoragePoolValidator(getStoragePool()).isUp())) { + return false; + } + + for (Guid srcStorageDomainId : sourceImageDomainsImageMap.keySet()) { + boolean checkIsValid = true; + if (!ImagesHandler.PerformImagesChecks( + getReturnValue().getCanDoActionMessages(), + getVm().getStoragePoolId(), + srcStorageDomainId, + false, + true, + true, + true, + true, + checkIsValid, + sourceImageDomainsImageMap.get(srcStorageDomainId))) { + return false; + } + checkIsValid = false; + } + + Map<Guid, StorageDomain> storageDomains = new HashMap<Guid, StorageDomain>(); + Set<Guid> destImageDomains = getStorageGuidSet(); + destImageDomains.removeAll(sourceImageDomainsImageMap.keySet()); + for (Guid destImageDomain : destImageDomains) { + StorageDomain storage = DbFacade.getInstance().getStorageDomainDao().getForStoragePool( + destImageDomain, getVm().getStoragePoolId()); + if (storage == null) { + // if storage is null then we need to check if it doesn't exist or + // domain is not in the same storage pool as the vm + if (DbFacade.getInstance().getStorageDomainStaticDao().get(destImageDomain) == null) { + addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_DOMAIN_NOT_EXIST.toString()); + } else { + addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_DOMAIN_NOT_IN_STORAGE_POOL); + } + return false; + } + if (storage.getStatus() == null || storage.getStatus() != StorageDomainStatus.Active) { + addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_DOMAIN_STATUS_ILLEGAL.toString()); + return false; + } + + if (storage.getStorageDomainType() == StorageDomainType.ImportExport + || storage.getStorageDomainType() == StorageDomainType.ISO) { + + addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_DOMAIN_TYPE_ILLEGAL); + return false; + } + storageDomains.put(destImageDomain, storage); + } + // update vm snapshots for storage free space check + ImagesHandler.fillImagesBySnapshots(getVm()); + + Map<StorageDomain, Integer> domainMap = + StorageDomainValidator.getSpaceRequirementsForStorageDomains( + ImagesHandler.filterImageDisks(getVm().getDiskMap().values(), true, false), + storageDomains, + diskInfoDestinationMap); + for (Map.Entry<StorageDomain, Integer> entry : domainMap.entrySet()) { + if (!doesStorageDomainhaveSpaceForRequest(entry.getKey(), entry.getValue())) { + return false; + } + } } if (isVmTemlateWithSameNameExist(getVmTemplateName())) { @@ -182,88 +278,13 @@ } // Check that the USB policy is legal - if (!VmHandler.isUsbPolicyLegal(getParameters().getVm().getUsbPolicy(), getParameters().getVm().getOs(), getVdsGroup(), getReturnValue().getCanDoActionMessages())) { + if (!VmHandler.isUsbPolicyLegal(getParameters().getVm().getUsbPolicy(), + getParameters().getVm().getOs(), + getVdsGroup(), + getReturnValue().getCanDoActionMessages())) { return false; } - Map<Guid, List<DiskImage>> sourceImageDomainsImageMap = new HashMap<Guid, List<DiskImage>>(); - for (DiskImage image : mImages) { - MultiValueMapUtils.addToMap(image.getStorageIds().get(0), image, sourceImageDomainsImageMap); - if (!diskInfoDestinationMap.containsKey(image.getId())) { - Guid destStorageId = - getParameters().getDestinationStorageDomainId() != null ? getParameters().getDestinationStorageDomainId() - : image.getStorageIds().get(0); - ArrayList<Guid> storageIds = new ArrayList<Guid>(); - storageIds.add(destStorageId); - image.setStorageIds(storageIds); - diskInfoDestinationMap.put(image.getId(), image); - } - } - - if (!validate(new StoragePoolValidator(getStoragePool()).isUp())) { - return false; - } - - for (Guid srcStorageDomainId : sourceImageDomainsImageMap.keySet()) { - boolean checkIsValid = true; - if (!ImagesHandler.PerformImagesChecks( - getReturnValue().getCanDoActionMessages(), - getVm().getStoragePoolId(), - srcStorageDomainId, - false, - true, - true, - true, - true, - checkIsValid, - sourceImageDomainsImageMap.get(srcStorageDomainId))) { - return false; - } - checkIsValid = false; - } - - Map<Guid, StorageDomain> storageDomains = new HashMap<Guid, StorageDomain>(); - Set<Guid> destImageDomains = getStorageGuidSet(); - destImageDomains.removeAll(sourceImageDomainsImageMap.keySet()); - for (Guid destImageDomain : destImageDomains) { - StorageDomain storage = DbFacade.getInstance().getStorageDomainDao().getForStoragePool( - destImageDomain, getVm().getStoragePoolId()); - if (storage == null) { - // if storage is null then we need to check if it doesn't exist or - // domain is not in the same storage pool as the vm - if (DbFacade.getInstance().getStorageDomainStaticDao().get(destImageDomain) == null) { - addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_DOMAIN_NOT_EXIST.toString()); - } else { - addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_DOMAIN_NOT_IN_STORAGE_POOL); - } - return false; - } - if (storage.getStatus() == null || storage.getStatus() != StorageDomainStatus.Active) { - addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_DOMAIN_STATUS_ILLEGAL.toString()); - return false; - } - - if (storage.getStorageDomainType() == StorageDomainType.ImportExport - || storage.getStorageDomainType() == StorageDomainType.ISO) { - - addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_DOMAIN_TYPE_ILLEGAL); - return false; - } - storageDomains.put(destImageDomain, storage); - } - // update vm snapshots for storage free space check - ImagesHandler.fillImagesBySnapshots(getVm()); - - Map<StorageDomain, Integer> domainMap = - StorageDomainValidator.getSpaceRequirementsForStorageDomains( - ImagesHandler.filterImageDisks(getVm().getDiskMap().values(), true, false), - storageDomains, - diskInfoDestinationMap); - for (Map.Entry<StorageDomain, Integer> entry : domainMap.entrySet()) { - if (!doesStorageDomainhaveSpaceForRequest(entry.getKey(), entry.getValue())) { - return false; - } - } return AddVmCommand.CheckCpuSockets(getParameters().getMasterVm().getNumOfSockets(), getParameters().getMasterVm().getCpuPerSocket(), getVdsGroup() .getcompatibility_version().toString(), getReturnValue().getCanDoActionMessages()); @@ -313,6 +334,7 @@ getVmTemplate().setQuotaId(getParameters().getMasterVm().getQuotaId()); getVmTemplate().setDedicatedVmForVds(getParameters().getMasterVm().getDedicatedVmForVds()); getVmTemplate().setMigrationSupport(getParameters().getMasterVm().getMigrationSupport()); + getVmTemplate().setTemplateType(getParameters().getTemplateType()); DbFacade.getInstance().getVmTemplateDao().save(getVmTemplate()); getCompensationContext().snapshotNewEntity(getVmTemplate()); setActionReturnValue(getVmTemplate().getId()); @@ -405,7 +427,9 @@ } private void endUnlockOps() { - VmHandler.UnLockVm(getVm()); + if (getVm() != null) { + VmHandler.UnLockVm(getVm()); + } VmTemplateHandler.UnLockVmTemplate(getVmTemplateId()); } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddVmTemplateParameters.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddVmTemplateParameters.java index 8c7628e..c2afc12 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddVmTemplateParameters.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddVmTemplateParameters.java @@ -6,6 +6,7 @@ import javax.validation.constraints.Size; import org.ovirt.engine.core.common.businessentities.DiskImage; +import org.ovirt.engine.core.common.businessentities.TemplateType; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VmStatic; import org.ovirt.engine.core.common.utils.ValidationUtils; @@ -25,6 +26,7 @@ private Guid privateVmTemplateID = Guid.Empty; private Guid destinationStorageDomainId; private HashMap<Guid, DiskImage> diskInfoDestinationMap; + private TemplateType templateType = TemplateType.TEMPLATE; @Size(max = 40, message = "VALIDATION.VM_TEMPLATE.NAME.MAX", groups = { CreateEntity.class, UpdateEntity.class }) @ValidI18NName(message = "ACTION_TYPE_FAILED_NAME_MAY_NOT_CONTAIN_SPECIAL_CHARS") @@ -102,4 +104,12 @@ public void setDiskInfoDestinationMap(HashMap<Guid, DiskImage> diskInfoDestinationMap) { this.diskInfoDestinationMap = diskInfoDestinationMap; } + + public TemplateType getTemplateType() { + return templateType; + } + + public void setTemplateType(TemplateType templateType) { + this.templateType = templateType; + } } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/TemplateType.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/TemplateType.java index 3f756e4..2fbafa6 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/TemplateType.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/TemplateType.java @@ -1,7 +1,12 @@ package org.ovirt.engine.core.common.businessentities; -public enum TemplateType { +public enum TemplateType implements Identifiable { TEMPLATE, INSTANCE_TYPE, IMAGE_TYPE; + + @Override + public int getValue() { + return name().hashCode(); + } } diff --git a/backend/manager/modules/searchbackend/src/main/java/org/ovirt/engine/core/searchbackend/VmTemplateConditionFieldAutoCompleter.java b/backend/manager/modules/searchbackend/src/main/java/org/ovirt/engine/core/searchbackend/VmTemplateConditionFieldAutoCompleter.java index e016a86..0373ee8 100644 --- a/backend/manager/modules/searchbackend/src/main/java/org/ovirt/engine/core/searchbackend/VmTemplateConditionFieldAutoCompleter.java +++ b/backend/manager/modules/searchbackend/src/main/java/org/ovirt/engine/core/searchbackend/VmTemplateConditionFieldAutoCompleter.java @@ -3,6 +3,7 @@ import java.util.UUID; import org.ovirt.engine.core.common.businessentities.DateEnumForSearch; +import org.ovirt.engine.core.common.businessentities.TemplateType; import org.ovirt.engine.core.common.businessentities.VmOsType; import org.ovirt.engine.core.common.businessentities.VmTemplateStatus; @@ -19,6 +20,7 @@ mVerbs.put("CLUSTER", "CLUSTER"); mVerbs.put("DATACENTER", "DATACENTER"); mVerbs.put("QUOTA", "QUOTA"); + mVerbs.put("TYPE", "TYPE"); buildCompletions(); mVerbs.put("_VMT_ID", "_VMT_ID"); @@ -35,6 +37,7 @@ getTypeDictionary().put("DATACENTER", String.class); getTypeDictionary().put("QUOTA", String.class); getTypeDictionary().put("_VMT_ID", UUID.class); + getTypeDictionary().put("TYPE", TemplateType.class); // building the ColumnName Dict columnNameDict.put("NAME", "name"); @@ -49,6 +52,7 @@ columnNameDict.put("DATACENTER", "storage_pool_name"); columnNameDict.put("QUOTA", "quota_name"); columnNameDict.put("_VMT_ID", "vmt_guid"); + columnNameDict.put("TYPE", "entity_type"); // Building the validation dict buildBasicValidationTable(); } @@ -74,6 +78,8 @@ return new EnumValueAutoCompleter(VmTemplateStatus.class); } else if ("QUOTA".equals(fieldName)) { return new NullableStringAutoCompleter(); + } else if ("STATUS".equals(fieldName)) { + return new EnumValueAutoCompleter(TemplateType.class); } return null; } -- To view, visit http://gerrit.ovirt.org/12282 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Iad21690004787093c4a040a8aa41ff17dfa08af0 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Omer Frenkel <ofren...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches