Daniel Erez has uploaded a new change for review.

Change subject: rest: retrieve disk snapshots list by storage domain
......................................................................

rest: retrieve disk snapshots list by storage domain

* Introduce a support for retrieving disk snapshots from
  storage domain context:

- GET /api/storagedomains/{storage_id}/disksnapshots
- Added a new rest entity - DiskSnapshot:
-- Represents a snapshot of a disk.
-- Its ID is the image_id; as DiskImage in backend
   composed of an image_group_id (the id of the Disk),
   and a list of DiskImages (snapshots) which differentiate
   by image_id. Hence, each DiskSnapshot can be uniquely
   identified by the image_id.
-- Contains a link to the container disk (image_group).

* Introduce a support for deleting a disk snapshot from
  storage domain:

- DELETE /api/storagedomains/{storage_id}/disksnapshots/{image_id}

Change-Id: I5359c5df490c7e7e6f9b4d25e794bd07c6877339
Feature-Page: http://www.ovirt.org/Features/Snapshots_Overview
Signed-off-by: Daniel Erez <[email protected]>
---
A 
backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/DiskSnapshotResource.java
A 
backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/DiskSnapshotsResource.java
M 
backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/StorageDomainResource.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
A 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainDiskSnapshotResource.java
A 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainDiskSnapshotsResource.java
M 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainResource.java
M 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainsResource.java
A 
backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainDiskSnapshotResourceTest.java
A 
backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainDiskSnapshotsResourceTest.java
M 
backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainsResourceTest.java
A 
backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/DiskSnapshotMapper.java
A 
backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/DiskSnapshotMapperTest.java
15 files changed, 518 insertions(+), 4 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/30/26730/1

diff --git 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/DiskSnapshotResource.java
 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/DiskSnapshotResource.java
new file mode 100644
index 0000000..0687bbc
--- /dev/null
+++ 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/DiskSnapshotResource.java
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2010 Red Hat, Inc.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*           http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.ovirt.engine.api.resource;
+
+import org.jboss.resteasy.annotations.providers.jaxb.Formatted;
+import org.ovirt.engine.api.model.DiskSnapshot;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Produces;
+
+@Produces({ApiMediaType.APPLICATION_XML, ApiMediaType.APPLICATION_JSON, 
ApiMediaType.APPLICATION_X_YAML})
+public interface DiskSnapshotResource extends ReadOnlyResource<DiskSnapshot> {
+
+    @GET
+    @Formatted
+    @Override
+    public DiskSnapshot get();
+
+}
diff --git 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/DiskSnapshotsResource.java
 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/DiskSnapshotsResource.java
new file mode 100644
index 0000000..e5e6c60
--- /dev/null
+++ 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/DiskSnapshotsResource.java
@@ -0,0 +1,20 @@
+package org.ovirt.engine.api.resource;
+
+import javax.ws.rs.DELETE;
+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.DiskSnapshot;
+import org.ovirt.engine.api.model.DiskSnapshots;
+
+@Path("/disksnapshots")
+@Produces({ApiMediaType.APPLICATION_XML, ApiMediaType.APPLICATION_JSON, 
ApiMediaType.APPLICATION_X_YAML})
+public interface DiskSnapshotsResource extends ReadOnlyResources<DiskSnapshot, 
DiskSnapshots> {
+
+    @DELETE
+    @Path("{id}")
+    public Response remove(@PathParam("id") String id);
+
+}
diff --git 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/StorageDomainResource.java
 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/StorageDomainResource.java
index 0cd38bc..bd2509e 100644
--- 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/StorageDomainResource.java
+++ 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/StorageDomainResource.java
@@ -48,4 +48,7 @@
 
     @Path("images")
     public ImagesResource getImagesResource();
+
+    @Path("disksnapshots")
+    public DiskSnapshotsResource getDiskSnapshotsResource();
 }
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 e9ff142..87a8809 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.DataCenter;
 import org.ovirt.engine.api.model.DetailedLink;
 import org.ovirt.engine.api.model.Disk;
+import org.ovirt.engine.api.model.DiskSnapshot;
 import org.ovirt.engine.api.model.Domain;
 import org.ovirt.engine.api.model.Event;
 import org.ovirt.engine.api.model.File;
