Arik Hadas has uploaded a new change for review. Change subject: core: change import vm to be VmCommand - part 3 ......................................................................
core: change import vm to be VmCommand - part 3 Introduce ImportValidator that stores the validation logics which are required for import operations, to reduce the coupling between ImportVmcommand and MoveOrCopyTemplateCommand. This validator will be used later in other import commands. Change-Id: I7fa61e7f493d196acdb40bfe461665d6668c6508 Signed-off-by: Arik Hadas <[email protected]> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmFromConfigurationCommand.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/ImportValidator.java 3 files changed, 208 insertions(+), 11 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/87/34987/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java index 84faa23..73170f8 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java @@ -26,6 +26,7 @@ import org.ovirt.engine.core.bll.utils.PermissionSubject; import org.ovirt.engine.core.bll.utils.VmDeviceUtils; import org.ovirt.engine.core.bll.validator.DiskImagesValidator; +import org.ovirt.engine.core.bll.validator.ImportValidator; import org.ovirt.engine.core.bll.validator.StorageDomainValidator; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.FeatureSupported; @@ -113,6 +114,7 @@ private final List<String> macsAdded = new ArrayList<String>(); private final SnapshotsManager snapshotsManager = new SnapshotsManager(); + private ImportValidator importValidator; public ImportVmCommand(T parameters) { this(parameters, null); @@ -172,6 +174,7 @@ public ImportVmCommand(T parameters, CommandContext commandContext) { super(parameters, commandContext); + importValidator = new ImportValidator(getParameters()); } @Override @@ -455,7 +458,7 @@ return false; } - if (!validateMacAddress(Entities.<VmNic, VmNetworkInterface> upcast(getVm().getInterfaces()))) { + if (!validate(importValidator.validateMacAddress(Entities.<VmNic, VmNetworkInterface> upcast(getVm().getInterfaces())))) { return false; } @@ -486,7 +489,7 @@ return false; } } - return validateSpaceRequirements(dummiesDisksList); + return validate(importValidator.validateSpaceRequirements(dummiesDisksList)); } /** @@ -627,7 +630,7 @@ } protected boolean checkTemplateInStorageDomain() { - boolean retValue = verifyDisksIfNeeded(); + boolean retValue = validate(importValidator.verifyDisks(imageList, imageToDestinationDomainMap)); if (retValue && !VmTemplateHandler.BLANK_VM_TEMPLATE_ID.equals(getVm().getVmtGuid()) && !getParameters().getCopyCollapse()) { List<StorageDomain> domains = runInternalQuery(VdcQueryType.GetStorageDomainsByVmTemplateId, @@ -644,13 +647,6 @@ } } return retValue; - } - - private boolean verifyDisksIfNeeded() { - if (!getParameters().isImportAsNewEntity() && !isImagesAlreadyOnTarget()) { - return checkIfDisksExist(imageList); - } - return true; } private boolean templateExists() { diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmFromConfigurationCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmFromConfigurationCommand.java index 4200879..8b9a6e3 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmFromConfigurationCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmFromConfigurationCommand.java @@ -9,6 +9,7 @@ import org.apache.commons.lang.StringUtils; import org.ovirt.engine.core.bll.context.CommandContext; +import org.ovirt.engine.core.bll.validator.ImportValidator; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.action.AttachDetachVmDiskParameters; import org.ovirt.engine.core.common.action.ImportVmParameters; @@ -52,7 +53,8 @@ @Override protected boolean canDoAction() { if (isImagesAlreadyOnTarget()) { - if (!validateUnregisteredEntity(vmFromConfiguration, ovfEntityData)) { + ImportValidator importValidator = new ImportValidator(getParameters()); + if (!validate(importValidator.validateUnregisteredEntity(vmFromConfiguration, ovfEntityData, getImages()))) { return false; } setImagesWithStoragePoolId(getStorageDomain().getStoragePoolId(), getVm().getImages()); diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/ImportValidator.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/ImportValidator.java new file mode 100644 index 0000000..fad18f7 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/ImportValidator.java @@ -0,0 +1,199 @@ +package org.ovirt.engine.core.bll.validator; + +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + +import org.apache.commons.lang.StringUtils; +import org.ovirt.engine.core.bll.Backend; +import org.ovirt.engine.core.bll.ImagesHandler; +import org.ovirt.engine.core.bll.ValidationResult; +import org.ovirt.engine.core.bll.network.macpoolmanager.MacPoolManagerStrategy; +import org.ovirt.engine.core.bll.network.macpoolmanager.MacPoolPerDcSingleton; +import org.ovirt.engine.core.common.action.MoveOrCopyParameters; +import org.ovirt.engine.core.common.businessentities.DiskImage; +import org.ovirt.engine.core.common.businessentities.IVdcQueryable; +import org.ovirt.engine.core.common.businessentities.OvfEntityData; +import org.ovirt.engine.core.common.businessentities.StorageDomain; +import org.ovirt.engine.core.common.businessentities.StoragePool; +import org.ovirt.engine.core.common.businessentities.network.VmNic; +import org.ovirt.engine.core.common.errors.VdcBLLException; +import org.ovirt.engine.core.common.errors.VdcBllMessages; +import org.ovirt.engine.core.common.utils.MacAddressValidationPatterns; +import org.ovirt.engine.core.common.vdscommands.GetImagesListVDSCommandParameters; +import org.ovirt.engine.core.common.vdscommands.VDSCommandType; +import org.ovirt.engine.core.common.vdscommands.VDSParametersBase; +import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dal.dbbroker.DbFacade; +import org.ovirt.engine.core.dao.StorageDomainDAO; +import org.ovirt.engine.core.dao.StoragePoolDAO; + +public class ImportValidator { + + private MoveOrCopyParameters params; + + private StoragePool cachedStoragePool; + private StorageDomain cachedStorageDomain; + + private static final Pattern VALIDATE_MAC_ADDRESS = + Pattern.compile(MacAddressValidationPatterns.UNICAST_MAC_ADDRESS_FORMAT); + + public ImportValidator(MoveOrCopyParameters params) { + this.params = params; + } + + public ValidationResult validateUnregisteredEntity(IVdcQueryable entityFromConfiguration, OvfEntityData ovfEntityData, List<DiskImage> images) { + if (ovfEntityData == null && !params.isImportAsNewEntity()) { + return new ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_UNSUPPORTED_OVF); + } + + if (entityFromConfiguration == null) { + return new ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_OVF_CONFIGURATION_NOT_SUPPORTED); + } + + for (DiskImage image : images) { + StorageDomain sd = getStorageDomainDAO().getForStoragePool( + image.getStorageIds().get(0), getStoragePool().getId()); + ValidationResult result = new StorageDomainValidator(sd).isDomainExistAndActive(); + if (result != ValidationResult.VALID) { + return result; + } + } + + if (!getStorageDomain().getStorageDomainType().isDataDomain()) { + return new ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_DOMAIN_TYPE_UNSUPPORTED, + String.format("$domainId %1$s", params.getStorageDomainId()), + String.format("$domainType %1$s", getStorageDomain().getStorageDomainType())); + } + + return ValidationResult.VALID; + } + + public ValidationResult validateMacAddress(List<VmNic> ifaces) { + int freeMacs = 0; + for (VmNic iface : ifaces) { + if (!StringUtils.isEmpty(iface.getMacAddress())) { + if(!VALIDATE_MAC_ADDRESS.matcher(iface.getMacAddress()).matches()) { + return new ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_NETWORK_INTERFACE_MAC_INVALID, + String.format("$IfaceName %1$s", iface.getName()), + String.format("$MacAddress %1$s", iface.getMacAddress())); + } + } + else { + freeMacs++; + } + } + if (freeMacs > 0 && !(getMacPool().getAvailableMacsCount() >= freeMacs)) { + return new ValidationResult(VdcBllMessages.MAC_POOL_NOT_ENOUGH_MAC_ADDRESSES); + } + + return ValidationResult.VALID; + } + + protected ValidationResult checkIfDisksExist(Iterable<DiskImage> disksList, Map<Guid, Guid> imageToDestinationDomainMap) { + Map<Guid, List<Guid>> alreadyRetrieved = new HashMap<>(); + for (DiskImage disk : disksList) { + Guid targetStorageDomainId = imageToDestinationDomainMap.get(disk.getId()); + List<Guid> imagesOnStorageDomain = alreadyRetrieved.get(targetStorageDomainId); + + if (imagesOnStorageDomain == null) { + VDSReturnValue returnValue = runVdsCommand( + VDSCommandType.GetImagesList, + new GetImagesListVDSCommandParameters(targetStorageDomainId, params.getStoragePoolId()) + ); + + if (returnValue.getSucceeded()) { + imagesOnStorageDomain = (List<Guid>) returnValue.getReturnValue(); + alreadyRetrieved.put(targetStorageDomainId, imagesOnStorageDomain); + } else { + return new ValidationResult(VdcBllMessages.ERROR_GET_IMAGE_LIST, + String.format("$sdName %1$s", getStorageDomain(targetStorageDomainId).getName())); + } + } + + if (imagesOnStorageDomain.contains(disk.getId())) { + return new ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_DOMAIN_ALREADY_CONTAINS_DISK); + } + } + + return ValidationResult.VALID; + } + + public ValidationResult verifyDisks(Iterable<DiskImage> imageList, Map<Guid, Guid> imageToDestinationDomainMap) { + if (!params.isImportAsNewEntity() && !params.isImagesExistOnTargetStorageDomain()) { + return checkIfDisksExist(imageList, imageToDestinationDomainMap); + } + + return ValidationResult.VALID; + } + + public ValidationResult validateSpaceRequirements(Collection<DiskImage> diskImages) { + MultipleStorageDomainsValidator sdValidator = createMultipleStorageDomainsValidator(diskImages); + ValidationResult result = sdValidator.allDomainsExistAndActive(); + if (result != ValidationResult.VALID) { + return result; + } + + result = sdValidator.allDomainsWithinThresholds(); + if (result != ValidationResult.VALID) { + return result; + } + + if (params.getCopyCollapse()) { + result = sdValidator.allDomainsHaveSpaceForClonedDisks(diskImages); + if (result != ValidationResult.VALID) { + return result; + } + } + + result = sdValidator.allDomainsHaveSpaceForDisksWithSnapshots(diskImages); + if (result != ValidationResult.VALID) { + return result; + } + + return ValidationResult.VALID; + } + + protected MultipleStorageDomainsValidator createMultipleStorageDomainsValidator(Collection<DiskImage> diskImages) { + return new MultipleStorageDomainsValidator(params.getStoragePoolId(), + ImagesHandler.getAllStorageIdsForImageIds(diskImages)); + } + + protected VDSReturnValue runVdsCommand(VDSCommandType commandType, VDSParametersBase parameters) + throws VdcBLLException { + return Backend.getInstance().getResourceManager().RunVdsCommand(commandType, parameters); + } + + protected StorageDomain getStorageDomain(Guid domainId) { + return getStorageDomainDAO().getForStoragePool(domainId, getStoragePool().getId()); + } + + protected MacPoolManagerStrategy getMacPool() { + return MacPoolPerDcSingleton.getInstance().poolForDataCenter(params.getStoragePoolId()); + } + + protected StorageDomainDAO getStorageDomainDAO() { + return DbFacade.getInstance().getStorageDomainDao(); + } + + protected StoragePoolDAO getStoragePoolDAO() { + return DbFacade.getInstance().getStoragePoolDao(); + } + + protected StoragePool getStoragePool() { + if (cachedStoragePool == null) { + cachedStoragePool = getStoragePoolDAO().get(params.getStoragePoolId()); + } + return cachedStoragePool; + } + + public StorageDomain getStorageDomain() { + if (cachedStorageDomain == null) { + cachedStorageDomain = getStorageDomainDAO().get(params.getStorageDomainId()); + } + return cachedStorageDomain; + } +} -- To view, visit http://gerrit.ovirt.org/34987 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I7fa61e7f493d196acdb40bfe461665d6668c6508 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Arik Hadas <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
