Daniel Erez has uploaded a new change for review.

Change subject: restapi: add OpenStackVolumeTypes sub-collection
......................................................................

restapi: add OpenStackVolumeTypes sub-collection

Adding OpenStackVolumeTypes sub-collection to OpenStackVolumeProviders
root-collection:
* Added OpenStackVolumeType/OpenStackVolumeTypes elements.
* Support GET /api/openstackvolumeproviders/{provider_id}/volumetypes.
* Added relevant tests.
* Updated rsdl_metadata.yaml accordingly.

Feature Page: http://www.ovirt.org/Features/Cinder_Integration

Change-Id: I08157edb4f4808880848bc9f7d07c29500d1197d
Bug-Url: https://bugzilla.redhat.com/1185826
Signed-off-by: Daniel Erez <[email protected]>
---
M 
backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/openstack/OpenStackVolumeProviderResource.java
A 
backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/openstack/OpenStackVolumeTypeResource.java
A 
backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/openstack/OpenStackVolumeTypesResource.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/resource/openstack/BackendOpenStackImageResource.java
M 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/openstack/BackendOpenStackImagesResource.java
R 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/openstack/BackendOpenStackStorageProviderHelper.java
M 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/openstack/BackendOpenStackVolumeProviderResource.java
A 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/openstack/BackendOpenStackVolumeTypeResource.java
A 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/openstack/BackendOpenStackVolumeTypesResource.java
A 
backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/openstack/BackendOpenStackVolumeTypeResourceTest.java
A 
backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/openstack/BackendOpenStackVolumeTypesResourceTest.java
A 
backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/openstack/OpenStackVolumeTypeMapper.java
15 files changed, 559 insertions(+), 4 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/71/39371/1

diff --git 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/openstack/OpenStackVolumeProviderResource.java
 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/openstack/OpenStackVolumeProviderResource.java
index d709f86..4fb3b2f 100644
--- 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/openstack/OpenStackVolumeProviderResource.java
+++ 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/openstack/OpenStackVolumeProviderResource.java
@@ -20,8 +20,11 @@
 import org.ovirt.engine.api.resource.ApiMediaType;
 import org.ovirt.engine.api.resource.ExternalProviderResource;
 
+import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 
 @Produces({ApiMediaType.APPLICATION_XML, ApiMediaType.APPLICATION_JSON, 
ApiMediaType.APPLICATION_X_YAML})
 public interface OpenStackVolumeProviderResource extends 
ExternalProviderResource<OpenStackVolumeProvider> {
+    @Path("volumetypes")
+    public OpenStackVolumeTypesResource getOpenStackVolumeTypes();
 }
diff --git 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/openstack/OpenStackVolumeTypeResource.java
 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/openstack/OpenStackVolumeTypeResource.java
