Merge pull request #1840 from anderbubble/overlay-dups

wwctl upgrade nodes --replace-overlays avoids applying overlays multiple times
This commit is contained in:
Jonathon Anderson
2025-03-28 12:53:06 -06:00
committed by GitHub
4 changed files with 126 additions and 25 deletions

View File

@@ -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 <node|profile> 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

View File

@@ -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 {

View File

@@ -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
`,
},
{

View File

@@ -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)
}