From 0bda09acf4e0f8ef72f774e0bd7b247453994a7e Mon Sep 17 00:00:00 2001 From: Yolanda Robla Date: Mon, 17 Dec 2018 12:15:00 +0100 Subject: [PATCH] Add pxe template per node Allow to pass a pxe_template field in driver_info. If that is present, it will search for the template file specified there, instead of checking the per-arch/agent templates. Change-Id: I436a61ad6a3e688bc6f833f5645c99be6d7e26e7 Story: #2004525 Task: #28264 --- ironic/drivers/modules/deploy_utils.py | 19 +++++++++++-------- .../unit/drivers/modules/test_deploy_utils.py | 8 ++++++++ .../add-pxe-per-node-526fd79df17efda8.yaml | 8 ++++++++ 3 files changed, 27 insertions(+), 8 deletions(-) create mode 100644 releasenotes/notes/add-pxe-per-node-526fd79df17efda8.yaml diff --git a/ironic/drivers/modules/deploy_utils.py b/ironic/drivers/modules/deploy_utils.py index a4deae971a..ed73ed20b4 100644 --- a/ironic/drivers/modules/deploy_utils.py +++ b/ironic/drivers/modules/deploy_utils.py @@ -735,19 +735,22 @@ def get_pxe_config_template(node): """Return the PXE config template file name requested for deploy. This method returns PXE config template file to be used for deploy. - Architecture specific template file is searched first. BIOS/UEFI - template file is used if no valid architecture specific file found. + First specific pxe template is searched in the node. After that + architecture specific template file is searched. BIOS/UEFI template file + is used if no valid architecture specific file found. :param node: A single Node. :returns: The PXE config template file name. """ - cpu_arch = node.properties.get('cpu_arch') - config_template = CONF.pxe.pxe_config_template_by_arch.get(cpu_arch) + config_template = node.driver_info.get("pxe_template", None) if config_template is None: - if boot_mode_utils.get_boot_mode(node) == 'uefi': - config_template = CONF.pxe.uefi_pxe_config_template - else: - config_template = CONF.pxe.pxe_config_template + cpu_arch = node.properties.get('cpu_arch') + config_template = CONF.pxe.pxe_config_template_by_arch.get(cpu_arch) + if config_template is None: + if boot_mode_utils.get_boot_mode(node) == 'uefi': + config_template = CONF.pxe.uefi_pxe_config_template + else: + config_template = CONF.pxe.pxe_config_template return config_template diff --git a/ironic/tests/unit/drivers/modules/test_deploy_utils.py b/ironic/tests/unit/drivers/modules/test_deploy_utils.py index d51885a692..4f6d828103 100644 --- a/ironic/tests/unit/drivers/modules/test_deploy_utils.py +++ b/ironic/tests/unit/drivers/modules/test_deploy_utils.py @@ -1113,6 +1113,14 @@ class GetPxeBootConfigTestCase(db_base.DbTestCase): result = utils.get_pxe_config_template(self.node) self.assertEqual('bios-template', result) + def test_get_pxe_config_template_per_node(self): + node = obj_utils.create_test_node( + self.context, driver='fake-hardware', + driver_info={"pxe_template": "fake-template"}, + ) + result = utils.get_pxe_config_template(node) + self.assertEqual('fake-template', result) + @mock.patch('time.sleep', lambda sec: None) class OtherFunctionTestCase(db_base.DbTestCase): diff --git a/releasenotes/notes/add-pxe-per-node-526fd79df17efda8.yaml b/releasenotes/notes/add-pxe-per-node-526fd79df17efda8.yaml new file mode 100644 index 0000000000..d73ae511d4 --- /dev/null +++ b/releasenotes/notes/add-pxe-per-node-526fd79df17efda8.yaml @@ -0,0 +1,8 @@ +--- +features: + - | + Add a new field pxe_template that can be set at driver-info level. This + will specify a path for a custom pxe boot template. If present, this + template will be read and will have priority in front of the per-arch and + general pxe templates. +