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