Michael Pasternak has uploaded a new change for review.

Change subject: restapi: Allow copying template disks to another storage domain 
#851099
......................................................................

restapi: Allow copying template disks to another storage domain #851099

https://bugzilla.redhat.com/show_bug.cgi?id=851099

Change-Id: Ic629b331e4753b24ef02612ff50cb6a4457cfd58
Signed-off-by: Michael Pasternak <mpast...@redhat.com>
---
M 
backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/LinkHelper.java
A 
backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/TemplateDiskResource.java
M 
backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/TemplateDisksResource.java
M 
backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata_v-3.1.yaml
M 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/AbstractBackendActionableResource.java
A 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplateDiskResource.java
M 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplateDisksResource.java
M 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplateResource.java
M 
backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/AbstractBackendDisksResourceTest.java
A 
backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendTemplateDiskResourceTest.java
10 files changed, 306 insertions(+), 21 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/28/8428/1

diff --git 
a/backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/LinkHelper.java
 
b/backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/LinkHelper.java
index 2d30774..8890f96 100644
--- 
a/backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/LinkHelper.java
+++ 
b/backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/LinkHelper.java
@@ -104,6 +104,7 @@
 import org.ovirt.engine.api.resource.AssignedPermissionsResource;
 import org.ovirt.engine.api.resource.PermitResource;
 import org.ovirt.engine.api.resource.PermitsResource;
+import org.ovirt.engine.api.resource.TemplateDiskResource;
 import org.ovirt.engine.api.resource.TemplateDisksResource;
 import org.ovirt.engine.api.resource.UpdatableRoleResource;
 import org.ovirt.engine.api.resource.AssignedRolesResource;
@@ -193,12 +194,12 @@
         map = new ParentToCollectionMap(DataCenterResource.class, 
DataCentersResource.class);
         TYPES.put(DataCenter.class, map);
 
-        map = new ParentToCollectionMap(ReadOnlyDeviceResource.class, 
ReadOnlyDevicesResource.class, Template.class);
+        map = new ParentToCollectionMap(TemplateDiskResource.class, 
TemplateDisksResource.class, Template.class);
         TYPES.put(Disk.class, map);
 
         map = new ParentToCollectionMap(DiskResource.class, 
DisksResource.class);
         map.add(VmDiskResource.class, VmDisksResource.class, VM.class);
-        map.add(ReadOnlyDeviceResource.class, TemplateDisksResource.class, 
Template.class);
+        map.add(TemplateDiskResource.class, TemplateDisksResource.class, 
Template.class);
         TYPES.put(Disk.class, map);
 
         map = new ParentToCollectionMap(HostResource.class, 
HostsResource.class);
diff --git 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/TemplateDiskResource.java
 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/TemplateDiskResource.java
new file mode 100644
index 0000000..f7bc52a
--- /dev/null
+++ 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/TemplateDiskResource.java
@@ -0,0 +1,44 @@
+/*
+ * 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 javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Response;
+
+import org.jboss.resteasy.annotations.providers.jaxb.Formatted;
+import org.ovirt.engine.api.model.Action;
+import org.ovirt.engine.api.model.Actionable;
+import org.ovirt.engine.api.model.Disk;
+
+
+@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, 
MediaType.APPLICATION_X_YAML})
+public interface TemplateDiskResource extends ReadOnlyDeviceResource<Disk> {
+
+    @Path("{action: (copy)}/{oid}")
+    public ActionResource getActionSubresource(@PathParam("action") String 
action, @PathParam("oid") String oid);
+
+    @POST
+    @Formatted
+    @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, 
MediaType.APPLICATION_X_YAML})
+    @Actionable
+    @Path("copy")
+    public Response copy(Action action);
+}
diff --git 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/TemplateDisksResource.java
 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/TemplateDisksResource.java
index 3fb7a1c..2be709b 100644
--- 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/TemplateDisksResource.java
+++ 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/TemplateDisksResource.java
@@ -41,4 +41,15 @@
     @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, 
MediaType.APPLICATION_X_YAML})
     @Path("{id}")
     public Response remove(@PathParam("id") String id, Action action);
+
+    /**
+     * Sub-resource locator method, returns individual DeviceResource on which 
the
+     * remainder of the URI is dispatched.
+     *
+     * @param id  the Device ID
+     * @return    matching subresource if found
+     */
+    @Path("{id}")
+    public TemplateDiskResource getDeviceSubResource(@PathParam("id") String 
id);
+
 }
