Rename "container" to "image"

- Updated `wwctl upgrade` to handle updates
- Maintained `.Container` and `.ContainerName` in tstruct
- Added `ContainerName()` methods to node and profile objects
- Added `--container`, `-C` aliases to wwctl commands (`<node|profile> <add|set>`)
- Added `wwctl container` alias
- Added support for `container_exit.sh` if `image_exit.sh` is not found

Signed-off-by: Jonathon Anderson <janderson@ciq.com>
This commit is contained in:
Jonathon Anderson
2025-01-18 17:34:48 -07:00
parent 96396ed47e
commit 45a690ca4e
142 changed files with 2212 additions and 2183 deletions

View File

@@ -29,6 +29,7 @@ type WarewulfYaml struct {
TFTP *TFTPConf `yaml:"tftp"`
NFS *NFSConf `yaml:"nfs"`
SSH *SSHConf `yaml:"ssh"`
MountsImage []*MountEntry `yaml:"image mounts"`
MountsContainer []*MountEntry `yaml:"container mounts"`
Paths *BuildConfig `yaml:"paths"`
WWClient *WWClientConf `yaml:"wwclient"`
@@ -61,9 +62,14 @@ func (this *WarewulfYaml) Upgrade() (upgraded *config.WarewulfYaml) {
if this.SSH != nil {
upgraded.SSH = this.SSH.Upgrade()
}
upgraded.MountsContainer = make([]*config.MountEntry, 0)
for _, mount := range this.MountsContainer {
upgraded.MountsContainer = append(upgraded.MountsContainer, mount.Upgrade())
upgraded.MountsImage = make([]*config.MountEntry, 0)
for _, mount := range this.MountsImage {
upgraded.MountsImage = append(upgraded.MountsImage, mount.Upgrade())
}
if len(upgraded.MountsImage) == 0 {
for _, mount := range this.MountsContainer {
upgraded.MountsImage = append(upgraded.MountsImage, mount.Upgrade())
}
}
if this.Paths != nil {
upgraded.Paths = this.Paths.Upgrade()

View File

@@ -388,7 +388,7 @@ ssh:
- dsa
- ecdsa
- ed25519
container mounts:
image mounts:
- source: /etc/resolv.conf
dest: /etc/resolv.conf
readonly: true
@@ -482,7 +482,7 @@ ssh:
- dsa
- ecdsa
- ed25519
container mounts:
image mounts:
- source: /etc/resolv.conf
dest: /etc/resolv.conf
readonly: true

View File

@@ -154,7 +154,10 @@ func (this *Node) Upgrade(addDefaults bool, replaceOverlays bool) (upgraded *nod
upgraded.AssetKey = this.AssetKey
upgraded.ClusterName = this.ClusterName
upgraded.Comment = this.Comment
upgraded.ContainerName = this.ContainerName
upgraded.ImageName = this.ImageName
if upgraded.ImageName == "" {
upgraded.ImageName = this.ContainerName
}
if this.Disabled != "" {
logIgnore("Disabled", this.Disabled, "obsolete")
}
@@ -206,14 +209,14 @@ func (this *Node) Upgrade(addDefaults bool, replaceOverlays bool) (upgraded *nod
}
upgraded.Ipxe = this.Ipxe
if this.Kernel != nil {
upgraded.Kernel = this.Kernel.Upgrade(this.ContainerName)
upgraded.Kernel = this.Kernel.Upgrade(upgraded.ImageName)
} else {
inlineKernel := &KernelConf{
Args: this.KernelArgs,
Version: this.KernelVersion,
Override: this.KernelOverride,
}
upgraded.Kernel = inlineKernel.Upgrade(this.ContainerName)
upgraded.Kernel = inlineKernel.Upgrade(upgraded.ImageName)
}
if this.Keys != nil {
for key, value := range this.Keys {
@@ -298,6 +301,7 @@ type Profile struct {
AssetKey string `yaml:"asset key,omitempty"`
ClusterName string `yaml:"cluster name,omitempty"`
Comment string `yaml:"comment,omitempty"`
ImageName string `yaml:"image name,omitempty"`
ContainerName string `yaml:"container name,omitempty"`
Disabled string `yaml:"disabled,omitempty"`
Discoverable string `yaml:"discoverable,omitempty"`
@@ -342,7 +346,10 @@ func (this *Profile) Upgrade(addDefaults bool, replaceOverlays bool) (upgraded *
}
upgraded.ClusterName = this.ClusterName
upgraded.Comment = this.Comment
upgraded.ContainerName = this.ContainerName
upgraded.ImageName = this.ImageName
if upgraded.ImageName == "" {
upgraded.ImageName = this.ContainerName
}
if this.Disabled != "" {
logIgnore("Disabled", this.Disabled, "obsolete")
}
@@ -395,14 +402,14 @@ func (this *Profile) Upgrade(addDefaults bool, replaceOverlays bool) (upgraded *
}
upgraded.Ipxe = this.Ipxe
if this.Kernel != nil {
upgraded.Kernel = this.Kernel.Upgrade(this.ContainerName)
upgraded.Kernel = this.Kernel.Upgrade(upgraded.ImageName)
} else {
inlineKernel := &KernelConf{
Args: this.KernelArgs,
Version: this.KernelVersion,
Override: this.KernelOverride,
}
upgraded.Kernel = inlineKernel.Upgrade(this.ContainerName)
upgraded.Kernel = inlineKernel.Upgrade(upgraded.ImageName)
}
if this.Keys != nil {
for key, value := range this.Keys {
@@ -525,29 +532,29 @@ type KernelConf struct {
Version string `yaml:"version,omitempty"`
}
func (this *KernelConf) Upgrade(containerName string) (upgraded *node.KernelConf) {
func (this *KernelConf) Upgrade(imageName string) (upgraded *node.KernelConf) {
upgraded = new(node.KernelConf)
upgraded.Args = this.Args
kernels := kernel.FindKernels(containerName)
wwlog.Debug("referencing kernels: %v (containerName: %v)", kernels, containerName)
kernels := kernel.FindKernels(imageName)
wwlog.Debug("referencing kernels: %v (imageName: %v)", kernels, imageName)
if this.Override != "" {
if version := util.ParseVersion(legacyKernelVersion(this.Override)); version != nil {
for _, kernel_ := range kernels {
wwlog.Debug("checking if kernel '%v' version '%v' from container '%v' matches override '%v'", kernel_, kernel_.Version(), containerName, this.Override)
wwlog.Debug("checking if kernel '%v' version '%v' from image '%v' matches override '%v'", kernel_, kernel_.Version(), imageName, this.Override)
if kernel_.Version() == version.String() {
upgraded.Version = kernel_.Path
wwlog.Info("kernel override %v -> version %v (container %v)", this.Override, upgraded.Version, containerName)
wwlog.Info("kernel override %v -> version %v (image %v)", this.Override, upgraded.Version, imageName)
}
}
} else if util.IsFile((&kernel.Kernel{ContainerName: containerName, Path: this.Override}).FullPath()) {
} else if util.IsFile((&kernel.Kernel{ImageName: imageName, Path: this.Override}).FullPath()) {
upgraded.Version = this.Override
}
if upgraded.Version == "" {
containerDisplay := "unknown"
if containerName != "" {
containerDisplay = containerName
imageDisplay := "unknown"
if imageName != "" {
imageDisplay = imageName
}
wwlog.Warn("unable to resolve kernel override %v (container %v)", this.Override, containerDisplay)
wwlog.Warn("unable to resolve kernel override %v (image %v)", this.Override, imageDisplay)
}
}
if upgraded.Version == "" {

View File

@@ -688,30 +688,30 @@ nodes:
addDefaults: false,
replaceOverlays: false,
files: map[string]string{
"/srv/warewulf/kernel/mykernel/version": "1.2.3",
"/var/lib/warewulf/chroots/mycontainer/rootfs/boot/vmlinuz-1.2.3": "",
"/srv/warewulf/kernel/mykernel/version": "1.2.3",
"/var/lib/warewulf/chroots/myimage/rootfs/boot/vmlinuz-1.2.3": "",
},
legacyYaml: `
nodeprofiles:
default:
container name: mycontainer
container name: myimage
kernel:
override: mykernel
nodes:
n1:
container name: mycontainer
container name: myimage
kernel:
override: mykernel
`,
upgradedYaml: `
nodeprofiles:
default:
container name: mycontainer
image name: myimage
kernel:
version: /boot/vmlinuz-1.2.3
nodes:
n1:
container name: mycontainer
image name: myimage
kernel:
version: /boot/vmlinuz-1.2.3
`,
@@ -721,30 +721,30 @@ nodes:
addDefaults: false,
replaceOverlays: false,
files: map[string]string{
"/srv/warewulf/kernel/mykernel/version": "1.2.3",
"/var/lib/warewulf/chroots/mycontainer/rootfs/boot/vmlinuz-1.2.3": "",
"/srv/warewulf/kernel/mykernel/version": "1.2.3",
"/var/lib/warewulf/chroots/myimage/rootfs/boot/vmlinuz-1.2.3": "",
},
legacyYaml: `
nodeprofiles:
default:
container name: mycontainer
container name: myimage
kernel:
override: /boot/vmlinuz-1.2.3
nodes:
n1:
container name: mycontainer
container name: myimage
kernel:
override: /boot/vmlinuz-1.2.3
`,
upgradedYaml: `
nodeprofiles:
default:
container name: mycontainer
image name: myimage
kernel:
version: /boot/vmlinuz-1.2.3
nodes:
n1:
container name: mycontainer
image name: myimage
kernel:
version: /boot/vmlinuz-1.2.3
`,