From 218f5e4e8d2c67431008135f2b0bf860f43921b4 Mon Sep 17 00:00:00 2001 From: Bob Fournier Date: Thu, 30 Jul 2026 15:43:42 -0400 Subject: [PATCH] agent: add static networking support for ISO_NO_REGISTRY mode Add TUI automation to configure static IPs, hostnames, and DNS via nmtui for agent-based ISO_NO_REGISTRY installations. Creates a NEW NetworkManager connection (rather than editing the existing DHCP one) to ensure --copy-network is triggered by coreos-installer, preserving the static config across reboots. Co-Authored-By: Claude Opus 4.6 --- agent/06_agent_create_cluster.sh | 50 +++++- agent/common.sh | 8 + .../automate-no-registry-agent-tui-static.sh | 165 ++++++++++++++++++ agent/e2e/agent-tui/utils.sh | 12 +- config_example.sh | 8 + 5 files changed, 236 insertions(+), 7 deletions(-) create mode 100755 agent/e2e/agent-tui/automate-no-registry-agent-tui-static.sh diff --git a/agent/06_agent_create_cluster.sh b/agent/06_agent_create_cluster.sh index d44e0ce6e..ca067e54c 100755 --- a/agent/06_agent_create_cluster.sh +++ b/agent/06_agent_create_cluster.sh @@ -335,6 +335,44 @@ function automate_rendezvousIP_selection(){ done } +function automate_static_networking(){ + local node_type=$1 + local node_count=$2 + local base_ip=80 + + # Compute IP offset: masters start at 80, workers continue after masters, + # arbiters continue after workers + local offset=0 + case "$node_type" in + master) offset=0 ;; + worker) offset=$NUM_MASTERS ;; + arbiter) offset=$(( NUM_MASTERS + NUM_WORKERS )) ;; + esac + + local hostname_format + case "$node_type" in + master) hostname_format="$MASTER_HOSTNAME_FORMAT" ;; + worker) hostname_format="$WORKER_HOSTNAME_FORMAT" ;; + arbiter) hostname_format="$ARBITER_HOSTNAME_FORMAT" ;; + esac + + for (( n=0; n, +# , and at the bottom. +# +pressDown "Navigate to " 3 "$node_name" +pressEnter "Select ''" "" "$node_name" + +# +# Phase 2: Add a new Ethernet connection with static IP in nmtui +# Creating a NEW connection (rather than editing the existing one) ensures +# a new .nmconnection file is created with a birth time after agent-tui start. +# This triggers the --copy-network flag in coreos-installer, which preserves +# the static networking config into the installed system. +# +# nmtui opens with: "Edit a connection", "Activate a connection", +# "Set system hostname", "Radio" (4.16+), "Quit" +# +pressEnter "Select 'Edit a connection'" "" "$node_name" + +# Tab from connection list to button. +# Connection list is one widget; Tab goes to buttons: , , , +pressTab "Goto button" 1 "$node_name" +pressEnter "Select '' button" "" "$node_name" + +# New Connection type dialog: DSL is selected by default. +# Navigate down to Ethernet, then tab past to and confirm. +pressDown "Select Ethernet" 1 "$node_name" +pressTab "Goto button" 1 "$node_name" +pressTab "Goto button" 1 "$node_name" +pressEnter "Create new Ethernet connection" "" "$node_name" + +# Edit Connection form opens with cursor on Profile name field. +# Leave default profile name, tab to Device field and enter interface name. +pressTab "Goto Device field" 1 "$node_name" +pressKeys "Enter device name" "enp2s0" "$node_name" + +# Tab past ETHERNET , 802.1X SECURITY to IPv4 +pressTab "Goto IPv4 CONFIGURATION mode" 3 "$node_name" +pressEnter "Open IPv4 mode selector" "" "$node_name" +# Modes are: Disabled, Automatic, Link-Local, Manual +# From Automatic, Manual is two DOWNs +pressDown "Select Manual" 2 "$node_name" +pressEnter "Confirm Manual" "" "$node_name" + +# After selecting Manual, expand to reveal address fields. +# From the mode selector, is the next tab stop. +pressTab "Goto " 1 "$node_name" +pressEnter "Expand IPv4 details" "" "$node_name" + +# Tab to the Addresses field and enter the static IP. +pressTab "Goto Addresses " 1 "$node_name" +pressEnter "Activate Addresses field" "" "$node_name" +pressKeys "Enter static IP address" "${node_ip}/24" "$node_name" + +# Tab past and to Gateway field +pressTab "Goto Gateway field" 3 "$node_name" +pressKeys "Enter gateway" "192.168.111.1" "$node_name" + +# Tab to DNS servers field +pressTab "Goto DNS servers " 1 "$node_name" +pressEnter "Activate DNS servers field" "" "$node_name" +pressKeys "Enter DNS server" "192.168.111.1" "$node_name" + +# Tab to button +# From DNS servers, tab past: , , Search domains , +# Routing (No custom routes) , +# [ ] Never use this network for default route, +# [ ] Ignore automatically obtained routes, +# [ ] Ignore automatically obtained DNS parameters, +# [ ] Require IPv4 addressing for this connection, +# IPv6 CONFIGURATION , +# [X] Automatically connect, [X] Available to all users, +# , +pressTab "Goto button" 14 "$node_name" +pressEnter "Select '' button" "" "$node_name" + +# +# Phase 3: Activate the new static connection +# After OK we're back at the connection list. Go Back to main menu, +# then activate the new connection (which deactivates the old DHCP one). +# +pressTab "Goto button" 4 "$node_name" +pressEnter "Select '' button" "" "$node_name" +pressDown "Select 'Activate a connection'" 1 "$node_name" +pressEnter "Select 'Activate a connection' menu item" "" "$node_name" +# Activate a connection list layout: +# Ethernet (enp1s0) +# Wired connection 1 <- cursor starts here +# Ethernet (enp2s0) +# * Wired connection 2 <- active DHCP (DOWN 1) +# Ethernet connection 1 <- our new static (DOWN 2) +# Navigate down 2 to our new static connection and activate it. +# NM auto-deactivates the old DHCP connection on the same device. +pressDown "Select 'Ethernet connection 1'" 2 "$node_name" +pressEnter "Activate new static connection" "" "$node_name" +sleep 3 + +# +# Phase 4: Set system hostname in nmtui +# After "Activate a connection" Back, we're at the main menu. +# Menu items: "Edit a connection", "Activate a connection" (cursor here), +# "Set system hostname", "Radio" (4.16+), "Quit" +# +pressTab "Goto button" 2 "$node_name" +pressEnter "Select '' button" "" "$node_name" +pressDown "Select 'Set system hostname'" 1 "$node_name" +pressEnter "Select 'Set system hostname' menu item" "" "$node_name" + +# Clear any existing hostname and enter the new one. +# The dialog has: hostname text field, , . +# Press End to ensure cursor is at end of any existing text, +# then Ctrl+U to clear the line. +pressKey "Goto end of hostname field" KEY_END 1 "$node_name" +echo "Clear hostname field" +sudo virsh send-key "$node_name" KEY_LEFTCTRL KEY_U +sleep 1 +pressKeys "Enter hostname" "$node_hostname" "$node_name" + +# Tab past to and confirm +pressTab "Goto button" 2 "$node_name" +pressEnter "Confirm hostname" "" "$node_name" + +# +# Phase 5: Exit nmtui back to TUI first screen +# After setting hostname, we're back at the main menu on "Set system hostname". +# From here: "Radio" is 1 down, "Quit" is 2 down. +# +pressDown "Select Quit" 2 "$node_name" +pressEnter "Select 'Quit' menu item" "" "$node_name" +pressEsc "Esc from network tree view" 2 "$node_name" +sleep 3 + +# Wait for TUI checks to update after network reconfiguration +sleep 10 + +# +# Phase 6: Save rendezvous IP on the TUI first screen +# After returning from nmtui, cursor is back on the Rendezvous IP field. +# All nodes enter the same rendezvous IP. The rendezvous node recognizes +# the IP as its own; other nodes use it to find the rendezvous. +# +rendezvousIP=$(getRendezvousIP) +pressKeys "Entering rendezvous IP address" "$rendezvousIP" "$node_name" +# After typing in the text field, the first TAB is absorbed, so we need +# 2 TABs to reach : 1 absorbed + 1 to +pressTab "Goto " 2 "$node_name" +pressEnter "" "" "$node_name" +pressEnter "Save and Continue" "" "$node_name" diff --git a/agent/e2e/agent-tui/utils.sh b/agent/e2e/agent-tui/utils.sh index 960781c25..8d1d0e7a2 100644 --- a/agent/e2e/agent-tui/utils.sh +++ b/agent/e2e/agent-tui/utils.sh @@ -35,7 +35,7 @@ function pressKey() { echo "$msg" fi - local node_name=$4 + local node_name=${4:-} for i in $(seq 1 "$numReps"); do _pressKey "$keyCode" "$node_name" done @@ -46,7 +46,7 @@ function pressEnter() { } function pressTab() { - pressKey "$1" KEY_TAB "$2" + pressKey "$1" KEY_TAB "$2" "${3:-}" } function pressDown() { @@ -54,11 +54,11 @@ function pressDown() { } function pressBackspace() { - pressKey "$1" KEY_BACKSPACE "$2" + pressKey "$1" KEY_BACKSPACE "$2" "${3:-}" } function pressEsc() { - pressKey "$1" KEY_ESC "$2" + pressKey "$1" KEY_ESC "$2" "${3:-}" } function pressKeys(){ @@ -85,6 +85,10 @@ function pressKeys(){ c="DOT" elif [[ $c =~ [':'] ]]; then c="LEFTSHIFT KEY_SEMICOLON" + elif [[ $c =~ ['/'] ]]; then + c="SLASH" + elif [[ $c == '-' ]]; then + c="MINUS" fi local keyCode="KEY_"$c diff --git a/config_example.sh b/config_example.sh index f99617c35..614442838 100755 --- a/config_example.sh +++ b/config_example.sh @@ -994,6 +994,14 @@ set -x # As the size of the ISO increases in future, increase the expected ISO size accordingly. # export AGENT_OVE_ISO_SIZE=40 +# AGENT_ISO_NO_REGISTRY_STATIC_NETWORKING controls whether the ISO_NO_REGISTRY +# test configures static networking on each node via the TUI (nmtui) instead of +# using DHCP. When set to 'true', the TUI automation script will navigate nmtui +# to configure a static IP on each node before proceeding with rendezvous IP +# selection. Static IPs are assigned starting at 192.168.111.80 (rendezvous node), +# incrementing by 1 for each additional node. +# Requires: AGENT_E2E_TEST_BOOT_MODE=ISO_NO_REGISTRY +# export AGENT_ISO_NO_REGISTRY_STATIC_NETWORKING=true # Uncomment and set the following value to "true" to enable a test scenario # where the DNS is disabled on the hosts by setting its IP address to an incorrect value.