new file mode 100644
index 0000000..a8f5443
--- /dev/null
+++ 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/openstack/OpenStackVolumeTypeResource.java
@@ -0,0 +1,29 @@
+/*
+* Copyright (c) 2014 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.openstack;
+
+import org.ovirt.engine.api.model.OpenStackVolumeType;
+import org.ovirt.engine.api.resource.ApiMediaType;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Produces;
+
+@Produces({ApiMediaType.APPLICATION_XML, ApiMediaType.APPLICATION_JSON, 
ApiMediaType.APPLICATION_X_YAML})
+public interface OpenStackVolumeTypeResource {
+    @GET
+    public OpenStackVolumeType get();
+}
diff --git 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/openstack/OpenStackVolumeTypesResource.java
 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/openstack/OpenStackVolumeTypesResource.java
new file mode 100644
index 0000000..4d4c2c8
--- /dev/null
+++ 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/openstack/OpenStackVolumeTypesResource.java
@@ -0,0 +1,35 @@
+/*
+* Copyright (c) 2014 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.openstack;
+
+import org.ovirt.engine.api.model.OpenStackVolumeTypes;
+import org.ovirt.engine.api.resource.ApiMediaType;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+
+@Path("volumes")
+@Produces({ApiMediaType.APPLICATION_XML, ApiMediaType.APPLICATION_JSON, 
ApiMediaType.APPLICATION_X_YAML})
+public interface OpenStackVolumeTypesResource {
+    @GET
+    public OpenStackVolumeTypes list();
+
+    @Path("{id}")
+    OpenStackVolumeTypeResource getOpenStackVolumeType(@PathParam("id") String 
id);
+}
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 8ebf97c..0cb7f33 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
@@ -79,6 +79,7 @@
 import org.ovirt.engine.api.model.OpenStackNetworkProvider;
 import org.ovirt.engine.api.model.OpenStackSubnet;
 import org.ovirt.engine.api.model.OpenStackVolumeProvider;
+import org.ovirt.engine.api.model.OpenStackVolumeType;
 import org.ovirt.engine.api.model.OperatingSystemInfo;
 import org.ovirt.engine.api.model.Parameter;
 import org.ovirt.engine.api.model.ParametersSet;
@@ -267,6 +268,8 @@
 import org.ovirt.engine.api.resource.openstack.OpenStackSubnetsResource;
 import org.ovirt.engine.api.resource.openstack.OpenStackVolumeProviderResource;
 import 
org.ovirt.engine.api.resource.openstack.OpenStackVolumeProvidersResource;
+import org.ovirt.engine.api.resource.openstack.OpenStackVolumeTypeResource;
+import org.ovirt.engine.api.resource.openstack.OpenStackVolumeTypesResource;
 
 /**
  * Contains a static addLinks() method which constructs any href attributes
@@ -556,6 +559,10 @@
         map = new ParentToCollectionMap(OpenStackVolumeProviderResource.class, 
OpenStackVolumeProvidersResource.class);
         TYPES.put(OpenStackVolumeProvider.class, map);
 
+        map = new ParentToCollectionMap(OpenStackVolumeTypeResource.class, 
OpenStackVolumeTypesResource.class);
+        map.add(OpenStackVolumeTypeResource.class, 
OpenStackVolumeTypesResource.class, OpenStackVolumeProvider.class);
+        TYPES.put(OpenStackVolumeType.class, map);
+
         // OpenStack network providers:
         map = new 
ParentToCollectionMap(OpenStackNetworkProviderResource.class, 
OpenStackNetworkProvidersResource.class);
         TYPES.put(OpenStackNetworkProvider.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 07cfecf..34ccfb7 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
@@ -5373,6 +5373,37 @@
       </xs:extension>
     </xs:complexContent>
   </xs:complexType>
+    
+  <xs:element name="openstack_volume_type" type="OpenStackVolumeType"/>
+
+  <xs:element name="openstack_volume_types" type="OpenStackVolumeTypes"/>
+
+  <xs:complexType name="OpenStackVolumeType">
+    <xs:complexContent>
+      <xs:extension base="BaseResource">
+        <xs:sequence>
+          <xs:element ref="properties" minOccurs="0" maxOccurs="1"/>
+          <xs:element ref="openstack_volume_provider" minOccurs="0" 
maxOccurs="1"/>
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <xs:complexType name="OpenStackVolumeTypes">
+    <xs:complexContent>
+      <xs:extension base="BaseResources">
+        <xs:sequence>
+          <xs:element ref="openstack_volume_type" minOccurs="0" 
maxOccurs="unbounded">
+            <xs:annotation>
+              <xs:appinfo>
+                <jaxb:property name="OpenStackVolumeTypes"/>
+              </xs:appinfo>
+            </xs:annotation>
+          </xs:element>
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
 
   <!-- OpenStack network providers: -->
   <xs:element name="openstack_network_provider" 
type="OpenStackNetworkProvider"/>
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 87ce521..8fe08ca 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
@@ -6168,6 +6168,23 @@
     headers:
       Content-Type: {value: application/xml|json, required: true}
       Expect: {value: 201-created, required: false}
+- name: 
/openstackvolumeproviders/{openstackvolumeprovider:id}/volumetypes|rel=get
+  description: get the list of volume types of the OpenStack volume provider
+  request:
+    body:
+      parameterType: null
+      signatures: []
+    urlparams:
+      max: {context: matrix, type: 'xs:int', value: 'max results', required: 
false}
+    headers: {}
+- name: 
/openstackvolumeproviders/{openstackvolumeprovider:id}/volumetypes/{volumetype:id}|rel=get
+  description: get the details of the specified volume type of the OpenStack 
volume provider
+  request:
+    body:
+      parameterType: null
+      signatures: []
+    urlparams: {}
+    headers: {}
 
 - name: /openstacknetworkproviders|rel=get
   description: get the list of all OpenStack network providers in the system
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/openstack/BackendOpenStackImageResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/openstack/BackendOpenStackImageResource.java
index c26940d..75bb14d 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/openstack/BackendOpenStackImageResource.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/openstack/BackendOpenStackImageResource.java
@@ -44,7 +44,7 @@
 
     @Override
     public OpenStackImage get() {
-        Guid storageDomainId = 
BackendOpenStackImageProviderHelper.getStorageDomainId(this, providerId);
+        Guid storageDomainId = 
BackendOpenStackStorageProviderHelper.getStorageDomainId(this, providerId);
         return performGet(VdcQueryType.GetImageById, new 
GetImageByIdParameters(storageDomainId, id));
     }
 
@@ -64,7 +64,7 @@
     @Override
     public Response doImport(Action action) {
         validateParameters(action, "storageDomain.id|name");
-        Guid storageDomainId = 
BackendOpenStackImageProviderHelper.getStorageDomainId(this, providerId);
+        Guid storageDomainId = 
BackendOpenStackStorageProviderHelper.getStorageDomainId(this, providerId);
         ImportRepoImageParameters parameters = new ImportRepoImageParameters();
         parameters.setSourceRepoImageId(id);
         parameters.setSourceStorageDomainId(storageDomainId);
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/openstack/BackendOpenStackImagesResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/openstack/BackendOpenStackImagesResource.java
index b738a05..858e4c3 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/openstack/BackendOpenStackImagesResource.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/openstack/BackendOpenStackImagesResource.java
@@ -44,7 +44,7 @@
 
     @Override
     public OpenStackImages list() {
-        Guid storageDomainId = 
BackendOpenStackImageProviderHelper.getStorageDomainId(this, providerId);
+        Guid storageDomainId = 
BackendOpenStackStorageProviderHelper.getStorageDomainId(this, providerId);
         GetImagesListParameters parameters = new 
GetImagesListParameters(storageDomainId, ImageFileType.All);
         return mapCollection(getBackendCollection(VdcQueryType.GetImagesList, 
parameters));
     }
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/openstack/BackendOpenStackImageProviderHelper.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/openstack/BackendOpenStackStorageProviderHelper.java
similarity index 97%
rename from 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/openstack/BackendOpenStackImageProviderHelper.java
rename to 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/openstack/BackendOpenStackStorageProviderHelper.java
index ee7c5a1..7e7a9d4 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/openstack/BackendOpenStackImageProviderHelper.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/openstack/BackendOpenStackStorageProviderHelper.java
@@ -27,7 +27,7 @@
 /**
  * A set of utility functions for dealing with OpenStack image providers.
  */
