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

Reply via email to