Amit Aviram has uploaded a new change for review.

Change subject: restapi: Extending disk editing when adding a new template.
......................................................................

restapi: Extending disk editing when adding a new template.

Currently when adding a new template, its disks edit is enabled only
when the disk's storage domain is specified- In this case, editing
any other field is ignored by the REST, and the request which is sent
to the backend does not contain all the values the user posted.

This patch makes the REST request for a new template to consider every
given value related to the new template's disks whether the storage
domain is specified and whether it is not, so the disk values that
are provided will always be sent to backend.

The specified attributes given in the REST request will be patched on
the original disk using a mapper so that a sent disk will contain a
default value in case some of its fields will not be provided by the
user.

Change-Id: Ib0baf4e5bd7233fbc4eab2f1f671b8b15e08ba03
Bug-Url: https://bugzilla.redhat.com/1110798
Signed-off-by: Amit Aviram <aavi...@redhat.com>
---
M 
backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml
M 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplatesResource.java
2 files changed, 44 insertions(+), 15 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/86/40986/1

diff --git 
a/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml
 
b/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml
index d564124..fa0ed98 100644
--- 
a/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml
+++ 
b/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml
@@ -3850,6 +3850,7 @@
           template.origin: xs:string
           template.high_availability.priority: 'xs:int'
           template.timezone: xs:string
+          template.storage_domain.id: 'xs:string'
           template.domain.name: xs:string
           template.type: xs:string
           template.stateless: 'xs:boolean'
@@ -3884,7 +3885,7 @@
           template.migration_downtime: xs:int
           template.virtio_scsi.enabled: xs:boolean
           template.soundcard_enabled: xs:boolean
-          template.vm.disks.disk--COLLECTION: {disk.id: 'xs:string', 
storage_domains.storage_domain--COLLECTION: {storage_domain.id: 'xs:string'}}
+          template.vm.disks.disk--COLLECTION: {disk.id: 'xs:string', 
disk.alias: 'xs:string', storage_domains.storage_domain--COLLECTION: 
{storage_domain.id: 'xs:string'}}
           template.permissions.clone: xs:boolean
           template.version.version_name: xs:string
           template.version.base_template.id: xs:string
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplatesResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplatesResource.java
index 473e3fa..482690f 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplatesResource.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplatesResource.java
@@ -1,6 +1,7 @@
 package org.ovirt.engine.api.restapi.resource;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -15,6 +16,7 @@
 import org.ovirt.engine.api.model.VirtIOSCSI;
 import org.ovirt.engine.api.resource.TemplateResource;
 import org.ovirt.engine.api.resource.TemplatesResource;
+import org.ovirt.engine.api.restapi.types.DiskMapper;
 import org.ovirt.engine.api.restapi.types.RngDeviceMapper;
 import org.ovirt.engine.api.restapi.types.VmMapper;
 import org.ovirt.engine.api.restapi.util.VmHelper;
@@ -113,7 +115,7 @@
             
params.setDestinationStorageDomainId(asGuid(template.getStorageDomain().getId()));
             isDomainSet = true;
         }
-        
params.setDiskInfoDestinationMap(getDiskToDestinationMap(template.getVm(),
+        
params.setDiskInfoDestinationMap(getDestinationTemplateDiskMap(template.getVm(),
                 params.getDestinationStorageDomainId(),
                 isDomainSet));
 
@@ -135,24 +137,50 @@
         return getEntity(VDSGroup.class, VdcQueryType.GetVdsGroupByVdsGroupId, 
new IdQueryParameters(id), "GetVdsGroupByVdsGroupId");
     }
 
-    protected HashMap<Guid, DiskImage> getDiskToDestinationMap(VM vm, Guid 
storageDomainId, boolean isDomainSet) {
-        HashMap<Guid, DiskImage> diskToDestinationMap = null;
+    protected HashMap<Guid, DiskImage> getDestinationTemplateDiskMap(VM vm, 
Guid storageDomainId, boolean isTemplateGeneralStorageDomainSet) {
+        HashMap<Guid, DiskImage> destinationTemplateDiskMap = null;
         if (vm.isSetDisks() && vm.getDisks().isSetDisks()) {
-            diskToDestinationMap = new HashMap<Guid, DiskImage>();
+            destinationTemplateDiskMap = new HashMap<Guid, DiskImage>();
+            Map<Guid, org.ovirt.engine.core.common.businessentities.Disk> 
vmSourceDisks = queryVmDisksMap(vm);
+
             for (Disk disk : vm.getDisks().getDisks()) {
-                if (disk.isSetId() && disk.isSetStorageDomains() && 
disk.getStorageDomains().isSetStorageDomains()
-                        && 
disk.getStorageDomains().getStorageDomains().get(0).isSetId()) {
-                    DiskImage diskImage = new DiskImage();
-                    diskImage.setId(asGuid(disk.getId()));
-                    diskImage.setStorageIds(new ArrayList<Guid>());
-                    Guid newStorageDomainId = isDomainSet ? storageDomainId : 
asGuid(disk.getStorageDomains()
-                            .getStorageDomains().get(0).getId());
-                    diskImage.getStorageIds().add(newStorageDomainId);
-                    diskToDestinationMap.put(diskImage.getId(), diskImage);
+                if (!disk.isSetId()) {
+                    continue;
                 }
+
+                Guid currDiskID = asGuid(disk.getId());
+                org.ovirt.engine.core.common.businessentities.Disk sourceDisk 
= vmSourceDisks.get(currDiskID);
+
+                // VM template can only have disk images
+                if (sourceDisk == null || !isDiskImage(sourceDisk)) {
+                    continue;
+                }
+
+                DiskImage destinationDisk = (DiskImage) DiskMapper.map(disk, 
sourceDisk);
+                if (isTemplateGeneralStorageDomainSet) {
+                    destinationDisk.setStorageIds(new 
ArrayList<>(Arrays.asList(storageDomainId)));
+                }
+
+                // Since domain can be changed, do not set profile and quota 
for this disk.
+                destinationDisk.setDiskProfileId(null);
+                destinationDisk.setQuotaId(null);
+
+                destinationTemplateDiskMap.put(destinationDisk.getId(), 
destinationDisk);
             }
         }
-        return diskToDestinationMap;
+        return destinationTemplateDiskMap;
+    }
+
+    private boolean 
isDiskImage(org.ovirt.engine.core.common.businessentities.Disk disk) {
+        return disk.getDiskStorageType() == 
org.ovirt.engine.core.common.businessentities.Disk.DiskStorageType.IMAGE;
+    }
+
+    private Map<Guid, org.ovirt.engine.core.common.businessentities.Disk> 
queryVmDisksMap(VM vm) {
+        List<org.ovirt.engine.core.common.businessentities.Disk> vmDisks =
+                
getBackendCollection(org.ovirt.engine.core.common.businessentities.Disk.class,
+                        VdcQueryType.GetAllDisksByVmId,
+                        new IdQueryParameters(asGuid(vm.getId())));
+        return Entities.businessEntitiesById(vmDisks);
     }
 
     @Override


-- 
To view, visit https://gerrit.ovirt.org/40986
To unsubscribe, visit https://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ib0baf4e5bd7233fbc4eab2f1f671b8b15e08ba03
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: ovirt-engine-3.5
Gerrit-Owner: Amit Aviram <aavi...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to