From dd2d256179403a5ebcc2101a2b988f0443520e18 Mon Sep 17 00:00:00 2001 From: Jonathon Anderson Date: Mon, 24 Mar 2025 18:50:43 -0600 Subject: [PATCH] wwctl upgrade nodes --replace-overlays avoids applying overlays multiple times - Closes: #1823 Signed-off-by: Jonathon Anderson --- CHANGELOG.md | 1 + internal/pkg/upgrade/node.go | 32 +++-------- internal/pkg/upgrade/node_test.go | 95 ++++++++++++++++++++++++++++++- internal/pkg/upgrade/slices.go | 23 ++++++++ 4 files changed, 126 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fcbaeec6..93ebd987 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Fix processing of UNDEF and UNSET during `wwctl set`. #1837 - Actually cause grub to sleep and reboot when log messages indiacte. #1838 - Fixed issue with importing new nodes from yaml. #1842 +- `wwctl upgrade nodes --replace-overlays` avoids applying overlays multiple times. #1823 ### Changed diff --git a/internal/pkg/upgrade/node.go b/internal/pkg/upgrade/node.go index 353856c5..d071d451 100644 --- a/internal/pkg/upgrade/node.go +++ b/internal/pkg/upgrade/node.go @@ -329,18 +329,10 @@ func (legacy *Node) Upgrade(addDefaults bool, replaceOverlays bool) (upgraded *n } } if replaceOverlays { - if indexOf(upgraded.SystemOverlay, "wwinit") != -1 { - upgraded.SystemOverlay = replaceSliceElement( - upgraded.SystemOverlay, - indexOf(upgraded.SystemOverlay, "wwinit"), - wwinitSplitOverlays) - } - if indexOf(upgraded.RuntimeOverlay, "generic") != -1 { - upgraded.RuntimeOverlay = replaceSliceElement( - upgraded.RuntimeOverlay, - indexOf(upgraded.RuntimeOverlay, "generic"), - genericSplitOverlays) - } + upgraded.SystemOverlay = replaceOverlay( + upgraded.SystemOverlay, "wwinit", wwinitSplitOverlays) + upgraded.RuntimeOverlay = replaceOverlay( + upgraded.RuntimeOverlay, "generic", genericSplitOverlays) } if legacy.Resources != nil { for key, value := range legacy.Resources { @@ -535,18 +527,10 @@ func (legacy *Profile) Upgrade(addDefaults bool, replaceOverlays bool) (upgraded } } if replaceOverlays { - if indexOf(upgraded.SystemOverlay, "wwinit") != -1 { - upgraded.SystemOverlay = replaceSliceElement( - upgraded.SystemOverlay, - indexOf(upgraded.SystemOverlay, "wwinit"), - wwinitSplitOverlays) - } - if indexOf(upgraded.RuntimeOverlay, "generic") != -1 { - upgraded.RuntimeOverlay = replaceSliceElement( - upgraded.RuntimeOverlay, - indexOf(upgraded.RuntimeOverlay, "generic"), - genericSplitOverlays) - } + upgraded.SystemOverlay = replaceOverlay( + upgraded.SystemOverlay, "wwinit", wwinitSplitOverlays) + upgraded.RuntimeOverlay = replaceOverlay( + upgraded.RuntimeOverlay, "generic", genericSplitOverlays) } if legacy.Resources != nil { for key, value := range legacy.Resources { diff --git a/internal/pkg/upgrade/node_test.go b/internal/pkg/upgrade/node_test.go index 4db27cc4..6b655af2 100644 --- a/internal/pkg/upgrade/node_test.go +++ b/internal/pkg/upgrade/node_test.go @@ -676,7 +676,7 @@ nodes: `, }, { - name: "replace overlays conflicts", + name: "replace overlays", addDefaults: false, replaceOverlays: true, legacyYaml: ` @@ -736,6 +736,99 @@ nodes: - debian.interfaces - wicked - ignition +`, + }, + { + name: "replace overlays again", + addDefaults: false, + replaceOverlays: true, + legacyYaml: ` +nodeprofiles: + default: + runtime overlay: + - hosts + - ssh.authorized_keys + - syncuser + system overlay: + - wwinit + - wwclient + - fstab + - hostname + - ssh.host_keys + - issue + - resolv + - udev.netname + - systemd.netname + - ifcfg + - NetworkManager + - debian.interfaces + - wicked + - ignition +nodes: + n1: + runtime overlay: + - hosts + - ssh.authorized_keys + - syncuser + system overlay: + - wwinit + - wwclient + - fstab + - hostname + - ssh.host_keys + - issue + - resolv + - udev.netname + - systemd.netname + - ifcfg + - NetworkManager + - debian.interfaces + - wicked + - ignition +`, + upgradedYaml: ` +nodeprofiles: + default: + runtime overlay: + - hosts + - ssh.authorized_keys + - syncuser + system overlay: + - wwinit + - wwclient + - fstab + - hostname + - ssh.host_keys + - issue + - resolv + - udev.netname + - systemd.netname + - ifcfg + - NetworkManager + - debian.interfaces + - wicked + - ignition +nodes: + n1: + runtime overlay: + - hosts + - ssh.authorized_keys + - syncuser + system overlay: + - wwinit + - wwclient + - fstab + - hostname + - ssh.host_keys + - issue + - resolv + - udev.netname + - systemd.netname + - ifcfg + - NetworkManager + - debian.interfaces + - wicked + - ignition `, }, { diff --git a/internal/pkg/upgrade/slices.go b/internal/pkg/upgrade/slices.go index 780350d3..e6bbf484 100644 --- a/internal/pkg/upgrade/slices.go +++ b/internal/pkg/upgrade/slices.go @@ -15,3 +15,26 @@ func replaceSliceElement[T any](original []T, index int, replacement []T) []T { } return append(original[:index], append(replacement, original[index+1:]...)...) } + +func replaceOverlay(originals []string, toReplace string, replacements []string) []string { + if indexOf(originals, toReplace) == -1 { + return originals + } + + lookup := make(map[string]bool) + for _, v := range originals { + lookup[v] = true + } + + var newReplacements []string + for _, v := range replacements { + if !lookup[v] || v == toReplace { + newReplacements = append(newReplacements, v) + } + } + + return replaceSliceElement( + originals, + indexOf(originals, toReplace), + newReplacements) +}