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

Reply via email to