diff --git 
a/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata_v-3.1.yaml
 
b/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata_v-3.1.yaml
index 0055702..dfc4143 100644
--- 
a/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata_v-3.1.yaml
+++ 
b/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata_v-3.1.yaml
@@ -146,7 +146,6 @@
       Content-Type: {value: application/xml|json, required: true}
       Correlation-Id: {value: 'any string', required: false}
       Filter: {value: true|false, required: false}
-
 - name: /api/vms/{vm:id}/suspend|rel=suspend
   request:
     body:
@@ -2106,6 +2105,18 @@
     headers:
       Content-Type: {value: application/xml|json, required: false}
       Correlation-Id: {value: 'any string', required: false}
+- name: /api/templates/{template:id}/disks/{disk:id}/copy|rel=copy
+  request:
+    body:
+      parameterType: Action
+      signatures:
+      - mandatoryArguments: {storagedomain.host.id|name: 'xs:string'}
+        optionalArguments: {action.async: 'xs:boolean'}
+    urlparams: {}
+    headers:
+      Content-Type: {value: application/xml|json, required: true}
+      Correlation-Id: {value: 'any string', required: false}
+      Filter: {value: true|false, required: false}
 - name: /api/templates/{template:id}/nics|rel=get
   request:
     body:
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/AbstractBackendActionableResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/AbstractBackendActionableResource.java
index aa6e967..22b6cb2 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/AbstractBackendActionableResource.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/AbstractBackendActionableResource.java
@@ -20,6 +20,8 @@
 import org.ovirt.engine.core.common.queries.GetVdsByNameParameters;
 import org.ovirt.engine.core.common.queries.VdcQueryType;
 import org.ovirt.engine.core.common.businessentities.VDS;
+import org.ovirt.engine.core.common.businessentities.storage_domains;
+import org.ovirt.engine.core.common.interfaces.SearchType;
 import org.ovirt.engine.core.compat.Guid;
 
 
@@ -149,4 +151,16 @@
     private String getPath(UriInfo uriInfo) {
         return LinkHelper.combine(uriInfo.getBaseUri().getPath(), 
uriInfo.getPath());
     }
+
+    protected Guid getStorageDomainId(Action action) {
+        if (action.getStorageDomain().isSetId()) {
+            return asGuid(action.getStorageDomain().getId());
+        } else {
+            return 
lookupStorageDomainIdByName(action.getStorageDomain().getName());
+        }
+    }
+
+    protected Guid lookupStorageDomainIdByName(String name) {
+        return getEntity(storage_domains.class, SearchType.StorageDomain, 
"Storage: name=" + name).getId();
+    }
 }
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplateDiskResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplateDiskResource.java
new file mode 100644
index 0000000..3eb6ca6
--- /dev/null
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplateDiskResource.java
@@ -0,0 +1,38 @@
+package org.ovirt.engine.api.restapi.resource;
+
+import javax.ws.rs.core.Response;
+
+import org.ovirt.engine.api.model.Action;
+import org.ovirt.engine.api.model.Disk;
+import org.ovirt.engine.api.model.Disks;
+import org.ovirt.engine.api.resource.TemplateDiskResource;
+import org.ovirt.engine.core.common.action.MoveOrCopyImageGroupParameters;
+import org.ovirt.engine.core.common.action.VdcActionType;
+import org.ovirt.engine.core.common.businessentities.ImageOperation;
+import org.ovirt.engine.core.compat.Guid;
+
+public class BackendTemplateDiskResource extends 
BackendReadOnlyDeviceResource<Disk, Disks, 
org.ovirt.engine.core.common.businessentities.Disk>
+        implements TemplateDiskResource {
+
+    protected BackendTemplateDisksResource collection;
+
+    public BackendTemplateDiskResource(Class<Disk> modelType,
+                                       
Class<org.ovirt.engine.core.common.businessentities.Disk> entityType,
+                                       Guid guid,
+                                       BackendTemplateDisksResource collection,
+                                       String... subCollections) {
+        super(modelType, entityType, guid, collection, subCollections);
+        this.collection = collection;
+    }
+
+    @Override
+    public Response copy(Action action) {
+        validateParameters(action, "storageDomain.id|name");
+        MoveOrCopyImageGroupParameters params =
+                new MoveOrCopyImageGroupParameters(asGuid(get().getImageId()),
+                                                   Guid.Empty,
+                                                   getStorageDomainId(action),
+                                                   ImageOperation.Copy);
+        return doAction(VdcActionType.MoveOrCopyDisk, params, action);
+    }
+}
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplateDisksResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplateDisksResource.java
index 6c36acb..5ab86e6 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplateDisksResource.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplateDisksResource.java
@@ -4,9 +4,8 @@
 
 import org.ovirt.engine.api.model.Action;
 import org.ovirt.engine.api.model.Disk;
-import org.ovirt.engine.api.model.Disks;
 import org.ovirt.engine.api.model.Template;
-import org.ovirt.engine.api.resource.ReadOnlyDeviceResource;
+import org.ovirt.engine.api.resource.TemplateDiskResource;
 import org.ovirt.engine.api.resource.TemplateDisksResource;
 import org.ovirt.engine.core.common.action.RemoveDiskParameters;
 import org.ovirt.engine.core.common.action.VdcActionType;
@@ -44,8 +43,8 @@
 
     @Override
     @SingleEntityResource
-    public ReadOnlyDeviceResource<Disk> getDeviceSubResource(String id) {
-        return inject(new BackendReadOnlyDeviceResource<Disk, Disks, 
org.ovirt.engine.core.common.businessentities.Disk>(modelType, entityType, 
asGuidOr404(id), this));
+    public TemplateDiskResource getDeviceSubResource(String id) {
+        return inject(new BackendTemplateDiskResource(modelType, entityType, 
asGuidOr404(id), this));
     }
 
     @Override
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplateResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplateResource.java
index 43c8b91..b36d519 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplateResource.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplateResource.java
@@ -23,9 +23,7 @@
 import org.ovirt.engine.core.common.action.VdcActionType;
 import org.ovirt.engine.core.common.businessentities.UsbPolicy;
 import org.ovirt.engine.core.common.businessentities.VDSGroup;
-import org.ovirt.engine.core.common.businessentities.storage_domains;
 import org.ovirt.engine.core.common.businessentities.VmTemplate;
-import org.ovirt.engine.core.common.interfaces.SearchType;
 import org.ovirt.engine.core.common.queries.GetPermissionsForObjectParameters;
 import org.ovirt.engine.core.common.queries.GetVdsGroupByVdsGroupIdParameters;
 import org.ovirt.engine.core.common.queries.GetVmTemplatesDisksParameters;
@@ -68,18 +66,6 @@
         }
 
         return doAction(VdcActionType.ExportVmTemplate, params, action);
-    }
-
-    protected Guid getStorageDomainId(Action action) {
-        if (action.getStorageDomain().isSetId()) {
-            return asGuid(action.getStorageDomain().getId());
-        } else {
-            return 
lookupStorageDomainIdByName(action.getStorageDomain().getName());
-        }
-    }
-
-    protected Guid lookupStorageDomainIdByName(String name) {
-        return getEntity(storage_domains.class, SearchType.StorageDomain, 
"Storage: name=" + name).getId();
     }
 
     @Override
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/AbstractBackendDisksResourceTest.java
 
b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/AbstractBackendDisksResourceTest.java
index 8003bf9..1fd1fa3 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/AbstractBackendDisksResourceTest.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/AbstractBackendDisksResourceTest.java
@@ -23,6 +23,7 @@
 import org.ovirt.engine.core.common.queries.VdcQueryType;
 import org.ovirt.engine.core.compat.Guid;
 
+import static org.easymock.EasyMock.expect;
 import static org.easymock.classextension.EasyMock.expect;
 
 @Ignore
@@ -104,6 +105,7 @@
         expect(entity.isShareable()).andReturn(false).anyTimes();
         
expect(entity.getPropagateErrors()).andReturn(PropagateErrors.On).anyTimes();
         
