Gilad Chaplik has uploaded a new change for review. Change subject: restapi: add cpu profile support ......................................................................
restapi: add cpu profile support href="/ovirt-engine/api/cpuprofiles"; "add"; method: POST; request type: CpuProfile; response type: CpuProfile href="/ovirt-engine/api/cpuprofiles"; "get"; method: GET; response type: CpuProfiles href="/ovirt-engine/api/cpuprofiles/{cpuprofile:id}"; "delete"; method: DELETE href="/ovirt-engine/api/cpuprofiles/{cpuprofile:id}"; "get"; method: GET; response type: CpuProfile href="/ovirt-engine/api/cpuprofiles/{cpuprofile:id}"; "update"; method: PUT; request type: CpuProfile; response type: CpuProfile href="/ovirt-engine/api/cpuprofiles/{cpuprofile:id}/permissions"; "add"; method: POST; request type: Permission; response type: Permission href="/ovirt-engine/api/cpuprofiles/{cpuprofile:id}/permissions"; "get"; method: GET; response type: Permissions href="/ovirt-engine/api/cpuprofiles/{cpuprofile:id}/permissions/{permission:id}"; "delete"; method: DELETE href="/ovirt-engine/api/cpuprofiles/{cpuprofile:id}/permissions/{permission:id}"; "get"; method: GET; response type: Permission href="/ovirt-engine/api/clusters/{cluster:id}/cpuprofiles"; "add"; method: POST; request type: CpuProfile; response type: CpuProfile href="/ovirt-engine/api/clusters/{cluster:id}/cpuprofiles"; "get"; method: GET; response type: CpuProfiles href="/ovirt-engine/api/clusters/{cluster:id}/cpuprofiles/{cpuprofile:id}"; "delete"; method: DELETE href="/ovirt-engine/api/clusters/{cluster:id}/cpuprofiles/{cpuprofile:id}"; "get"; method: GET; response type: CpuProfile Change-Id: I65976b00665a7f6d87b3fa6f62e54c753c51238c Signed-off-by: Gilad Chaplik <gchap...@redhat.com> --- A backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/AssignedCpuProfileResource.java A backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/AssignedCpuProfilesResource.java M backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/ClusterResource.java A backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/CpuProfileResource.java A backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/CpuProfilesResource.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/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/AbstractBackendCpuProfileResource.java A backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/AbstractBackendCpuProfilesResource.java A backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendAssignedCpuProfileResource.java A backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendAssignedCpuProfilesResource.java M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendClusterResource.java M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendClustersResource.java A backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendCpuProfileResource.java A backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendCpuProfilesResource.java M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/utils/FeaturesHelper.java A backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/AbstractBackendCpuProfilesResourceTest.java M backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendApiResourceTest.java A backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendAssignedCpuProfileResourceTest.java A backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendAssignedCpuProfilesResourceTest.java A backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendCpuProfileResourceTest.java A backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendCpuProfilesResourceTest.java A backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/CpuProfileMapper.java A backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/CpuProfileMapperTest.java 27 files changed, 1,326 insertions(+), 1 deletion(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/30/31730/1 diff --git a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/AssignedCpuProfileResource.java b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/AssignedCpuProfileResource.java new file mode 100644 index 0000000..ab45eb2 --- /dev/null +++ b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/AssignedCpuProfileResource.java @@ -0,0 +1,13 @@ +package org.ovirt.engine.api.resource; + +import javax.ws.rs.GET; +import javax.ws.rs.Produces; + +import org.ovirt.engine.api.model.CpuProfile; + +@Produces({ ApiMediaType.APPLICATION_XML, ApiMediaType.APPLICATION_JSON, ApiMediaType.APPLICATION_X_YAML }) +public interface AssignedCpuProfileResource { + + @GET + public CpuProfile get(); +} diff --git a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/AssignedCpuProfilesResource.java b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/AssignedCpuProfilesResource.java new file mode 100644 index 0000000..4d9be6a --- /dev/null +++ b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/AssignedCpuProfilesResource.java @@ -0,0 +1,31 @@ +package org.ovirt.engine.api.resource; + +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; + +import org.ovirt.engine.api.model.CpuProfile; +import org.ovirt.engine.api.model.CpuProfiles; + +@Produces({ ApiMediaType.APPLICATION_XML, ApiMediaType.APPLICATION_JSON, ApiMediaType.APPLICATION_X_YAML }) +public interface AssignedCpuProfilesResource { + + @GET + public CpuProfiles list(); + + @POST + @Consumes({ ApiMediaType.APPLICATION_XML, ApiMediaType.APPLICATION_JSON, ApiMediaType.APPLICATION_X_YAML }) + public Response add(CpuProfile cpuProfile); + + @DELETE + @Path("{id}") + public Response remove(@PathParam("id") String id); + + @Path("{id}") + public AssignedCpuProfileResource getAssignedCpuProfileSubResource(@PathParam("id") String id); +} diff --git a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/ClusterResource.java b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/ClusterResource.java index 72cbdbc..831d865 100644 --- a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/ClusterResource.java +++ b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/ClusterResource.java @@ -40,4 +40,7 @@ @Path("affinitygroups") public AffinityGroupsResource getAffinityGroupsResource(); + + @Path("cpuprofiles") + public AssignedCpuProfilesResource getCpuProfilesResource(); } diff --git a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/CpuProfileResource.java b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/CpuProfileResource.java new file mode 100644 index 0000000..dc06e65 --- /dev/null +++ b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/CpuProfileResource.java @@ -0,0 +1,13 @@ +package org.ovirt.engine.api.resource; + +import javax.ws.rs.Path; +import javax.ws.rs.Produces; + +import org.ovirt.engine.api.model.CpuProfile; + +@Produces({ ApiMediaType.APPLICATION_XML, ApiMediaType.APPLICATION_JSON, ApiMediaType.APPLICATION_X_YAML }) +public interface CpuProfileResource extends UpdatableResource<CpuProfile> { + + @Path("permissions") + public AssignedPermissionsResource getPermissionsResource(); +} diff --git a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/CpuProfilesResource.java b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/CpuProfilesResource.java new file mode 100644 index 0000000..c231750 --- /dev/null +++ b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/CpuProfilesResource.java @@ -0,0 +1,32 @@ +package org.ovirt.engine.api.resource; + +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; + +import org.ovirt.engine.api.model.CpuProfile; +import org.ovirt.engine.api.model.CpuProfiles; + +@Path("/cpuprofiles") +@Produces({ ApiMediaType.APPLICATION_XML, ApiMediaType.APPLICATION_JSON, ApiMediaType.APPLICATION_X_YAML }) +public interface CpuProfilesResource { + + @GET + public CpuProfiles list(); + + @POST + @Consumes({ ApiMediaType.APPLICATION_XML, ApiMediaType.APPLICATION_JSON, ApiMediaType.APPLICATION_X_YAML }) + public Response add(CpuProfile cpuProfile); + + @DELETE + @Path("{id}") + public Response remove(@PathParam("id") String id); + + @Path("{id}") + public CpuProfileResource getCpuProfileSubResource(@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 02bf6fa..0f4fb66 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 @@ -53,6 +53,7 @@ links.add(createLink("storageconnections", baseUri)); links.add(createLink("vnicprofiles", baseUri)); links.add(createLink("diskprofiles", baseUri)); + links.add(createLink("cpuprofiles", baseUri)); links.add(createLink("schedulingpolicyunits", baseUri)); links.add(createLink("schedulingpolicies", baseUri)); links.add(createLink("permissions", 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 6fb9d5e..9b257f1 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 @@ -37,6 +37,7 @@ import org.ovirt.engine.api.model.Bookmark; import org.ovirt.engine.api.model.CdRom; import org.ovirt.engine.api.model.Cluster; +import org.ovirt.engine.api.model.CpuProfile; import org.ovirt.engine.api.model.DataCenter; import org.ovirt.engine.api.model.DetailedLink; import org.ovirt.engine.api.model.Disk; @@ -115,6 +116,8 @@ import org.ovirt.engine.api.resource.DataCentersResource; import org.ovirt.engine.api.resource.DeviceResource; import org.ovirt.engine.api.resource.DevicesResource; +import org.ovirt.engine.api.resource.CpuProfileResource; +import org.ovirt.engine.api.resource.CpuProfilesResource; import org.ovirt.engine.api.resource.DiskProfileResource; import org.ovirt.engine.api.resource.DiskProfilesResource; import org.ovirt.engine.api.resource.DiskResource; @@ -467,6 +470,9 @@ map = new ParentToCollectionMap(DiskProfileResource.class, DiskProfilesResource.class); TYPES.put(DiskProfile.class, map); + map = new ParentToCollectionMap(CpuProfileResource.class, CpuProfilesResource.class); + TYPES.put(CpuProfile.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 b156c3a..afb6391 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 @@ -4780,4 +4780,35 @@ </xs:extension> </xs:complexContent> </xs:complexType> + + <!-- Cpu Profiles --> + <xs:element name="cpu_profile" type="CpuProfile"/> + + <xs:element name="cpu_profiles" type="CpuProfiles" /> + + <xs:complexType name="CpuProfile"> + <xs:complexContent> + <xs:extension base="BaseResource"> + <xs:sequence> + <xs:element ref="qos" minOccurs="1" maxOccurs="1"/> + <xs:element ref="cluster" minOccurs="1" maxOccurs="1"/> + </xs:sequence> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:complexType name="CpuProfiles"> + <xs:complexContent> + <xs:extension base="BaseResources"> + <xs:sequence> + <xs:annotation> + <xs:appinfo> + <jaxb:property name="CpuProfiles"/> + </xs:appinfo> + </xs:annotation> + <xs:element ref="cpu_profile" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + </xs:extension> + </xs:complexContent> + </xs:complexType> </xs:schema> 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 202d431..9a81fee 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 @@ -5810,3 +5810,146 @@ Content-Type: {value: application/xml|json, required: true} Expect: {value: 201-created, required: false} Correlation-Id: {value: 'any string', required: false} +- name: /cpuprofiles|rel=get + description: get the list of all cpu profiles in the system + request: + body: + parameterType: null + signatures: [] + urlparams: + max: {context: matrix, type: 'xs:int', value: 'max results', required: false} + headers: {} +- name: /cpuprofiles/{cpuprofile:id}|rel=get + description: get the details of the specified cpu profile in the system + request: + body: + parameterType: null + signatures: [] + urlparams: {} + headers: {} +- name: /cpuprofiles/{cpuprofile:id}|rel=delete + description: delete the specified cpu profile in 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: /cpuprofiles/{cpuprofile:id}|rel=update + description: update the specified cpu profile in the system + request: + body: + parameterType: CpuProfile + signatures: + - mandatoryArguments: {} + optionalArguments: {cpuprofile.name: 'xs:string', + cpuprofile.description: 'xs:string', + cpuprofile.qos.id: 'xs:string'} + description: update the specified cpu profile in the system + urlparams: {} + headers: + Content-Type: {value: application/xml|json, required: true} + Correlation-Id: {value: 'any string', required: false} +- name: /cpuprofiles|rel=add + description: add a new cpu profile to the system + request: + body: + parameterType: CpuProfile + signatures: + - mandatoryArguments: {cpuprofile.cluster.id: 'xs:string', cpuprofile.name: 'xs:string'} + optionalArguments: {cpuprofile.description: 'xs:string', + cpuprofile.qos.id: 'xs:string'} + description: add a new cpu profile 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: /cpuprofiles/{cpuprofile:id}/permissions|rel=get + description: get the list of all permissions on the cpu profile in the system + request: + body: + parameterType: null + signatures: [] + urlparams: + max: {context: matrix, type: 'xs:int', value: 'max results', required: false} + headers: {} +- name: /cpuprofiles/{cpuprofile:id}/permissions/{permission:id}|rel=get + description: get details of the specified permission on the cpu profile in the system + request: + body: + parameterType: null + signatures: [] + urlparams: {} + headers: {} +- name: /cpuprofiles/{cpuprofile:id}/permissions/{permission:id}|rel=delete + description: delete the specified permission for the cpu profile + 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: /cpuprofiles/{cpuprofile:id}/permissions|rel=add + description: add a new permission on the cpu profile in the system + request: + body: + parameterType: Permission + signatures: + - mandatoryArguments: {permission.user.id: 'xs:string', permission.role.id: 'xs:string'} + optionalArguments: {} + description: add a new user level permission on the cpu profile in the system + - mandatoryArguments: {permission.group.id: 'xs:string', permission.role.id: 'xs:string'} + optionalArguments: {} + description: add a new group level permission on the cpu profile in 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}/cpuprofiles|rel=get + description: get the list of all cpu profiles for the cluster + request: + body: + parameterType: null + signatures: [] + urlparams: + max: {context: matrix, type: 'xs:int', value: 'max results', required: false} + headers: {} +- name: /clusters/{cluster:id}/cpuprofiles/{cpuprofile:id}|rel=get + description: get the details of the specified cpu profile for the cluster + request: + body: + parameterType: null + signatures: [] + urlparams: {} + headers: {} +- name: /clusters/{cluster:id}/cpuprofiles/{cpuprofile:id}|rel=delete + description: delete the specified cpu profile for the cluster + 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: /clusters/{cluster:id}/cpuprofiles|rel=add + description: add a new cpu profile for the cluster + request: + body: + parameterType: CpuProfile + signatures: + - mandatoryArguments: {cpuprofile.name: 'xs:string'} + optionalArguments: {cpuprofile.description: 'xs:string', + cpuprofile.qos.id: 'xs:string'} + description: add a new cpu profile for the cluster + 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/BackendApplication.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/BackendApplication.java index 8ecc1c7..e6ed1b4 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 @@ -33,6 +33,7 @@ import org.ovirt.engine.api.restapi.resource.BackendCapabilitiesResource; import org.ovirt.engine.api.restapi.resource.BackendClustersResource; import org.ovirt.engine.api.restapi.resource.BackendDataCentersResource; +import org.ovirt.engine.api.restapi.resource.BackendCpuProfilesResource; import org.ovirt.engine.api.restapi.resource.BackendDiskProfilesResource; import org.ovirt.engine.api.restapi.resource.BackendDisksResource; import org.ovirt.engine.api.restapi.resource.BackendEventsResource; @@ -144,6 +145,7 @@ addResource(new BackendSchedulingPolicyUnitsResource()); addResource(new BackendSystemPermissionsResource()); addResource(new BackendDiskProfilesResource()); + addResource(new BackendCpuProfilesResource()); addResource(VmHelper.getInstance()); final SessionProcessor processor = new SessionProcessor(); diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/AbstractBackendCpuProfileResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/AbstractBackendCpuProfileResource.java new file mode 100644 index 0000000..2edc66b --- /dev/null +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/AbstractBackendCpuProfileResource.java @@ -0,0 +1,25 @@ +package org.ovirt.engine.api.restapi.resource; + +import org.ovirt.engine.api.model.CpuProfile; +import org.ovirt.engine.core.common.queries.IdQueryParameters; +import org.ovirt.engine.core.common.queries.VdcQueryType; + +public abstract class AbstractBackendCpuProfileResource + extends AbstractBackendSubResource<CpuProfile, org.ovirt.engine.core.common.businessentities.profiles.CpuProfile> { + + protected AbstractBackendCpuProfileResource(String id, String... subCollections) { + super(id, CpuProfile.class, + org.ovirt.engine.core.common.businessentities.profiles.CpuProfile.class, + subCollections); + } + + protected CpuProfile get() { + return performGet(VdcQueryType.GetCpuProfileById, new IdQueryParameters(guid)); + } + + @Override + protected CpuProfile doPopulate(CpuProfile model, + org.ovirt.engine.core.common.businessentities.profiles.CpuProfile entity) { + return model; + } +} diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/AbstractBackendCpuProfilesResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/AbstractBackendCpuProfilesResource.java new file mode 100644 index 0000000..f661846 --- /dev/null +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/AbstractBackendCpuProfilesResource.java @@ -0,0 +1,72 @@ +package org.ovirt.engine.api.restapi.resource; + +import java.util.List; + +import javax.ws.rs.core.Response; + +import org.ovirt.engine.api.model.CpuProfile; +import org.ovirt.engine.api.model.CpuProfiles; +import org.ovirt.engine.core.common.action.CpuProfileParameters; +import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.common.queries.IdQueryParameters; +import org.ovirt.engine.core.common.queries.VdcQueryType; +import org.ovirt.engine.core.compat.Guid; + +public abstract class AbstractBackendCpuProfilesResource + extends AbstractBackendCollectionResource<CpuProfile, org.ovirt.engine.core.common.businessentities.profiles.CpuProfile> { + + public AbstractBackendCpuProfilesResource(String... subCollections) { + super(CpuProfile.class, + org.ovirt.engine.core.common.businessentities.profiles.CpuProfile.class, + subCollections); + } + + protected CpuProfiles mapCollection(List<org.ovirt.engine.core.common.businessentities.profiles.CpuProfile> entities) { + CpuProfiles collection = new CpuProfiles(); + for (org.ovirt.engine.core.common.businessentities.profiles.CpuProfile entity : entities) { + collection.getCpuProfiles().add(addLinks(populate(map(entity), entity))); + } + + return collection; + } + + protected Response add(CpuProfile cpuProfile) { + validateParameters(cpuProfile); + CpuProfileParameters parameters = + new CpuProfileParameters(); + org.ovirt.engine.core.common.businessentities.profiles.CpuProfile map = map(cpuProfile); + parameters.setProfile(map); + return performCreate(VdcActionType.AddCpuProfile, + parameters, + new QueryIdResolver<Guid>(VdcQueryType.GetCpuProfileById, IdQueryParameters.class)); + } + + protected abstract void validateParameters(CpuProfile cpuProfile); + + @Override + protected Response performRemove(String id) { + org.ovirt.engine.core.common.businessentities.profiles.CpuProfile cpuProfile = getCpuProfile(id); + return performAction(VdcActionType.RemoveCpuProfile, + new CpuProfileParameters(cpuProfile, + cpuProfile.getId())); + } + + protected org.ovirt.engine.core.common.businessentities.profiles.CpuProfile getCpuProfile(String id) { + return getEntity(org.ovirt.engine.core.common.businessentities.profiles.CpuProfile.class, + VdcQueryType.GetCpuProfileById, + new IdQueryParameters(asGuidOr404(id)), + "CpuProfiles"); + } + + @Override + protected CpuProfile doPopulate(CpuProfile model, + org.ovirt.engine.core.common.businessentities.profiles.CpuProfile entity) { + return model; + } + + protected abstract List<org.ovirt.engine.core.common.businessentities.profiles.CpuProfile> getCpuProfilesCollection(); + + protected CpuProfiles performList() { + return mapCollection(getCpuProfilesCollection()); + } +} diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendAssignedCpuProfileResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendAssignedCpuProfileResource.java new file mode 100644 index 0000000..7fc712d --- /dev/null +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendAssignedCpuProfileResource.java @@ -0,0 +1,34 @@ +package org.ovirt.engine.api.restapi.resource; + +import org.ovirt.engine.api.model.CpuProfile; +import org.ovirt.engine.api.resource.AssignedCpuProfileResource; + +public class BackendAssignedCpuProfileResource extends AbstractBackendCpuProfileResource implements AssignedCpuProfileResource { + + private final BackendAssignedCpuProfilesResource parent; + + public BackendAssignedCpuProfileResource(String id, BackendAssignedCpuProfilesResource parent) { + super(id); + this.parent = parent; + } + + public BackendAssignedCpuProfilesResource getParent() { + return parent; + } + + @Override + public CpuProfile get() { + return addLinks(super.get()); + } + + @Override + protected CpuProfile addParents(CpuProfile cpuProfile) { + return parent.addParents(cpuProfile); + } + + @Override + protected CpuProfile doPopulate(CpuProfile model, + org.ovirt.engine.core.common.businessentities.profiles.CpuProfile entity) { + return model; + } +} diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendAssignedCpuProfilesResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendAssignedCpuProfilesResource.java new file mode 100644 index 0000000..83b0aa5 --- /dev/null +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendAssignedCpuProfilesResource.java @@ -0,0 +1,62 @@ +package org.ovirt.engine.api.restapi.resource; + +import java.util.List; + +import javax.ws.rs.PathParam; +import javax.ws.rs.core.Response; + +import org.ovirt.engine.api.model.Cluster; +import org.ovirt.engine.api.model.CpuProfile; +import org.ovirt.engine.api.model.CpuProfiles; +import org.ovirt.engine.api.resource.AssignedCpuProfileResource; +import org.ovirt.engine.api.resource.AssignedCpuProfilesResource; +import org.ovirt.engine.core.common.queries.IdQueryParameters; +import org.ovirt.engine.core.common.queries.VdcQueryType; + +public class BackendAssignedCpuProfilesResource extends AbstractBackendCpuProfilesResource implements AssignedCpuProfilesResource { + + private final String clusterId; + + public BackendAssignedCpuProfilesResource(String clusterId) { + this.clusterId = clusterId; + } + + @Override + public CpuProfiles list() { + return performList(); + } + + @Override + public Response add(CpuProfile cpuProfile) { + if (!cpuProfile.isSetCluster() || !cpuProfile.getCluster().isSetId()) { + cpuProfile.setCluster(new Cluster()); + cpuProfile.getCluster().setId(clusterId); + } + + return super.add(cpuProfile); + } + + @Override + protected void validateParameters(CpuProfile cpuProfile) { + validateParameters(cpuProfile, "name"); + } + + @SingleEntityResource + @Override + public AssignedCpuProfileResource getAssignedCpuProfileSubResource(@PathParam("id") String id) { + return inject(new BackendAssignedCpuProfileResource(id, this)); + } + + @Override + public CpuProfile addParents(CpuProfile cpuProfile) { + cpuProfile.setCluster(new Cluster()); + cpuProfile.getCluster().setId(clusterId); + return cpuProfile; + } + + @Override + protected List<org.ovirt.engine.core.common.businessentities.profiles.CpuProfile> getCpuProfilesCollection() { + return getBackendCollection(VdcQueryType.GetCpuProfilesByClusterId, + new IdQueryParameters(asGuidOr404(clusterId))); + } +} diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendClusterResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendClusterResource.java index 21d1122..4ad4677 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendClusterResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendClusterResource.java @@ -5,6 +5,7 @@ import org.ovirt.engine.api.model.Cluster; import org.ovirt.engine.api.resource.AffinityGroupsResource; +import org.ovirt.engine.api.resource.AssignedCpuProfilesResource; import org.ovirt.engine.api.resource.AssignedNetworksResource; import org.ovirt.engine.api.resource.AssignedPermissionsResource; import org.ovirt.engine.api.resource.ClusterResource; @@ -84,4 +85,8 @@ return inject(new BackendAffinityGroupsResource(id)); } + @Override + public AssignedCpuProfilesResource getCpuProfilesResource() { + return inject(new BackendAssignedCpuProfilesResource(id)); + } } diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendClustersResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendClustersResource.java index ef43ac7..3e5950c 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendClustersResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendClustersResource.java @@ -26,7 +26,7 @@ implements ClustersResource { static final String[] SUB_COLLECTIONS = { "networks", "permissions", "glustervolumes", "glusterhooks", - "affinitygroups" }; + "affinitygroups", "cpuprofiles" }; static final String[] VIRT_ONLY_MODE_COLLECTIONS_TO_HIDE = {"glustervolumes", "glusterhooks" }; public BackendClustersResource() { super(Cluster.class, VDSGroup.class, SUB_COLLECTIONS); diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendCpuProfileResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendCpuProfileResource.java new file mode 100644 index 0000000..30d68b3 --- /dev/null +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendCpuProfileResource.java @@ -0,0 +1,52 @@ +package org.ovirt.engine.api.restapi.resource; + +import org.ovirt.engine.api.model.CpuProfile; +import org.ovirt.engine.api.resource.AssignedPermissionsResource; +import org.ovirt.engine.api.resource.CpuProfileResource; +import org.ovirt.engine.core.common.VdcObjectType; +import org.ovirt.engine.core.common.action.CpuProfileParameters; +import org.ovirt.engine.core.common.action.VdcActionParametersBase; +import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.common.queries.GetPermissionsForObjectParameters; +import org.ovirt.engine.core.common.queries.IdQueryParameters; +import org.ovirt.engine.core.common.queries.VdcQueryType; +import org.ovirt.engine.core.compat.Guid; + +public class BackendCpuProfileResource extends AbstractBackendCpuProfileResource implements CpuProfileResource { + + protected BackendCpuProfileResource(String id) { + super(id, BackendCpuProfilesResource.SUB_COLLECTIONS); + } + + @Override + public CpuProfile get() { + return super.get(); + } + + @Override + public CpuProfile update(CpuProfile resource) { + return performUpdate(resource, + new QueryIdResolver<Guid>(VdcQueryType.GetCpuProfileById, IdQueryParameters.class), + VdcActionType.UpdateCpuProfile, + new UpdateParametersProvider()); + } + + @Override + public AssignedPermissionsResource getPermissionsResource() { + return inject(new BackendAssignedPermissionsResource(guid, + VdcQueryType.GetPermissionsForObject, + new GetPermissionsForObjectParameters(guid), + CpuProfile.class, + VdcObjectType.CpuProfile)); + } + + protected class UpdateParametersProvider + implements ParametersProvider<CpuProfile, org.ovirt.engine.core.common.businessentities.profiles.CpuProfile> { + @Override + public VdcActionParametersBase getParameters(CpuProfile incoming, + org.ovirt.engine.core.common.businessentities.profiles.CpuProfile entity) { + org.ovirt.engine.core.common.businessentities.profiles.CpuProfile map = map(incoming, entity); + return new CpuProfileParameters(map, map.getId()); + } + } +} diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendCpuProfilesResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendCpuProfilesResource.java new file mode 100644 index 0000000..67509f8 --- /dev/null +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendCpuProfilesResource.java @@ -0,0 +1,57 @@ +package org.ovirt.engine.api.restapi.resource; + +import java.util.List; + +import javax.ws.rs.PathParam; +import javax.ws.rs.core.Response; + +import org.ovirt.engine.api.model.CpuProfile; +import org.ovirt.engine.api.model.CpuProfiles; +import org.ovirt.engine.api.resource.CpuProfileResource; +import org.ovirt.engine.api.resource.CpuProfilesResource; +import org.ovirt.engine.core.common.businessentities.VDSGroup; +import org.ovirt.engine.core.common.queries.IdQueryParameters; +import org.ovirt.engine.core.common.queries.VdcQueryParametersBase; +import org.ovirt.engine.core.common.queries.VdcQueryType; + +public class BackendCpuProfilesResource extends AbstractBackendCpuProfilesResource implements CpuProfilesResource { + + static final String[] SUB_COLLECTIONS = { "permissions" }; + + public BackendCpuProfilesResource() { + super(SUB_COLLECTIONS); + } + + @Override + public CpuProfiles list() { + return performList(); + } + + @Override + protected List<org.ovirt.engine.core.common.businessentities.profiles.CpuProfile> getCpuProfilesCollection() { + return getBackendCollection(VdcQueryType.GetAllCpuProfiles, new VdcQueryParametersBase()); + } + + @Override + public Response add(CpuProfile cpuProfile) { + return super.add(cpuProfile); + } + + @Override + protected void validateParameters(CpuProfile cpuProfile) { + validateParameters(cpuProfile, "name", "cluster.id"); + String clusterId = cpuProfile.getCluster().getId(); + // verify the cluster.id is well provided + getEntity(VDSGroup.class, + VdcQueryType.GetVdsGroupById, + new IdQueryParameters(asGuid(clusterId)), + "cluster: id=" + + clusterId); + } + + @SingleEntityResource + @Override + public CpuProfileResource getCpuProfileSubResource(@PathParam("id") String id) { + return inject(new BackendCpuProfileResource(id)); + } +} 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 46fc8b5..14a9085 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 @@ -89,10 +89,18 @@ addNumaNodesFeature(features); addMacPoolsFeature(features); addDiskProfilesFeature(features); + addCpuProfilesFeature(features); } return features; } + private void addCpuProfilesFeature(Features features) { + Feature feature = new Feature(); + feature.setName("Cpu Profiles"); + feature.setDescription("Configuring Cpu's profile, for Cluster and QoS"); + features.getFeature().add(feature); + } + private void addDiskProfilesFeature(Features features) { Feature feature = new Feature(); feature.setName("Disk Profiles"); diff --git a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/AbstractBackendCpuProfilesResourceTest.java b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/AbstractBackendCpuProfilesResourceTest.java new file mode 100644 index 0000000..54157a0 --- /dev/null +++ b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/AbstractBackendCpuProfilesResourceTest.java @@ -0,0 +1,330 @@ +package org.ovirt.engine.api.restapi.resource; + +import static org.easymock.EasyMock.anyObject; +import static org.easymock.EasyMock.eq; +import static org.easymock.EasyMock.expect; + +import java.util.ArrayList; +import java.util.List; + +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.UriInfo; + +import org.junit.Ignore; +import org.junit.Test; +import org.ovirt.engine.api.model.Fault; +import org.ovirt.engine.api.model.CpuProfile; +import org.ovirt.engine.api.model.Cluster; +import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.common.action.CpuProfileParameters; +import org.ovirt.engine.core.common.queries.IdQueryParameters; +import org.ovirt.engine.core.common.queries.VdcQueryParametersBase; +import org.ovirt.engine.core.common.queries.VdcQueryReturnValue; +import org.ovirt.engine.core.common.queries.VdcQueryType; +import org.ovirt.engine.core.compat.Guid; + +public abstract class AbstractBackendCpuProfilesResourceTest<C extends AbstractBackendCpuProfilesResource> + extends AbstractBackendCollectionResourceTest<CpuProfile, org.ovirt.engine.core.common.businessentities.profiles.CpuProfile, C> { + + protected static final Guid CLUSTER_ID = GUIDS[1]; + private final VdcQueryType listQueryType; + private final Class<? extends VdcQueryParametersBase> listQueryParamsClass; + + public AbstractBackendCpuProfilesResourceTest(C collection, + VdcQueryType listQueryType, + Class<? extends VdcQueryParametersBase> queryParamsClass) { + super(collection, null, ""); + this.listQueryType = listQueryType; + this.listQueryParamsClass = queryParamsClass; + } + + @Test + public void testRemoveNotFound() throws Exception { + setUpEntityQueryExpectations(1, 0, true); + control.replay(); + try { + collection.remove(GUIDS[0].toString()); + fail("expected WebApplicationException"); + } catch (WebApplicationException wae) { + verifyNotFoundException(wae); + } + } + + @Test + public void testRemove() throws Exception { + setUpEntityQueryExpectations(2, 0, false); + setUriInfo(setUpActionExpectations(VdcActionType.RemoveCpuProfile, + CpuProfileParameters.class, + new String[] {}, + new Object[] {}, + true, + true)); + verifyRemove(collection.remove(GUIDS[0].toString())); + } + + @Test + public void testRemoveNonExistant() throws Exception { + setUpEntityQueryExpectations(VdcQueryType.GetCpuProfileById, + IdQueryParameters.class, + new String[] { "Id" }, + new Object[] { NON_EXISTANT_GUID }, + null); + control.replay(); + try { + collection.remove(NON_EXISTANT_GUID.toString()); + fail("expected WebApplicationException"); + } catch (WebApplicationException wae) { + assertNotNull(wae.getResponse()); + assertEquals(404, wae.getResponse().getStatus()); + } + } + + @Test + public void testRemoveCantDo() throws Exception { + doTestBadRemove(false, true, CANT_DO); + } + + @Test + public void testRemoveFailed() throws Exception { + doTestBadRemove(true, false, FAILURE); + } + + protected void doTestBadRemove(boolean canDo, boolean success, String detail) throws Exception { + setUpEntityQueryExpectations(2, 0, false); + + setUriInfo(setUpActionExpectations(VdcActionType.RemoveCpuProfile, + CpuProfileParameters.class, + new String[] {}, + new Object[] {}, + canDo, + success)); + try { + collection.remove(GUIDS[0].toString()); + fail("expected WebApplicationException"); + } catch (WebApplicationException wae) { + verifyFault(wae, detail); + } + } + + @Test + public void testAddCpuProfile() throws Exception { + setUriInfo(setUpBasicUriExpectations()); + setUpClusterQueryExpectations(); + setUpCreationExpectations(VdcActionType.AddCpuProfile, + CpuProfileParameters.class, + new String[] {}, + new Object[] {}, + true, + true, + GUIDS[0], + VdcQueryType.GetCpuProfileById, + IdQueryParameters.class, + new String[] { "Id" }, + new Object[] { Guid.Empty }, + getEntity(0)); + CpuProfile model = getModel(0); + model.setCluster(new Cluster()); + model.getCluster().setId(CLUSTER_ID.toString()); + + Response response = collection.add(model); + assertEquals(201, response.getStatus()); + assertTrue(response.getEntity() instanceof CpuProfile); + verifyModel((CpuProfile) response.getEntity(), 0); + } + + @Test + public void testAddCpuProfileCantDo() throws Exception { + setUpClusterQueryExpectations(); + doTestBadAddCpuProfile(false, true, CANT_DO); + } + + @Test + public void testAddCpuProfileFailure() throws Exception { + setUpClusterQueryExpectations(); + doTestBadAddCpuProfile(true, false, FAILURE); + } + + private void doTestBadAddCpuProfile(boolean canDo, boolean success, String detail) throws Exception { + setUriInfo(setUpActionExpectations(VdcActionType.AddCpuProfile, + CpuProfileParameters.class, + new String[] {}, + new Object[] {}, + canDo, + success)); + CpuProfile model = getModel(0); + model.setCluster(new Cluster()); + model.getCluster().setId(CLUSTER_ID.toString()); + + try { + collection.add(model); + fail("expected WebApplicationException"); + } catch (WebApplicationException wae) { + verifyFault(wae, detail); + } + } + + @Test + public void testAddIncompleteParameters() throws Exception { + CpuProfile model = createIncompleteCpuProfile(); + setUriInfo(setUpBasicUriExpectations()); + control.replay(); + try { + collection.add(model); + fail("expected WebApplicationException on incomplete parameters"); + } catch (WebApplicationException wae) { + verifyIncompleteException(wae, "CpuProfile", "validateParameters", getIncompleteFields()); + } + } + + protected String[] getIncompleteFields() { + return new String[] { "name" }; + } + + protected CpuProfile createIncompleteCpuProfile() { + return new CpuProfile(); + } + + @Test + @Ignore + @Override + public void testQuery() throws Exception { + } + + @Override + @Test + public void testList() throws Exception { + UriInfo uriInfo = setUpUriExpectations(null); + setUpCpuProfilesQueryExpectations(null); + control.replay(); + collection.setUriInfo(uriInfo); + verifyCollection(getCollection()); + } + + @Override + @Test + public void testListFailure() throws Exception { + setUpCpuProfilesQueryExpectations(FAILURE); + UriInfo uriInfo = setUpUriExpectations(null); + collection.setUriInfo(uriInfo); + control.replay(); + + try { + getCollection(); + fail("expected WebApplicationException"); + } catch (WebApplicationException wae) { + assertTrue(wae.getResponse().getEntity() instanceof Fault); + assertEquals(mockl10n(FAILURE), ((Fault) wae.getResponse().getEntity()).getDetail()); + } + } + + @Override + @Test + public void testListCrash() throws Exception { + Throwable t = new RuntimeException(FAILURE); + setUpCpuProfilesQueryExpectations(t); + + UriInfo uriInfo = setUpUriExpectations(null); + collection.setUriInfo(uriInfo); + + control.replay(); + + try { + getCollection(); + fail("expected WebApplicationException"); + } catch (WebApplicationException wae) { + verifyFault(wae, BACKEND_FAILED_SERVER_LOCALE, t); + } + } + + @Override + @Test + public void testListCrashClientLocale() throws Exception { + UriInfo uriInfo = setUpUriExpectations(null); + locales.add(CLIENT_LOCALE); + + Throwable t = new RuntimeException(FAILURE); + setUpCpuProfilesQueryExpectations(t); + collection.setUriInfo(uriInfo); + + control.replay(); + try { + getCollection(); + fail("expected WebApplicationException"); + } catch (WebApplicationException wae) { + verifyFault(wae, BACKEND_FAILED_CLIENT_LOCALE, t); + } finally { + locales.clear(); + } + } + + private void setUpCpuProfilesQueryExpectations(Object failure) { + VdcQueryReturnValue queryResult = control.createMock(VdcQueryReturnValue.class); + expect(queryResult.getSucceeded()).andReturn(failure == null).anyTimes(); + List<org.ovirt.engine.core.common.businessentities.profiles.CpuProfile> entities = new ArrayList<>(); + + if (failure == null) { + for (int i = 0; i < NAMES.length; i++) { + entities.add(getEntity(i)); + } + expect(queryResult.getReturnValue()).andReturn(entities).anyTimes(); + } else { + if (failure instanceof String) { + expect(queryResult.getExceptionString()).andReturn((String) failure).anyTimes(); + setUpL10nExpectations((String) failure); + } else if (failure instanceof Exception) { + expect(backend.runQuery(eq(listQueryType), + anyObject(listQueryParamsClass))).andThrow((Exception) failure).anyTimes(); + return; + } + } + expect(backend.runQuery(eq(listQueryType), anyObject(listQueryParamsClass))).andReturn( + queryResult); + } + + protected void setUpEntityQueryExpectations(int times, int index, boolean notFound) throws Exception { + while (times-- > 0) { + setUpEntityQueryExpectations(VdcQueryType.GetCpuProfileById, + IdQueryParameters.class, + new String[] { "Id" }, + new Object[] { GUIDS[index] }, + notFound ? null : getEntity(index)); + } + } + + static CpuProfile getModel(int index) { + CpuProfile model = new CpuProfile(); + model.setId(GUIDS[index].toString()); + model.setName(NAMES[index]); + model.setDescription(DESCRIPTIONS[index]); + return model; + } + + protected List<org.ovirt.engine.core.common.businessentities.profiles.CpuProfile> getEntityList() { + List<org.ovirt.engine.core.common.businessentities.profiles.CpuProfile> entities = + new ArrayList<org.ovirt.engine.core.common.businessentities.profiles.CpuProfile>(); + for (int i = 0; i < NAMES.length; i++) { + entities.add(getEntity(i)); + } + + return entities; + } + + @Override + protected org.ovirt.engine.core.common.businessentities.profiles.CpuProfile getEntity(int index) { + return setUpEntityExpectations(control.createMock(org.ovirt.engine.core.common.businessentities.profiles.CpuProfile.class), + index); + } + + protected void setUpClusterQueryExpectations() { + } + + static org.ovirt.engine.core.common.businessentities.profiles.CpuProfile setUpEntityExpectations(org.ovirt.engine.core.common.businessentities.profiles.CpuProfile entity, + int index) { + expect(entity.getId()).andReturn(GUIDS[index]).anyTimes(); + expect(entity.getName()).andReturn(NAMES[index]).anyTimes(); + expect(entity.getDescription()).andReturn(DESCRIPTIONS[index]).anyTimes(); + expect(entity.getClusterId()).andReturn(GUIDS[index]).anyTimes(); + return entity; + } +} diff --git a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendApiResourceTest.java b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendApiResourceTest.java index 5956119..9868ddb 100644 --- a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendApiResourceTest.java +++ b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendApiResourceTest.java @@ -122,6 +122,7 @@ "storageconnections", "vnicprofiles", "diskprofiles", + "cpuprofiles", "schedulingpolicyunits", "schedulingpolicies", "permissions", @@ -183,6 +184,7 @@ BASE_PATH + "/storageconnections", BASE_PATH + "/vnicprofiles", BASE_PATH + "/diskprofiles", + BASE_PATH + "/cpuprofiles", BASE_PATH + "/schedulingpolicyunits", BASE_PATH + "/schedulingpolicies", BASE_PATH + "/permissions", diff --git a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendAssignedCpuProfileResourceTest.java b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendAssignedCpuProfileResourceTest.java new file mode 100644 index 0000000..a2ec2c4 --- /dev/null +++ b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendAssignedCpuProfileResourceTest.java @@ -0,0 +1,99 @@ +package org.ovirt.engine.api.restapi.resource; + +import static org.easymock.EasyMock.expect; + +import java.util.ArrayList; +import java.util.List; + +import javax.ws.rs.WebApplicationException; + +import org.junit.Test; +import org.ovirt.engine.api.model.CpuProfile; +import org.ovirt.engine.core.common.queries.IdQueryParameters; +import org.ovirt.engine.core.common.queries.VdcQueryType; + +public class BackendAssignedCpuProfileResourceTest + extends AbstractBackendSubResourceTest<CpuProfile, org.ovirt.engine.core.common.businessentities.profiles.CpuProfile, BackendAssignedCpuProfileResource> { + + public BackendAssignedCpuProfileResourceTest() { + super(new BackendAssignedCpuProfileResource(GUIDS[0].toString(), + new BackendAssignedCpuProfilesResource(GUIDS[0].toString()))); + } + + @Test + public void testBadGuid() throws Exception { + control.replay(); + try { + new BackendCpuProfileResource("foo"); + fail("expected WebApplicationException"); + } catch (WebApplicationException wae) { + verifyNotFoundException(wae); + } + } + + @Test + public void testGetNotFound() throws Exception { + setUriInfo(setUpBasicUriExpectations()); + setUpEntityQueryExpectations(1, 0, true); + control.replay(); + try { + resource.get(); + fail("expected WebApplicationException"); + } catch (WebApplicationException wae) { + verifyNotFoundException(wae); + } + } + + @Test + public void testGet() throws Exception { + setUriInfo(setUpBasicUriExpectations()); + setUpEntityQueryExpectations(1, 0, false); + control.replay(); + + verifyModel(resource.get(), 0); + } + + protected void setUpEntityQueryExpectations(int times, int index, boolean notFound) throws Exception { + while (times-- > 0) { + setUpEntityQueryExpectations(VdcQueryType.GetCpuProfileById, + IdQueryParameters.class, + new String[] { "Id" }, + new Object[] { GUIDS[index] }, + notFound ? null : getEntity(index)); + } + } + + static CpuProfile getModel(int index) { + CpuProfile model = new CpuProfile(); + model.setId(GUIDS[index].toString()); + model.setName(NAMES[index]); + model.setDescription(DESCRIPTIONS[index]); + return model; + } + + @Override + protected org.ovirt.engine.core.common.businessentities.profiles.CpuProfile getEntity(int index) { + return setUpEntityExpectations(control.createMock(org.ovirt.engine.core.common.businessentities.profiles.CpuProfile.class), + index); + } + + protected List<org.ovirt.engine.core.common.businessentities.profiles.CpuProfile> getEntityList() { + List<org.ovirt.engine.core.common.businessentities.profiles.CpuProfile> entities = + new ArrayList<org.ovirt.engine.core.common.businessentities.profiles.CpuProfile>(); + for (int i = 0; i < NAMES.length; i++) { + entities.add(getEntity(i)); + } + + return entities; + } + + static org.ovirt.engine.core.common.businessentities.profiles.CpuProfile setUpEntityExpectations(org.ovirt.engine.core.common.businessentities.profiles.CpuProfile entity, + int index) { + expect(entity.getId()).andReturn(GUIDS[index]).anyTimes(); + expect(entity.getName()).andReturn(NAMES[index]).anyTimes(); + expect(entity.getDescription()).andReturn(DESCRIPTIONS[index]).anyTimes(); + expect(entity.getClusterId()).andReturn(GUIDS[index]).anyTimes(); + expect(entity.getQosId()).andReturn(GUIDS[index]).anyTimes(); + return entity; + } +} diff --git a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendAssignedCpuProfilesResourceTest.java b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendAssignedCpuProfilesResourceTest.java new file mode 100644 index 0000000..33acde2 --- /dev/null +++ b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendAssignedCpuProfilesResourceTest.java @@ -0,0 +1,21 @@ +package org.ovirt.engine.api.restapi.resource; + +import java.util.List; + +import org.ovirt.engine.api.model.CpuProfile; +import org.ovirt.engine.core.common.queries.IdQueryParameters; +import org.ovirt.engine.core.common.queries.VdcQueryType; + +public class BackendAssignedCpuProfilesResourceTest extends AbstractBackendCpuProfilesResourceTest<BackendAssignedCpuProfilesResource> { + + public BackendAssignedCpuProfilesResourceTest() { + super(new BackendAssignedCpuProfilesResource(CLUSTER_ID.toString()), + VdcQueryType.GetCpuProfilesByClusterId, + IdQueryParameters.class); + } + + @Override + protected List<CpuProfile> getCollection() { + return collection.list().getCpuProfiles(); + } +} diff --git a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendCpuProfileResourceTest.java b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendCpuProfileResourceTest.java new file mode 100644 index 0000000..24e372b --- /dev/null +++ b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendCpuProfileResourceTest.java @@ -0,0 +1,159 @@ +package org.ovirt.engine.api.restapi.resource; + +import static org.easymock.EasyMock.expect; + +import javax.ws.rs.WebApplicationException; + +import org.junit.Test; +import org.ovirt.engine.api.model.CpuProfile; +import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.common.action.CpuProfileParameters; +import org.ovirt.engine.core.common.queries.IdQueryParameters; +import org.ovirt.engine.core.common.queries.VdcQueryType; + +public class BackendCpuProfileResourceTest + extends AbstractBackendSubResourceTest<CpuProfile, org.ovirt.engine.core.common.businessentities.profiles.CpuProfile, BackendCpuProfileResource> { + + public BackendCpuProfileResourceTest() { + super(new BackendCpuProfileResource(GUIDS[0].toString())); + } + + @Test + public void testBadGuid() throws Exception { + control.replay(); + try { + new BackendCpuProfileResource("foo"); + fail("expected WebApplicationException"); + } catch (WebApplicationException wae) { + verifyNotFoundException(wae); + } + } + + @Test + public void testGetNotFound() throws Exception { + setUriInfo(setUpBasicUriExpectations()); + setUpEntityQueryExpectations(1, 0, true); + control.replay(); + try { + resource.get(); + fail("expected WebApplicationException"); + } catch (WebApplicationException wae) { + verifyNotFoundException(wae); + } + } + + @Test + public void testGet() throws Exception { + setUriInfo(setUpBasicUriExpectations()); + setUpEntityQueryExpectations(1, 0, false); + control.replay(); + + verifyModel(resource.get(), 0); + } + + @Test + public void testUpdateNotFound() throws Exception { + setUriInfo(setUpBasicUriExpectations()); + setUpEntityQueryExpectations(1, 0, true); + + control.replay(); + try { + resource.update(getModel(0)); + fail("expected WebApplicationException"); + } catch (WebApplicationException wae) { + verifyNotFoundException(wae); + } + } + + @Test + public void testUpdate() throws Exception { + setUpEntityQueryExpectations(2, 0, false); + + setUriInfo(setUpActionExpectations(VdcActionType.UpdateCpuProfile, + CpuProfileParameters.class, + new String[] {}, + new Object[] {}, + true, + true)); + + verifyModel(resource.update(getModel(0)), 0); + } + + @Test + public void testUpdateCantDo() throws Exception { + doTestBadUpdate(false, true, CANT_DO); + } + + @Test + public void testUpdateFailed() throws Exception { + doTestBadUpdate(true, false, FAILURE); + } + + private void doTestBadUpdate(boolean canDo, boolean success, String detail) throws Exception { + setUpEntityQueryExpectations(1, 0, false); + + setUriInfo(setUpActionExpectations(VdcActionType.UpdateCpuProfile, + CpuProfileParameters.class, + new String[] {}, + new Object[] {}, + canDo, + success)); + + try { + resource.update(getModel(0)); + fail("expected WebApplicationException"); + } catch (WebApplicationException wae) { + verifyFault(wae, detail); + } + } + + @Test + public void testConflictedUpdate() throws Exception { + setUriInfo(setUpBasicUriExpectations()); + setUpEntityQueryExpectations(1, 0, false); + control.replay(); + + CpuProfile model = getModel(1); + model.setId(GUIDS[1].toString()); + try { + resource.update(model); + fail("expected WebApplicationException"); + } catch (WebApplicationException wae) { + verifyImmutabilityConstraint(wae); + } + } + + protected void setUpEntityQueryExpectations(int times, int index, boolean notFound) throws Exception { + while (times-- > 0) { + setUpEntityQueryExpectations(VdcQueryType.GetCpuProfileById, + IdQueryParameters.class, + new String[] { "Id" }, + new Object[] { GUIDS[index] }, + notFound ? null : getEntity(index)); + } + } + + static CpuProfile getModel(int index) { + CpuProfile model = new CpuProfile(); + model.setId(GUIDS[index].toString()); + model.setName(NAMES[index]); + model.setDescription(DESCRIPTIONS[index]); + return model; + } + + @Override + protected org.ovirt.engine.core.common.businessentities.profiles.CpuProfile getEntity(int index) { + return setUpEntityExpectations(control.createMock(org.ovirt.engine.core.common.businessentities.profiles.CpuProfile.class), + index); + } + + static org.ovirt.engine.core.common.businessentities.profiles.CpuProfile setUpEntityExpectations(org.ovirt.engine.core.common.businessentities.profiles.CpuProfile entity, + int index) { + expect(entity.getId()).andReturn(GUIDS[index]).anyTimes(); + expect(entity.getName()).andReturn(NAMES[index]).anyTimes(); + expect(entity.getDescription()).andReturn(DESCRIPTIONS[index]).anyTimes(); + expect(entity.getClusterId()).andReturn(GUIDS[index]).anyTimes(); + expect(entity.getQosId()).andReturn(GUIDS[index]).anyTimes(); + return entity; + } +} diff --git a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendCpuProfilesResourceTest.java b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendCpuProfilesResourceTest.java new file mode 100644 index 0000000..d301ff5 --- /dev/null +++ b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendCpuProfilesResourceTest.java @@ -0,0 +1,42 @@ +package org.ovirt.engine.api.restapi.resource; + +import java.util.List; + +import org.ovirt.engine.api.model.CpuProfile; +import org.ovirt.engine.core.common.businessentities.VDSGroup; +import org.ovirt.engine.core.common.queries.IdQueryParameters; +import org.ovirt.engine.core.common.queries.VdcQueryParametersBase; +import org.ovirt.engine.core.common.queries.VdcQueryType; + +public class BackendCpuProfilesResourceTest extends AbstractBackendCpuProfilesResourceTest<BackendCpuProfilesResource> { + + public BackendCpuProfilesResourceTest() { + super(new BackendCpuProfilesResource(), VdcQueryType.GetAllCpuProfiles, VdcQueryParametersBase.class); + } + + @Override + protected String[] getIncompleteFields() { + return new String[] { "cluster.id" }; + } + + @Override + protected CpuProfile createIncompleteCpuProfile() { + CpuProfile cpuProfile = super.createIncompleteCpuProfile(); + cpuProfile.setName(NAMES[0]); + return cpuProfile; + } + + @Override + protected List<CpuProfile> getCollection() { + return collection.list().getCpuProfiles(); + } + + @Override + protected void setUpClusterQueryExpectations() { + setUpEntityQueryExpectations(VdcQueryType.GetVdsGroupById, + IdQueryParameters.class, + new String[] { "Id" }, + new Object[] { CLUSTER_ID }, + new VDSGroup()); + } +} diff --git a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/CpuProfileMapper.java b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/CpuProfileMapper.java new file mode 100644 index 0000000..ee7e626 --- /dev/null +++ b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/CpuProfileMapper.java @@ -0,0 +1,56 @@ +package org.ovirt.engine.api.restapi.types; + +import org.ovirt.engine.api.model.CpuProfile; +import org.ovirt.engine.api.model.QoS; +import org.ovirt.engine.api.model.Cluster; +import org.ovirt.engine.api.restapi.utils.GuidUtils; + +public class CpuProfileMapper { + @Mapping(from = CpuProfile.class, to = org.ovirt.engine.core.common.businessentities.profiles.CpuProfile.class) + public static org.ovirt.engine.core.common.businessentities.profiles.CpuProfile map(CpuProfile model, + org.ovirt.engine.core.common.businessentities.profiles.CpuProfile template) { + org.ovirt.engine.core.common.businessentities.profiles.CpuProfile entity = + template != null ? template : new org.ovirt.engine.core.common.businessentities.profiles.CpuProfile(); + if (model.isSetId()) { + entity.setId(GuidUtils.asGuid(model.getId())); + } + if (model.isSetName()) { + entity.setName(model.getName()); + } + if (model.isSetDescription()) { + entity.setDescription(model.getDescription()); + } + if (model.isSetCluster() && model.getCluster().isSetId()) { + entity.setClusterId(GuidUtils.asGuid(model.getCluster().getId())); + } + if (model.isSetQos() && model.getQos().isSetId()) { + entity.setQosId(GuidUtils.asGuid(model.getQos().getId())); + } + return entity; + } + + @Mapping(from = org.ovirt.engine.core.common.businessentities.profiles.CpuProfile.class, to = CpuProfile.class) + public static CpuProfile map(org.ovirt.engine.core.common.businessentities.profiles.CpuProfile entity, + CpuProfile template) { + CpuProfile model = template != null ? template : new CpuProfile(); + if (entity.getId() != null) { + model.setId(entity.getId().toString()); + } + if (entity.getName() != null) { + model.setName(entity.getName()); + } + if (entity.getDescription() != null) { + model.setDescription(entity.getDescription()); + } + if (entity.getClusterId() != null) { + model.setCluster(new Cluster()); + model.getCluster().setId(entity.getClusterId().toString()); + } + if (entity.getQosId() != null) { + model.setQos(new QoS()); + model.getQos().setId(entity.getQosId().toString()); + } + + return model; + } +} diff --git a/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/CpuProfileMapperTest.java b/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/CpuProfileMapperTest.java new file mode 100644 index 0000000..c1c33a1 --- /dev/null +++ b/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/CpuProfileMapperTest.java @@ -0,0 +1,26 @@ +package org.ovirt.engine.api.restapi.types; + +import org.ovirt.engine.api.model.CpuProfile; + +public class CpuProfileMapperTest extends AbstractInvertibleMappingTest<CpuProfile, + org.ovirt.engine.core.common.businessentities.profiles.CpuProfile, + org.ovirt.engine.core.common.businessentities.profiles.CpuProfile> { + + public CpuProfileMapperTest() { + super(CpuProfile.class, + org.ovirt.engine.core.common.businessentities.profiles.CpuProfile.class, + org.ovirt.engine.core.common.businessentities.profiles.CpuProfile.class); + } + + @Override + protected void verify(CpuProfile model, CpuProfile transform) { + assertNotNull(transform); + assertEquals(model.getName(), transform.getName()); + assertEquals(model.getId(), transform.getId()); + assertEquals(model.getDescription(), transform.getDescription()); + assertNotNull(transform.getCluster()); + assertEquals(model.getCluster().getId(), transform.getCluster().getId()); + assertNotNull(transform.getQos()); + assertEquals(model.getQos().getId(), transform.getQos().getId()); + } +} -- To view, visit http://gerrit.ovirt.org/31730 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I65976b00665a7f6d87b3fa6f62e54c753c51238c Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Gilad Chaplik <gchap...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches