diff --git a/nova/tests/virt/libvirt/test_libvirt_config.py b/nova/tests/virt/libvirt/test_libvirt_config.py
index ae71152ea8b7..740ea98aa868 100644
--- a/nova/tests/virt/libvirt/test_libvirt_config.py
+++ b/nova/tests/virt/libvirt/test_libvirt_config.py
@@ -1586,3 +1586,27 @@ class LibvirtConfigGuestSeclabel(LibvirtConfigBaseTest):
system_u:system_r:my_svirt_t:s0
""")
+
+
+class LibvirtConfigGuestRngTest(LibvirtConfigBaseTest):
+
+ def test_config_rng_driver(self):
+ obj = config.LibvirtConfigGuestRng()
+
+ xml = obj.to_xml()
+ self.assertXmlEqual(xml, """
+
+ /dev/random
+""")
+
+ def test_config_rng_driver_with_rate(self):
+ obj = config.LibvirtConfigGuestRng()
+ obj.rate_period = '12'
+ obj.rate_bytes = '34'
+
+ xml = obj.to_xml()
+ self.assertXmlEqual(xml, """
+
+
+ /dev/random
+""")
diff --git a/nova/virt/libvirt/config.py b/nova/virt/libvirt/config.py
index 62a3b3d75d56..fae902cecaa2 100644
--- a/nova/virt/libvirt/config.py
+++ b/nova/virt/libvirt/config.py
@@ -1335,3 +1335,33 @@ class LibvirtConfigNodeDevicePciSubFunctionCap(LibvirtConfigObject):
c.get('bus'),
c.get('slot'),
c.get('function')))
+
+
+class LibvirtConfigGuestRng(LibvirtConfigGuestDevice):
+
+ def __init__(self, **kwargs):
+ super(LibvirtConfigGuestRng, self).__init__(root_name="rng",
+ **kwargs)
+
+ self.model = 'random'
+ self.backend = '/dev/random'
+ self.rate_period = None
+ self.rate_bytes = None
+
+ def format_dom(self):
+ dev = super(LibvirtConfigGuestRng, self).format_dom()
+ dev.set('model', 'virtio')
+
+ backend = etree.Element("backend")
+ backend.set("model", self.model)
+ backend.text = self.backend
+
+ if self.rate_period and self.rate_bytes:
+ rate = etree.Element("rate")
+ rate.set("period", str(self.rate_period))
+ rate.set("bytes", str(self.rate_bytes))
+ dev.append(rate)
+
+ dev.append(backend)
+
+ return dev