The virtio-rng device is supported by libvirt since version 1.0.3. Signed-off-by: Giuseppe Scrivano <gscrivan@xxxxxxxxxx> --- tests/testdriver.xml | 7 +++ tests/xmlparse-xml/change-rng-egd-in.xml | 64 +++++++++++++++++++ tests/xmlparse-xml/change-rng-egd-out.xml | 64 +++++++++++++++++++ tests/xmlparse-xml/change-rng-random-in.xml | 61 ++++++++++++++++++ tests/xmlparse-xml/change-rng-random-out.xml | 61 ++++++++++++++++++ tests/xmlparse.py | 30 +++++++++ virtinst/__init__.py | 1 + virtinst/device.py | 4 +- virtinst/devicerng.py | 94 ++++++++++++++++++++++++++++ 9 files changed, 385 insertions(+), 1 deletion(-) create mode 100644 tests/xmlparse-xml/change-rng-egd-in.xml create mode 100644 tests/xmlparse-xml/change-rng-egd-out.xml create mode 100644 tests/xmlparse-xml/change-rng-random-in.xml create mode 100644 tests/xmlparse-xml/change-rng-random-out.xml create mode 100644 virtinst/devicerng.py diff --git a/tests/testdriver.xml b/tests/testdriver.xml index 195afe1..cd70ad8 100644 --- a/tests/testdriver.xml +++ b/tests/testdriver.xml @@ -298,6 +298,13 @@ </backend> </tpm> + <!-- rng devices --> + <rng model='virtio'> + <rate period='2000' bytes='1234'/> + <backend model='egd' type='tcp'> + <source mode='connect' host='1.2.3.4' service='1234'/> + </backend> + </rng> </devices> </domain> diff --git a/tests/xmlparse-xml/change-rng-egd-in.xml b/tests/xmlparse-xml/change-rng-egd-in.xml new file mode 100644 index 0000000..74db226 --- /dev/null +++ b/tests/xmlparse-xml/change-rng-egd-in.xml @@ -0,0 +1,64 @@ +<domain type='kvm'> + <name>TestGuest</name> + <currentMemory>204800</currentMemory> + <memory>409600</memory> + <uuid>12345678-1234-1234-1234-123456789012</uuid> + <os> + <type arch='i686' machine='foobar'>hvm</type> + <boot dev='hd'/> + </os> + <features> + <acpi/><apic/> + </features> + <cpu match='exact'> + <model>footest</model> + <vendor>Intel</vendor> + <topology sockets='4' cores='5' threads='2'/> + <feature policy='force' name='x2apic'/> + <feature policy='forbid' name='lahf_lm'/> + </cpu> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <vcpu cpuset='1-3'>5</vcpu> + <devices> + <emulator>/usr/lib/xen/bin/qemu-dm</emulator> + <disk type='file' device='floppy'> + <driver name='qemu' type='qcow2'/> + <source file='/dev/default-pool/testvol1.img'/> + <target dev='fda' bus='fdc'/> + </disk> + <disk type='file' device='disk'> + <driver name='qemu' type='raw'/> + <source file='/tmp/test.img'/> + <target dev='vda' bus='virtio'/> + </disk> + <disk type='block' device='disk'> + <driver name='qemu'/> + <source dev='/dev/loop0'/> + <target dev='vdb' bus='virtio'/> + </disk> + <disk type='block' device='cdrom'> + <target dev='hdc' bus='ide'/> + <readonly/> + </disk> + <interface type='network'> + <source network='default'/> + <mac address='22:22:33:44:55:66'/> + <model type='virtio'/> + </interface> + <graphics type='sdl' display=':3.4' xauth='/tmp/.Xauthority'/> + <console type='pty'/> + <rng model='virtio'> + <rate period='2000' bytes='1234'/> + <backend model='egd' type='udp'> + <source mode='connect' host='1.2.3.4' service='1234'/> + </backend> + </rng> + </devices> + <seclabel type='static' model='selinux'> + <label>foolabel</label> + <imagelabel>imagelabel</imagelabel> + </seclabel> +</domain> diff --git a/tests/xmlparse-xml/change-rng-egd-out.xml b/tests/xmlparse-xml/change-rng-egd-out.xml new file mode 100644 index 0000000..c4bd71e --- /dev/null +++ b/tests/xmlparse-xml/change-rng-egd-out.xml @@ -0,0 +1,64 @@ +<domain type="kvm"> + <name>TestGuest</name> + <currentMemory>204800</currentMemory> + <memory>409600</memory> + <uuid>12345678-1234-1234-1234-123456789012</uuid> + <os> + <type arch="i686" machine="foobar">hvm</type> + <boot dev="hd"/> + </os> + <features> + <acpi/><apic/> + </features> + <cpu match="exact"> + <model>footest</model> + <vendor>Intel</vendor> + <topology sockets="4" cores="5" threads="2"/> + <feature policy="force" name="x2apic"/> + <feature policy="forbid" name="lahf_lm"/> + </cpu> + <clock offset="utc"/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <vcpu cpuset="1-3">5</vcpu> + <devices> + <emulator>/usr/lib/xen/bin/qemu-dm</emulator> + <disk type="file" device="floppy"> + <driver name="qemu" type="qcow2"/> + <source file="/dev/default-pool/testvol1.img"/> + <target dev="fda" bus="fdc"/> + </disk> + <disk type="file" device="disk"> + <driver name="qemu" type="raw"/> + <source file="/tmp/test.img"/> + <target dev="vda" bus="virtio"/> + </disk> + <disk type="block" device="disk"> + <driver name="qemu"/> + <source dev="/dev/loop0"/> + <target dev="vdb" bus="virtio"/> + </disk> + <disk type="block" device="cdrom"> + <target dev="hdc" bus="ide"/> + <readonly/> + </disk> + <interface type="network"> + <source network="default"/> + <mac address="22:22:33:44:55:66"/> + <model type="virtio"/> + </interface> + <graphics type="sdl" display=":3.4" xauth="/tmp/.Xauthority"/> + <console type="pty"/> + <rng model="virtio"> + <rate period="2001" bytes="4321"/> + <backend model="egd" type="tcp"> + <source mode="bind" host="1.2.3.5" service="1235"/> + </backend> + </rng> + </devices> + <seclabel type="static" model="selinux"> + <label>foolabel</label> + <imagelabel>imagelabel</imagelabel> + </seclabel> +</domain> diff --git a/tests/xmlparse-xml/change-rng-random-in.xml b/tests/xmlparse-xml/change-rng-random-in.xml new file mode 100644 index 0000000..fb9367d --- /dev/null +++ b/tests/xmlparse-xml/change-rng-random-in.xml @@ -0,0 +1,61 @@ +<domain type='kvm'> + <name>TestGuest</name> + <currentMemory>204800</currentMemory> + <memory>409600</memory> + <uuid>12345678-1234-1234-1234-123456789012</uuid> + <os> + <type arch='i686' machine='foobar'>hvm</type> + <boot dev='hd'/> + </os> + <features> + <acpi/><apic/> + </features> + <cpu match='exact'> + <model>footest</model> + <vendor>Intel</vendor> + <topology sockets='4' cores='5' threads='2'/> + <feature policy='force' name='x2apic'/> + <feature policy='forbid' name='lahf_lm'/> + </cpu> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <vcpu cpuset='1-3'>5</vcpu> + <devices> + <emulator>/usr/lib/xen/bin/qemu-dm</emulator> + <disk type='file' device='floppy'> + <driver name='qemu' type='qcow2'/> + <source file='/dev/default-pool/testvol1.img'/> + <target dev='fda' bus='fdc'/> + </disk> + <disk type='file' device='disk'> + <driver name='qemu' type='raw'/> + <source file='/tmp/test.img'/> + <target dev='vda' bus='virtio'/> + </disk> + <disk type='block' device='disk'> + <driver name='qemu'/> + <source dev='/dev/loop0'/> + <target dev='vdb' bus='virtio'/> + </disk> + <disk type='block' device='cdrom'> + <target dev='hdc' bus='ide'/> + <readonly/> + </disk> + <interface type='network'> + <source network='default'/> + <mac address='22:22:33:44:55:66'/> + <model type='virtio'/> + </interface> + <graphics type='sdl' display=':3.4' xauth='/tmp/.Xauthority'/> + <console type='pty'/> + <rng model='virtio'> + <backend model='random'>/dev/random</backend> + </rng> + </devices> + <seclabel type='static' model='selinux'> + <label>foolabel</label> + <imagelabel>imagelabel</imagelabel> + </seclabel> +</domain> diff --git a/tests/xmlparse-xml/change-rng-random-out.xml b/tests/xmlparse-xml/change-rng-random-out.xml new file mode 100644 index 0000000..8c3eba4 --- /dev/null +++ b/tests/xmlparse-xml/change-rng-random-out.xml @@ -0,0 +1,61 @@ +<domain type="kvm"> + <name>TestGuest</name> + <currentMemory>204800</currentMemory> + <memory>409600</memory> + <uuid>12345678-1234-1234-1234-123456789012</uuid> + <os> + <type arch="i686" machine="foobar">hvm</type> + <boot dev="hd"/> + </os> + <features> + <acpi/><apic/> + </features> + <cpu match="exact"> + <model>footest</model> + <vendor>Intel</vendor> + <topology sockets="4" cores="5" threads="2"/> + <feature policy="force" name="x2apic"/> + <feature policy="forbid" name="lahf_lm"/> + </cpu> + <clock offset="utc"/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <vcpu cpuset="1-3">5</vcpu> + <devices> + <emulator>/usr/lib/xen/bin/qemu-dm</emulator> + <disk type="file" device="floppy"> + <driver name="qemu" type="qcow2"/> + <source file="/dev/default-pool/testvol1.img"/> + <target dev="fda" bus="fdc"/> + </disk> + <disk type="file" device="disk"> + <driver name="qemu" type="raw"/> + <source file="/tmp/test.img"/> + <target dev="vda" bus="virtio"/> + </disk> + <disk type="block" device="disk"> + <driver name="qemu"/> + <source dev="/dev/loop0"/> + <target dev="vdb" bus="virtio"/> + </disk> + <disk type="block" device="cdrom"> + <target dev="hdc" bus="ide"/> + <readonly/> + </disk> + <interface type="network"> + <source network="default"/> + <mac address="22:22:33:44:55:66"/> + <model type="virtio"/> + </interface> + <graphics type="sdl" display=":3.4" xauth="/tmp/.Xauthority"/> + <console type="pty"/> + <rng model="virtio"> + <backend model="random">/dev/hwrng</backend> + </rng> + </devices> + <seclabel type="static" model="selinux"> + <label>foolabel</label> + <imagelabel>imagelabel</imagelabel> + </seclabel> +</domain> diff --git a/tests/xmlparse.py b/tests/xmlparse.py index db67949..14fb91a 100644 --- a/tests/xmlparse.py +++ b/tests/xmlparse.py @@ -733,6 +733,36 @@ class XMLParseTest(unittest.TestCase): self._alter_compare(guest.get_xml_config(), outfile) + def testAlterRNG_EGD(self): + guest, outfile = self._get_test_content("change-rng-egd") + + dev1 = guest.get_devices("rng")[0] + + check = self._make_checker(dev1) + check("type", "egd") + check("backend_type", "udp", "tcp") + + check("backend_source_host", "1.2.3.4", "1.2.3.5") + check("backend_source_service", "1234", "1235") + check("backend_source_mode", "connect", "bind") + + check("rate_bytes", "1234", "4321") + check("rate_period", "2000", "2001") + + self._alter_compare(guest.get_xml_config(), outfile) + + def testAlterRNG_Random(self): + guest, outfile = self._get_test_content("change-rng-random") + + dev1 = guest.get_devices("rng")[0] + + check = self._make_checker(dev1) + check("type", "random", "random") + check("model", "virtio", "virtio") + check("device", "/dev/random", "/dev/hwrng") + + self._alter_compare(guest.get_xml_config(), outfile) + def testConsoleCompat(self): guest, outfile = self._get_test_content("console-compat") diff --git a/virtinst/__init__.py b/virtinst/__init__.py index 603e2dc..1cf5c55 100644 --- a/virtinst/__init__.py +++ b/virtinst/__init__.py @@ -53,6 +53,7 @@ from virtinst.devicesmartcard import VirtualSmartCardDevice from virtinst.deviceredirdev import VirtualRedirDevice from virtinst.devicememballoon import VirtualMemballoon from virtinst.devicetpm import VirtualTPMDevice +from virtinst.devicerng import VirtualRNGDevice from virtinst.installer import (ContainerInstaller, ImportInstaller, LiveCDInstaller, PXEInstaller, Installer) diff --git a/virtinst/device.py b/virtinst/device.py index f7dce38..73e3d2d 100644 --- a/virtinst/device.py +++ b/virtinst/device.py @@ -45,6 +45,7 @@ class VirtualDevice(XMLBuilder): VIRTUAL_DEV_REDIRDEV = "redirdev" VIRTUAL_DEV_MEMBALLOON = "memballoon" VIRTUAL_DEV_TPM = "tpm" + VIRTUAL_DEV_RNG = "rng" # Ordering in this list is important: it will be the order the # Guest class outputs XML. So changing this may upset the test suite @@ -65,7 +66,8 @@ class VirtualDevice(XMLBuilder): VIRTUAL_DEV_SMARTCARD, VIRTUAL_DEV_REDIRDEV, VIRTUAL_DEV_MEMBALLOON, - VIRTUAL_DEV_TPM] + VIRTUAL_DEV_TPM, + VIRTUAL_DEV_RNG] virtual_device_classes = {} diff --git a/virtinst/devicerng.py b/virtinst/devicerng.py new file mode 100644 index 0000000..c28dde0 --- /dev/null +++ b/virtinst/devicerng.py @@ -0,0 +1,94 @@ +# coding=utf-8 +# +# Copyright 2013 Red Hat, Inc. +# Giuseppe Scrivano <gscrivan@xxxxxxxxxx> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +# MA 02110-1301 USA. + +from virtinst import VirtualDevice +from virtinst.xmlbuilder import XMLProperty + + +class VirtualRNGDevice(VirtualDevice): + + virtual_device_type = VirtualDevice.VIRTUAL_DEV_RNG + + TYPE_RANDOM = "random" + TYPE_EGD = "egd" + TYPES = [TYPE_RANDOM, TYPE_EGD] + + BACKEND_TYPE_UDP = "udp" + BACKEND_TYPE_TCP = "tcp" + BACKEND_TYPES = [BACKEND_TYPE_UDP, BACKEND_TYPE_TCP] + + BACKEND_MODE_BIND = "bind" + BACKEND_MODE_CONNECT = "connect" + BACKEND_MODES = [BACKEND_MODE_BIND, BACKEND_MODE_CONNECT] + + @staticmethod + def get_pretty_type(rng_type): + if rng_type == VirtualRNGDevice.TYPE_RANDOM: + return _("Random") + if rng_type == VirtualRNGDevice.TYPE_EGD: + return _("Entropy Gathering Daemon") + return rng_type + + @staticmethod + def get_pretty_backend_type(backend_type): + return {"udp" : "UDP", + "tcp": "TCP"}.get(backend_type) or backend_type + + @staticmethod + def get_pretty_mode(mode): + return {"bind" : "Bind", + "connect": "Connect"}.get(mode) or mode + + def supports_property(self, propname): + """ + Whether the rng dev type supports the passed property name + """ + users = { + "type" : [self.TYPE_EGD, self.TYPE_RANDOM], + + "model" : [self.TYPE_EGD, self.TYPE_RANDOM], + "backend_source_host" : [self.TYPE_EGD], + "backend_source_mode" : [self.TYPE_EGD], + "backend_source_service" : [self.TYPE_EGD], + "backend_type" : [self.TYPE_EGD], + "device" : [self.TYPE_RANDOM], + "rate_bytes" : [self.TYPE_EGD, self.TYPE_RANDOM], + "rate_period" : [self.TYPE_EGD, self.TYPE_RANDOM], + } + if users.get(propname): + return self.type in users[propname] + + return hasattr(self, propname) + + type = XMLProperty(xpath="./backend/@model") + model = XMLProperty(xpath="./@model", + default_cb=lambda s: "virtio") + + backend_type = XMLProperty(xpath="./backend/@type") + backend_source_host = XMLProperty(xpath="./backend/source/@host") + backend_source_service = XMLProperty(xpath="./backend/source/@service") + backend_source_mode = XMLProperty(xpath="./backend/source/@mode") + + rate_bytes = XMLProperty(xpath="./rate/@bytes") + rate_period = XMLProperty(xpath="./rate/@period") + + device = XMLProperty(xpath="./backend") + +VirtualRNGDevice.register_type() -- 1.8.3.1 _______________________________________________ virt-tools-list mailing list virt-tools-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/virt-tools-list