From 550c4e0753963d347f5e475e4e7b11555e4b96bd Mon Sep 17 00:00:00 2001 From: Armstrong Liu Date: Mon, 15 Mar 2021 15:58:40 +0800 Subject: [PATCH] update grub2 file name Some higher versions of grub2 (e.g. 2.05 or 2.06-rc1) use grub.cfg-01-MAC, while another lower versions of grub2 (e.g. 2.04) use MAC.conf, so we generate both paths in order to be compatible with both. For more information we can see: https://docs.oracle.com/en/operating-systems/oracle-linux/7/install/ol7-install-prepare.html#ol7-install-pxe-boot-uefi Change-Id: Icbdd284de38b8e54c52cdbba709bba0e644c35cd Signed-off-by: Armstrong Liu (cherry picked from commit 8f474bfe598849d0dfffb4ede11057f0411dde3c) --- ironic/common/pxe_utils.py | 14 +++++--- ironic/tests/unit/common/test_pxe_utils.py | 32 +++++++++++++++++++ ...ub2-config-file-name-88e689a982a21684.yaml | 7 ++++ 3 files changed, 48 insertions(+), 5 deletions(-) create mode 100644 releasenotes/notes/fix-grub2-config-file-name-88e689a982a21684.yaml diff --git a/ironic/common/pxe_utils.py b/ironic/common/pxe_utils.py index 2a78f0c3db..bb2e40c829 100644 --- a/ironic/common/pxe_utils.py +++ b/ironic/common/pxe_utils.py @@ -112,8 +112,9 @@ def _link_mac_pxe_configs(task, ipxe_enabled=False): create_link(_get_pxe_mac_path(port.address, client_id=client_id, ipxe_enabled=ipxe_enabled)) # Grub2 MAC address only - create_link(_get_pxe_grub_mac_path(port.address, - ipxe_enabled=ipxe_enabled)) + for path in _get_pxe_grub_mac_path(port.address, + ipxe_enabled=ipxe_enabled): + create_link(path) def _link_ip_address_pxe_configs(task, ipxe_enabled=False): @@ -156,7 +157,9 @@ def _link_ip_address_pxe_configs(task, ipxe_enabled=False): def _get_pxe_grub_mac_path(mac, ipxe_enabled=False): root_dir = get_ipxe_root_dir() if ipxe_enabled else get_root_dir() - return os.path.join(root_dir, mac + '.conf') + yield os.path.join(root_dir, "%s-%s-%s" % + ("grub.cfg", "01", mac.replace(':', "-").lower())) + yield os.path.join(root_dir, mac + '.conf') def _get_pxe_mac_path(mac, delimiter='-', client_id=None, @@ -364,8 +367,9 @@ def clean_up_pxe_config(task, ipxe_enabled=False): _get_pxe_mac_path(port.address, client_id=client_id, ipxe_enabled=ipxe_enabled)) # Grub2 MAC address based confiuration - ironic_utils.unlink_without_raise( - _get_pxe_grub_mac_path(port.address, ipxe_enabled=ipxe_enabled)) + for path in _get_pxe_grub_mac_path(port.address, + ipxe_enabled=ipxe_enabled): + ironic_utils.unlink_without_raise(path) if ipxe_enabled: utils.rmtree_without_raise(os.path.join(get_ipxe_root_dir(), task.node.uuid)) diff --git a/ironic/tests/unit/common/test_pxe_utils.py b/ironic/tests/unit/common/test_pxe_utils.py index c5be259b17..74951b446d 100644 --- a/ironic/tests/unit/common/test_pxe_utils.py +++ b/ironic/tests/unit/common/test_pxe_utils.py @@ -273,17 +273,23 @@ class TestPXEUtils(db_base.DbTestCase): create_link_calls = [ mock.call(u'../1be26c0b-03f2-4d2e-ae87-c02d7f33c123/config', '/tftpboot/pxelinux.cfg/01-11-22-33-44-55-66'), + mock.call(u'1be26c0b-03f2-4d2e-ae87-c02d7f33c123/config', + '/tftpboot/grub.cfg-01-11-22-33-44-55-66'), mock.call(u'1be26c0b-03f2-4d2e-ae87-c02d7f33c123/config', '/tftpboot/11:22:33:44:55:66.conf'), mock.call(u'../1be26c0b-03f2-4d2e-ae87-c02d7f33c123/config', '/tftpboot/pxelinux.cfg/01-11-22-33-44-55-67'), + mock.call(u'1be26c0b-03f2-4d2e-ae87-c02d7f33c123/config', + '/tftpboot/grub.cfg-01-11-22-33-44-55-67'), mock.call(u'1be26c0b-03f2-4d2e-ae87-c02d7f33c123/config', '/tftpboot/11:22:33:44:55:67.conf') ] unlink_calls = [ mock.call('/tftpboot/pxelinux.cfg/01-11-22-33-44-55-66'), + mock.call('/tftpboot/grub.cfg-01-11-22-33-44-55-66'), mock.call('/tftpboot/11:22:33:44:55:66.conf'), mock.call('/tftpboot/pxelinux.cfg/01-11-22-33-44-55-67'), + mock.call('/tftpboot/grub.cfg-01-11-22-33-44-55-67'), mock.call('/tftpboot/11:22:33:44:55:67.conf') ] with task_manager.acquire(self.context, self.node.uuid) as task: @@ -312,17 +318,23 @@ class TestPXEUtils(db_base.DbTestCase): create_link_calls = [ mock.call(u'../1be26c0b-03f2-4d2e-ae87-c02d7f33c123/config', '/tftpboot/pxelinux.cfg/20-11-22-33-44-55-66'), + mock.call(u'1be26c0b-03f2-4d2e-ae87-c02d7f33c123/config', + '/tftpboot/grub.cfg-01-11-22-33-44-55-66'), mock.call(u'1be26c0b-03f2-4d2e-ae87-c02d7f33c123/config', '/tftpboot/11:22:33:44:55:66.conf'), mock.call(u'../1be26c0b-03f2-4d2e-ae87-c02d7f33c123/config', '/tftpboot/pxelinux.cfg/20-11-22-33-44-55-67'), + mock.call(u'1be26c0b-03f2-4d2e-ae87-c02d7f33c123/config', + '/tftpboot/grub.cfg-01-11-22-33-44-55-67'), mock.call(u'1be26c0b-03f2-4d2e-ae87-c02d7f33c123/config', '/tftpboot/11:22:33:44:55:67.conf') ] unlink_calls = [ mock.call('/tftpboot/pxelinux.cfg/20-11-22-33-44-55-66'), + mock.call('/tftpboot/grub.cfg-01-11-22-33-44-55-66'), mock.call('/tftpboot/11:22:33:44:55:66.conf'), mock.call('/tftpboot/pxelinux.cfg/20-11-22-33-44-55-67'), + mock.call('/tftpboot/grub.cfg-01-11-22-33-44-55-67'), mock.call('/tftpboot/11:22:33:44:55:67.conf') ] with task_manager.acquire(self.context, self.node.uuid) as task: @@ -344,17 +356,23 @@ class TestPXEUtils(db_base.DbTestCase): create_link_calls = [ mock.call(u'../1be26c0b-03f2-4d2e-ae87-c02d7f33c123/config', '/httpboot/pxelinux.cfg/11-22-33-44-55-66'), + mock.call(u'1be26c0b-03f2-4d2e-ae87-c02d7f33c123/config', + '/httpboot/grub.cfg-01-11-22-33-44-55-66'), mock.call(u'1be26c0b-03f2-4d2e-ae87-c02d7f33c123/config', '/httpboot/11:22:33:44:55:66.conf'), mock.call(u'../1be26c0b-03f2-4d2e-ae87-c02d7f33c123/config', '/httpboot/pxelinux.cfg/11-22-33-44-55-67'), + mock.call(u'1be26c0b-03f2-4d2e-ae87-c02d7f33c123/config', + '/httpboot/grub.cfg-01-11-22-33-44-55-67'), mock.call(u'1be26c0b-03f2-4d2e-ae87-c02d7f33c123/config', '/httpboot/11:22:33:44:55:67.conf') ] unlink_calls = [ mock.call('/httpboot/pxelinux.cfg/11-22-33-44-55-66'), + mock.call('/httpboot/grub.cfg-01-11-22-33-44-55-66'), mock.call('/httpboot/11:22:33:44:55:66.conf'), mock.call('/httpboot/pxelinux.cfg/11-22-33-44-55-67'), + mock.call('/httpboot/grub.cfg-01-11-22-33-44-55-67'), mock.call('/httpboot/11:22:33:44:55:67.conf'), ] with task_manager.acquire(self.context, self.node.uuid) as task: @@ -595,6 +613,7 @@ class TestPXEUtils(db_base.DbTestCase): ensure_calls = [ mock.call("/tftpboot/pxelinux.cfg/01-%s" % address.replace(':', '-')), + mock.call("/tftpboot/grub.cfg-01-aa-aa-aa-aa-aa-aa"), mock.call("/tftpboot/%s.conf" % address) ] @@ -796,6 +815,7 @@ class TestPXEUtils(db_base.DbTestCase): unlink_calls = [ mock.call('/tftpboot/10.10.0.1.conf'), mock.call('/tftpboot/pxelinux.cfg/01-aa-aa-aa-aa-aa-aa'), + mock.call('/tftpboot/grub.cfg-01-aa-aa-aa-aa-aa-aa'), mock.call('/tftpboot/' + address + '.conf') ] unlink_mock.assert_has_calls(unlink_calls) @@ -824,6 +844,7 @@ class TestPXEUtils(db_base.DbTestCase): mock.call('/tftpboot/10.10.0.1.conf'), mock.call('/tftpboot/pxelinux.cfg/01-%s' % address.replace(':', '-')), + mock.call('/tftpboot/grub.cfg-01-aa-aa-aa-aa-aa-aa'), mock.call('/tftpboot/' + address + '.conf') ] @@ -852,6 +873,7 @@ class TestPXEUtils(db_base.DbTestCase): unlink_calls = [ mock.call('/tftpboot/10.10.0.1.conf'), mock.call('/tftpboot/pxelinux.cfg/01-aa-aa-aa-aa-aa-aa'), + mock.call('/tftpboot/grub.cfg-01-aa-aa-aa-aa-aa-aa'), mock.call('/tftpboot/' + address + ".conf") ] unlink_mock.assert_has_calls(unlink_calls) @@ -901,12 +923,21 @@ class TestPXEUtils(db_base.DbTestCase): unlink_calls = [ mock.call('/tftpboot/pxelinux.cfg/01-%s' % address.replace(':', '-')), + mock.call('/tftpboot/grub.cfg-01-aa-aa-aa-aa-aa-aa'), mock.call('/tftpboot/aa:aa:aa:aa:aa:aa.conf') ] unlink_mock.assert_has_calls(unlink_calls) rmtree_mock.assert_called_once_with( os.path.join(CONF.pxe.tftp_root, self.node.uuid)) + def test__get_pxe_grub_mac_path(self): + self.config(tftp_root='/tftpboot-path/', group='pxe') + address = "aa:aa:aa:aa:aa:aa" + actual = pxe_utils._get_pxe_grub_mac_path(address) + self.assertEqual('/tftpboot-path/grub.cfg-01-aa-aa-aa-aa-aa-aa', + next(actual)) + self.assertEqual('/tftpboot-path/' + address + '.conf', next(actual)) + @mock.patch.object(ipxe.iPXEBoot, '__init__', lambda self: None) @mock.patch.object(pxe.PXEBoot, '__init__', lambda self: None) @@ -1820,6 +1851,7 @@ class iPXEBuildConfigOptionsTestCase(db_base.DbTestCase): ensure_calls = [ mock.call("/httpboot/pxelinux.cfg/%s" % address.replace(':', '-')), + mock.call("/httpboot/grub.cfg-01-aa-aa-aa-aa-aa-aa"), mock.call("/httpboot/%s.conf" % address) ] diff --git a/releasenotes/notes/fix-grub2-config-file-name-88e689a982a21684.yaml b/releasenotes/notes/fix-grub2-config-file-name-88e689a982a21684.yaml new file mode 100644 index 0000000000..df17585d1d --- /dev/null +++ b/releasenotes/notes/fix-grub2-config-file-name-88e689a982a21684.yaml @@ -0,0 +1,7 @@ +--- +fixes: + - | + Fixes the problem about grub2 config file. Some higher versions of + grub2 (e.g. 2.05 or 2.06-rc1) use grub.cfg-01-MAC, while another + lower versions of grub2 (e.g. 2.04) use MAC.conf, so we generate + both paths in order to be compatible with both.