@@ -97,6 +98,8 @@
 import org.ovirt.engine.api.resource.DeviceResource;
 import org.ovirt.engine.api.resource.DevicesResource;
 import org.ovirt.engine.api.resource.DiskResource;
+import org.ovirt.engine.api.resource.DiskSnapshotResource;
+import org.ovirt.engine.api.resource.DiskSnapshotsResource;
 import org.ovirt.engine.api.resource.DisksResource;
 import org.ovirt.engine.api.resource.DomainGroupResource;
 import org.ovirt.engine.api.resource.DomainGroupsResource;
@@ -245,6 +248,9 @@
         map.add(DiskResource.class, DisksResource.class, StorageDomain.class);
         TYPES.put(Disk.class, map);
 
+        map = new ParentToCollectionMap(DiskSnapshotResource.class, 
DiskSnapshotsResource.class, StorageDomain.class);
+        TYPES.put(DiskSnapshot.class, map);
+
         map = new ParentToCollectionMap(HostResource.class, 
HostsResource.class);
         TYPES.put(Host.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 87ab2b2..d9f7c7e 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
@@ -2945,6 +2945,10 @@
 
   <xs:element name="disks" type="Disks"/>
 
+  <xs:element name="disksnapshot" type="DiskSnapshot"/>
+
+  <xs:element name="disksnapshots" type="DiskSnapshots"/>
+
   <xs:element name="nic" type="NIC"/>
 
   <xs:element name="nics" type="Nics"/>
@@ -3083,6 +3087,32 @@
     </xs:complexContent>
   </xs:complexType>
 
+  <xs:complexType name="DiskSnapshot">
+    <xs:complexContent>
+        <xs:extension base="Disk">
+            <xs:sequence>
+                <xs:element ref="disk" minOccurs="0" maxOccurs="1"/>
+            </xs:sequence>
+        </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <xs:complexType name="DiskSnapshots">
+    <xs:complexContent>
+      <xs:extension base="BaseDevices">
+        <xs:sequence>
+          <xs:element ref="disksnapshot" minOccurs="0" maxOccurs="unbounded">
+            <xs:annotation>
+              <xs:appinfo>
+                <jaxb:property name="DiskSnapshots"/>
+              </xs:appinfo>
+            </xs:annotation>
+          </xs:element>
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
   <xs:element name="disk_states" type="DiskStates"/>
 
   <xs:complexType name="DiskStates">
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 965065e..b0cc21e 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
@@ -1554,6 +1554,33 @@
     headers:
       Content-Type: {value: application/xml|json, required: true}
       Correlation-Id: {value: 'any string', required: false}
+- name: /storagedomains/{storagedomain:id}/disksnapshots|rel=get
+  description: get the list of disk snapshots in the storage domain
+  request:
+    body:
+      parameterType: null
+      signatures: []
+    urlparams:
+      max: {context: matrix, type: 'xs:int', value: 'max results', required: 
false}
+    headers: {}
+- name: 
/storagedomains/{storagedomain:id}/disksnapshots/{disksnapshot:id}|rel=delete
+  description: delete the specified disk snapshot from the storage domain
+  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: 
/storagedomains/{storagedomain:id}/disksnapshots/{disksnapshot:id}|rel=get
+  description: get the details of the specified disk snapshot in the storage 
domain
+  request:
+    body:
+      parameterType: null
+      signatures: []
+    urlparams: {}
+    headers: {}
 - name: /clusters|rel=get
   description: get the list of clusters in the system
   request:
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainDiskSnapshotResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainDiskSnapshotResource.java
new file mode 100644
index 0000000..26de2d1
--- /dev/null
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainDiskSnapshotResource.java
@@ -0,0 +1,45 @@
+package org.ovirt.engine.api.restapi.resource;
+
+import org.ovirt.engine.api.model.DiskSnapshot;
+import org.ovirt.engine.api.model.StorageDomain;
+import org.ovirt.engine.api.resource.DiskSnapshotResource;
+import org.ovirt.engine.core.common.queries.IdQueryParameters;
+import org.ovirt.engine.core.common.queries.VdcQueryType;
+
+public class BackendStorageDomainDiskSnapshotResource
+        extends AbstractBackendActionableResource<DiskSnapshot, 
org.ovirt.engine.core.common.businessentities.Disk>
+        implements DiskSnapshotResource {
+
+    final private String storageDomainId;
+
+    protected BackendStorageDomainDiskSnapshotResource(String id, 
BackendStorageDomainDiskSnapshotsResource parent) {
+        super(id, DiskSnapshot.class, 
org.ovirt.engine.core.common.businessentities.Disk.class);
+        this.storageDomainId = parent.getStorageDomainId().toString();
+    }
+
+    @Override
+    protected DiskSnapshot deprecatedPopulate(DiskSnapshot model, 
org.ovirt.engine.core.common.businessentities.Disk entity) {
+        DiskSnapshot populatedDisk = doPopulate(model, entity);
+
+        // this code generates back-link to the corresponding SD
+        populatedDisk.setStorageDomain(new StorageDomain());
+        populatedDisk.getStorageDomain().setId(this.storageDomainId);
+
+        return model;
+    }
+
+    @Override
+    protected DiskSnapshot doPopulate(DiskSnapshot model, 
org.ovirt.engine.core.common.businessentities.Disk entity) {
+        return model;
+    }
+
+    public String getStorageDomainId() {
+        return storageDomainId;
+    }
+
+    @Override
+    public DiskSnapshot get() {
+        return performGet(VdcQueryType.GetDiskSnapshotByImageId, new 
IdQueryParameters(guid));
+    }
+
+}
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainDiskSnapshotsResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainDiskSnapshotsResource.java
new file mode 100644
index 0000000..edc4a2f
--- /dev/null
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainDiskSnapshotsResource.java
@@ -0,0 +1,89 @@
+package org.ovirt.engine.api.restapi.resource;
+
+import javax.ws.rs.core.Response;
+
+import org.ovirt.engine.api.model.BaseResource;
+import org.ovirt.engine.api.model.DiskSnapshot;
+import org.ovirt.engine.api.model.DiskSnapshots;
+import org.ovirt.engine.api.model.StorageDomain;
+import org.ovirt.engine.api.resource.DiskSnapshotResource;
+import org.ovirt.engine.api.resource.DiskSnapshotsResource;
+import org.ovirt.engine.api.restapi.types.DiskSnapshotMapper;
+import org.ovirt.engine.core.common.action.RemoveDiskSnapshotsParameters;
+import org.ovirt.engine.core.common.action.VdcActionType;
+import org.ovirt.engine.core.common.businessentities.DiskImage;
+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 BackendStorageDomainDiskSnapshotsResource
+        extends AbstractBackendCollectionResource<DiskSnapshot, 
org.ovirt.engine.core.common.businessentities.Disk>
+        implements DiskSnapshotsResource {
+
+    Guid storageDomainId;
+
+    public BackendStorageDomainDiskSnapshotsResource(Guid storageDomainId, 
String... subCollections) {
+        super(DiskSnapshot.class, 
org.ovirt.engine.core.common.businessentities.Disk.class);
+        this.storageDomainId = storageDomainId;
+    }
+
+    @Override
+    protected DiskSnapshot addLinks(DiskSnapshot model,
+                             Class<? extends BaseResource> suggestedParent,
+                             String... excludeSubCollectionMembers) {
+        return super.addLinks(model, StorageDomain.class, 
excludeSubCollectionMembers);
+    }
+
+    @Override
+    protected DiskSnapshot addLinks(DiskSnapshot model, String... 
subCollectionMembersToExclude) {
+        return addLinks(model, StorageDomain.class, 
subCollectionMembersToExclude);
+    }
+
+    @Override
+    public DiskSnapshots list() {
+            return 
mapCollection(getBackendCollection(VdcQueryType.GetAllDiskSnapshotsByStorageDomainId,
+                    new IdQueryParameters(this.storageDomainId)));
+    }
+
+    protected DiskSnapshots 
mapCollection(List<org.ovirt.engine.core.common.businessentities.Disk> 
entities) {
+        DiskSnapshots collection = new DiskSnapshots();
+        for (org.ovirt.engine.core.common.businessentities.Disk disk : 
entities) {
+            DiskSnapshot diskSnapshot = DiskSnapshotMapper.map(disk, null);
+            collection.getDiskSnapshots().add(addLinks(populate(diskSnapshot, 
disk)));
+        }
+        return collection;
+    }
+
+    @Override
+    protected Response performRemove(String id) {
+        DiskImage diskImage = (DiskImage) 
DiskSnapshotMapper.map(getDeviceSubResource(id).get(), null);
+        return performAction(VdcActionType.RemoveDiskSnapshots, new 
RemoveDiskSnapshotsParameters(diskImage));
+    }
+
+    @Override
+    public DiskSnapshotResource getDeviceSubResource(String id) {
+        return inject(new BackendStorageDomainDiskSnapshotResource(id, this));
+    }
+
+    @Override
+    protected DiskSnapshot deprecatedPopulate(DiskSnapshot model, 
org.ovirt.engine.core.common.businessentities.Disk entity) {
+        DiskSnapshot populatedDisk = doPopulate(model, entity);
+
+        // this code generates back-link to the corresponding SD
+        populatedDisk.setStorageDomain(new StorageDomain());
+        
populatedDisk.getStorageDomain().setId(this.storageDomainId.toString());
+
+        return model;
+    }
+
+    @Override
+    protected DiskSnapshot doPopulate(DiskSnapshot model, 
org.ovirt.engine.core.common.businessentities.Disk entity) {
+        return model;
+    }
+
+    protected Guid getStorageDomainId() {
+        return storageDomainId;
+    }
+}
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainResource.java
index 13a1de2..234287c 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainResource.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainResource.java
@@ -15,6 +15,7 @@
 import org.ovirt.engine.api.model.VM;
 import org.ovirt.engine.api.model.VMs;
 import org.ovirt.engine.api.resource.AssignedPermissionsResource;
+import org.ovirt.engine.api.resource.DiskSnapshotsResource;
 import org.ovirt.engine.api.resource.DisksResource;
 import org.ovirt.engine.api.resource.ImagesResource;
 import org.ovirt.engine.api.resource.RemovableStorageDomainContentsResource;
@@ -282,4 +283,9 @@
     public ImagesResource getImagesResource() {
         return inject(new BackendStorageDomainImagesResource(guid));
     }
+
+    @Override
+    public DiskSnapshotsResource getDiskSnapshotsResource() {
+        return inject(new BackendStorageDomainDiskSnapshotsResource(guid));
+    }
 }
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainsResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainsResource.java
index 50b505c..6665809 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainsResource.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainsResource.java
@@ -49,7 +49,7 @@
     extends AbstractBackendCollectionResource<StorageDomain, 
