Tomas Jelinek has uploaded a new change for review. Change subject: restapi: introducint the instance types rest part ......................................................................
restapi: introducint the instance types rest part WIP, not prepared for review yet Change-Id: I45f464339e30258860f100240f34d1aa51e533ee Bug-Url: https://bugzilla.redhat.com/?????? Signed-off-by: Tomas Jelinek <tjeli...@redhat.com> --- A backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/InstanceTypeResource.java A backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/InstanceTypesResource.java M backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/utils/ApiRootLinksCreator.java M backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/utils/LinkHelper.java M backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd M backend/manager/modules/restapi/interface/definition/src/main/resources/jyaml.yml 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/BackendApplication.java A backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendInstanceTypeResource.java A backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendInstanceTypesResource.java M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplateResource.java M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplatesResource.java M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmResource.java M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmsResource.java M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/utils/FeaturesHelper.java A backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/InstanceTypeMapper.java M backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/VmMapper.java M backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/VmMapperTest.java 18 files changed, 501 insertions(+), 21 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/76/27776/1 diff --git a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/InstanceTypeResource.java b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/InstanceTypeResource.java new file mode 100644 index 0000000..c39b234 --- /dev/null +++ b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/InstanceTypeResource.java @@ -0,0 +1,40 @@ +/* +* Copyright (c) 2010 Red Hat, Inc. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package org.ovirt.engine.api.resource; + +import org.ovirt.engine.api.model.InstanceType; +import org.ovirt.engine.api.model.NIC; +import org.ovirt.engine.api.model.Nics; + +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; + +@Produces({ApiMediaType.APPLICATION_XML, ApiMediaType.APPLICATION_JSON, ApiMediaType.APPLICATION_X_YAML}) +public interface InstanceTypeResource extends UpdatableResource<InstanceType>, AsynchronouslyCreatedResource { + + @Path("{action: (export)}/{oid}") + public ActionResource getActionSubresource(@PathParam("action") String action, @PathParam("oid") String oid); + + + @Path("nics") + public DevicesResource<NIC, Nics> getNicsResource(); + + @Path("watchdogs") + public WatchdogsResource getWatchdogsResource(); + +} diff --git a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/InstanceTypesResource.java b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/InstanceTypesResource.java new file mode 100644 index 0000000..8d3d62b --- /dev/null +++ b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/InstanceTypesResource.java @@ -0,0 +1,52 @@ +/* +* Copyright (c) 2010 Red Hat, Inc. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package org.ovirt.engine.api.resource; + +import org.jboss.resteasy.annotations.providers.jaxb.Formatted; +import org.ovirt.engine.api.model.InstanceType; +import org.ovirt.engine.api.model.InstanceTypes; + +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Response; + + +@Path("/instance_types") +@Produces({ApiMediaType.APPLICATION_XML, ApiMediaType.APPLICATION_JSON, ApiMediaType.APPLICATION_X_YAML}) +public interface InstanceTypesResource { + + @GET + @Formatted + public InstanceTypes list(); + + @POST + @Formatted + @Consumes({ApiMediaType.APPLICATION_XML, ApiMediaType.APPLICATION_JSON, ApiMediaType.APPLICATION_X_YAML}) + public Response add(InstanceType template); + + @DELETE + @Path("{id}") + public Response remove(@PathParam("id") String id); + + @Path("{id}") + public InstanceTypeResource getInstanceTypeSubResource(@PathParam("id") String id); +} diff --git a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/utils/ApiRootLinksCreator.java b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/utils/ApiRootLinksCreator.java index 572a152..46c5667 100644 --- a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/utils/ApiRootLinksCreator.java +++ b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/utils/ApiRootLinksCreator.java @@ -42,6 +42,7 @@ links.add(createLink("tags", baseUri)); links.add(createLink("bookmarks", baseUri)); links.add(createLink("templates", LinkFlags.SEARCHABLE, baseUri)); + links.add(createLink("instance_types", LinkFlags.SEARCHABLE, baseUri)); links.add(createLink("users", LinkFlags.SEARCHABLE, baseUri)); links.add(createLink("groups", LinkFlags.SEARCHABLE, baseUri)); links.add(createLink("domains", baseUri)); diff --git a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/utils/LinkHelper.java b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/utils/LinkHelper.java index e2450cb..ea8fd49 100644 --- a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/utils/LinkHelper.java +++ b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/utils/LinkHelper.java @@ -51,6 +51,7 @@ import org.ovirt.engine.api.model.Host; import org.ovirt.engine.api.model.HostNIC; import org.ovirt.engine.api.model.Image; +import org.ovirt.engine.api.model.InstanceType; import org.ovirt.engine.api.model.Job; import org.ovirt.engine.api.model.Label; import org.ovirt.engine.api.model.Link; @@ -126,6 +127,8 @@ import org.ovirt.engine.api.resource.HostsResource; import org.ovirt.engine.api.resource.ImageResource; import org.ovirt.engine.api.resource.ImagesResource; +import org.ovirt.engine.api.resource.InstanceTypeResource; +import org.ovirt.engine.api.resource.InstanceTypesResource; import org.ovirt.engine.api.resource.JobResource; import org.ovirt.engine.api.resource.JobsResource; import org.ovirt.engine.api.resource.LabelResource; @@ -330,6 +333,9 @@ map.add(StorageDomainContentResource.class, StorageDomainContentsResource.class, StorageDomain.class); TYPES.put(Template.class, map); + map = new ParentToCollectionMap(InstanceTypeResource.class, InstanceTypesResource.class); + TYPES.put(InstanceType.class, map); + map = new ParentToCollectionMap(UserResource.class, UsersResource.class); map.add(DomainUserResource.class, DomainUsersResource.class, Domain.class); TYPES.put(User.class, map); 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 103211d..a6d30ec 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 @@ -2395,9 +2395,33 @@ </xs:complexType> <!-- Virtual Machine Templates --> - <xs:element name="templates" type="Templates"/> <xs:element name="template" type="Template"/> + + <xs:complexType name="InstanceTypes"> + <xs:complexContent> + <xs:extension base="BaseResources"> + <xs:sequence> + <xs:annotation> + <xs:appinfo> + <jaxb:property name="InstanceTypes"/> + </xs:appinfo> + </xs:annotation> + <xs:element ref="instance_type" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:complexType name="InstanceType"> + <xs:complexContent> + <xs:extension base="Template"> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:element name="instance_types" type="InstanceTypes"/> + <xs:element name="instance_type" type="InstanceType"/> <xs:complexType name="Template"> <xs:complexContent> @@ -2781,6 +2805,7 @@ <xs:element ref="host" minOccurs="0" maxOccurs="1"/> <xs:element ref="cluster" minOccurs="0" maxOccurs="1"/> <xs:element ref="template" minOccurs="0" maxOccurs="1"/> + <xs:element ref="instance_type" minOccurs="0" maxOccurs="1"/> <xs:element ref="storage_domain" minOccurs="0" maxOccurs="1"/> <xs:element name="start_time" type="xs:dateTime" minOccurs="0"/> <xs:element name="stop_time" type="xs:dateTime" minOccurs="0"/> diff --git a/backend/manager/modules/restapi/interface/definition/src/main/resources/jyaml.yml b/backend/manager/modules/restapi/interface/definition/src/main/resources/jyaml.yml index e97869c..cdb940b 100644 --- a/backend/manager/modules/restapi/interface/definition/src/main/resources/jyaml.yml +++ b/backend/manager/modules/restapi/interface/definition/src/main/resources/jyaml.yml @@ -76,6 +76,8 @@ bookmarks: org.ovirt.engine.api.models.Bookmarks template: org.ovirt.engine.api.model.Template templates: org.ovirt.engine.api.model.Templates + instance_type: org.ovirt.engine.api.model.InstanceType + instance_types: org.ovirt.engine.api.model.InstanceTypes ticket: org.ovirt.engine.api.model.Ticket transparent_hugepages: org.ovirt.engine.api.model.TransparentHugePages user: org.ovirt.engine.api.model.User @@ -168,6 +170,8 @@ org.ovirt.engine.api.model.Tags: org.ovirt.engine.api.resteasy.yaml.CustomBeanWrapper org.ovirt.engine.api.model.Template: org.ovirt.engine.api.resteasy.yaml.CustomBeanWrapper org.ovirt.engine.api.model.Templates: org.ovirt.engine.api.resteasy.yaml.CustomBeanWrapper + org.ovirt.engine.api.model.InstanceType: org.ovirt.engine.api.resteasy.yaml.CustomBeanWrapper + org.ovirt.engine.api.model.InstanceTypes: org.ovirt.engine.api.resteasy.yaml.CustomBeanWrapper org.ovirt.engine.api.model.Ticket: org.ovirt.engine.api.resteasy.yaml.CustomBeanWrapper org.ovirt.engine.api.model.TransparentHugePages: org.ovirt.engine.api.resteasy.yaml.CustomBeanWrapper org.ovirt.engine.api.model.User: org.ovirt.engine.api.resteasy.yaml.CustomBeanWrapper 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 1bf1216..065da83 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 @@ -50,6 +50,7 @@ signatures: - mandatoryArguments: {} optionalArguments: + vm.instance_type.id: 'xs:string' vm.name: xs:string vm.cluster.id|name: xs:string vm.timezone: xs:string @@ -126,6 +127,7 @@ signatures: - mandatoryArguments: {vm.name: 'xs:string', vm.template.id|name: 'xs:string', vm.cluster.id|name: 'xs:string'} optionalArguments: + vm.instance_type.id: 'xs:string' vm.quota.id: xs:string vm.timezone: xs:string vm.os.boot--COLLECTION: {boot.dev: 'xs:string'} @@ -4876,6 +4878,92 @@ Content-Type: {value: application/xml|json, required: true} Expect: {value: 201-created, required: false} Correlation-Id: {value: 'any string', required: false} + +- name: /instance_types|rel=get + description: get the list of instance types on the system + request: + body: + parameterType: null + signatures: [] + urlparams: + max: {context: matrix, type: 'xs:int', value: 'max results', required: false} + headers: {} +- name: /instance_types/{instance_type:id}|rel=get + description: get the details of the instance type on the system + request: + body: + parameterType: null + signatures: [] + urlparams: {} + headers: {} +- name: /instance_types/{instance_type:id}|rel=delete + description: delete the instance type from the system + request: + body: + parameterType: null + signatures: [] + urlparams: + async: {context: matrix, type: 'xs:boolean', value: true|false, required: false} + headers: + Correlation-Id: {value: 'any string', required: false} +- name: /instance_types|rel=add + description: add a new instance type to the system + request: + body: + parameterType: InstanceType + signatures: + - mandatoryArguments: {template.vm.id|name: 'xs:string', template.name: 'xs:string'} + optionalArguments: + template.memory: xs:long + template.cpu.topology.cores: xs:int + template.high_availability.enabled: 'xs:boolean' + template.os.cmdline: xs:string + template.origin: xs:string + template.high_availability.priority: 'xs:int' + template.timezone: xs:string + template.domain.name: xs:string + template.type: xs:string + template.stateless: 'xs:boolean' + template.delete_protected: xs:boolean + template.sso.methods.method--COLLECTION: {method.id: 'xs:string'} + template.console.enabled: xs:boolean + template.placement_policy.affinity: xs:string + template.description: xs:string + template.comment: xs:string + template.custom_properties.custom_property--COLLECTION: {custom_property.name: 'xs:string', custom_property.value: 'xs:string'} + template.os.type: xs:string + template.os.boot--COLLECTION: {boot.dev: 'xs:string'} + template.cpu.topology.sockets: xs:int + template.cpu_shares: xs:int + template.cpu.architecture: xs:string + template.os.kernel: xs:string + template.display.type: xs:string + template.display.monitors: xs:int + vm.display.single_qxl_pci: xs:boolean + template.display.allow_override: xs:boolean + template.display.smartcard_enabled: xs:boolean + template.display.keyboard_layout: xs:string + template.os.initRd: xs:string + template.usb.enabled: xs:boolean + template.usb.type: xs:string + template.tunnel_migration: xs:boolean + template.migration_downtime: xs:int + template.virtio_scsi.enabled: xs:boolean + template.vm.disks.disk--COLLECTION: {disk.id: '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 + template.cpu.cpu_tune.vcpu_pin--COLLECTION: {vcpu_pin.vcpu: 'xs:int', vcpu_pin.cpu_set: 'xs:string'} + template.serial_number.policy: xs:string + template.serial_number.value: xs:string + template.bios.boot_menu.enabled: xs:boolean + description: add a new template to the system + urlparams: {} + headers: + Content-Type: {value: application/xml|json, required: true} + Expect: {value: 201-created, required: false} + Correlation-Id: {value: 'any string', required: false} + - name: /clusters/{cluster:id}/affinitygroups|rel=get description: get the list of affinity groups in the cluster request: diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/BackendApplication.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/BackendApplication.java index accabcb..5af0863 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/BackendApplication.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/BackendApplication.java @@ -44,6 +44,7 @@ import org.ovirt.engine.api.restapi.resource.BackendEventsResource; import org.ovirt.engine.api.restapi.resource.BackendGroupsResource; import org.ovirt.engine.api.restapi.resource.BackendHostsResource; +import org.ovirt.engine.api.restapi.resource.BackendInstanceTypesResource; import org.ovirt.engine.api.restapi.resource.BackendJobsResource; import org.ovirt.engine.api.restapi.resource.BackendNetworksResource; import org.ovirt.engine.api.restapi.resource.BackendResource; @@ -129,6 +130,7 @@ addResource(new BackendDataCentersResource()); addResource(new BackendStorageDomainsResource()); addResource(new BackendTemplatesResource()); + addResource(new BackendInstanceTypesResource()); addResource(new BackendNetworksResource()); addResource(new BackendVmPoolsResource()); addResource(new BackendDisksResource()); diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendInstanceTypeResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendInstanceTypeResource.java new file mode 100644 index 0000000..cb9d01f --- /dev/null +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendInstanceTypeResource.java @@ -0,0 +1,96 @@ +package org.ovirt.engine.api.restapi.resource; + + +import org.ovirt.engine.api.model.Console; +import org.ovirt.engine.api.model.InstanceType; +import org.ovirt.engine.api.model.NIC; +import org.ovirt.engine.api.model.Nics; +import org.ovirt.engine.api.model.VirtIOSCSI; +import org.ovirt.engine.api.resource.CreationResource; +import org.ovirt.engine.api.resource.DevicesResource; +import org.ovirt.engine.api.resource.InstanceTypeResource; +import org.ovirt.engine.api.resource.WatchdogsResource; +import org.ovirt.engine.api.restapi.types.VmMapper; +import org.ovirt.engine.api.restapi.util.VmHelper; +import org.ovirt.engine.core.common.action.UpdateVmTemplateParameters; +import org.ovirt.engine.core.common.action.VdcActionParametersBase; +import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.common.businessentities.VmTemplate; +import org.ovirt.engine.core.common.queries.GetVmTemplateParameters; +import org.ovirt.engine.core.common.queries.IdQueryParameters; +import org.ovirt.engine.core.common.queries.VdcQueryType; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.compat.Version; + +import java.util.List; + +public class BackendInstanceTypeResource + extends AbstractBackendActionableResource<InstanceType, org.ovirt.engine.core.common.businessentities.InstanceType> + implements InstanceTypeResource { + + static final String[] SUB_COLLECTIONS = { "nics", "watchdogs" }; + + public BackendInstanceTypeResource(String id) { + super(id, InstanceType.class, org.ovirt.engine.core.common.businessentities.InstanceType.class, SUB_COLLECTIONS); + } + + @Override + public InstanceType get() { + return performGet(VdcQueryType.GetVmTemplate, new GetVmTemplateParameters(guid)); + } + + @Override + public InstanceType update(InstanceType incoming) { + return performUpdate(incoming, + new QueryIdResolver<Guid>(VdcQueryType.GetVmTemplate, GetVmTemplateParameters.class), + VdcActionType.UpdateVmTemplate, + new UpdateParametersProvider()); + } + + @Override + protected InstanceType doPopulate(InstanceType model, org.ovirt.engine.core.common.businessentities.InstanceType entity) { + if (!model.isSetConsole()) { + model.setConsole(new Console()); + } + model.getConsole().setEnabled(!getConsoleDevicesForEntity(entity.getId()).isEmpty()); + if (!model.isSetVirtioScsi()) { + model.setVirtioScsi(new VirtIOSCSI()); + } + model.getVirtioScsi().setEnabled(!VmHelper.getInstance().getVirtioScsiControllersForEntity(entity.getId()).isEmpty()); + return model; + } + + @Override + public DevicesResource<NIC, Nics> getNicsResource() { + return inject(new BackendTemplateNicsResource(guid)); + } + + @Override + public WatchdogsResource getWatchdogsResource() { + return inject(new BackendTemplateWatchdogsResource(guid, + VdcQueryType.GetWatchdog, + new IdQueryParameters(guid))); + } + + @Override + public CreationResource getCreationSubresource(String oid) { + return inject(new BackendCreationResource(oid)); + } + + private List<String> getConsoleDevicesForEntity(Guid id) { + return getEntity(List.class, + VdcQueryType.GetConsoleDevices, + new IdQueryParameters(id), + "GetConsoleDevices", true); + } + + protected class UpdateParametersProvider implements ParametersProvider<InstanceType, org.ovirt.engine.core.common.businessentities.InstanceType> { + @Override + public VdcActionParametersBase getParameters(InstanceType incoming, org.ovirt.engine.core.common.businessentities.InstanceType entity) { + org.ovirt.engine.core.common.businessentities.InstanceType updated = getMapper(modelType, org.ovirt.engine.core.common.businessentities.InstanceType.class).map(incoming, entity); + updated.setUsbPolicy(VmMapper.getUsbPolicyOnUpdate(incoming.getUsb(), entity.getUsbPolicy(), Version.getLast())); + + return getMapper(modelType, UpdateVmTemplateParameters.class).map(incoming, new UpdateVmTemplateParameters((VmTemplate) updated)); + } + } +} diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendInstanceTypesResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendInstanceTypesResource.java new file mode 100644 index 0000000..eac2d48 --- /dev/null +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendInstanceTypesResource.java @@ -0,0 +1,117 @@ +package org.ovirt.engine.api.restapi.resource; + +import org.ovirt.engine.api.model.Console; +import org.ovirt.engine.api.model.InstanceType; +import org.ovirt.engine.api.model.InstanceTypes; +import org.ovirt.engine.api.model.Template; +import org.ovirt.engine.api.model.VirtIOSCSI; +import org.ovirt.engine.api.resource.InstanceTypeResource; +import org.ovirt.engine.api.resource.InstanceTypesResource; +import org.ovirt.engine.api.restapi.util.VmHelper; +import org.ovirt.engine.core.common.action.AddVmTemplateParameters; +import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.common.action.VmTemplateParametersBase; +import org.ovirt.engine.core.common.businessentities.VM; +import org.ovirt.engine.core.common.businessentities.VmEntityType; +import org.ovirt.engine.core.common.businessentities.VmStatic; +import org.ovirt.engine.core.common.queries.GetVmTemplateParameters; +import org.ovirt.engine.core.common.queries.IdQueryParameters; +import org.ovirt.engine.core.common.queries.VdcQueryParametersBase; +import org.ovirt.engine.core.common.queries.VdcQueryType; +import org.ovirt.engine.core.compat.Guid; + +import javax.ws.rs.core.Response; +import java.util.List; + +public class BackendInstanceTypesResource + extends AbstractBackendCollectionResource<InstanceType, org.ovirt.engine.core.common.businessentities.InstanceType> + implements InstanceTypesResource { + + static final String[] SUB_COLLECTIONS = {"nics", "watchdogs" }; + + public BackendInstanceTypesResource() { + super(InstanceType.class, org.ovirt.engine.core.common.businessentities.InstanceType.class, SUB_COLLECTIONS); + } + + @Override + public InstanceTypes list() { + return mapCollection(getBackendCollection(VdcQueryType.GetAllInstanceTypes, + new VdcQueryParametersBase())); + } + + @Override + public Response add(InstanceType instanceType) { + validateParameters(instanceType, "name"); + validateEnums(InstanceType.class, instanceType); + + VmStatic vmStatic = getMapper(Template.class, VmStatic.class).map(instanceType, new VmStatic()); + VM vm = new VM(); + vm.setStaticData(vmStatic); + + String name = instanceType.getName(); + String description = ""; + + if (instanceType.isSetDescription()) { + description = instanceType.getDescription(); + } + + vm.setVmDescription(description); + + AddVmTemplateParameters addInstanceTypeParameters = + new AddVmTemplateParameters(vm, name, description); + addInstanceTypeParameters.setTemplateType(VmEntityType.INSTANCE_TYPE); + addInstanceTypeParameters.setVmTemplateId(null); + addInstanceTypeParameters.setPublicUse(true); + + addInstanceTypeParameters.setConsoleEnabled(instanceType.getConsole() != null && instanceType.getConsole().isSetEnabled() ? + instanceType.getConsole().isEnabled() : + false); + addInstanceTypeParameters.setVirtioScsiEnabled(instanceType.isSetVirtioScsi() && instanceType.getVirtioScsi().isSetEnabled() ? + instanceType.getVirtioScsi().isEnabled() : null); + + + return performCreate(VdcActionType.AddVmTemplate, + addInstanceTypeParameters, + new QueryIdResolver<Guid>(VdcQueryType.GetVmTemplate, + GetVmTemplateParameters.class)); + } + + @Override + public InstanceTypeResource getInstanceTypeSubResource(String id) { + return inject(new BackendInstanceTypeResource(id)); + } + + @Override + public Response performRemove(String id) { + return performAction(VdcActionType.RemoveVmTemplate, new VmTemplateParametersBase(asGuid(id))); + } + + protected InstanceTypes mapCollection(List<org.ovirt.engine.core.common.businessentities.InstanceType> entities) { + InstanceTypes collection = new InstanceTypes(); + for (org.ovirt.engine.core.common.businessentities.InstanceType entity : entities) { + collection.getInstanceTypes().add(addLinks(populate(map(entity), entity))); + } + return collection; + } + + @Override + protected InstanceType doPopulate(InstanceType model, org.ovirt.engine.core.common.businessentities.InstanceType entity) { + if (!model.isSetConsole()) { + model.setConsole(new Console()); + } + model.getConsole().setEnabled(!getConsoleDevicesForEntity(entity.getId()).isEmpty()); + if (!model.isSetVirtioScsi()) { + model.setVirtioScsi(new VirtIOSCSI()); + } + model.getVirtioScsi().setEnabled(!VmHelper.getInstance().getVirtioScsiControllersForEntity(entity.getId()).isEmpty()); + return model; + } + + private List<String> getConsoleDevicesForEntity(Guid id) { + return getEntity(List.class, + VdcQueryType.GetConsoleDevices, + new IdQueryParameters(id), + "GetConsoleDevices", true); + } + +} 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 d18ec1a..d9e251b 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 @@ -124,7 +124,7 @@ public VdcActionParametersBase getParameters(Template incoming, VmTemplate entity) { VmTemplate updated = getMapper(modelType, VmTemplate.class).map(incoming, entity); updated.setUsbPolicy(VmMapper.getUsbPolicyOnUpdate(incoming.getUsb(), entity.getUsbPolicy(), - lookupCluster(updated.getVdsGroupId()))); + lookupCluster(updated.getVdsGroupId()).getcompatibility_version())); return getMapper(modelType, UpdateVmTemplateParameters.class).map(incoming, new UpdateVmTemplateParameters(updated)); } 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 41b50c6..1caa9dc 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 @@ -81,7 +81,7 @@ } staticVm.setUsbPolicy(VmMapper.getUsbPolicyOnCreate(template.getUsb(), - cluster != null ? cluster : lookupCluster(staticVm.getVdsGroupId()))); + cluster != null ? cluster.getcompatibility_version() : lookupCluster(staticVm.getVdsGroupId()).getcompatibility_version())); // REVISIT: powershell has a IsVmTemlateWithSameNameExist safety check AddVmTemplateParameters params = new AddVmTemplateParameters(staticVm, diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmResource.java index 1f4880d..2b228c6 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmResource.java @@ -480,7 +480,7 @@ entity.getStaticData()); updated.setUsbPolicy(VmMapper.getUsbPolicyOnUpdate(incoming.getUsb(), entity.getUsbPolicy(), - lookupCluster(updated.getVdsGroupId()))); + lookupCluster(updated.getVdsGroupId()).getcompatibility_version())); VmManagementParametersBase params = new VmManagementParametersBase(updated); @@ -500,6 +500,9 @@ if (incoming.isSetVirtioScsi()) { params.setVirtioScsiEnabled(incoming.getVirtioScsi().isEnabled()); } + if (incoming.isSetInstanceType() && incoming.getInstanceType().isSetId()) { + updated.setInstanceTypeId(asGuid(incoming.getInstanceType().getId())); + } return params; } } diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmsResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmsResource.java index 5de80ae..11c0aeb 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmsResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmsResource.java @@ -121,7 +121,7 @@ } staticVm.setUsbPolicy(VmMapper.getUsbPolicyOnCreate(vm.getUsb(), - cluster)); + cluster.getcompatibility_version())); if (!isFiltered()) { // if the user set the host-name within placement-policy, rather than the host-id (legal) - @@ -138,6 +138,11 @@ (vm.isSetStorageDomain() && vm.getStorageDomain().isSetId()) ? asGuid(vm.getStorageDomain() .getId()) : Guid.Empty; + + if (vm.isSetInstanceType() && vm.getInstanceType().isSetId()) { + staticVm.setInstanceTypeId(asGuid(vm.getInstanceType().getId())); + } + if (vm.isSetDisks() && vm.getDisks().isSetClone() && vm.getDisks().isClone()) { response = cloneVmFromTemplate(staticVm, vm, templateId); } else if (Guid.Empty.equals(templateId)) { diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/utils/FeaturesHelper.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/utils/FeaturesHelper.java index 56f271a..a5ef93b 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/utils/FeaturesHelper.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/utils/FeaturesHelper.java @@ -84,6 +84,7 @@ addNetworkCustomPropertiesFeature(features); addFeatureRemoveDiskFromVmSnapshot(features); addFeatureDiskSnapshotsResourceInStorageDomainContext(features); + addInstanceTypesFeature(features); } return features; } @@ -458,4 +459,11 @@ feature.setDescription("Configure custom properties when provisioning networks on hosts."); features.getFeature().add(feature); } + + private void addInstanceTypesFeature(Features features) { + Feature feature = new Feature(); + feature.setName("Instance Types"); + feature.setDescription("Add/modify/remove instance types."); + features.getFeature().add(feature); + } } diff --git a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/InstanceTypeMapper.java b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/InstanceTypeMapper.java new file mode 100644 index 0000000..447d0f0 --- /dev/null +++ b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/InstanceTypeMapper.java @@ -0,0 +1,34 @@ +package org.ovirt.engine.api.restapi.types; + +import org.ovirt.engine.api.model.InstanceType; +import org.ovirt.engine.core.common.action.UpdateVmTemplateParameters; +import org.ovirt.engine.core.common.businessentities.VmStatic; +import org.ovirt.engine.core.common.businessentities.VmTemplate; + +public class InstanceTypeMapper extends TemplateMapper { + + @Mapping(from = InstanceType.class, to = org.ovirt.engine.core.common.businessentities.InstanceType.class) + public static org.ovirt.engine.core.common.businessentities.InstanceType map( + InstanceType model, + org.ovirt.engine.core.common.businessentities.InstanceType incoming) { + return TemplateMapper.map(model, (VmTemplate) incoming); + } + + @Mapping(from = InstanceType.class, to = VmStatic.class) + public static VmStatic map(InstanceType model, VmStatic incoming) { + return TemplateMapper.map(model, incoming); + } + + @Mapping(from = org.ovirt.engine.core.common.businessentities.InstanceType.class, to = InstanceType.class) + public static InstanceType map(org.ovirt.engine.core.common.businessentities.InstanceType entity, InstanceType incoming) { + InstanceType res = incoming != null ? incoming : new InstanceType(); + TemplateMapper.map((VmTemplate) entity, res); + return res; + } + + @Mapping(from = InstanceType.class, to = UpdateVmTemplateParameters.class) + public static UpdateVmTemplateParameters map(InstanceType template, UpdateVmTemplateParameters paramsTemplate) { + return TemplateMapper.map(template, paramsTemplate); + } + +} diff --git a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/VmMapper.java b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/VmMapper.java index 5f75b41..bd7a595c 100644 --- a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/VmMapper.java +++ b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/VmMapper.java @@ -66,7 +66,6 @@ import org.ovirt.engine.core.common.businessentities.MigrationSupport; import org.ovirt.engine.core.common.businessentities.OriginType; import org.ovirt.engine.core.common.businessentities.UsbPolicy; -import org.ovirt.engine.core.common.businessentities.VDSGroup; import org.ovirt.engine.core.common.businessentities.VMStatus; import org.ovirt.engine.core.common.businessentities.VmInit; import org.ovirt.engine.core.common.businessentities.VmInitNetwork; @@ -1351,21 +1350,21 @@ return pin; } - public static UsbPolicy getUsbPolicyOnCreate(Usb usb, VDSGroup vdsGroup) { + public static UsbPolicy getUsbPolicyOnCreate(Usb usb, Version vdsGroupVersion) { if (usb == null || !usb.isSetEnabled() || !usb.isEnabled()) { return UsbPolicy.DISABLED; } else { UsbType usbType = getUsbType(usb); if (usbType == null) { - return getUsbPolicyAccordingToClusterVersion(vdsGroup); + return getUsbPolicyAccordingToClusterVersion(vdsGroupVersion); } else { return getUsbPolicyAccordingToUsbType(usbType); } } } - public static UsbPolicy getUsbPolicyOnUpdate(Usb usb, UsbPolicy currentPolicy, VDSGroup vdsGroup) { + public static UsbPolicy getUsbPolicyOnUpdate(Usb usb, UsbPolicy currentPolicy, Version vdsGroupVersion) { if (usb == null) return currentPolicy; @@ -1379,7 +1378,7 @@ } else { return currentPolicy == UsbPolicy.DISABLED ? - getUsbPolicyAccordingToClusterVersion(vdsGroup) + getUsbPolicyAccordingToClusterVersion(vdsGroupVersion) : currentPolicy; } } @@ -1402,8 +1401,8 @@ return usb.isSetType() ? UsbType.fromValue(usb.getType()) : null; } - private static UsbPolicy getUsbPolicyAccordingToClusterVersion(VDSGroup vdsGroup) { - return vdsGroup.getcompatibility_version().compareTo(Version.v3_1) >= 0 ? + private static UsbPolicy getUsbPolicyAccordingToClusterVersion(Version vdsGroupVersion) { + return vdsGroupVersion.compareTo(Version.v3_1) >= 0 ? UsbPolicy.ENABLED_NATIVE : UsbPolicy.ENABLED_LEGACY; } diff --git a/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/VmMapperTest.java b/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/VmMapperTest.java index a63e2a4..7f49428 100644 --- a/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/VmMapperTest.java +++ b/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/VmMapperTest.java @@ -330,14 +330,14 @@ public void getUsbPolicyNullUsb() { Usb usb = null; VDSGroup vdsGroup = new VDSGroup(); - assertEquals(VmMapper.getUsbPolicyOnCreate(usb, vdsGroup), UsbPolicy.DISABLED); + assertEquals(VmMapper.getUsbPolicyOnCreate(usb, vdsGroup.getcompatibility_version()), UsbPolicy.DISABLED); } @Test public void getUsbPolicyIsSetDisabled() { Usb usb = new Usb(); VDSGroup vdsGroup = new VDSGroup(); - assertEquals(VmMapper.getUsbPolicyOnCreate(usb, vdsGroup), UsbPolicy.DISABLED); + assertEquals(VmMapper.getUsbPolicyOnCreate(usb, vdsGroup.getcompatibility_version()), UsbPolicy.DISABLED); } @Test @@ -345,7 +345,7 @@ Usb usb = new Usb(); usb.setEnabled(false); VDSGroup vdsGroup = new VDSGroup(); - assertEquals(VmMapper.getUsbPolicyOnCreate(usb, vdsGroup), UsbPolicy.DISABLED); + assertEquals(VmMapper.getUsbPolicyOnCreate(usb, vdsGroup.getcompatibility_version()), UsbPolicy.DISABLED); } @Test @@ -354,7 +354,7 @@ usb.setEnabled(true); usb.setType("native"); VDSGroup vdsGroup = new VDSGroup(); - assertEquals(VmMapper.getUsbPolicyOnCreate(usb, vdsGroup), UsbPolicy.ENABLED_NATIVE); + assertEquals(VmMapper.getUsbPolicyOnCreate(usb, vdsGroup.getcompatibility_version()), UsbPolicy.ENABLED_NATIVE); } @Test @@ -363,7 +363,7 @@ usb.setEnabled(true); usb.setType("legacy"); VDSGroup vdsGroup = new VDSGroup(); - assertEquals(VmMapper.getUsbPolicyOnCreate(usb, vdsGroup), UsbPolicy.ENABLED_LEGACY); + assertEquals(VmMapper.getUsbPolicyOnCreate(usb, vdsGroup.getcompatibility_version()), UsbPolicy.ENABLED_LEGACY); } @Test @@ -372,7 +372,7 @@ usb.setEnabled(true); VDSGroup vdsGroup = new VDSGroup(); vdsGroup.setcompatibility_version(Version.v3_1); - assertEquals(VmMapper.getUsbPolicyOnCreate(usb, vdsGroup), UsbPolicy.ENABLED_NATIVE); + assertEquals(VmMapper.getUsbPolicyOnCreate(usb, vdsGroup.getcompatibility_version()), UsbPolicy.ENABLED_NATIVE); } @Test @@ -381,7 +381,7 @@ usb.setEnabled(true); VDSGroup vdsGroup = new VDSGroup(); vdsGroup.setcompatibility_version(Version.v3_0); - assertEquals(VmMapper.getUsbPolicyOnCreate(usb, vdsGroup), UsbPolicy.ENABLED_LEGACY); + assertEquals(VmMapper.getUsbPolicyOnCreate(usb, vdsGroup.getcompatibility_version()), UsbPolicy.ENABLED_LEGACY); } @Test @@ -506,7 +506,7 @@ usb.setEnabled(true); VDSGroup vdsGroup = new VDSGroup(); vdsGroup.setcompatibility_version(Version.v3_0); - assertEquals(VmMapper.getUsbPolicyOnUpdate(usb, UsbPolicy.DISABLED, vdsGroup), UsbPolicy.ENABLED_LEGACY); + assertEquals(VmMapper.getUsbPolicyOnUpdate(usb, UsbPolicy.DISABLED, vdsGroup.getcompatibility_version()), UsbPolicy.ENABLED_LEGACY); } @Test @@ -515,7 +515,7 @@ usb.setEnabled(true); VDSGroup vdsGroup = new VDSGroup(); vdsGroup.setcompatibility_version(Version.v3_1); - assertEquals(VmMapper.getUsbPolicyOnUpdate(usb, UsbPolicy.DISABLED, vdsGroup), UsbPolicy.ENABLED_NATIVE); + assertEquals(VmMapper.getUsbPolicyOnUpdate(usb, UsbPolicy.DISABLED, vdsGroup.getcompatibility_version()), UsbPolicy.ENABLED_NATIVE); } @Test -- To view, visit http://gerrit.ovirt.org/27776 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I45f464339e30258860f100240f34d1aa51e533ee Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Tomas Jelinek <tjeli...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches