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