summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLucas Alvares Gomes <lucasagomes@gmail.com>2015-05-12 17:53:24 +0100
committerLucas Alvares Gomes <lucasagomes@gmail.com>2015-06-04 11:58:57 +0100
commitc55b15cc0ab2ab7cbdcec25fa4d7e446912341c7 (patch)
treeb4a3531da0cdbe6dc801d71c60edf27b5fe80596
parentf5c00a2d52122219eb6cd957249c995ec1e45c9f (diff)
downloadironic-c55b15cc0ab2ab7cbdcec25fa4d7e446912341c7.tar.gz
Fix chainloading iPXE (undionly.kpxe)
This patch is making the neutron DHCP provider to explicitly check if the request is coming from iPXE before ACK'ing the PXE request with the iPXE script (When iPXE is enabled only). Also, update the documentation that explains how to configure neutron for iPXE to create the "ipxe" tag based on the DHCP user class or DHCP option 175 (as before). Conflicts: doc/source/deploy/install-guide.rst Change-Id: I60f9f515a9bd45aed6b2f6f9165a2f85259b3879 Closes-Bug: #1454332 (cherry picked from commit 4ec47b66602b4eb0b86ffd1fd69b70ef2bf16a25)
-rw-r--r--doc/source/deploy/install-guide.rst32
-rw-r--r--ironic/common/pxe_utils.py8
-rw-r--r--ironic/tests/test_pxe_utils.py2
3 files changed, 37 insertions, 5 deletions
diff --git a/doc/source/deploy/install-guide.rst b/doc/source/deploy/install-guide.rst
index 9043ad69b..5da8880ba 100644
--- a/doc/source/deploy/install-guide.rst
+++ b/doc/source/deploy/install-guide.rst
@@ -802,6 +802,38 @@ on the Bare Metal Service node(s) where ``ironic-conductor`` is running.
service ironic-conductor restart
+
+Neutron configuration
+---------------------
+
+DHCP requests from iPXE need to have a DHCP tag called ``ipxe``, in order
+for the DHCP server to tell the client to get the boot.ipxe script via
+HTTP. Otherwise, if the tag isn't there, the DHCP server will tell the
+DHCP client to chainload the iPXE image (undionly.kpxe). Neutron needs to
+be configured to create this DHCP tag, since it isn't create by default.
+
+#. Create a custom ``dnsmasq.conf`` file with a setting for the ipxe tag. For
+ example, create the file ``/etc/dnsmasq-ironic.conf`` with the content::
+
+ # Create the "ipxe" tag if request comes from iPXE user class
+ dhcp-userclass=set:ipxe,iPXE
+
+ # Alternatively, create the "ipxe" tag if request comes from DHCP option 175
+ # dhcp-match=set:ipxe,175
+
+#. In the Neutron DHCP Agent configuration file (typically located at
+ /etc/neutron/dhcp_agent.ini), set the custom ``/etc/dnsmasq-ironic.conf``
+ file as the dnsmasq configuration file::
+
+ [DEFAULT]
+ dnsmasq_config_file = /etc/dnsmasq-ironic.conf
+
+
+#. Restart the ``neutron-dhcp-agent`` process::
+
+ service neutron-dhcp-agent restart
+
+
IPMI support
------------
diff --git a/ironic/common/pxe_utils.py b/ironic/common/pxe_utils.py
index 09528a218..fdd2c0d0f 100644
--- a/ironic/common/pxe_utils.py
+++ b/ironic/common/pxe_utils.py
@@ -260,15 +260,15 @@ def dhcp_options_for_instance(task):
# to neutron "dhcp-match=set:ipxe,175" and use below option
dhcp_opts.append({'opt_name': 'tag:!ipxe,bootfile-name',
'opt_value': CONF.pxe.pxe_bootfile_name})
+ dhcp_opts.append({'opt_name': 'tag:ipxe,bootfile-name',
+ 'opt_value': ipxe_script_url})
else:
# !175 == non-iPXE.
# http://ipxe.org/howto/dhcpd#ipxe-specific_options
dhcp_opts.append({'opt_name': '!175,bootfile-name',
'opt_value': CONF.pxe.pxe_bootfile_name})
- # If the request comes from iPXE, direct it to boot from the
- # iPXE script
- dhcp_opts.append({'opt_name': 'bootfile-name',
- 'opt_value': ipxe_script_url})
+ dhcp_opts.append({'opt_name': 'bootfile-name',
+ 'opt_value': ipxe_script_url})
else:
if deploy_utils.get_boot_mode_for_deploy(task.node) == 'uefi':
boot_file = CONF.pxe.uefi_pxe_bootfile_name
diff --git a/ironic/tests/test_pxe_utils.py b/ironic/tests/test_pxe_utils.py
index 1792d840a..cca824a33 100644
--- a/ironic/tests/test_pxe_utils.py
+++ b/ironic/tests/test_pxe_utils.py
@@ -357,7 +357,7 @@ class TestPXEUtils(db_base.DbTestCase):
'opt_value': '192.0.2.1'},
{'opt_name': 'tftp-server',
'opt_value': '192.0.2.1'},
- {'opt_name': 'bootfile-name',
+ {'opt_name': 'tag:ipxe,bootfile-name',
'opt_value': expected_boot_script_url}]
with task_manager.acquire(self.context, self.node.uuid) as task:
self.assertEqual(sorted(expected_info),