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