-public class BackendOpenStackImageProviderHelper {
+public class BackendOpenStackStorageProviderHelper {
     /**
      * Finds the identifier of the storage domain corresponding to the given 
provider.
      *
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/openstack/BackendOpenStackVolumeProviderResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/openstack/BackendOpenStackVolumeProviderResource.java
index 54309a9..0900b04 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/openstack/BackendOpenStackVolumeProviderResource.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/openstack/BackendOpenStackVolumeProviderResource.java
@@ -18,6 +18,7 @@
 
 import org.ovirt.engine.api.model.OpenStackVolumeProvider;
 import org.ovirt.engine.api.resource.openstack.OpenStackVolumeProviderResource;
+import org.ovirt.engine.api.resource.openstack.OpenStackVolumeTypesResource;
 import 
org.ovirt.engine.api.restapi.resource.AbstractBackendExternalProviderResource;
 import org.ovirt.engine.core.common.businessentities.Provider;
 
@@ -35,6 +36,11 @@
     }
 
     @Override
+    public OpenStackVolumeTypesResource getOpenStackVolumeTypes() {
+        return inject(new BackendOpenStackVolumeTypesResource(id));
+    }
+
+    @Override
     protected OpenStackVolumeProvider doPopulate(OpenStackVolumeProvider 
model, Provider entity) {
         return parent.doPopulate(model, entity);
     }
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/openstack/BackendOpenStackVolumeTypeResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/openstack/BackendOpenStackVolumeTypeResource.java
new file mode 100644
index 0000000..b29af5e
--- /dev/null
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/openstack/BackendOpenStackVolumeTypeResource.java
@@ -0,0 +1,74 @@
+/*
+* Copyright (c) 2014 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.restapi.resource.openstack;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.Predicate;
+import org.ovirt.engine.api.model.OpenStackVolumeProvider;
+import org.ovirt.engine.api.model.OpenStackVolumeType;
+import org.ovirt.engine.api.resource.openstack.OpenStackVolumeTypeResource;
+import org.ovirt.engine.api.restapi.resource.AbstractBackendActionableResource;
+import org.ovirt.engine.core.common.businessentities.storage.CinderVolumeType;
+import org.ovirt.engine.core.common.queries.IdQueryParameters;
+import org.ovirt.engine.core.common.queries.VdcQueryType;
+import org.ovirt.engine.core.compat.Guid;
+
+import java.util.List;
+
+public class BackendOpenStackVolumeTypeResource
+        extends AbstractBackendActionableResource<OpenStackVolumeType, 
CinderVolumeType>
+        implements OpenStackVolumeTypeResource {
+    private String providerId;
+
+    protected BackendOpenStackVolumeTypeResource(String providerId, String id) 
{
+        super(id, OpenStackVolumeType.class, CinderVolumeType.class);
+        this.providerId = providerId;
+    }
+
+    @Override
+    public OpenStackVolumeType get() {
+        Guid storageDomainId = 
BackendOpenStackStorageProviderHelper.getStorageDomainId(this, providerId);
+        IdQueryParameters parameters = new IdQueryParameters(storageDomainId);
+        List<CinderVolumeType> volumeTypes = getBackendCollection(
+                CinderVolumeType.class, 
VdcQueryType.GetCinderVolumeTypesByStorageDomainId, parameters);
+        CollectionUtils.filter(volumeTypes, new Predicate() {
+            @Override
+            public boolean evaluate(Object o) {
+                return ((CinderVolumeType) o).getId().equals(id);
+            }
+        });
+
+        if (volumeTypes.isEmpty()) {
+            return notFound();
+        }
+
+        return addLinks(populate(map(volumeTypes.get(0)), volumeTypes.get(0)));
+    }
+
+    @Override
+    protected OpenStackVolumeType doPopulate(OpenStackVolumeType model, 
CinderVolumeType entity) {
+        return model;
+    }
+
+    @Override
+    protected OpenStackVolumeType addParents(OpenStackVolumeType volumeType) {
+        OpenStackVolumeProvider provider = new OpenStackVolumeProvider();
+        provider.setId(providerId);
+        volumeType.setOpenstackVolumeProvider(provider);
+        return super.addParents(volumeType);
+    }
+}
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/openstack/BackendOpenStackVolumeTypesResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/openstack/BackendOpenStackVolumeTypesResource.java
new file mode 100644
index 0000000..5fc0860
--- /dev/null
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/openstack/BackendOpenStackVolumeTypesResource.java
@@ -0,0 +1,83 @@
+/*
+* Copyright (c) 2014 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.restapi.resource.openstack;
+
+import org.ovirt.engine.api.model.OpenStackVolumeProvider;
+import org.ovirt.engine.api.model.OpenStackVolumeType;
+import org.ovirt.engine.api.model.OpenStackVolumeTypes;
+import org.ovirt.engine.api.resource.openstack.OpenStackVolumeTypeResource;
+import org.ovirt.engine.api.resource.openstack.OpenStackVolumeTypesResource;
+import org.ovirt.engine.api.restapi.resource.AbstractBackendCollectionResource;
+import org.ovirt.engine.api.restapi.resource.SingleEntityResource;
+import org.ovirt.engine.core.common.businessentities.storage.CinderVolumeType;
+import org.ovirt.engine.core.common.queries.IdQueryParameters;
+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 BackendOpenStackVolumeTypesResource
+        extends AbstractBackendCollectionResource<OpenStackVolumeType, 
CinderVolumeType>
+        implements OpenStackVolumeTypesResource {
+    private String providerId;
+
+    public BackendOpenStackVolumeTypesResource(String providerId) {
+        super(OpenStackVolumeType.class, CinderVolumeType.class);
+        this.providerId = providerId;
+    }
+
+    @Override
+    public OpenStackVolumeTypes list() {
+        Guid storageDomainId = 
BackendOpenStackStorageProviderHelper.getStorageDomainId(this, providerId);
+        IdQueryParameters parameters = new IdQueryParameters(storageDomainId);
+        return 
mapCollection(getBackendCollection(VdcQueryType.GetCinderVolumeTypesByStorageDomainId,
 parameters));
+
+    }
+
+    @Override
+    protected OpenStackVolumeType doPopulate(OpenStackVolumeType model, 
CinderVolumeType entity) {
+        return model;
+    }
+
+    protected OpenStackVolumeTypes mapCollection(List<CinderVolumeType> 
entities) {
+        OpenStackVolumeTypes collection = new OpenStackVolumeTypes();
+        for (CinderVolumeType volumeType : entities) {
+            
collection.getOpenStackVolumeTypes().add(addLinks(populate(map(volumeType), 
volumeType)));
+        }
+        return collection;
+    }
+
+    @Override
+    protected OpenStackVolumeType addParents(OpenStackVolumeType volumeType) {
+        OpenStackVolumeProvider provider = new OpenStackVolumeProvider();
+        provider.setId(providerId);
+        volumeType.setOpenstackVolumeProvider(provider);
+        return super.addParents(volumeType);
+    }
+
+    @Override
+    protected Response performRemove(String id) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    @SingleEntityResource
+    public OpenStackVolumeTypeResource getOpenStackVolumeType(String id) {
+        return inject(new BackendOpenStackVolumeTypeResource(providerId, id));
+    }
+}
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/openstack/BackendOpenStackVolumeTypeResourceTest.java
 
b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/openstack/BackendOpenStackVolumeTypeResourceTest.java
new file mode 100644
index 0000000..9bebf7c
--- /dev/null
+++ 
b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/openstack/BackendOpenStackVolumeTypeResourceTest.java
@@ -0,0 +1,120 @@
+/*
+* Copyright (c) 2014 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.restapi.resource.openstack;
+
+import org.junit.Test;
+import org.ovirt.engine.api.model.OpenStackVolumeType;
+import org.ovirt.engine.api.restapi.resource.AbstractBackendSubResourceTest;
+import org.ovirt.engine.core.common.businessentities.storage.CinderVolumeType;
+import org.ovirt.engine.core.common.businessentities.StorageDomain;
+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 javax.ws.rs.WebApplicationException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import static org.easymock.EasyMock.expect;
+
+public class BackendOpenStackVolumeTypeResourceTest
+        extends AbstractBackendSubResourceTest<OpenStackVolumeType, 
CinderVolumeType, BackendOpenStackVolumeTypeResource> {
+    public BackendOpenStackVolumeTypeResourceTest() {
+        super(new BackendOpenStackVolumeTypeResource(GUIDS[0].toString(), 
GUIDS[1].toString()));
+    }
+
+    @Test
+    public void testBadId() throws Exception {
+        control.replay();
+        try {
+            new BackendOpenStackImageProviderResource("foo");
+            fail("expected WebApplicationException");
+        }
+        catch (WebApplicationException wae) {
+            verifyNotFoundException(wae);
+        }
+    }
+
+    @Test
+    public void testGetNotFound() throws Exception {
+        setUriInfo(setUpBasicUriExpectations());
+        setUpGetEntityExpectations(true);
+        control.replay();
+        try {
+            resource.get();
+            fail("expected WebApplicationException");
+        }
+        catch (WebApplicationException wae) {
+            verifyNotFoundException(wae);
+        }
+    }
+
+    @Test
+    public void testGet() throws Exception {
+        setUriInfo(setUpBasicUriExpectations());
+        setUpGetEntityExpectations(false);
+        control.replay();
+        verifyModel(resource.get(), 1);
+    }
+
+    private List<StorageDomain> getStorageDomains() {
+        StorageDomain storageDomain = control.createMock(StorageDomain.class);
+        expect(storageDomain.getId()).andReturn(GUIDS[0]).anyTimes();
+        
expect(storageDomain.getStorage()).andReturn(GUIDS[0].toString()).anyTimes();
+        return Collections.singletonList(storageDomain);
+    }
+
+    @Override
+    protected CinderVolumeType getEntity(int index) {
+        CinderVolumeType cinderVolumeType = 
control.createMock(CinderVolumeType.class);
+        
expect(cinderVolumeType.getId()).andReturn(GUIDS[index].toString()).anyTimes();
+        expect(cinderVolumeType.getName()).andReturn(NAMES[index]).anyTimes();
+        return cinderVolumeType;
+    }
+
+    private void setUpGetEntityExpectations(boolean notFound) throws Exception 
{
+        setUpEntityQueryExpectations(
+            VdcQueryType.GetAllStorageDomains,
+            VdcQueryParametersBase.class,
+            new String[] {},
+            new Object[] {},
+            getStorageDomains()
+        );
+        setUpEntityQueryExpectations(
+                VdcQueryType.GetCinderVolumeTypesByStorageDomainId,
+                IdQueryParameters.class,
+                new String[]{"Id"},
+                new Object[]{GUIDS[0]},
+                notFound ? Collections.emptyList() : getCinderVolumeTypes()
+        );
+    }
+
+    @Override
+    protected void verifyModel(OpenStackVolumeType model, int index) {
+        assertEquals(NAMES[index], model.getName());
+        verifyLinks(model);
+    }
+
+    private List<CinderVolumeType> getCinderVolumeTypes() {
+        List<CinderVolumeType> cinderVolumeTypes = new ArrayList<>();
+        for (int i = 0; i < NAMES.length; i++) {
+            cinderVolumeTypes.add(getEntity(i));
+        }
+        return cinderVolumeTypes;
+    }
+}
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/openstack/BackendOpenStackVolumeTypesResourceTest.java
 
b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/openstack/BackendOpenStackVolumeTypesResourceTest.java
new file mode 100644
index 0000000..f7bb244
--- /dev/null
+++ 
b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/openstack/BackendOpenStackVolumeTypesResourceTest.java
@@ -0,0 +1,96 @@
+/*
+* Copyright (c) 2014 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.restapi.resource.openstack;
+
+import org.ovirt.engine.api.model.OpenStackVolumeType;
+import 
org.ovirt.engine.api.restapi.resource.AbstractBackendCollectionResourceTest;
+import org.ovirt.engine.core.common.businessentities.storage.CinderVolumeType;
+import org.ovirt.engine.core.common.businessentities.StorageDomain;
+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 java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import static org.easymock.EasyMock.expect;
+
+public class BackendOpenStackVolumeTypesResourceTest extends
+        AbstractBackendCollectionResourceTest<OpenStackVolumeType, 
CinderVolumeType, BackendOpenStackVolumeTypesResource> {
+    public BackendOpenStackVolumeTypesResourceTest() {
+        super(
+            new BackendOpenStackVolumeTypesResource(GUIDS[0].toString()),
+            null,
+            ""
+        );
+    }
+
+    @Override
+    protected List<OpenStackVolumeType> getCollection() {
+        return collection.list().getOpenStackVolumeTypes();
+    }
+
+    @Override
+    protected void setUpQueryExpectations(String query, Object failure) throws 
Exception {
+        setUpEntityQueryExpectations(
+            VdcQueryType.GetAllStorageDomains,
+            VdcQueryParametersBase.class,
+            new String[] {},
+            new Object[] {},
+            getStorageDomains()
+        );
+        setUpEntityQueryExpectations(
+            VdcQueryType.GetCinderVolumeTypesByStorageDomainId,
+            IdQueryParameters.class,
+            new String[] { "Id" },
+            new Object[] { GUIDS[0] },
+            getCinderVolumeTypes(),
+            failure
+        );
+        control.replay();
+    }
+
+    private List<StorageDomain> getStorageDomains() {
+        StorageDomain storageDomain = control.createMock(StorageDomain.class);
+        expect(storageDomain.getId()).andReturn(GUIDS[0]).anyTimes();
+        
expect(storageDomain.getStorage()).andReturn(GUIDS[0].toString()).anyTimes();
+        return Collections.singletonList(storageDomain);
+    }
+
+    private List<CinderVolumeType> getCinderVolumeTypes() {
+        List<CinderVolumeType> cinderVolumeTypes = new ArrayList<>();
+        for (int i = 0; i < NAMES.length; i++) {
+            cinderVolumeTypes.add(getEntity(i));
+        }
+        return cinderVolumeTypes;
+    }
+
+    @Override
+    protected CinderVolumeType getEntity(int index) {
+        CinderVolumeType cinderVolumeType = 
control.createMock(CinderVolumeType.class);
+        
expect(cinderVolumeType.getId()).andReturn(GUIDS[index].toString()).anyTimes();
+        expect(cinderVolumeType.getName()).andReturn(NAMES[index]).anyTimes();
+        return cinderVolumeType;
+    }
+
+    @Override
+    protected void verifyModel(OpenStackVolumeType model, int index) {
+        assertEquals(NAMES[index], model.getName());
+        verifyLinks(model);
+    }
+}
diff --git 
a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/openstack/OpenStackVolumeTypeMapper.java
 
b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/openstack/OpenStackVolumeTypeMapper.java
new file mode 100644
index 0000000..1c0237e
--- /dev/null
+++ 
b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/openstack/OpenStackVolumeTypeMapper.java
@@ -0,0 +1,54 @@
+/*
+* Copyright (c) 2014 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.restapi.types.openstack;
+
+import org.ovirt.engine.api.model.OpenStackVolumeType;
+import org.ovirt.engine.api.restapi.types.Mapping;
+import org.ovirt.engine.api.restapi.utils.CustomPropertiesParser;
+import org.ovirt.engine.core.common.businessentities.storage.CinderVolumeType;
+
+public class OpenStackVolumeTypeMapper {
+    @Mapping(from = CinderVolumeType.class, to = OpenStackVolumeType.class)
+    public static OpenStackVolumeType map(CinderVolumeType entity, 
OpenStackVolumeType template) {
+        OpenStackVolumeType model = template != null ? template: new 
OpenStackVolumeType();
+        if (entity.getId() != null) {
+            model.setId(entity.getId());
+        }
+        if (entity.getName() != null) {
+            model.setName(entity.getName());
+        }
+        if (entity.getExtraSpecs() != null) {
+            
model.setProperties(CustomPropertiesParser.fromMap(entity.getExtraSpecs()));
+        }
+        return model;
+    }
+
+    @Mapping(from = OpenStackVolumeType.class, to = CinderVolumeType.class)
+    public static CinderVolumeType map(OpenStackVolumeType model, 
CinderVolumeType template) {
+        CinderVolumeType entity = template != null ? template: new 
CinderVolumeType();
+        if (model.isSetId()) {
+            entity.setId(model.getId());
+        }
+        if (model.isSetName()) {
+            entity.setName(model.getName());
+        }
+        if (model.isSetProperties()) {
+            
entity.setExtraSpecs(CustomPropertiesParser.toMap(model.getProperties()));
+        }
+        return entity;
+    }
+}


-- 
To view, visit https://gerrit.ovirt.org/39371
To unsubscribe, visit https://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I08157edb4f4808880848bc9f7d07c29500d1197d
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Daniel Erez <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to