From b94550f4199f858e5be491a97a2bc04959b9dcd3 Mon Sep 17 00:00:00 2001 From: Vladik Romanovsky Date: Thu, 16 Jan 2014 16:13:44 -0500 Subject: [PATCH] libvirt: configuration element for a random number generator device This configuration exposes a paravirtual random number generator device, with a default backend set to a hosts /dev/random An optional rate element can be provided in order to limit the consumption of host's entropy by the guest. Partially implements blueprint libvirt-rng-device Change-Id: Id1be32a307473aec2ff0b54b43b2ca3547d74b84 --- .../tests/virt/libvirt/test_libvirt_config.py | 24 +++++++++++++++ nova/virt/libvirt/config.py | 30 +++++++++++++++++++ 2 files changed, 54 insertions(+) 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