expect(entity.getDiskStorageType()).andReturn(DiskStorageType.IMAGE).anyTimes();
+        expect(entity.getImageId()).andReturn(GUIDS[1]).anyTimes();
         return setUpStatisticalEntityExpectations(entity);
     }
 
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendTemplateDiskResourceTest.java
 
b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendTemplateDiskResourceTest.java
new file mode 100644
index 0000000..df6e4b4
--- /dev/null
+++ 
b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendTemplateDiskResourceTest.java
@@ -0,0 +1,179 @@
+package org.ovirt.engine.api.restapi.resource;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+
+import org.junit.Test;
+
+import org.ovirt.engine.api.model.Action;
+import org.ovirt.engine.api.model.Disk;
+import org.ovirt.engine.api.model.StorageDomain;
+import org.ovirt.engine.core.common.action.MoveOrCopyImageGroupParameters;
+import org.ovirt.engine.core.common.action.VdcActionParametersBase;
+import org.ovirt.engine.core.common.action.VdcActionType;
+import org.ovirt.engine.core.common.businessentities.DiskImage;
+import org.ovirt.engine.core.common.businessentities.ImageOperation;
+import org.ovirt.engine.core.common.businessentities.StorageDomainStatus;
+import org.ovirt.engine.core.common.businessentities.StorageDomainType;
+import org.ovirt.engine.core.common.businessentities.StorageType;
+import org.ovirt.engine.core.common.businessentities.storage_domains;
+import org.ovirt.engine.core.common.interfaces.SearchType;
+import org.ovirt.engine.core.common.queries.GetVmTemplatesDisksParameters;
+import org.ovirt.engine.core.common.queries.VdcQueryType;
+import org.ovirt.engine.core.compat.Guid;
+
+import static org.easymock.EasyMock.expect;
+import static 
org.ovirt.engine.api.restapi.resource.AbstractBackendDisksResourceTest.setUpEntityExpectations;
+import static 
org.ovirt.engine.api.restapi.resource.AbstractBackendDisksResourceTest.verifyModelSpecific;
+import static 
org.ovirt.engine.api.restapi.resource.AbstractBackendDisksResourceTest.PARENT_ID;
+
+public class BackendTemplateDiskResourceTest
+        extends AbstractBackendSubResourceTest<Disk, 
org.ovirt.engine.core.common.businessentities.Disk, 
BackendTemplateDiskResource> {
+
+    public BackendTemplateDiskResourceTest() {
+        super(new BackendTemplateDiskResource(Disk.class,
+                                              
org.ovirt.engine.core.common.businessentities.Disk.class,
+                                              GUIDS[1],
+                                              getcollection()));
+    }
+
+    protected static BackendTemplateDisksResource getcollection() {
+        return new BackendTemplateDisksResource(PARENT_ID,
+                                                
VdcQueryType.GetVmTemplatesDisks,
+                                                new 
GetVmTemplatesDisksParameters(PARENT_ID));
+    }
+
+    protected void init() {
+        super.init();
+        initResource(resource.getCollection());
+    }
+
+    @Test
+    public void testGetNotFound() throws Exception {
+        setUriInfo(setUpBasicUriExpectations());
+        setUpEntityQueryExpectations(VdcQueryType.GetVmTemplatesDisks,
+                                     GetVmTemplatesDisksParameters.class,
+                                     new String[] { "Id" },
+                                     new Object[] { PARENT_ID },
+                                     new ArrayList<DiskImage>());
+        control.replay();
+        try {
+            resource.get();
+            fail("expected WebApplicationException");
+        } catch (WebApplicationException wae) {
+            verifyNotFoundException(wae);
+        }
+    }
+
+    @Test
+    public void testGet() throws Exception {
+        setUriInfo(setUpBasicUriExpectations());
+        setUpEntityQueryExpectations(1);
+        control.replay();
+
+        Disk disk = resource.get();
+        verifyModelSpecific(disk, 1);
+        verifyLinks(disk);
+    }
+
+    @Override
+    protected org.ovirt.engine.core.common.businessentities.Disk getEntity(int 
index) {
+        return setUpEntityExpectations(control.createMock(DiskImage.class), 
index);
+    }
+
+    protected List<org.ovirt.engine.core.common.businessentities.Disk> 
getEntityList() {
+        List<org.ovirt.engine.core.common.businessentities.Disk> entities = 
new ArrayList<org.ovirt.engine.core.common.businessentities.Disk>();
+        for (int i = 0; i < NAMES.length; i++) {
+            entities.add(getEntity(i));
+        }
+        return entities;
+
+    }
+
+    protected void setUpEntityQueryExpectations(int times) throws Exception {
+        while (times-- > 0) {
+            setUpEntityQueryExpectations(VdcQueryType.GetVmTemplatesDisks,
+                                         GetVmTemplatesDisksParameters.class,
+                                         new String[] { "Id" },
+                                         new Object[] { PARENT_ID },
+                                         getEntityList());
+        }
+    }
+
+    @Test
+    public void testCopyBySdId() throws Exception {
+        setUpEntityQueryExpectations(1);
+        setUriInfo(setUpActionExpectations(VdcActionType.MoveOrCopyDisk,
+                                           
MoveOrCopyImageGroupParameters.class,
+                                           new String[] { "ImageId", 
"SourceDomainId", "StorageDomainId", "Operation" },
+                                           new Object[] { GUIDS[1], 
Guid.Empty, GUIDS[3], ImageOperation.Copy }));
+
+        verifyActionResponse(resource.copy(setUpCopyParams(false)));
+    }
+
+    @Test
+    public void testCopyBySdName() throws Exception {
+        setUpEntityQueryExpectations(1);
+        setUpGetEntityExpectations("Storage: name=" + NAMES[2],
+                                    SearchType.StorageDomain,
+                                    getStorageDomainEntity(0));
+        setUriInfo(setUpActionExpectations(VdcActionType.MoveOrCopyDisk,
+                                           
MoveOrCopyImageGroupParameters.class,
+                                           new String[] { "ImageId", 
"SourceDomainId", "StorageDomainId", "Operation" },
+                                           new Object[] { GUIDS[1], 
Guid.Empty, GUIDS[3], ImageOperation.Copy }));
+
+        verifyActionResponse(resource.copy(setUpCopyParams(true)));
+    }
+
+    protected storage_domains getStorageDomainEntity(int index) {
+        storage_domains entity = control.createMock(storage_domains.class);
+        return setUpStorageDomainEntityExpectations(entity, index, 
StorageType.NFS);
+    }
+
+    static storage_domains 
setUpStorageDomainEntityExpectations(storage_domains entity, int index, 
StorageType storageType) {
+        expect(entity.getId()).andReturn(GUIDS[3]).anyTimes();
+        expect(entity.getstorage_name()).andReturn(NAMES[2]).anyTimes();
+        
expect(entity.getstatus()).andReturn(StorageDomainStatus.Active).anyTimes();
+        
expect(entity.getstorage_domain_type()).andReturn(StorageDomainType.Master).anyTimes();
+        expect(entity.getstorage_type()).andReturn(storageType).anyTimes();
+        expect(entity.getstorage()).andReturn(GUIDS[0].toString()).anyTimes();
+        return entity;
+    }
+    private Action setUpCopyParams(boolean byName) {
+        Action action = new Action();
+        StorageDomain sd = new StorageDomain();
+        if (byName) {
+            sd.setName(NAMES[2]);
+        } else {
+            sd.setId(GUIDS[3].toString());
+        }
+        action.setStorageDomain(sd);
+        return action;
+    }
+
+    private void verifyActionResponse(Response r) throws Exception {
+        verifyActionResponse(r, "templates/" + PARENT_ID + "/disks/" + 
PARENT_ID, false);
+    }
+
+    @Test
+    public void testIncompleteCopy() throws Exception {
+        setUriInfo(setUpBasicUriExpectations());
+        try {
+            control.replay();
+            resource.copy(new Action());
+            fail("expected WebApplicationException on incomplete parameters");
+        } catch (WebApplicationException wae) {
+             verifyIncompleteException(wae, "Action", "copy", 
"storageDomain.id|name");
+        }
+    }
+
+    protected UriInfo setUpActionExpectations(VdcActionType task,
+            Class<? extends VdcActionParametersBase> clz,
+            String[] names,
+            Object[] values) {
+        return setUpActionExpectations(task, clz, names, values, true, true, 
null, null, true);
+    }
+}


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ic629b331e4753b24ef02612ff50cb6a4457cfd58
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Michael Pasternak <mpast...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to