Skip to content

Commit 0e5055f

Browse files
committed
Fix IPv6 URL formatting in init scripts
The init scripts for ironic conductor and inspector need to detect IPv6 and format the http and tftp URL's accordingly. Fixes: OSPRH-20483
1 parent 9695d21 commit 0e5055f

File tree

4 files changed

+67
-5
lines changed

4 files changed

+67
-5
lines changed

templates/ironicconductor/bin/init.sh

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,28 @@ if [ -n "${ProvisionNetwork}" ]; then
3333
fi
3434

3535

36-
export DEPLOY_HTTP_URL=$(python3 -c 'import os; print(os.environ["DeployHTTPURL"] % os.environ)')
36+
export DEPLOY_HTTP_URL=$(python3 -c '
37+
import os
38+
import ipaddress
39+
40+
# Get the IP address
41+
ip_str = os.environ.get("ProvisionNetworkIP", "")
42+
43+
# Check if it is an IPv6 address and format accordingly
44+
try:
45+
ip = ipaddress.ip_address(ip_str)
46+
if isinstance(ip, ipaddress.IPv6Address):
47+
# For IPv6, we need to wrap the IP in brackets for URL formatting
48+
formatted_env = dict(os.environ)
49+
formatted_env["ProvisionNetworkIP"] = f"[{ip_str}]"
50+
print(os.environ["DeployHTTPURL"] % formatted_env)
51+
else:
52+
# For IPv4, use as-is
53+
print(os.environ["DeployHTTPURL"] % os.environ)
54+
except ValueError:
55+
# If IP parsing fails, use as-is (fallback)
56+
print(os.environ["DeployHTTPURL"] % os.environ)
57+
')
3758

3859
crudini --set ${INIT_CONFIG} deploy http_url ${DEPLOY_HTTP_URL}
3960
crudini --set ${INIT_CONFIG} conductor bootloader ${DEPLOY_HTTP_URL}esp.img

templates/ironicinspector/bin/inspector-pxe-init.sh

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,48 @@ export PODINDEX=$(echo ${HOSTNAME##*-})
2020

2121
# DHCP server configuration
2222
export InspectorNetworkIP=$(/usr/local/bin/container-scripts/get_net_ip ${InspectionNetwork})
23-
export INSPECTOR_HTTP_URL=$(python3 -c 'import os; print(os.environ["InspectorHTTPURL"] % os.environ)')
23+
export INSPECTOR_HTTP_URL=$(python3 -c '
24+
import os
25+
import ipaddress
26+
27+
# Get the IP address
28+
ip_str = os.environ.get("InspectorNetworkIP", "")
29+
30+
# Check if it is an IPv6 address and format accordingly
31+
try:
32+
ip = ipaddress.ip_address(ip_str)
33+
if isinstance(ip, ipaddress.IPv6Address):
34+
# For IPv6, we need to wrap the IP in brackets for URL formatting
35+
formatted_env = dict(os.environ)
36+
formatted_env["InspectorNetworkIP"] = f"[{ip_str}]"
37+
print(os.environ["InspectorHTTPURL"] % formatted_env)
38+
else:
39+
# For IPv4, use as-is
40+
print(os.environ["InspectorHTTPURL"] % os.environ)
41+
except ValueError:
42+
# If IP parsing fails, use as-is (fallback)
43+
print(os.environ["InspectorHTTPURL"] % os.environ)
44+
')
45+
46+
# Export URL-formatted IP for use in config templates
47+
export InspectorNetworkIPForURL=$(python3 -c '
48+
import os
49+
import ipaddress
50+
51+
# Get the IP address
52+
ip_str = os.environ.get("InspectorNetworkIP", "")
53+
54+
# Check if it is an IPv6 address and format accordingly
55+
try:
56+
ip = ipaddress.ip_address(ip_str)
57+
if isinstance(ip, ipaddress.IPv6Address):
58+
print(f"[{ip_str}]")
59+
else:
60+
print(ip_str)
61+
except ValueError:
62+
# If IP parsing fails, use as-is (fallback)
63+
print(ip_str)
64+
')
2465

2566
# Copy required config to modifiable location
2667
cp /var/lib/config-data/default/dnsmasq.conf /var/lib/ironic/

templates/ironicinspector/config/dnsmasq.conf

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ dhcp-option=tag:ipxe6,option6:bootfile-url,${INSPECTOR_HTTP_URL}inspector.ipxe
6161

6262
# Client is PXE booting over EFI without iPXE ROM; send EFI version of iPXE chainloader
6363
dhcp-boot=tag:efi,tag:!ipxe,snponly.efi
64-
dhcp-option=tag:efi6,tag:!ipxe6,option6:bootfile-url,tftp://${InspectorNetworkIP}/snponly.efi
64+
dhcp-option=tag:efi6,tag:!ipxe6,option6:bootfile-url,tftp://${InspectorNetworkIPForURL}/snponly.efi
6565

6666
# Client is running PXE over BIOS; send BIOS version of iPXE chainloader
67-
dhcp-boot=undionly.kpxe,localhost.localdomain,${InspectorNetworkIP}
67+
dhcp-boot=undionly.kpxe,localhost.localdomain,${InspectorNetworkIPForURL}

templates/ironicinspector/config/inspector.ipxe

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22

33
:retry_boot
44
imgfree
5-
kernel --timeout 60000 ${INSPECTOR_HTTP_URL}ironic-python-agent.kernel ipa-inspection-callback-url=http://${InspectorNetworkIP}:5050/v1/continue ipa-inspection-collectors=default,extra-hardware,numa-topology,logs systemd.journald.forward_to_console=yes BOOTIF=${mac} ipa-inspection-dhcp-all-interfaces=1 ipa-collect-lldp=1 initrd=ironic-python-agent.initramfs || goto retry_boot
5+
kernel --timeout 60000 ${INSPECTOR_HTTP_URL}ironic-python-agent.kernel ipa-inspection-callback-url=http://${InspectorNetworkIPForURL}:5050/v1/continue ipa-inspection-collectors=default,extra-hardware,numa-topology,logs systemd.journald.forward_to_console=yes BOOTIF=${mac} ipa-inspection-dhcp-all-interfaces=1 ipa-collect-lldp=1 initrd=ironic-python-agent.initramfs || goto retry_boot
66
initrd --timeout 60000 ${INSPECTOR_HTTP_URL}ironic-python-agent.initramfs || goto retry_boot
77
boot

0 commit comments

Comments
 (0)