org.ovirt.engine.core.common.businessentities.StorageDomain>
     implements StorageDomainsResource {
 
-    static final String[] SUB_COLLECTIONS = { "permissions", "files", 
"templates", "vms", "disks" , "storageconnections", "images" };
+    static final String[] SUB_COLLECTIONS = { "permissions", "files", 
"templates", "vms", "disks" , "storageconnections", "images", "disksnapshots" };
 
     private StorageDomain storageDomain = null; //utility variable; used in 
the context of a single activation of remove()
 
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainDiskSnapshotResourceTest.java
 
b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainDiskSnapshotResourceTest.java
new file mode 100644
index 0000000..d93d4bd
--- /dev/null
+++ 
b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainDiskSnapshotResourceTest.java
@@ -0,0 +1,55 @@
+package org.ovirt.engine.api.restapi.resource;
+
+import org.junit.Test;
+import org.ovirt.engine.api.model.DiskSnapshot;
+import org.ovirt.engine.core.common.businessentities.Disk;
+import org.ovirt.engine.core.common.businessentities.DiskImage;
+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 BackendStorageDomainDiskSnapshotResourceTest
+        extends AbstractBackendSubResourceTest<DiskSnapshot, Disk, 
BackendStorageDomainDiskSnapshotResource> {
+
+    protected static final Guid DOMAIN_ID = GUIDS[0];
+    protected static final Guid IMAGE_ID = GUIDS[1];
+    protected static final Guid DISK_ID = GUIDS[2];
+
+    public BackendStorageDomainDiskSnapshotResourceTest() {
+        super(new BackendStorageDomainDiskSnapshotResource(IMAGE_ID.toString(),
+                new BackendStorageDomainDiskSnapshotsResource(DOMAIN_ID)));
+    }
+
+    @Test
+    public void testGet() {
+        setUriInfo(setUpBasicUriExpectations());
+        setUpEntityQueryExpectations(VdcQueryType.GetDiskSnapshotByImageId, 
IdQueryParameters.class,
+                new String[]{"Id"}, new Object[]{IMAGE_ID},
+                getEntity(1));
+        control.replay();
+
+        DiskSnapshot diskSnapshot = resource.get();
+        verifyModelSpecific(diskSnapshot, 1);
+        verifyLinks(diskSnapshot);
+    }
+
+    @Override
+    protected Disk getEntity(int index) {
+        DiskImage entity = new DiskImage();
+        entity.setImageId(GUIDS[index]);
+        entity.setId(DISK_ID);
+        return entity;
+    }
+
+    @Override
+    protected void verifyModel(DiskSnapshot model, int index) {
+        verifyModelSpecific(model, index);
+        verifyLinks(model);
+    }
+
+    static void verifyModelSpecific(DiskSnapshot model, int index) {
+        assertEquals(GUIDS[index].toString(), model.getId());
+    }
+
+}
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainDiskSnapshotsResourceTest.java
 
b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainDiskSnapshotsResourceTest.java
new file mode 100644
index 0000000..d5f788c
--- /dev/null
+++ 
b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainDiskSnapshotsResourceTest.java
@@ -0,0 +1,93 @@
+package org.ovirt.engine.api.restapi.resource;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Ignore;
+import org.junit.Test;
+import org.ovirt.engine.api.model.DiskSnapshot;
+import org.ovirt.engine.core.common.businessentities.Disk;
+import org.ovirt.engine.core.common.businessentities.DiskImage;
+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 BackendStorageDomainDiskSnapshotsResourceTest extends
+        AbstractBackendCollectionResourceTest<DiskSnapshot, Disk, 
BackendStorageDomainDiskSnapshotsResource> {
+
+    protected static final Guid DOMAIN_ID = GUIDS[2];
+    protected static final Guid DISK_ID = GUIDS[3];
+
+    public BackendStorageDomainDiskSnapshotsResourceTest() {
+        super(new BackendStorageDomainDiskSnapshotsResource(DOMAIN_ID), null, 
null);
+    }
+
+    @Override
+    protected List<DiskSnapshot> getCollection() {
+        return collection.list().getDiskSnapshots();
+    }
+
+    @Override
+    protected Disk getEntity(int index) {
+        DiskImage entity = new DiskImage();
+        entity.setImageId(GUIDS[index]);
+        entity.setId(DISK_ID);
+        return entity;
+    }
+
+    @Override
+    @Test
+    @Ignore
+    public void testQuery() throws Exception {
+    }
+
+    @Test
+    @Override
+    public void testList() throws Exception {
+        collection.setUriInfo(setUpBasicUriExpectations());
+
+        List<Disk> entities = new 
ArrayList<org.ovirt.engine.core.common.businessentities.Disk>();
+        for (int i = 0; i < NAMES.length; i++) {
+            entities.add(getEntity(i));
+        }
+        
setUpEntityQueryExpectations(VdcQueryType.GetAllDiskSnapshotsByStorageDomainId,
+                IdQueryParameters.class,
+                new String[] { "Id" },
+                new Object[] {DOMAIN_ID},
+                entities);
+        control.replay();
+        verifyCollection(getCollection());
+    }
+
+    @Test
+    @Override
+    @Ignore
+    public void testListFailure() throws Exception {
+
+    }
+
+    @Test
+    @Override
+    @Ignore
+    public void testListCrash() throws Exception {
+
+    }
+
+    @Test
+    @Override
+    @Ignore
+    public void testListCrashClientLocale() throws Exception {
+
+    }
+
+    @Override
+    protected void verifyModel(DiskSnapshot model, int index) {
+        verifyModelSpecific(model, index);
+        verifyLinks(model);
+    }
+
+    static void verifyModelSpecific(DiskSnapshot model, int index) {
+        assertEquals(GUIDS[index].toString(), model.getId());
+        assertEquals(DISK_ID.toString(), model.getDisk().getId());
+    }
+}
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainsResourceTest.java
 
b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainsResourceTest.java
index 9272f3d..9dff335 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainsResourceTest.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainsResourceTest.java
@@ -802,11 +802,11 @@
         assertEquals(PATHS[index], model.getStorage().getPath());
         assertEquals("permissions", model.getLinks().get(0).getRel());
         if (StorageDomainType.fromValue(model.getType()) == 
StorageDomainType.ISO) {
-            assertEquals(2, model.getLinks().size());
+            assertEquals(3, model.getLinks().size());
             assertEquals("files", model.getLinks().get(1).getRel());
 
         } else if(model.getType().equals(TYPES[2].value())){
-            assertEquals(4, model.getLinks().size());
+            assertEquals(5, model.getLinks().size());
             assertEquals("templates", model.getLinks().get(1).getRel());
             assertEquals("vms", model.getLinks().get(2).getRel());
         }
@@ -842,7 +842,7 @@
         assertEquals(TARGET, 
model.getStorage().getVolumeGroup().getLogicalUnits().get(0).getTarget());
         assertEquals(ADDRESSES[0], 
model.getStorage().getVolumeGroup().getLogicalUnits().get(0).getAddress());
         assertEquals(PORT, 
model.getStorage().getVolumeGroup().getLogicalUnits().get(0).getPort());
-        assertEquals(3, model.getLinks().size());
+        assertEquals(4, model.getLinks().size());
         assertEquals("permissions", model.getLinks().get(0).getRel());
         assertNotNull(model.getLinks().get(0).getHref());
         verifyLinks(model);
diff --git 
a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/DiskSnapshotMapper.java
 
b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/DiskSnapshotMapper.java
new file mode 100644
index 0000000..d878b7b
--- /dev/null
+++ 
b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/DiskSnapshotMapper.java
@@ -0,0 +1,42 @@
+package org.ovirt.engine.api.restapi.types;
+
+import org.ovirt.engine.api.model.Disk;
+import org.ovirt.engine.api.model.DiskSnapshot;
+import org.ovirt.engine.api.restapi.utils.GuidUtils;
+import org.ovirt.engine.core.common.businessentities.DiskImage;
+
+public class DiskSnapshotMapper extends DiskMapper {
+
+    @Mapping(from = org.ovirt.engine.core.common.businessentities.Disk.class, 
to = DiskSnapshot.class)
+    public static DiskSnapshot 
map(org.ovirt.engine.core.common.businessentities.Disk entity, DiskSnapshot 
template) {
+        if (template == null) {
+            template = new DiskSnapshot();
+        }
+        DiskSnapshot model = (DiskSnapshot) DiskMapper.map(entity, template);
+
+        Disk disk = new Disk();
+        disk.setId(entity.getId().toString());
+        model.setDisk(disk);
+
+        DiskImage diskImage = (DiskImage) entity;
+        model.setId(diskImage.getImageId().toString());
+        model.setImageId(null);
+
+        return model;
+    }
+
+    @Mapping(from = DiskSnapshot.class, to = 
org.ovirt.engine.core.common.businessentities.Disk.class)
+    public static org.ovirt.engine.core.common.businessentities.Disk 
map(DiskSnapshot diskSnapshot, 
org.ovirt.engine.core.common.businessentities.Disk template) {
+        DiskImage engineDisk = (DiskImage) DiskMapper.map(diskSnapshot, 
template);
+
+        engineDisk.setImageId(GuidUtils.asGuid(diskSnapshot.getId()));
+
+        if (diskSnapshot.isSetDisk()) {
+            engineDisk.setId(GuidUtils.asGuid(diskSnapshot.getDisk().getId()));
+        }
+
+        return engineDisk;
+    }
+
+
+}
diff --git 
a/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/DiskSnapshotMapperTest.java
 
b/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/DiskSnapshotMapperTest.java
new file mode 100644
index 0000000..6018ab4
--- /dev/null
+++ 
b/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/DiskSnapshotMapperTest.java
@@ -0,0 +1,66 @@
+package org.ovirt.engine.api.restapi.types;
+
+import static org.ovirt.engine.api.restapi.types.MappingTestHelper.populate;
+
+import org.junit.Test;
+import org.ovirt.engine.api.common.util.StatusUtils;
+import org.ovirt.engine.api.model.DiskFormat;
+import org.ovirt.engine.api.model.DiskInterface;
+import org.ovirt.engine.api.model.DiskSnapshot;
+import org.ovirt.engine.api.model.DiskStatus;
+import org.ovirt.engine.api.model.ScsiGenericIO;
+import org.ovirt.engine.core.common.businessentities.DiskImage;
+
+public class DiskSnapshotMapperTest extends 
AbstractInvertibleMappingTest<DiskSnapshot, DiskImage, DiskImage> {
+
+    public DiskSnapshotMapperTest() {
+        super(DiskSnapshot.class, DiskImage.class, DiskImage.class);
+    }
+
+    @Override
+    protected DiskSnapshot postPopulate(DiskSnapshot model) {
+        model.setFormat(MappingTestHelper.shuffle(DiskFormat.class).value());
+        
model.setInterface(MappingTestHelper.shuffle(DiskInterface.class).value());
+        model.setSgio(MappingTestHelper.shuffle(ScsiGenericIO.class).value());
+        
model.setStatus(StatusUtils.create(MappingTestHelper.shuffle(DiskStatus.class)));
+        model.setLunStorage(null);
+        return model;
+    }
+
+    @Override
+    protected void verify(DiskSnapshot model, DiskSnapshot transform) {
+        assertNotNull(transform);
+        assertEquals(model.getId(), transform.getId());
+        assertEquals(model.getFormat(), transform.getFormat());
+        assertEquals(model.getInterface(), transform.getInterface());
+        assertEquals(model.isActive(), transform.isActive());
+        assertEquals(model.isReadOnly(), transform.isReadOnly());
+        assertEquals(model.getDescription(), transform.getDescription());
+        assertNotNull(model.getSnapshot());
+        assertEquals(model.getSnapshot().getId(), 
transform.getSnapshot().getId());
+        assertEquals("unexpected status", model.getStatus().getState(), 
transform.getStatus().getState());
+        assertEquals("unexpected sparse", model.isSparse(), 
transform.isSparse());
+        assertEquals("unexpected bootable", model.isBootable(), 
transform.isBootable());
+        assertEquals("unexpected propagate errors", model.isPropagateErrors(), 
transform.isPropagateErrors());
+        assertEquals("unexpected wipe after delete", 
model.isWipeAfterDelete(), transform.isWipeAfterDelete());
+        assertEquals("unexpected shareable", model.isShareable(), 
transform.isShareable());
+    }
+
+    @Test
+    @Override
+    public void testRoundtrip() throws Exception {
+        setUpConfigExpectations();
+
+        DiskSnapshot model = 
DiskSnapshot.class.cast(populate(DiskSnapshot.class));
+        model = postPopulate(model);
+        Mapper<DiskSnapshot, 
org.ovirt.engine.core.common.businessentities.Disk> out =
+                getMappingLocator().getMapper(DiskSnapshot.class, 
org.ovirt.engine.core.common.businessentities.Disk.class);
+        Mapper<org.ovirt.engine.core.common.businessentities.Disk, 
DiskSnapshot> back =
+                
getMappingLocator().getMapper(org.ovirt.engine.core.common.businessentities.Disk.class,
 DiskSnapshot.class);
+        DiskImage to = (DiskImage) out.map(model, null);
+        DiskImage inverse = getInverse(to);
+        DiskSnapshot transform = back.map(inverse, null);
+        verify(model, transform);
+    }
+
+}


-- 
To view, visit http://gerrit.ovirt.org/26730
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I5359c5df490c7e7e6f9b4d25e794bd07c6877339
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