Jason Liao has uploaded a new change for review. Change subject: restapi: NUMA feature restful API support ......................................................................
restapi: NUMA feature restful API support This the the draft version of restful API support Let the owner review the interfaces and models The restful API define is on ovirt wiki page http://www.ovirt.org/Features/Detailed_NUMA_and_Virtual_NUMA Change-Id: I72ed4b16c220decbf640f74c4aadffe423afc290 Signed-off-by: Jason Liao <[email protected]> Bug-Url: https://bugzilla.redhat.com/1069303 Signed-off-by: Jason Liao <[email protected]> --- A backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/HostNumaNodeResource.java A backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/HostNumaNodesResource.java M backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/HostResource.java A backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/VmNumaNodeResource.java A backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/VmNumaNodesResource.java M backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/VmResource.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/resource/BackendHostResource.java A backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendNumaNodeResource.java A backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendNumaNodesResource.java M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmResource.java 13 files changed, 389 insertions(+), 0 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/43/26943/1 diff --git a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/HostNumaNodeResource.java b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/HostNumaNodeResource.java new file mode 100644 index 0000000..2cef853 --- /dev/null +++ b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/HostNumaNodeResource.java @@ -0,0 +1,16 @@ +package org.ovirt.engine.api.resource; + +import javax.ws.rs.GET; +import javax.ws.rs.Produces; + +import org.jboss.resteasy.annotations.providers.jaxb.Formatted; +import org.ovirt.engine.api.model.NumaNode; + +@Produces({ApiMediaType.APPLICATION_XML, ApiMediaType.APPLICATION_JSON, ApiMediaType.APPLICATION_X_YAML}) +public interface HostNumaNodeResource extends ReadOnlyResource<NumaNode>, MeasurableResource { + + @GET + @Formatted + public NumaNode get(); + +} diff --git a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/HostNumaNodesResource.java b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/HostNumaNodesResource.java new file mode 100644 index 0000000..6d04da7 --- /dev/null +++ b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/HostNumaNodesResource.java @@ -0,0 +1,21 @@ +package org.ovirt.engine.api.resource; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; + +import org.jboss.resteasy.annotations.providers.jaxb.Formatted; +import org.ovirt.engine.api.model.NumaNodes; + +@Produces({ApiMediaType.APPLICATION_XML, ApiMediaType.APPLICATION_JSON, ApiMediaType.APPLICATION_X_YAML}) +public interface HostNumaNodesResource { + + @GET + @Formatted + public NumaNodes list(); + + @Path("{id}") + public HostNumaNodeResource getHostNumaNodeSubResource(@PathParam("id") String id); + +} diff --git a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/HostResource.java b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/HostResource.java index 9d36e8f..741bb49 100644 --- a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/HostResource.java +++ b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/HostResource.java @@ -88,6 +88,9 @@ @Path("forceselectspm") public Response forceSelectSPM(Action action); + @Path("numanodes") + public HostNumaNodesResource getHostNumaNodesResource(); + @Path("nics") public HostNicsResource getHostNicsResource(); diff --git a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/VmNumaNodeResource.java b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/VmNumaNodeResource.java new file mode 100644 index 0000000..7f60374 --- /dev/null +++ b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/VmNumaNodeResource.java @@ -0,0 +1,22 @@ +package org.ovirt.engine.api.resource; + +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.PUT; + +import org.jboss.resteasy.annotations.providers.jaxb.Formatted; +import org.ovirt.engine.api.model.VirtualNumaNode; + +public interface VmNumaNodeResource extends DeviceResource<VirtualNumaNode> { + + @PUT + @Formatted + @Override + @Consumes({ApiMediaType.APPLICATION_XML, ApiMediaType.APPLICATION_JSON, ApiMediaType.APPLICATION_X_YAML}) + public VirtualNumaNode update(VirtualNumaNode device); + + @GET + @Formatted + @Override + public VirtualNumaNode get(); +} diff --git a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/VmNumaNodesResource.java b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/VmNumaNodesResource.java new file mode 100644 index 0000000..9df8aa3 --- /dev/null +++ b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/VmNumaNodesResource.java @@ -0,0 +1,14 @@ +package org.ovirt.engine.api.resource; + +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; + +import org.ovirt.engine.api.model.VirtualNumaNode; +import org.ovirt.engine.api.model.VirtualNumaNodes; + +public interface VmNumaNodesResource extends DevicesResource<VirtualNumaNode, VirtualNumaNodes> { + + @Path("{iden}") + @Override + public VmNumaNodeResource getDeviceSubResource(@PathParam("iden") String id); +} diff --git a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/VmResource.java b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/VmResource.java index 659f84d..df3c023 100644 --- a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/VmResource.java +++ b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/VmResource.java @@ -162,6 +162,9 @@ @Path("disks") public VmDisksResource getDisksResource(); + @Path("numanodes") + public VmNumaNodesResource getVmNumaNodesResource(); + @Path("nics") public VmNicsResource getNicsResource(); 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 039a381..6823681 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 @@ -4097,4 +4097,75 @@ </xs:extension> </xs:complexContent> </xs:complexType> + + <!-- NumaNodes --> + + <xs:element name="host_numanode" type="NumaNode"/> + + <xs:element name="host_numanodes" type="NumaNodes"/> + + <xs:element name="vm_numanode" type="VirtualNumaNode"/> + + <xs:element name="vm_numanodes" type="VirtualNumaNodes"/> + + <xs:complexType name="NumaNode"> + <xs:complexContent> + <xs:extension base="BaseResource"> + <xs:sequence> + <xs:element ref="host" minOccurs="0" maxOccurs="1"/> + <xs:element name="index" type="xs:int" minOccurs="0"/> + <xs:element name="memory" type="xs:long" minOccurs="0" maxOccurs="1"/> + <xs:element name="cpu_list" type="xs:string" minOccurs="0" maxOccurs="1"/> + <xs:element name="statistics" type="Statistics" minOccurs="0" maxOccurs="1"/> + <xs:element name="node_distance" type="xs:string" minOccurs="0" maxOccurs="1"/> + </xs:sequence> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:complexType name="NumaNodes"> + <xs:complexContent> + <xs:extension base="BaseResources"> + <xs:sequence> + <xs:element ref="host_numanode" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:appinfo> + <jaxb:property name="NumaNodes"/> + </xs:appinfo> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:complexType name="VirtualNumaNode"> + <xs:complexContent> + <xs:extension base="BaseDevice"> + <xs:sequence> + <xs:element ref="host" minOccurs="0" maxOccurs="1"/> + <xs:element name="index" type="xs:int" minOccurs="0"/> + <xs:element name="memory" type="xs:long" minOccurs="0" maxOccurs="1"/> + <xs:element name="cpu_list" type="xs:string" minOccurs="0" maxOccurs="1"/> + <xs:element name="pinhost_numanode_list" type="xs:string" minOccurs="0" maxOccurs="1"/> + </xs:sequence> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:complexType name="VirtualNumaNodes"> + <xs:complexContent> + <xs:extension base="BaseDevices"> + <xs:sequence> + <xs:element ref="vm_numanode" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:appinfo> + <jaxb:property name="VirtualNumaNodes"/> + </xs:appinfo> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:extension> + </xs:complexContent> + </xs:complexType> </xs:schema> 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..4ed9055 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 @@ -90,6 +90,10 @@ vmpools: org.ovirt.engine.api.model.VmPools vms: org.ovirt.engine.api.model.VMs volume_group: org.ovirt.engine.api.model.VolumeGroup + numanode: org.ovirt.engine.api.model.NumaNode + numanodes: org.ovirt.engine.api.model.NumaNodes + virtual_numanode: org.ovirt.engine.api.model.VirtualNumaNode + virtual_numanodes: org.ovirt.engine.api.model.VirtualNumaNodes handlers: org.ovirt.engine.api.model.Action: 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 f7edabf..5ceeb3c 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 @@ -4897,4 +4897,98 @@ headers: Content-Type: {value: application/xml|json, required: true} Expect: {value: 201-created, required: false} +- name: /hosts/{host:id}/numanodes|rel=get + description: get the list of NUMA nodes for the host + request: + body: + parameterType: null + signatures: [] + urlparams: + max: {context: matrix, type: 'xs:int', value: 'max results', required: false} + headers: {} +- name: /hosts/{host:id}/numanodes/{numanode:id}|rel=get + description: get the details of the specified NUMA node for the host + request: + body: + parameterType: null + signatures: [] + urlparams: {} + headers: {} +- name: /hosts/{host:id}/numanodes/{numanode:id}/statistics|rel=get + description: get the statistics for the specified NUMA node of the host + request: + body: + parameterType: null + signatures: [] + urlparams: + max: {context: matrix, type: 'xs:int', value: 'max results', required: false} + headers: {} +- name: /hosts/{host:id}/numanodes/{numanode:id}/statistics/{statistic:id}|rel=get + description: get the details of the specified statistics for the specified NUMA node of the host + request: + body: + parameterType: null + signatures: [] + urlparams: {} + headers: {} +- name: /vms/{vm:id}/numanodes|rel=get + description: get the list of virtual NUMA nodes for the vm + request: + body: + parameterType: null + signatures: [] + urlparams: + max: {context: matrix, type: 'xs:int', value: 'max results', required: false} + headers: {} +- name: /vms/{vm:id}/numanodes/{numanode:id}|rel=get + description: get the details of the specified virtual NUMA node for the vm + request: + body: + parameterType: null + signatures: [] + urlparams: {} + headers: {} +- name: /vms/{vm:id}/numanodes/{numanode:id}|rel=delete + description: delete the specified virtual NUMA node for the vm + 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: /vms/{vm:id}/numanodes/{numanode:id}|rel=update + description: update the specified virtual NUMA node for the vm + request: + body: + parameterType: VirtualNumaNode + signatures: + - mandatoryArguments: {} + optionalArguments: + vm_numanode.index: xs:int + vm_numanode.memory: xs:string + vm_numanode.cpu_list: xs:string + vm_numanode.pinhost_numanode_list: xs:string + description: update the specified virtual NUMA node for the vm + urlparams: + async: {context: matrix, type: 'xs:boolean', value: true|false, required: false} + headers: + Content-Type: {value: application/xml|json, required: true} + Correlation-Id: {value: 'any string', required: false} +- name: /vms/{vm:id}/numanodes|rel=add + description: add a new virtual NUMA node for the vm + request: + body: + parameterType: VirtualNumaNode + signatures: + - mandatoryArguments: {vm_numanode.index: 'xs:int', vm_numanode.memory: 'xs:string', vm_numanode.cpu_list: 'xs:string'} + optionalArguments: + vm_numanode.pinhost_numanode_list: xs:string + description: add a new virtual NUMA node for the vm + urlparams: {} + headers: + Content-Type: {value: application/xml|json, required: true} + Expect: {value: 201-created, required: false} + Correlation-Id: {value: 'any string', required: false} diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendHostResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendHostResource.java index 1f981d4..592abd1 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendHostResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendHostResource.java @@ -22,6 +22,7 @@ import org.ovirt.engine.api.resource.AssignedPermissionsResource; import org.ovirt.engine.api.resource.AssignedTagsResource; import org.ovirt.engine.api.resource.HostNicsResource; +import org.ovirt.engine.api.resource.HostNumaNodesResource; import org.ovirt.engine.api.resource.HostResource; import org.ovirt.engine.api.resource.HostStorageResource; import org.ovirt.engine.api.resource.StatisticsResource; @@ -308,6 +309,12 @@ } @Override + @Path("numanodes") + public HostNumaNodesResource getHostNumaNodesResource() { + return inject(new BackendNumaNodesResource(id)); + } + + @Override public HostNicsResource getHostNicsResource() { return inject(new BackendHostNicsResource(id)); } diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendNumaNodeResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendNumaNodeResource.java new file mode 100644 index 0000000..ecf254f --- /dev/null +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendNumaNodeResource.java @@ -0,0 +1,41 @@ +package org.ovirt.engine.api.restapi.resource; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; + +import org.jboss.resteasy.annotations.providers.jaxb.Formatted; +import org.ovirt.engine.api.model.NumaNode; +import org.ovirt.engine.api.resource.HostNumaNodeResource; +import org.ovirt.engine.api.resource.StatisticsResource; +import org.ovirt.engine.core.common.businessentities.VdsNumaNode; + +import static org.ovirt.engine.api.restapi.resource.BackendNumaNodesResource.SUB_COLLECTIONS; + +public class BackendNumaNodeResource extends AbstractBackendSubResource<NumaNode, VdsNumaNode> implements HostNumaNodeResource { + + private BackendNumaNodesResource parent; + + public BackendNumaNodeResource(String id, BackendNumaNodesResource parent) { + super(id, NumaNode.class, VdsNumaNode.class, SUB_COLLECTIONS); + this.parent = parent; + } + + @Override + protected NumaNode doPopulate(NumaNode model, VdsNumaNode entity) { + return model; + } + + @Override + @Path("statistics") + public StatisticsResource getStatisticsResource() { + // TODO Auto-generated method stub + return null; + } + + @Override + @GET + @Formatted + public NumaNode get() { + return parent.lookupNumaNode(id, false); + } +} diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendNumaNodesResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendNumaNodesResource.java new file mode 100644 index 0000000..08247ae --- /dev/null +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendNumaNodesResource.java @@ -0,0 +1,84 @@ +package org.ovirt.engine.api.restapi.resource; + +import java.util.List; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.core.Response; + +import org.jboss.resteasy.annotations.providers.jaxb.Formatted; +import org.ovirt.engine.api.model.NumaNode; +import org.ovirt.engine.api.model.NumaNodes; +import org.ovirt.engine.api.resource.HostNumaNodeResource; +import org.ovirt.engine.api.resource.HostNumaNodesResource; +import org.ovirt.engine.core.common.businessentities.VdsNumaNode; +import org.ovirt.engine.core.common.queries.IdQueryParameters; +import org.ovirt.engine.core.common.queries.VdcQueryType; + +public class BackendNumaNodesResource extends AbstractBackendCollectionResource<NumaNode, VdsNumaNode> implements HostNumaNodesResource { + + static final String[] SUB_COLLECTIONS = { "statistics" }; + + private String hostId; + + public BackendNumaNodesResource(String hostId) { + super(NumaNode.class, VdsNumaNode.class, SUB_COLLECTIONS); + this.hostId = hostId; + } + + public String getHostId() { + return hostId; + } + + @Override + @GET + @Formatted + public NumaNodes list() { + NumaNodes ret = new NumaNodes(); + List<VdsNumaNode> nodes = getCollection(); + for (VdsNumaNode node : nodes) { + NumaNode numanode = populate(map(node, null), node); + ret.getNumaNodes().add(addLinks(numanode)); + } + return ret; + } + + @Override + @Path("{id}") + public HostNumaNodeResource getHostNumaNodeSubResource(@PathParam("id") String id) { + return inject(new BackendNumaNodeResource(id, this)); + } + + @Override + protected NumaNode doPopulate(NumaNode model, VdsNumaNode entity) { + return model; + } + + @Override + protected Response performRemove(String id) { + // TODO Auto-generated method stub + return null; + } + + protected List<VdsNumaNode> getCollection() { + return getBackendCollection(VdcQueryType.GetVdsNumaNodeByVdsId, new IdQueryParameters(asGuid(hostId))); + } + + public NumaNode lookupNumaNode(String id, boolean forcePopulate) { + List<VdsNumaNode> nodes = getCollection(); + for (VdsNumaNode node : nodes) { + if (node.getId().toString().equals(id)) { + NumaNode numanode = map(node, null); + if (forcePopulate) { + doPopulate(numanode, node); + } else { + populate(numanode, node); + } + return addLinks(numanode); + } + } + return notFound(); + } + +} 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..8fb309d 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 @@ -6,6 +6,7 @@ import java.util.List; import java.util.Set; +import javax.ws.rs.Path; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.Response; @@ -35,6 +36,7 @@ import org.ovirt.engine.api.resource.VmApplicationsResource; import org.ovirt.engine.api.resource.VmDisksResource; import org.ovirt.engine.api.resource.VmNicsResource; +import org.ovirt.engine.api.resource.VmNumaNodesResource; import org.ovirt.engine.api.resource.VmReportedDevicesResource; import org.ovirt.engine.api.resource.VmResource; import org.ovirt.engine.api.resource.VmSessionsResource; @@ -562,4 +564,11 @@ HaMaintenanceMode.GLOBAL, action.isMaintenanceEnabled()), action); } + + @Override + @Path("numanodes") + public VmNumaNodesResource getVmNumaNodesResource() { + // TODO Auto-generated method stub + return null; + } } -- To view, visit http://gerrit.ovirt.org/26943 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I72ed4b16c220decbf640f74c4aadffe423afc290 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Jason Liao <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
