Ravi Nori has uploaded a new change for review. Change subject: restapi : Placement policy template properties should be listed(#949285) ......................................................................
restapi : Placement policy template properties should be listed(#949285) Templates placement policy properties host id and affinity should be displayed on /api/templates/xxx and should be editable via update Change-Id: I3ecaca8e07bed62861f8e1d3fa5a92071d06693d Bug-Url: https://bugzilla.redhat.com/949285 Signed-off-by: Ravi Nori <[email protected]> --- M backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd 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/BackendTemplateResource.java M backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/TemplateMapper.java M backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/TemplateMapperTest.java 5 files changed, 103 insertions(+), 0 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/20/15620/1 diff --git a/backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd b/backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd index 06af2de..32aa4ba 100644 --- a/backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd +++ b/backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd @@ -1928,6 +1928,7 @@ <xs:element ref="domain" minOccurs="0" maxOccurs="1"/> <xs:element ref="usb" minOccurs="0" maxOccurs="1"/> <xs:element name="tunnel_migration" type="xs:boolean" minOccurs="0" maxOccurs="1"/> + <xs:element name="placement_policy" type="VmPlacementPolicy" minOccurs="0" maxOccurs="1"/> <!-- also rel="cdroms/disks/nics" links, see Devices below --> </xs:sequence> </xs:extension> 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 99a56b9..abdf565 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 @@ -2381,6 +2381,7 @@ template.stateless: 'xs:boolean' template.delete_protected: xs:boolean template.placement_policy.affinity: xs:string + template.placement_policy.host.id|name: xs:string template.description: xs:string template.custom_properties.custom_property--COLLECTION: {custom_property.name: 'xs:string', custom_property.value: 'xs:string'} template.os.type: xs:string diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplateResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplateResource.java index 416a9eb..ba787b5 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplateResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplateResource.java @@ -6,6 +6,7 @@ import org.ovirt.engine.api.model.Action; import org.ovirt.engine.api.model.CdRom; import org.ovirt.engine.api.model.CdRoms; +import org.ovirt.engine.api.model.Host; import org.ovirt.engine.api.model.NIC; import org.ovirt.engine.api.model.Nics; import org.ovirt.engine.api.model.Template; @@ -49,6 +50,12 @@ @Override public Template update(Template incoming) { validateEnums(Template.class, incoming); + if (incoming.isSetPlacementPolicy() && incoming.getPlacementPolicy().isSetHost()) { + Host host = incoming.getPlacementPolicy().getHost(); + if (host.isSetName() && !host.isSetId()) { + host.setId(getHostId(host).toString()); + } + } return performUpdate(incoming, new QueryIdResolver<Guid>(VdcQueryType.GetVmTemplate, GetVmTemplateParameters.class), VdcActionType.UpdateVmTemplate, diff --git a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/TemplateMapper.java b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/TemplateMapper.java index dadee58..660d4ef 100644 --- a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/TemplateMapper.java +++ b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/TemplateMapper.java @@ -9,15 +9,19 @@ import org.ovirt.engine.api.model.DisplayType; import org.ovirt.engine.api.model.Domain; import org.ovirt.engine.api.model.HighAvailability; +import org.ovirt.engine.api.model.Host; import org.ovirt.engine.api.model.OperatingSystem; import org.ovirt.engine.api.model.OsType; import org.ovirt.engine.api.model.Template; import org.ovirt.engine.api.model.TemplateStatus; import org.ovirt.engine.api.model.Usb; import org.ovirt.engine.api.model.UsbType; +import org.ovirt.engine.api.model.VmAffinity; +import org.ovirt.engine.api.model.VmPlacementPolicy; import org.ovirt.engine.api.model.VmType; import org.ovirt.engine.api.restapi.utils.GuidUtils; import org.ovirt.engine.api.restapi.utils.UsbMapperUtils; +import org.ovirt.engine.core.common.businessentities.MigrationSupport; import org.ovirt.engine.core.common.businessentities.OriginType; import org.ovirt.engine.core.common.businessentities.VmStatic; import org.ovirt.engine.core.common.businessentities.VmTemplate; @@ -129,6 +133,9 @@ if (model.isSetTunnelMigration()) { entity.setTunnelMigration(model.isTunnelMigration()); } + if (model.isSetPlacementPolicy()) { + map(model.getPlacementPolicy(), entity); + } return entity; } @@ -234,6 +241,9 @@ if (model.isSetTunnelMigration()) { staticVm.setTunnelMigration(model.isTunnelMigration()); } + if (model.isSetPlacementPolicy()) { + map(model.getPlacementPolicy(), staticVm); + } return staticVm; } @@ -315,11 +325,78 @@ } model.setUsb(usb); } + model.setPlacementPolicy(new VmPlacementPolicy()); + if (entity.getDedicatedVmForVds() != null) { + model.getPlacementPolicy().setHost(new Host()); + model.getPlacementPolicy().getHost().setId(entity.getDedicatedVmForVds().toString()); + } + VmAffinity vmAffinity = map(entity.getMigrationSupport(), null); + if (vmAffinity != null) { + model.getPlacementPolicy().setAffinity(vmAffinity.value()); + } model.setTimezone(entity.getTimeZone()); model.setTunnelMigration(entity.getTunnelMigration()); return model; } + @Mapping(from = MigrationSupport.class, to = VmAffinity.class) + public static VmAffinity map(MigrationSupport migrationSupport, VmAffinity template) { + if (migrationSupport != null) { + switch (migrationSupport) { + case MIGRATABLE: + return VmAffinity.MIGRATABLE; + case IMPLICITLY_NON_MIGRATABLE: + return VmAffinity.USER_MIGRATABLE; + case PINNED_TO_HOST: + return VmAffinity.PINNED; + default: + return null; + } + } + return null; + } + + public static void map(VmPlacementPolicy placementPolicy, VmStatic staticVm) { + if (placementPolicy.isSetHost() && placementPolicy.getHost().isSetId()) { + staticVm.setDedicatedVmForVds(GuidUtils.asGuid(placementPolicy.getHost().getId())); + } + if (placementPolicy.isSetAffinity()) { + MigrationSupport migrationSupport = map(VmAffinity.fromValue(placementPolicy.getAffinity()), null); + if (migrationSupport != null) { + staticVm.setMigrationSupport(migrationSupport); + } + } + } + + public static void map(VmPlacementPolicy placementPolicy, VmTemplate vmTemplate) { + if (placementPolicy.isSetHost() && placementPolicy.getHost().isSetId()) { + vmTemplate.setDedicatedVmForVds(GuidUtils.asGuid(placementPolicy.getHost().getId())); + } + if (placementPolicy.isSetAffinity()) { + MigrationSupport migrationSupport = map(VmAffinity.fromValue(placementPolicy.getAffinity()), null); + if (migrationSupport != null) { + vmTemplate.setMigrationSupport(migrationSupport); + } + } + } + + @Mapping(from = VmAffinity.class, to = MigrationSupport.class) + public static MigrationSupport map(VmAffinity affinity, MigrationSupport migrationSupport) { + if (affinity != null) { + switch (affinity) { + case MIGRATABLE: + return MigrationSupport.MIGRATABLE; + case USER_MIGRATABLE: + return MigrationSupport.IMPLICITLY_NON_MIGRATABLE; + case PINNED: + return MigrationSupport.PINNED_TO_HOST; + default: + return null; + } + } + return null; + } + @Mapping(from = VmTemplateStatus.class, to = TemplateStatus.class) public static TemplateStatus map(VmTemplateStatus entityStatus, TemplateStatus incoming) { switch (entityStatus) { diff --git a/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/TemplateMapperTest.java b/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/TemplateMapperTest.java index 72b55b9..ef02586 100644 --- a/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/TemplateMapperTest.java +++ b/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/TemplateMapperTest.java @@ -3,14 +3,20 @@ import org.ovirt.engine.api.model.Boot; import org.ovirt.engine.api.model.BootDevice; import org.ovirt.engine.api.model.DisplayType; +import org.ovirt.engine.api.model.Host; import org.ovirt.engine.api.model.Template; +import org.ovirt.engine.api.model.VmAffinity; +import org.ovirt.engine.api.model.VmPlacementPolicy; import org.ovirt.engine.api.model.VmType; import org.ovirt.engine.core.common.businessentities.OriginType; import org.ovirt.engine.core.common.businessentities.VmTemplate; +import org.ovirt.engine.core.compat.Guid; public class TemplateMapperTest extends AbstractInvertibleMappingTest<Template, VmTemplate, VmTemplate> { + private static final String HOST_ID = Guid.createGuidFromString("99408929-82cf-4dc7-a532-9d998063fa95").toString(); + private static final String AFFINITY = VmAffinity.MIGRATABLE.toString(); public TemplateMapperTest() { super(Template.class, VmTemplate.class, VmTemplate.class); } @@ -30,6 +36,14 @@ from.getCpu().getTopology().setCores(MappingTestHelper.rand(100)); } from.setTimezone("Australia/Darwin"); + if (!from.isSetPlacementPolicy()) { + from.setPlacementPolicy(new VmPlacementPolicy()); + } + if (!from.getPlacementPolicy().isSetHost()) { + from.getPlacementPolicy().setHost(new Host()); + } + from.getPlacementPolicy().getHost().setId(HOST_ID); + from.getPlacementPolicy().setAffinity(AFFINITY); return from; } @@ -71,5 +85,8 @@ assertEquals(model.getDisplay().isSmartcardEnabled(), transform.getDisplay().isSmartcardEnabled()); assertEquals(model.isDeleteProtected(), transform.isDeleteProtected()); assertEquals(model.isTunnelMigration(), transform.isTunnelMigration()); + assertEquals(model.getPlacementPolicy().getHost().getId(), transform.getPlacementPolicy().getHost().getId()); + assertEquals(VmAffinity.fromValue(model.getPlacementPolicy().getAffinity()), + VmAffinity.fromValue(transform.getPlacementPolicy().getAffinity())); } } -- To view, visit http://gerrit.ovirt.org/15620 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I3ecaca8e07bed62861f8e1d3fa5a92071d06693d Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Ravi Nori <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
