diff --git a/CHANGELOG.md b/CHANGELOG.md index d4fc3acf..10cc5ebd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Properly configure a default IPMI template during `wwctl upgrade nodes --add-defaults`. - Fixed display of dotted field names. #1825 - Add single quote around escapechar in ipmitool template #1830 +- Update nodes and profiles when renaming an image. #1637 ### Changed diff --git a/internal/app/wwctl/image/rename/main_test.go b/internal/app/wwctl/image/rename/main_test.go index fe6ce724..b1e4a5cd 100644 --- a/internal/app/wwctl/image/rename/main_test.go +++ b/internal/app/wwctl/image/rename/main_test.go @@ -16,6 +16,13 @@ import ( func Test_Rename(t *testing.T) { env := testenv.New(t) env.WriteFile(path.Join(testenv.WWChrootdir, "test-image/rootfs/file"), `test`) + env.WriteFile("etc/warewulf/nodes.conf", ` +nodeprofiles: + default: + image name: test-image +nodes: + n1: + image name: test-image`) defer env.RemoveAll() warewulfd.SetNoDaemon() @@ -38,6 +45,14 @@ func Test_Rename(t *testing.T) { t.Run("Image list", func(t *testing.T) { verifyImageListOutput(t, "test-image-rename") }) + + assert.YAMLEq(t, ` +nodeprofiles: + default: + image name: test-image-rename +nodes: + n1: + image name: test-image-rename`, env.ReadFile("etc/warewulf/nodes.conf")) } func verifyImageListOutput(t *testing.T, content string) { diff --git a/internal/pkg/api/image/image.go b/internal/pkg/api/image/image.go index be9995a0..674210f3 100644 --- a/internal/pkg/api/image/image.go +++ b/internal/pkg/api/image/image.go @@ -90,18 +90,19 @@ func ImageDelete(cdp *wwapiv1.ImageDeleteParameter) (err error) { return fmt.Errorf("could not open nodeDB: %s", err) } - nodes, err := nodeDB.FindAllNodes() - if err != nil { - return - } - ARG_LOOP: for i := 0; i < len(cdp.ImageNames); i++ { //_, arg := range args { imageName := cdp.ImageNames[i] - for _, n := range nodes { + for _, n := range nodeDB.Nodes { if n.ImageName == imageName { - wwlog.Error("image is configured for nodes, skipping: %s", imageName) + wwlog.Error("image %s is in use by node %s, skipping", imageName, n.Id()) + continue ARG_LOOP + } + } + for _, p := range nodeDB.NodeProfiles { + if p.ImageName == imageName { + wwlog.Error("image %s is in use by profile %s, skipping", imageName, p.Id()) continue ARG_LOOP } } @@ -355,23 +356,17 @@ func ImageRename(crp *wwapiv1.ImageRenameParameter) (err error) { return err } - nodes, err := nodeDB.FindAllNodes() - if err != nil { - return err - } - for _, node := range nodes { + for nodeId, node := range nodeDB.Nodes { if node.ImageName == crp.ImageName { - node.ImageName = crp.TargetName + wwlog.Debug("updating node %s image to %s", nodeId, crp.TargetName) + nodeDB.Nodes[nodeId].ImageName = crp.TargetName } } - profiles, err := nodeDB.FindAllProfiles() - if err != nil { - return err - } - for _, profile := range profiles { + for profileId, profile := range nodeDB.NodeProfiles { if profile.ImageName == crp.ImageName { - profile.ImageName = crp.TargetName + wwlog.Debug("updating profile %s image to %s", profileId, crp.TargetName) + nodeDB.NodeProfiles[profileId].ImageName = crp.TargetName } }