def _dhcp_option_file_or_url(task, urlboot=False, ip_version=None): """Returns the appropriate file or URL. :param task: A TaskManager object. :param url_boot: Boolean value default False to indicate if a URL should be returned to the file as opposed to a file. :param ip_version: Integer representing the version of IP of to return options for DHCP. Possible options are 4, and 6. """ try: if task.driver.boot.ipxe_enabled: boot_file = deploy_utils.get_ipxe_boot_file(task.node) else: boot_file = deploy_utils.get_pxe_boot_file(task.node) except AttributeError: # Support boot interfaces that lack an explicit ipxe_enabled # attribute flag. boot_file = deploy_utils.get_pxe_boot_file(task.node) # NOTE(TheJulia): There are additional cases as we add new # features, so the logic below is in the form of if/elif/elif if not urlboot: return boot_file elif urlboot: if CONF.my_ipv6 and ip_version == 6: host = utils.wrap_ipv6(CONF.my_ipv6) else: host = utils.wrap_ipv6(CONF.pxe.tftp_server) return "tftp://{host}/{boot_file}".format(host=host, boot_file=boot_file)
def dhcp_options_for_instance(task): """Retrieves the DHCP PXE boot options. :param task: A TaskManager instance. """ dhcp_opts = [] boot_file = deploy_utils.get_pxe_boot_file(task.node) if CONF.pxe.ipxe_enabled: script_name = os.path.basename(CONF.pxe.ipxe_boot_script) ipxe_script_url = '/'.join([CONF.deploy.http_url, script_name]) dhcp_provider_name = dhcp_factory.CONF.dhcp.dhcp_provider # if the request comes from dumb firmware send them the iPXE # boot image. if dhcp_provider_name == 'neutron': # Neutron use dnsmasq as default DHCP agent, add extra config # to neutron "dhcp-match=set:ipxe,175" and use below option dhcp_opts.append({ 'opt_name': 'tag:!ipxe,bootfile-name', 'opt_value': boot_file }) 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': boot_file }) dhcp_opts.append({ 'opt_name': 'bootfile-name', 'opt_value': ipxe_script_url }) else: dhcp_opts.append({'opt_name': 'bootfile-name', 'opt_value': boot_file}) dhcp_opts.append({ 'opt_name': 'server-ip-address', 'opt_value': CONF.pxe.tftp_server }) dhcp_opts.append({ 'opt_name': 'tftp-server', 'opt_value': CONF.pxe.tftp_server }) # Append the IP version for all the configuration options for opt in dhcp_opts: opt.update({'ip_version': int(CONF.pxe.ip_version)}) return dhcp_opts
def dhcp_options_for_instance(task): """Retrieves the DHCP PXE boot options. :param task: A TaskManager instance. """ dhcp_opts = [] boot_file = deploy_utils.get_pxe_boot_file(task.node) if CONF.pxe.ipxe_enabled: script_name = os.path.basename(CONF.pxe.ipxe_boot_script) ipxe_script_url = '/'.join([CONF.deploy.http_url, script_name]) dhcp_provider_name = CONF.dhcp.dhcp_provider # if the request comes from dumb firmware send them the iPXE # boot image. if dhcp_provider_name == 'neutron': # Neutron use dnsmasq as default DHCP agent, add extra config # to neutron "dhcp-match=set:ipxe,175" and use below option dhcp_opts.append({'opt_name': 'tag:!ipxe,bootfile-name', 'opt_value': boot_file}) 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': boot_file}) dhcp_opts.append({'opt_name': 'bootfile-name', 'opt_value': ipxe_script_url}) else: dhcp_opts.append({'opt_name': 'bootfile-name', 'opt_value': boot_file}) # 210 == tftp server path-prefix or tftp root, will be used to find # pxelinux.cfg directory. The pxelinux.0 loader infers this information # from it's own path, but Petitboot needs it to be specified by this # option since it doesn't use pxelinux.0 loader. dhcp_opts.append({'opt_name': '210', 'opt_value': get_tftp_path_prefix()}) dhcp_opts.append({'opt_name': 'server-ip-address', 'opt_value': CONF.pxe.tftp_server}) dhcp_opts.append({'opt_name': 'tftp-server', 'opt_value': CONF.pxe.tftp_server}) # Append the IP version for all the configuration options for opt in dhcp_opts: opt.update({'ip_version': int(CONF.pxe.ip_version)}) return dhcp_opts
def dhcp_options_for_instance(task): """Retrieves the DHCP PXE boot options. :param task: A TaskManager instance. """ dhcp_opts = [] boot_file = deploy_utils.get_pxe_boot_file(task.node) if CONF.pxe.ipxe_enabled: script_name = os.path.basename(CONF.pxe.ipxe_boot_script) ipxe_script_url = '/'.join([CONF.deploy.http_url, script_name]) dhcp_provider_name = dhcp_factory.CONF.dhcp.dhcp_provider # if the request comes from dumb firmware send them the iPXE # boot image. if dhcp_provider_name == 'neutron': # Neutron use dnsmasq as default DHCP agent, add extra config # to neutron "dhcp-match=set:ipxe,175" and use below option dhcp_opts.append({'opt_name': 'tag:!ipxe,bootfile-name', 'opt_value': boot_file}) 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': boot_file}) dhcp_opts.append({'opt_name': 'bootfile-name', 'opt_value': ipxe_script_url}) else: dhcp_opts.append({'opt_name': 'bootfile-name', 'opt_value': boot_file}) # 210 == tftp server path-prefix or tftp root, will be used to find # pxelinux.cfg directory. The pxelinux.0 loader infers this information # from it's own path, but Petitboot needs it to be specified by this # option since it doesn't use pxelinux.0 loader. dhcp_opts.append({'opt_name': '210', 'opt_value': get_tftp_path_prefix()}) dhcp_opts.append({'opt_name': 'server-ip-address', 'opt_value': CONF.pxe.tftp_server}) dhcp_opts.append({'opt_name': 'tftp-server', 'opt_value': CONF.pxe.tftp_server}) # Append the IP version for all the configuration options for opt in dhcp_opts: opt.update({'ip_version': int(CONF.pxe.ip_version)}) return dhcp_opts
def _dhcp_option_file_or_url(task, urlboot=False): """Returns the appropriate file or URL. :param task: A TaskManager object. :param url_boot: Boolean value default False to indicate if a URL should be returned to the file as opposed to a file. """ boot_file = deploy_utils.get_pxe_boot_file(task.node) # NOTE(TheJulia): There are additional cases as we add new # features, so the logic below is in the form of if/elif/elif if not urlboot: return boot_file elif urlboot: host = utils.wrap_ipv6(CONF.pxe.tftp_server) return "tftp://{host}/{boot_file}".format(host=host, boot_file=boot_file)
def _dhcp_option_file_or_url(task, urlboot=False): """Returns the appropriate file or URL. :param task: A TaskManager object. :param url_boot: Boolean value default False to indicate if a URL should be returned to the file as opposed to a file. """ boot_file = deploy_utils.get_pxe_boot_file(task.node) # NOTE(TheJulia): There are additional cases as we add new # features, so the logic below is in the form of if/elif/elif if not urlboot: return boot_file elif urlboot: path_prefix = get_tftp_path_prefix() if path_prefix == '': path_prefix = '/' return ("tftp://" + CONF.pxe.tftp_server + path_prefix + boot_file)
def _dhcp_option_file_or_url(task, urlboot=False): """Returns the appropriate file or URL. :param task: A TaskManager object. :param url_boot: Boolean value default False to indicate if a URL should be returned to the file as opposed to a file. """ boot_file = deploy_utils.get_pxe_boot_file(task.node) # NOTE(TheJulia): There are additional cases as we add new # features, so the logic below is in the form of if/elif/elif if not urlboot: return boot_file elif urlboot: if netutils.is_valid_ipv6(CONF.pxe.tftp_server): host = "[%s]" % CONF.pxe.tftp_server else: host = CONF.pxe.tftp_server return "tftp://{host}/{boot_file}".format(host=host, boot_file=boot_file)
def dhcp_options_for_instance(task): """Retrieves the DHCP PXE boot options. :param task: A TaskManager instance. """ dhcp_opts = [] boot_file = deploy_utils.get_pxe_boot_file(task.node) if CONF.pxe.ipxe_enabled: script_name = os.path.basename(CONF.pxe.ipxe_boot_script) ipxe_script_url = '/'.join([CONF.deploy.http_url, script_name]) dhcp_provider_name = CONF.dhcp.dhcp_provider # if the request comes from dumb firmware send them the iPXE # boot image. if dhcp_provider_name == 'neutron': # Neutron use dnsmasq as default DHCP agent, add extra config # to neutron "dhcp-match=set:ipxe,175" and use below option dhcp_opts.append({ 'opt_name': "tag:!ipxe,%s" % DHCP_BOOTFILE_NAME, 'opt_value': boot_file }) dhcp_opts.append({ 'opt_name': "tag:ipxe,%s" % DHCP_BOOTFILE_NAME, 'opt_value': ipxe_script_url }) else: # !175 == non-iPXE. # http://ipxe.org/howto/dhcpd#ipxe-specific_options dhcp_opts.append({ 'opt_name': "!%s,%s" % (DHCP_IPXE_ENCAP_OPTS, DHCP_BOOTFILE_NAME), 'opt_value': boot_file }) dhcp_opts.append({ 'opt_name': DHCP_BOOTFILE_NAME, 'opt_value': ipxe_script_url }) else: dhcp_opts.append({ 'opt_name': DHCP_BOOTFILE_NAME, 'opt_value': boot_file }) # 210 == tftp server path-prefix or tftp root, will be used to find # pxelinux.cfg directory. The pxelinux.0 loader infers this information # from it's own path, but Petitboot needs it to be specified by this # option since it doesn't use pxelinux.0 loader. dhcp_opts.append({ 'opt_name': DHCP_TFTP_PATH_PREFIX, 'opt_value': get_tftp_path_prefix() }) dhcp_opts.append({ 'opt_name': DHCP_TFTP_SERVER_NAME, 'opt_value': CONF.pxe.tftp_server }) dhcp_opts.append({ 'opt_name': DHCP_TFTP_SERVER_ADDRESS, 'opt_value': CONF.pxe.tftp_server }) # NOTE(vsaienko) set this option specially for dnsmasq case as it always # sets `siaddr` field which is treated by pxe clients as TFTP server # see page 9 https://tools.ietf.org/html/rfc2131. # If `server-ip-address` is not provided dnsmasq sets `siaddr` to dnsmasq's # IP which breaks PXE booting as TFTP server is configured on ironic # conductor host. # http://thekelleys.org.uk/gitweb/?p=dnsmasq.git;a=blob;f=src/dhcp-common.c;h=eae9ae3567fe16eb979a484976c270396322efea;hb=a3303e196e5d304ec955c4d63afb923ade66c6e8#l572 # noqa # There is an informational RFC which describes how options related to # tftp 150,66 and siaddr should be used https://tools.ietf.org/html/rfc5859 # All dhcp servers we've tried: contrail/dnsmasq/isc just silently ignore # unknown options but potentially it may blow up with others. # Related bug was opened on Neutron side: # https://bugs.launchpad.net/neutron/+bug/1723354 dhcp_opts.append({ 'opt_name': 'server-ip-address', 'opt_value': CONF.pxe.tftp_server }) # Append the IP version for all the configuration options for opt in dhcp_opts: opt.update({'ip_version': int(CONF.pxe.ip_version)}) return dhcp_opts