From b3aed10ee037770c4e0010594e64b2f3c8abb438 Mon Sep 17 00:00:00 2001 From: Miguel Herranz Date: Thu, 27 Jun 2019 15:33:13 +0200 Subject: [PATCH] Add support for 'initenv' elements To better support container based virtualization, libvirt domain XML format has the 'initenv' element [1] to setup env variables for the container's init process. This patch add to nova instance configuration a new dictionary called 'os_init_env' so that its entries are mapped to/from 'initenv' elements. [1] https://libvirt.org/formatdomain.html#elementsOSContainer Change-Id: I93c1b1c392a100240be0cac0051bbec2aed8242d Signed-off-by: Miguel Herranz --- nova/tests/unit/virt/libvirt/test_config.py | 4 ++++ nova/virt/libvirt/config.py | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/nova/tests/unit/virt/libvirt/test_config.py b/nova/tests/unit/virt/libvirt/test_config.py index 7e124b279098..84f1491c829e 100644 --- a/nova/tests/unit/virt/libvirt/test_config.py +++ b/nova/tests/unit/virt/libvirt/test_config.py @@ -2284,6 +2284,7 @@ class LibvirtConfigGuestTest(LibvirtConfigBaseTest): obj.uuid = "b38a3f43-4be2-4046-897f-b67c2f5e0147" obj.os_type = "exe" obj.os_init_path = "/sbin/init" + obj.os_init_env["foo"] = "bar" fs = config.LibvirtConfigGuestFilesys() fs.source_dir = "/root/lxc" @@ -2301,6 +2302,7 @@ class LibvirtConfigGuestTest(LibvirtConfigBaseTest): exe /sbin/init + bar @@ -2765,6 +2767,7 @@ class LibvirtConfigGuestTest(LibvirtConfigBaseTest): + bar """ @@ -2781,6 +2784,7 @@ class LibvirtConfigGuestTest(LibvirtConfigBaseTest): self.assertEqual('console=xvc0', obj.os_cmdline) self.assertEqual('root=xvda', obj.os_root) self.assertEqual('/sbin/init', obj.os_init_path) + self.assertEqual('bar', obj.os_init_env['foo']) self.assertEqual(['hd', 'cdrom', 'fd'], obj.os_boot_dev) self.assertTrue(obj.os_bootmenu) self.assertIsNone(obj.os_smbios) diff --git a/nova/virt/libvirt/config.py b/nova/virt/libvirt/config.py index 29f8bc5785b0..af3b27729729 100644 --- a/nova/virt/libvirt/config.py +++ b/nova/virt/libvirt/config.py @@ -2502,6 +2502,7 @@ class LibvirtConfigGuest(LibvirtConfigObject): self.os_kernel = None self.os_initrd = None self.os_cmdline = None + self.os_init_env = {} self.os_root = None self.os_init_path = None self.os_boot_dev = [] @@ -2561,6 +2562,10 @@ class LibvirtConfigGuest(LibvirtConfigObject): os.append(self._text_node("root", self.os_root)) if self.os_init_path is not None: os.append(self._text_node("init", self.os_init_path)) + for name, value in self.os_init_env.items(): + initenv = self._text_node("initenv", value) + initenv.set("name", name) + os.append(initenv) for boot_dev in self.os_boot_dev: os.append(etree.Element("boot", dev=boot_dev)) @@ -2674,6 +2679,8 @@ class LibvirtConfigGuest(LibvirtConfigObject): elif c.tag == 'bootmenu': if c.get('enable') == 'yes': self.os_bootmenu = True + elif c.tag == 'initenv': + self.os_init_env[c.get('name')] = c.text def parse_dom(self, xmldoc): self.virt_type = xmldoc.get('type')