From a92ea1379832aba8f943ecc9f1eaaefb7855721f Mon Sep 17 00:00:00 2001 From: Julian Sommer <115516918+juliansommer@users.noreply.github.com> Date: Fri, 27 Mar 2026 11:30:39 +1000 Subject: [PATCH] fixes --- cmd/spinifex/cmd/admin.go | 2 +- scripts/reset-dev-env.sh | 1 - spinifex/services/vpcd/topology.go | 28 ++++++++++++++++++---------- spinifex/services/vpcd/vpcd.go | 6 ++++-- 4 files changed, 23 insertions(+), 14 deletions(-) diff --git a/cmd/spinifex/cmd/admin.go b/cmd/spinifex/cmd/admin.go index c08365af4..e23fd47ca 100644 --- a/cmd/spinifex/cmd/admin.go +++ b/cmd/spinifex/cmd/admin.go @@ -220,7 +220,7 @@ func init() { // External networking flags adminInitCmd.Flags().String("external-mode", "", "External network mode: 'pool' (default when WAN detected) or '' (disabled)") adminInitCmd.Flags().String("external-iface", "", "WAN NIC for br-external (auto-detected from default route)") - adminInitCmd.Flags().String("external-source", "", "Pool IP source: 'static' (default, uses --external-pool range) or 'dhcp' (from router DHCP)") + adminInitCmd.Flags().String("external-source", "dhcp", "Pool IP source: 'dhcp' (default, from router DHCP) or 'static' (uses --external-pool range)") adminInitCmd.Flags().String("external-pool", "", "External IP pool range as start-end (e.g., 192.168.1.150-192.168.1.250)") adminInitCmd.Flags().String("external-gateway", "", "WAN gateway IP (auto-detected from default route)") adminInitCmd.Flags().String("gateway-ip", "", "OVN gateway router's external IP for SNAT (default: pool range_start for pool mode, required for nat mode without DHCP)") diff --git a/scripts/reset-dev-env.sh b/scripts/reset-dev-env.sh index 621267e69..23ea6fec7 100755 --- a/scripts/reset-dev-env.sh +++ b/scripts/reset-dev-env.sh @@ -197,7 +197,6 @@ if [ -n "$WAN_IFACE" ] && [ -n "$WAN_GW" ]; then ADMIN_INIT_ARGS="$ADMIN_INIT_ARGS --external-mode=pool --external-pool=${POOL_START}-${POOL_END} --external-gateway=${WAN_GW} --external-prefix-len=${WAN_PREFIX}" fi fi -./bin/spx admin init $ADMIN_INIT_ARGS # Re-initialize with --force to regenerate credentials, certs, config, and # update ~/.aws/credentials. Must carry the same args so external networking diff --git a/spinifex/services/vpcd/topology.go b/spinifex/services/vpcd/topology.go index 047d2989e..cf045bfcd 100644 --- a/spinifex/services/vpcd/topology.go +++ b/spinifex/services/vpcd/topology.go @@ -673,12 +673,18 @@ func (h *TopologyHandler) handleIGWAttach(msg *nats.Msg) { if gip == "" { gip = pool.RangeStart // Default: first IP in range } - gatewayIP = gip - prefixLen := pool.PrefixLen - if prefixLen == 0 { - prefixLen = 24 + if gip != "" { + // Static pool: use the pool's IP for the gateway router port + gatewayIP = gip + prefixLen := pool.PrefixLen + if prefixLen == 0 { + prefixLen = 24 + } + gatewayNetwork = fmt.Sprintf("%s/%d", gip, prefixLen) } - gatewayNetwork = fmt.Sprintf("%s/%d", gip, prefixLen) + // DHCP-sourced pools have no GatewayIP/RangeStart — keep the + // link-local defaults for the OVN router port but still use the + // pool's WAN gateway for the default route. wanGateway = pool.Gateway slog.Info("vpcd: using external pool for IGW", "pool", pool.Name, @@ -1059,12 +1065,14 @@ func (h *TopologyHandler) reconcileIGW(ctx context.Context, vpcId, igwId string) if gip == "" { gip = pool.RangeStart } - gatewayIP = gip - prefixLen := pool.PrefixLen - if prefixLen == 0 { - prefixLen = 24 + if gip != "" { + gatewayIP = gip + prefixLen := pool.PrefixLen + if prefixLen == 0 { + prefixLen = 24 + } + gatewayNetwork = fmt.Sprintf("%s/%d", gip, prefixLen) } - gatewayNetwork = fmt.Sprintf("%s/%d", gip, prefixLen) wanGateway = pool.Gateway } diff --git a/spinifex/services/vpcd/vpcd.go b/spinifex/services/vpcd/vpcd.go index 9a8878e74..a37cfc374 100644 --- a/spinifex/services/vpcd/vpcd.go +++ b/spinifex/services/vpcd/vpcd.go @@ -191,10 +191,12 @@ var discoverChassis = func(sbAddr string) ([]string, error) { if sbAddr != "" { args = append(args, "--db="+sbAddr) } - args = append(args, "list-chassis") + // OVN 25.03+ removed the "list-chassis" convenience command. + // Use "--columns=name list Chassis" which works on all versions. + args = append(args, "--bare", "--columns=name", "list", "Chassis") out, err := sudoCommand("ovn-sbctl", args...).CombinedOutput() if err != nil { - return nil, fmt.Errorf("ovn-sbctl list-chassis: %s: %w", strings.TrimSpace(string(out)), err) + return nil, fmt.Errorf("ovn-sbctl list Chassis: %s: %w", strings.TrimSpace(string(out)), err) } var names []string for line := range strings.SplitSeq(strings.TrimSpace(string(out)), "\n") {