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

Reply via email to