Frank Kobzik has uploaded a new change for review. Change subject: restapi: Control virtio rng device ......................................................................
restapi: Control virtio rng device Change-Id: I585ae1088bbe18af42bf374e3207d053ae71f166 Signed-off-by: Frantisek Kobzik <[email protected]> Bug-Url: https://bugzilla.redhat.com/977079 --- M backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd M backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplateResource.java M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplatesResource.java M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmPoolsResource.java M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmResource.java M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmsResource.java M backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/AbstractBackendBaseTest.java M backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendTemplateResourceTest.java M backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendTemplatesResourceTest.java M backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendVmPoolsResourceTest.java M backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendVmResourceTest.java M backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendVmsResourceTest.java A backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/RngDeviceMapper.java A backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/RngDeviceMapperTest.java 15 files changed, 282 insertions(+), 18 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/57/27157/1 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 89a4760..e599d4a 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 @@ -2377,6 +2377,7 @@ <xs:element name="stateless" type="xs:boolean" minOccurs="0"/> <xs:element name="delete_protected" type="xs:boolean" minOccurs="0"/> <xs:element ref="sso" minOccurs="0" maxOccurs="1"/> + <xs:element ref="rng_device" minOccurs="0" maxOccurs="1"/> <xs:element ref="console" minOccurs="0" maxOccurs="1"/> <xs:element name="timezone" type="xs:string" minOccurs="0" maxOccurs="1"/> <xs:element ref="domain" minOccurs="0" maxOccurs="1"/> @@ -2480,6 +2481,23 @@ <xs:complexType name="Method"> <xs:attribute name="id" type="xs:string"/> </xs:complexType> + + <!-- Random Number Genertor device --> + <xs:complexType name="Rate"> + <xs:sequence> + <xs:element name="bytes" type="xs:int" minOccurs="1" maxOccurs="1"/> + <xs:element name="period" type="xs:int" minOccurs="0" maxOccurs="1"/> + </xs:sequence> + </xs:complexType> + + <xs:element name="rng_device" type="RngDevice"/> + + <xs:complexType name="RngDevice"> + <xs:sequence> + <xs:element name="rate" type="Rate" minOccurs="0" maxOccurs="1"/> + <xs:element name="source" type="xs:string" minOccurs="1" maxOccurs="1"/> + </xs:sequence> + </xs:complexType> <xs:complexType name="HighAvailability"> <xs:sequence> @@ -2723,6 +2741,7 @@ <xs:element name="stateless" type="xs:boolean" minOccurs="0"/> <xs:element name="delete_protected" type="xs:boolean" minOccurs="0"/> <xs:element ref="sso" minOccurs="0" maxOccurs="1"/> + <xs:element ref="rng_device" minOccurs="0" maxOccurs="1"/> <xs:element ref="console" minOccurs="0" maxOccurs="1"/> <xs:element name="timezone" type="xs:string" minOccurs="0" maxOccurs="1"/> <xs:element ref="domain" minOccurs="0" maxOccurs="1"/> @@ -2923,6 +2942,7 @@ <xs:element name="prestarted_vms" type="xs:int" minOccurs="0"/> <xs:element name="max_user_vms" type="xs:int" minOccurs="0"/> <xs:element ref="display" minOccurs="0" maxOccurs="1"/> + <xs:element ref="rng_device" minOccurs="0" maxOccurs="1"/> </xs:sequence> </xs:extension> </xs:complexContent> 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 2bb756f..57c72b8 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 @@ -80,6 +80,9 @@ vm.stateless: xs:boolean vm.delete_protected: xs:boolean vm.sso.methods.method--COLLECTION: {method.id: 'xs:string'} + vm.rng_device.rate.bytes: xs:int + vm.rng_device.rate.period: xs:int + vm.rng_device.source: xs:string vm.console.enabled: xs:boolean vm.cpu.topology.sockets: xs:int vm.placement_policy.affinity: xs:string @@ -155,6 +158,9 @@ vm.permissions.clone: xs:boolean vm.delete_protected: xs:boolean vm.sso.methods.method--COLLECTION: {method.id: 'xs:string'} + vm.rng_device.rate.bytes: xs:int + vm.rng_device.rate.period: xs:int + vm.rng_device.source: xs:string vm.console.enabled: xs:boolean vm.cpu.mode: xs:string vm.cpu.topology.sockets: xs:int @@ -209,6 +215,9 @@ vm.stateless: xs:boolean vm.delete_protected: xs:boolean vm.sso.methods.method--COLLECTION: {method.id: 'xs:string'} + vm.rng_device.rate.bytes: xs:int + vm.rng_device.rate.period: xs:int + vm.rng_device.source: xs:string vm.console.enabled: xs:boolean vm.cpu.topology.sockets: xs:int vm.placement_policy.affinity: xs:string @@ -255,6 +264,9 @@ vm.permissions.clone: xs:boolean vm.delete_protected: xs:boolean vm.sso.methods.method--COLLECTION: {method.id: 'xs:string'} + vm.rng_device.rate.bytes: xs:int + vm.rng_device.rate.period: xs:int + vm.rng_device.source: xs:string vm.cpu.mode: xs:string vm.cpu.topology.sockets: xs:int vm.placement_policy.affinity: xs:string @@ -3423,6 +3435,9 @@ template.stateless: 'xs:boolean' template.delete_protected: xs:boolean template.sso.methods.method--COLLECTION: {method.id: 'xs:string'} + vm.rng_device.rate.bytes: xs:int + vm.rng_device.rate.period: xs:int + vm.rng_device.source: xs:string template.console.enabled: xs:boolean template.placement_policy.affinity: xs:string template.description: xs:string @@ -3475,6 +3490,9 @@ template.stateless: 'xs:boolean' template.delete_protected: xs:boolean template.sso.methods.method--COLLECTION: {method.id: 'xs:string'} + vm.rng_device.rate.bytes: xs:int + vm.rng_device.rate.period: xs:int + vm.rng_device.source: xs:string template.console.enabled: xs:boolean template.placement_policy.affinity: xs:string template.description: xs:string 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 d18ec1a..335c853 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 @@ -22,6 +22,7 @@ import org.ovirt.engine.api.resource.TemplateDisksResource; import org.ovirt.engine.api.resource.TemplateResource; import org.ovirt.engine.api.resource.WatchdogsResource; +import org.ovirt.engine.api.restapi.types.RngDeviceMapper; import org.ovirt.engine.api.restapi.types.VmMapper; import org.ovirt.engine.api.restapi.util.VmHelper; import org.ovirt.engine.core.common.VdcObjectType; @@ -30,6 +31,7 @@ import org.ovirt.engine.core.common.action.VdcActionParametersBase; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.VDSGroup; +import org.ovirt.engine.core.common.businessentities.VmRngDevice; import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.common.queries.GetPermissionsForObjectParameters; import org.ovirt.engine.core.common.queries.GetVmTemplateParameters; @@ -126,7 +128,12 @@ updated.setUsbPolicy(VmMapper.getUsbPolicyOnUpdate(incoming.getUsb(), entity.getUsbPolicy(), lookupCluster(updated.getVdsGroupId()))); - return getMapper(modelType, UpdateVmTemplateParameters.class).map(incoming, new UpdateVmTemplateParameters(updated)); + UpdateVmTemplateParameters params = new UpdateVmTemplateParameters(updated); + if (incoming.isSetRngDevice()) { + params.setUpdateRngDevice(true); + params.setRngDevice(RngDeviceMapper.map(incoming.getRngDevice(), null)); + } + return getMapper(modelType, UpdateVmTemplateParameters.class).map(incoming, params); } } @@ -144,9 +151,21 @@ model.setVirtioScsi(new VirtIOSCSI()); } model.getVirtioScsi().setEnabled(!VmHelper.getInstance().getVirtioScsiControllersForEntity(entity.getId()).isEmpty()); + setRngDevice(model); return model; } + private void setRngDevice(Template model) { + List<VmRngDevice> rngDevices = getEntity(List.class, + VdcQueryType.GetRngDevice, + new IdQueryParameters(Guid.createGuidFromString(model.getId())), + "GetRngDevice", true); + + if (rngDevices != null && !rngDevices.isEmpty()) { + model.setRngDevice(RngDeviceMapper.map(rngDevices.get(0), null)); + } + } + @Override @SingleEntityResource public WatchdogsResource getWatchdogsResource() { diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplatesResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplatesResource.java index 41b50c6..0a81d51 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplatesResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplatesResource.java @@ -15,6 +15,7 @@ import org.ovirt.engine.api.model.VirtIOSCSI; import org.ovirt.engine.api.resource.TemplateResource; import org.ovirt.engine.api.resource.TemplatesResource; +import org.ovirt.engine.api.restapi.types.RngDeviceMapper; import org.ovirt.engine.api.restapi.types.VmMapper; import org.ovirt.engine.api.restapi.util.VmHelper; import org.ovirt.engine.core.common.action.AddVmTemplateParameters; @@ -24,6 +25,7 @@ import org.ovirt.engine.core.common.businessentities.Entities; import org.ovirt.engine.core.common.businessentities.VDSGroup; import org.ovirt.engine.core.common.businessentities.VmInit; +import org.ovirt.engine.core.common.businessentities.VmRngDevice; import org.ovirt.engine.core.common.businessentities.VmStatic; import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.common.interfaces.SearchType; @@ -96,6 +98,12 @@ !getConsoleDevicesForEntity(staticVm.getId()).isEmpty()); params.setVirtioScsiEnabled(template.isSetVirtioScsi() && template.getVirtioScsi().isSetEnabled() ? template.getVirtioScsi().isEnabled() : null); + + if (template.isSetRngDevice()) { + params.setUpdateRngDevice(true); + params.setRngDevice(RngDeviceMapper.map(template.getRngDevice(), null)); + } + boolean isDomainSet = false; if (template.isSetStorageDomain() && template.getStorageDomain().isSetId()) { params.setDestinationStorageDomainId(asGuid(template.getStorageDomain().getId())); @@ -213,9 +221,20 @@ model.setVirtioScsi(new VirtIOSCSI()); } model.getVirtioScsi().setEnabled(!VmHelper.getInstance().getVirtioScsiControllersForEntity(entity.getId()).isEmpty()); + List<VmRngDevice> rngDevices = getRngDevices(entity.getId()); + if (rngDevices != null && !rngDevices.isEmpty()) { + model.setRngDevice(RngDeviceMapper.map(rngDevices.get(0), null)); + } return model; } + private List<VmRngDevice> getRngDevices(Guid id) { + return getEntity(List.class, + VdcQueryType.GetRngDevice, + new IdQueryParameters(id), + "GetRngDevice", true); + } + private List<String> getConsoleDevicesForEntity(Guid id) { return getEntity(List.class, VdcQueryType.GetConsoleDevices, diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmPoolsResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmPoolsResource.java index 2b71ed2..b9f84fa 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmPoolsResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmPoolsResource.java @@ -9,6 +9,7 @@ import org.ovirt.engine.api.model.VmPools; import org.ovirt.engine.api.resource.VmPoolResource; import org.ovirt.engine.api.resource.VmPoolsResource; +import org.ovirt.engine.api.restapi.types.RngDeviceMapper; import org.ovirt.engine.api.restapi.util.VmHelper; import org.ovirt.engine.core.common.action.AddVmPoolWithVmsParameters; import org.ovirt.engine.core.common.action.VdcActionType; @@ -17,6 +18,7 @@ import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VmDynamic; import org.ovirt.engine.core.common.businessentities.VmPoolType; +import org.ovirt.engine.core.common.businessentities.VmRngDevice; import org.ovirt.engine.core.common.businessentities.VmStatic; import org.ovirt.engine.core.common.businessentities.VmStatistics; import org.ovirt.engine.core.common.businessentities.VmTemplate; @@ -91,9 +93,21 @@ @Override public VmPool doPopulate(VmPool pool, org.ovirt.engine.core.common.businessentities.VmPool entity) { + setRngDevice(pool); return pool; } + protected void setRngDevice(VmPool model) { + List<VmRngDevice> rngDevices = getEntity(List.class, + VdcQueryType.GetRngDevice, + new IdQueryParameters(Guid.createGuidFromString(model.getId())), + "GetRngDevice", true); + + if (rngDevices != null && !rngDevices.isEmpty()) { + model.setRngDevice(RngDeviceMapper.map(rngDevices.get(0), null)); + } + } + @Override protected VmPool deprecatedPopulate(VmPool model, org.ovirt.engine.core.common.businessentities.VmPool entity) { if (model.isSetSize() && model.getSize() > 0) { diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmResource.java index 1f4880d..9ce22e3 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmResource.java @@ -1,16 +1,11 @@ package org.ovirt.engine.api.restapi.resource; -import static org.ovirt.engine.api.restapi.resource.BackendVmsResource.SUB_COLLECTIONS; -import static org.ovirt.engine.core.utils.Ticketing.generateOTP; - import java.util.List; import java.util.Set; - import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; - import org.ovirt.engine.api.common.util.DetailHelper; import org.ovirt.engine.api.common.util.DetailHelper.Detail; import org.ovirt.engine.api.model.Action; @@ -40,7 +35,7 @@ import org.ovirt.engine.api.resource.VmSessionsResource; import org.ovirt.engine.api.resource.WatchdogsResource; import org.ovirt.engine.api.restapi.logging.Messages; -import org.ovirt.engine.api.restapi.resource.AbstractBackendResource.QueryIdResolver; +import org.ovirt.engine.api.restapi.types.RngDeviceMapper; import org.ovirt.engine.api.restapi.types.VmMapper; import org.ovirt.engine.api.utils.LinkHelper; import org.ovirt.engine.core.common.VdcObjectType; @@ -76,6 +71,10 @@ import org.ovirt.engine.core.common.queries.VdcQueryReturnValue; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.compat.Guid; + + +import static org.ovirt.engine.api.restapi.resource.BackendVmsResource.SUB_COLLECTIONS; +import static org.ovirt.engine.core.utils.Ticketing.generateOTP; public class BackendVmResource extends AbstractBackendActionableResource<VM, org.ovirt.engine.core.common.businessentities.VM> implements @@ -444,6 +443,7 @@ parent.setConsoleDevice(model); parent.setVirtioScsiController(model); parent.setVmOvfConfiguration(model, entity); + parent.setRngDevice(model); return model; } @@ -500,6 +500,10 @@ if (incoming.isSetVirtioScsi()) { params.setVirtioScsiEnabled(incoming.getVirtioScsi().isEnabled()); } + if (incoming.isSetRngDevice()) { + params.setUpdateRngDevice(true); + params.setRngDevice(RngDeviceMapper.map(incoming.getRngDevice(), null)); + } return params; } } diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmsResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmsResource.java index 5de80ae..9ea145a 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmsResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmsResource.java @@ -6,10 +6,8 @@ import java.util.List; import java.util.Map; import java.util.Set; - import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Response; - import org.ovirt.engine.api.common.util.DetailHelper; import org.ovirt.engine.api.common.util.DetailHelper.Detail; import org.ovirt.engine.api.model.Action; @@ -34,6 +32,7 @@ import org.ovirt.engine.api.resource.VmResource; import org.ovirt.engine.api.resource.VmsResource; import org.ovirt.engine.api.restapi.types.DiskMapper; +import org.ovirt.engine.api.restapi.types.RngDeviceMapper; import org.ovirt.engine.api.restapi.types.VmMapper; import org.ovirt.engine.api.restapi.util.VmHelper; import org.ovirt.engine.core.common.action.AddVmFromScratchParameters; @@ -49,6 +48,7 @@ import org.ovirt.engine.core.common.businessentities.VdsStatic; import org.ovirt.engine.core.common.businessentities.VmInit; import org.ovirt.engine.core.common.businessentities.VmPayload; +import org.ovirt.engine.core.common.businessentities.VmRngDevice; import org.ovirt.engine.core.common.businessentities.VmStatic; import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.common.interfaces.SearchType; @@ -284,6 +284,11 @@ ? vm.getConsole().isEnabled() : !getConsoleDevicesForEntity(staticVm.getId()).isEmpty()); + if (vm.isSetRngDevice()) { + params.setUpdateRngDevice(true); + params.setRngDevice(RngDeviceMapper.map(vm.getRngDevice(), null)); + } + return performCreate(VdcActionType.AddVmFromSnapshot, params, new QueryIdResolver<Guid>(VdcQueryType.GetVmByVmId, IdQueryParameters.class)); @@ -301,6 +306,11 @@ params.setConsoleEnabled(vm.isSetConsole() && vm.getConsole().isSetEnabled() ? vm.getConsole().isEnabled() : !getConsoleDevicesForEntity(templateId).isEmpty()); + + if (vm.isSetRngDevice()) { + params.setUpdateRngDevice(true); + params.setRngDevice(RngDeviceMapper.map(vm.getRngDevice(), null)); + } params.setMakeCreatorExplicitOwner(shouldMakeCreatorExplicitOwner()); setupCloneTemplatePermissions(vm, params); @@ -360,6 +370,11 @@ params.setVirtioScsiEnabled(vm.isSetVirtioScsi() && vm.getVirtioScsi().isSetEnabled() ? vm.getVirtioScsi().isEnabled() : null); + if (vm.isSetRngDevice()) { + params.setUpdateRngDevice(true); + params.setRngDevice(RngDeviceMapper.map(vm.getRngDevice(), null)); + } + return performCreate(VdcActionType.AddVm, params, new QueryIdResolver<Guid>(VdcQueryType.GetVmByVmId, IdQueryParameters.class)); @@ -384,6 +399,11 @@ if (vm.isSetConsole() && vm.getConsole().isSetEnabled()) { params.setConsoleEnabled(vm.getConsole().isEnabled()); + } + + if (vm.isSetRngDevice()) { + params.setUpdateRngDevice(true); + params.setRngDevice(RngDeviceMapper.map(vm.getRngDevice(), null)); } return performCreate(VdcActionType.AddVmFromScratch, @@ -626,9 +646,21 @@ setVirtioScsiController(model); setCertificateInfo(model); setVmOvfConfiguration(model, entity); + setRngDevice(model); return model; } + protected void setRngDevice(VM model) { + List<VmRngDevice> rngDevices = getEntity(List.class, + VdcQueryType.GetRngDevice, + new IdQueryParameters(Guid.createGuidFromString(model.getId())), + "GetRngDevice", true); + + if (rngDevices != null && !rngDevices.isEmpty()) { + model.setRngDevice(RngDeviceMapper.map(rngDevices.get(0), null)); + } + } + private List<String> getConsoleDevicesForEntity(Guid id) { return getEntity(List.class, VdcQueryType.GetConsoleDevices, diff --git a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/AbstractBackendBaseTest.java b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/AbstractBackendBaseTest.java index d4203e9..533a469 100644 --- a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/AbstractBackendBaseTest.java +++ b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/AbstractBackendBaseTest.java @@ -1,24 +1,16 @@ package org.ovirt.engine.api.restapi.resource; -import static org.easymock.EasyMock.eq; -import static org.easymock.EasyMock.expect; -import static org.ovirt.engine.api.restapi.test.util.TestHelper.eqActionParams; -import static org.ovirt.engine.api.restapi.test.util.TestHelper.eqQueryParams; -import static org.ovirt.engine.api.restapi.test.util.TestHelper.eqSearchParams; - import java.net.URI; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Locale; - import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.PathSegment; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; - import org.easymock.IAnswer; import org.easymock.IMocksControl; import org.easymock.classextension.EasyMock; @@ -54,6 +46,13 @@ import org.ovirt.engine.core.common.queries.VdcQueryReturnValue; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.compat.Guid; + + +import static org.easymock.EasyMock.eq; +import static org.easymock.EasyMock.expect; +import static org.ovirt.engine.api.restapi.test.util.TestHelper.eqActionParams; +import static org.ovirt.engine.api.restapi.test.util.TestHelper.eqQueryParams; +import static org.ovirt.engine.api.restapi.test.util.TestHelper.eqSearchParams; public abstract class AbstractBackendBaseTest extends Assert { protected static final Guid[] GUIDS = { new Guid("00000000-0000-0000-0000-000000000000"), @@ -260,6 +259,16 @@ } } + protected void setUpGetRngDeviceExpectations(int ... idxs) throws Exception { + for (int i = 0; i < idxs.length; i++) { + setUpGetEntityExpectations(VdcQueryType.GetRngDevice, + IdQueryParameters.class, + new String[] { "Id" }, + new Object[] { GUIDS[idxs[i]] }, + new ArrayList<>()); + } + } + protected UriInfo setUpActionExpectations(VdcActionType task, Class<? extends VdcActionParametersBase> clz, String[] names, Object[] values, boolean canDo, boolean success) { diff --git a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendTemplateResourceTest.java b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendTemplateResourceTest.java index 76c6b19..8a69de5 100644 --- a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendTemplateResourceTest.java +++ b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendTemplateResourceTest.java @@ -100,6 +100,7 @@ expect(httpHeaders.getRequestHeader(BackendResource.POPULATE)).andReturn(populates).anyTimes(); setUpGetConsoleExpectations(new int[]{0}); setUpGetVirtioScsiExpectations(new int[]{0}); + setUpGetRngDeviceExpectations(new int[]{0}); } control.replay(); @@ -134,6 +135,7 @@ getVdsGroupEntity()); setUpGetConsoleExpectations(new int[]{0}); setUpGetVirtioScsiExpectations(new int[]{0}); + setUpGetRngDeviceExpectations(new int[]{0}); setUriInfo(setUpActionExpectations(VdcActionType.UpdateVmTemplate, UpdateVmTemplateParameters.class, diff --git a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendTemplatesResourceTest.java b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendTemplatesResourceTest.java index c5251bb..afd8b99 100644 --- a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendTemplatesResourceTest.java +++ b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendTemplatesResourceTest.java @@ -77,6 +77,7 @@ setUpGetEntityExpectations(0); setUpGetConsoleExpectations(new int[]{0, 0, 0}); setUpGetVirtioScsiExpectations(new int[]{0, 0}); + setUpGetRngDeviceExpectations(new int[]{0, 0}); setUpEntityQueryExpectations(VdcQueryType.GetVdsGroupByVdsGroupId, IdQueryParameters.class, new String[] { "Id" }, @@ -198,6 +199,7 @@ setUpGetConsoleExpectations(new int[]{0, 0}); setUpGetVirtioScsiExpectations(new int[]{0}); + setUpGetRngDeviceExpectations(new int[]{0}); setUpGetEntityExpectations(VdcQueryType.GetVmByVmId, IdQueryParameters.class, new String[] { "Id" }, @@ -235,6 +237,7 @@ setUpGetConsoleExpectations(new int[]{0, 0, 0}); setUpGetVirtioScsiExpectations(new int[]{0, 0}); + setUpGetRngDeviceExpectations(new int[]{0, 0}); setUpGetEntityExpectations(VdcQueryType.GetVmByVmId, IdQueryParameters.class, new String[] { "Id" }, @@ -292,6 +295,7 @@ setUpGetConsoleExpectations(new int[]{2, 0, 2}); setUpGetVirtioScsiExpectations(new int[]{2, 2}); + setUpGetRngDeviceExpectations(new int[]{2, 2}); setUpGetEntityExpectations(VdcQueryType.GetVmByVmId, IdQueryParameters.class, new String[] { "Id" }, @@ -347,6 +351,7 @@ setUpGetEntityExpectations(0); setUpGetConsoleExpectations(new int[] {0, 0, 0}); setUpGetVirtioScsiExpectations(new int[] {0, 0}); + setUpGetRngDeviceExpectations(new int[]{0, 0}); setUpCreationExpectations(VdcActionType.AddVmTemplate, AddVmTemplateParameters.class, @@ -395,7 +400,7 @@ setUpGetEntityExpectations(0); setUpGetConsoleExpectations(new int[] {0, 0, 0}); setUpGetVirtioScsiExpectations(new int[] {0, 0}); - + setUpGetRngDeviceExpectations(new int[] {0, 0}); setUpCreationExpectations(VdcActionType.AddVmTemplate, AddVmTemplateParameters.class, @@ -442,6 +447,7 @@ setUpGetConsoleExpectations(new int[] {0, 0, 0}); setUpGetVirtioScsiExpectations(new int[] {0, 0}); + setUpGetRngDeviceExpectations(new int[]{0, 0}); setUpCreationExpectations(VdcActionType.AddVmTemplate, AddVmTemplateParameters.class, @@ -488,6 +494,7 @@ setUpGetConsoleExpectations(new int[] {0, 0, 0}); setUpGetVirtioScsiExpectations(new int[] {0, 0}); + setUpGetRngDeviceExpectations(new int[]{0, 0}); setUpGetEntityExpectations(VdcQueryType.GetVdsGroupByName, NameQueryParameters.class, @@ -663,6 +670,7 @@ expect(httpHeaders.getRequestHeader(BackendResource.POPULATE)).andReturn(populates).anyTimes(); setUpGetConsoleExpectations(new int[]{0, 1, 2}); setUpGetVirtioScsiExpectations(new int[] {0, 1, 2}); + setUpGetRngDeviceExpectations(new int[]{0, 1, 2}); } setUpQueryExpectations(""); diff --git a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendVmPoolsResourceTest.java b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendVmPoolsResourceTest.java index 6a6cdda..e88770d 100644 --- a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendVmPoolsResourceTest.java +++ b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendVmPoolsResourceTest.java @@ -98,6 +98,8 @@ new Object[] { GUIDS[1] }, new ArrayList<>()); + setUpGetRngDeviceExpectations(new int[] {0}); + setUpCreationExpectations(VdcActionType.AddVmPoolWithVms, VmPoolParametersBase.class, new String[] { "StorageDomainId" }, @@ -128,6 +130,7 @@ getTemplateEntity()); setUpGetConsoleExpectations(new int[] { 1 }); + setUpGetRngDeviceExpectations(new int[] {0}); setUpGetEntityExpectations(VdcQueryType.GetVirtioScsiControllers, IdQueryParameters.class, diff --git a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendVmResourceTest.java b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendVmResourceTest.java index d6f0437..761a1ed 100644 --- a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendVmResourceTest.java +++ b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendVmResourceTest.java @@ -179,6 +179,7 @@ expect(httpHeaders.getRequestHeader(BackendResource.POPULATE)).andReturn(populates).anyTimes(); setUpGetConsoleExpectations(new int[]{0}); setUpGetVirtioScsiExpectations(new int[]{0}); + setUpGetRngDeviceExpectations(new int[]{0}); setUpGetVmOvfExpectations(new int[]{0}); } setUpGetEntityExpectations(1); @@ -223,6 +224,7 @@ setUpGetConsoleExpectations(new int[]{0}); setUpGetVmOvfExpectations(new int[]{0}); setUpGetVirtioScsiExpectations(new int[] {0}); + setUpGetRngDeviceExpectations(new int[]{0}); setUriInfo(setUpActionExpectations(VdcActionType.UpdateVm, VmManagementParametersBase.class, new String[] {}, @@ -250,6 +252,7 @@ setUpGetConsoleExpectations(new int[]{0}); setUpGetVmOvfExpectations(new int[]{0}); setUpGetVirtioScsiExpectations(new int[] {0}); + setUpGetRngDeviceExpectations(new int[]{0}); setUriInfo(setUpActionExpectations(VdcActionType.UpdateVm, VmManagementParametersBase.class, @@ -292,6 +295,7 @@ setUpGetConsoleExpectations(new int[]{0}); setUpGetVmOvfExpectations(new int[]{0}); setUpGetVirtioScsiExpectations(new int[] {0}); + setUpGetRngDeviceExpectations(new int[]{0}); setUpEntityQueryExpectations(VdcQueryType.GetVdsStaticByName, NameQueryParameters.class, new String[] { "Name" }, @@ -332,6 +336,7 @@ setUpGetConsoleExpectations(new int[]{0}); setUpGetVmOvfExpectations(new int[]{0}); setUpGetVirtioScsiExpectations(new int[] {0}); + setUpGetRngDeviceExpectations(new int[]{0}); setUriInfo(setUpActionExpectations(VdcActionType.ChangeVMCluster, ChangeVMClusterParameters.class, new String[] {"ClusterId", "VmId"}, diff --git a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendVmsResourceTest.java b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendVmsResourceTest.java index e8e8b40..0d57bee 100644 --- a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendVmsResourceTest.java +++ b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendVmsResourceTest.java @@ -239,6 +239,7 @@ setUpGetBallooningExpectations(1, 0); setUpGetConsoleExpectations(new int[]{0}); setUpGetVirtioScsiExpectations(new int[]{0}); + setUpGetRngDeviceExpectations(new int[]{0}); setUpGetVmOvfExpectations(new int[]{0}); setUpGetCertuficateExpectations(1, 0); setUpEntityQueryExpectations(VdcQueryType.GetVdsGroupByVdsGroupId, @@ -289,6 +290,7 @@ setUpGetConsoleExpectations(new int[]{0, 0}); setUpGetVmOvfExpectations(new int[]{0, 0}); setUpGetVirtioScsiExpectations(new int[]{0, 0}); + setUpGetRngDeviceExpectations(new int[]{0, 0}); setUpGetBallooningExpectations(2, 0); setUpGetCertuficateExpectations(2, 0); setUpEntityQueryExpectations(VdcQueryType.GetVmByVmId, @@ -346,6 +348,7 @@ setUpGetConsoleExpectations(new int[]{0, 0}); setUpGetVmOvfExpectations(new int[]{0, 0}); setUpGetVirtioScsiExpectations(new int[]{0, 0}); + setUpGetRngDeviceExpectations(new int[]{0, 0}); setUpGetCertuficateExpectations(2, 0); setUpEntityQueryExpectations(VdcQueryType.GetVmByVmId, IdQueryParameters.class, @@ -398,6 +401,7 @@ setUpGetConsoleExpectations(new int[]{0, 0}); setUpGetVmOvfExpectations(new int[]{0, 0}); setUpGetVirtioScsiExpectations(new int[]{0, 0}); + setUpGetRngDeviceExpectations(new int[]{0, 0}); setUpGetCertuficateExpectations(2, 0); setUpHttpHeaderExpectations("Expect", "201-created"); setUpEntityQueryExpectations(VdcQueryType.GetVdsGroupByName, @@ -500,6 +504,7 @@ setUpGetConsoleExpectations(new int[]{1, 2}); setUpGetVmOvfExpectations(new int[]{2}); setUpGetVirtioScsiExpectations(new int[]{2}); + setUpGetRngDeviceExpectations(new int[]{2}); setUpGetCertuficateExpectations(1, 2); setUpEntityQueryExpectations(VdcQueryType.GetVmTemplate, GetVmTemplateParameters.class, @@ -549,6 +554,7 @@ setUpGetConsoleExpectations(new int[]{0, 2}); setUpGetVmOvfExpectations(new int[]{2}); setUpGetVirtioScsiExpectations(new int[]{2}); + setUpGetRngDeviceExpectations(new int[]{2}); setUpEntityQueryExpectations(VdcQueryType.GetVmConfigurationBySnapshot, IdQueryParameters.class, new String[] { "Id" }, @@ -584,6 +590,7 @@ setUpGetConsoleExpectations(new int[]{1, 2}); setUpGetVmOvfExpectations(new int[]{2}); setUpGetVirtioScsiExpectations(new int[]{2}); + setUpGetRngDeviceExpectations(new int[]{2}); setUpGetCertuficateExpectations(1, 2); setUpEntityQueryExpectations(VdcQueryType.GetVmTemplate, GetVmTemplateParameters.class, @@ -623,6 +630,7 @@ setUpGetConsoleExpectations(new int[]{1, 2}); setUpGetVmOvfExpectations(new int[]{2}); setUpGetVirtioScsiExpectations(new int[]{2}); + setUpGetRngDeviceExpectations(new int[]{2}); setUpEntityQueryExpectations(VdcQueryType.GetVmTemplate, GetVmTemplateParameters.class, new String[] { "Id" }, @@ -669,6 +677,7 @@ setUpGetCertuficateExpectations(1, 2); setUpGetConsoleExpectations(new int[] { 1, 2 }); setUpGetVirtioScsiExpectations(new int[] { 2 }); + setUpGetRngDeviceExpectations(new int[]{2}); setUpGetVmOvfExpectations(new int[] { 2 }); setUpEntityQueryExpectations(VdcQueryType.GetVmTemplate, GetVmTemplateParameters.class, @@ -707,6 +716,7 @@ setUpGetConsoleExpectations(new int[] { 3 }); setUpGetVmOvfExpectations(new int[] { 3 }); setUpGetVirtioScsiExpectations(new int[] { 3 }); + setUpGetRngDeviceExpectations(new int[]{3}); VM model = createModel(null); org.ovirt.engine.core.common.businessentities.VM returnedVM = getEntity(2); model.setInitialization(new Initialization()); @@ -750,6 +760,7 @@ setUpGetConsoleExpectations(new int[]{2}); setUpGetVmOvfExpectations(new int[]{2}); setUpGetVirtioScsiExpectations(new int[]{2}); + setUpGetRngDeviceExpectations(new int[]{2}); VM model = createModel(null); org.ovirt.engine.core.common.businessentities.VM returnedVM = getEntity(2); model.setInitialization(new Initialization()); @@ -788,6 +799,7 @@ setUpGetConsoleExpectations(new int[]{2}); setUpGetVmOvfExpectations(new int[]{2}); setUpGetVirtioScsiExpectations(new int[]{2}); + setUpGetRngDeviceExpectations(new int[]{2}); VM model = createModel(null); org.ovirt.engine.core.common.businessentities.VM returnedVM = getEntity(2); model.setInitialization(new Initialization()); @@ -885,6 +897,7 @@ setUpGetConsoleExpectations(new int[]{1, 2}); setUpGetVmOvfExpectations(new int[]{2}); setUpGetVirtioScsiExpectations(new int[]{2}); + setUpGetRngDeviceExpectations(new int[]{2}); setUpGetCertuficateExpectations(1, 2); setUpEntityQueryExpectations(VdcQueryType.GetVdsStaticByName, NameQueryParameters.class, @@ -939,6 +952,7 @@ setUpGetConsoleExpectations(new int[]{1, 2}); setUpGetVmOvfExpectations(new int[]{2}); setUpGetVirtioScsiExpectations(new int[]{2}); + setUpGetRngDeviceExpectations(new int[]{2}); setUpGetCertuficateExpectations(1, 2); setUpEntityQueryExpectations(VdcQueryType.GetVmTemplate, GetVmTemplateParameters.class, @@ -980,6 +994,7 @@ setUpGetConsoleExpectations(new int[]{1, 2}); setUpGetVmOvfExpectations(new int[]{2}); setUpGetVirtioScsiExpectations(new int[]{2}); + setUpGetRngDeviceExpectations(new int[]{2}); setUpGetCertuficateExpectations(1, 2); setUpEntityQueryExpectations(VdcQueryType.GetVmTemplate, GetVmTemplateParameters.class, @@ -1044,6 +1059,7 @@ setUpGetConsoleExpectations(new int[]{1, 2}); setUpGetVmOvfExpectations(new int[]{2}); setUpGetVirtioScsiExpectations(new int[]{2}); + setUpGetRngDeviceExpectations(new int[]{2}); setUpEntityQueryExpectations(VdcQueryType.GetVmTemplate, GetVmTemplateParameters.class, new String[] { "Id" }, @@ -1096,6 +1112,7 @@ setUpGetConsoleExpectations(new int[]{1, 2}); setUpGetVmOvfExpectations(new int[]{2}); setUpGetVirtioScsiExpectations(new int[]{2}); + setUpGetRngDeviceExpectations(new int[]{2}); setUpEntityQueryExpectations(VdcQueryType.GetVmTemplate, GetVmTemplateParameters.class, new String[]{"Id"}, @@ -1167,6 +1184,7 @@ setUpGetConsoleExpectations(new int[]{0, 1, 2}); setUpGetVmOvfExpectations(new int[]{0, 1, 2}); setUpGetVirtioScsiExpectations(new int[]{0, 1, 2}); + setUpGetRngDeviceExpectations(new int[]{0, 1, 2}); setUpGetCertuficateExpectations(3); } @@ -1186,6 +1204,7 @@ setUpGetConsoleExpectations(new int[]{0, 1, 2}); setUpGetVmOvfExpectations(new int[]{0, 1, 2}); setUpGetVirtioScsiExpectations(new int[]{0, 1, 2}); + setUpGetRngDeviceExpectations(new int[]{0, 1, 2}); setUpGetCertuficateExpectations(3); setUpQueryExpectations(""); collection.setUriInfo(uriInfo); diff --git a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/RngDeviceMapper.java b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/RngDeviceMapper.java new file mode 100644 index 0000000..9c48d11 --- /dev/null +++ b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/RngDeviceMapper.java @@ -0,0 +1,51 @@ +package org.ovirt.engine.api.restapi.types; + +import org.ovirt.engine.api.model.Rate; +import org.ovirt.engine.api.model.RngDevice; +import org.ovirt.engine.core.common.businessentities.VmRngDevice; + +public class RngDeviceMapper { + + @Mapping(from = VmRngDevice.class, to = RngDevice.class) + public static RngDevice map(VmRngDevice entity, RngDevice template) { + RngDevice model = (template == null) + ? new RngDevice() + : template; + + if (entity.getBytes() != null) { + model.setRate(new Rate()); + model.getRate().setBytes(entity.getBytes()); + if (entity.getPeriod() != null) { + model.getRate().setPeriod(entity.getPeriod()); + } + } + + model.setSource(entity.getSource().toString()); + + return model; + } + + @Mapping(from = RngDevice.class, to = VmRngDevice.class) + public static VmRngDevice map(RngDevice model, VmRngDevice template) { + if (model != null && model.isSetSource()) { + VmRngDevice dev = new VmRngDevice(); + + if (model.isSetRate()) { + dev.setBytes(model.getRate().getBytes()); + if (model.getRate().isSetPeriod()) { + dev.setPeriod(model.getRate().getPeriod()); + } + } + + VmRngDevice.Source source = VmRngDevice.Source.fromString(model.getSource()); + + if (source != null) { + dev.setSource(source); + return dev; + } + } + + return null; + } + +} diff --git a/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/RngDeviceMapperTest.java b/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/RngDeviceMapperTest.java new file mode 100644 index 0000000..6b7b1e1 --- /dev/null +++ b/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/RngDeviceMapperTest.java @@ -0,0 +1,41 @@ +package org.ovirt.engine.api.restapi.types; + +import org.junit.Test; +import org.ovirt.engine.api.model.Rate; +import org.ovirt.engine.api.model.RngDevice; +import org.ovirt.engine.core.common.businessentities.VmRngDevice; +import org.ovirt.engine.core.compat.Guid; + + +import static org.junit.Assert.assertEquals; + + +public class RngDeviceMapperTest { + + @Test + public void testMapFromBackendToRest() throws Exception { + VmRngDevice entity = VmRngDevice.create(Guid.Empty, Guid.Empty, 11, 10, VmRngDevice.Source.RANDOM); + RngDevice expected = new RngDevice(); + expected.setRate(new Rate()); + expected.getRate().setBytes(11); + expected.getRate().setPeriod(10); + expected.setSource(VmRngDevice.Source.RANDOM.toString()); + + assertEquals(expected.getRate().getBytes(), RngDeviceMapper.map(entity, null).getRate().getBytes()); + assertEquals(expected.getRate().getPeriod(), RngDeviceMapper.map(entity, null).getRate().getPeriod()); + assertEquals(expected.getSource(), RngDeviceMapper.map(entity, null).getSource()); + } + + @Test + public void testMapFromRestToBackend() throws Exception { + RngDevice model = new RngDevice(); + model.setSource(VmRngDevice.Source.HWRNG.toString()); + model.setRate(new Rate()); + model.getRate().setBytes(10); + model.getRate().setPeriod(11); + + VmRngDevice expected = VmRngDevice.create(null, null, 10, 11, VmRngDevice.Source.HWRNG); + + assertEquals(expected, RngDeviceMapper.map(model, null)); + } +} -- To view, visit http://gerrit.ovirt.org/27157 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I585ae1088bbe18af42bf374e3207d053ae71f166 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Frank Kobzik <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
