Files
warewulf/internal/pkg/image/delete.go
Jonathon Anderson c2cfe513d7 Remove remaining gRPC references with additional tests
Signed-off-by: Jonathon Anderson <janderson@ciq.com>
2026-03-23 06:54:44 -06:00

79 lines
2.0 KiB
Go

package image
import (
"fmt"
"os"
"github.com/warewulf/warewulf/internal/pkg/node"
"github.com/warewulf/warewulf/internal/pkg/util"
"github.com/warewulf/warewulf/internal/pkg/wwlog"
)
func Delete(name string) error {
// validate image names
if !ValidSource(name) {
return fmt.Errorf("image name is not valid source: %s", name)
}
nodeDB, err := node.New()
if err != nil {
return fmt.Errorf("could not open nodeDB: %s", err)
}
// check if the deleted images are not used by nodes
for nodeName, node := range nodeDB.Nodes {
if node.ImageName == name {
return fmt.Errorf("image %s is in use by node %s, cannot delete", node.ImageName, nodeName)
}
}
// check if the deleted images are not used by profiles
for profileName, profile := range nodeDB.NodeProfiles {
if profile.ImageName == name {
return fmt.Errorf("image %s is in use by profile %s, cannot delete", profile.ImageName, profileName)
}
}
// delete images
if err := DeleteSource(name); err != nil {
return fmt.Errorf("could not remove image source %s: %w", name, err)
}
if err := DeleteImage(name); err != nil {
return fmt.Errorf("could not remove image file %s: %w", name, err)
}
wwlog.Info("Deleted image %q", name)
return nil
}
/*
Delete the chroot of an image
*/
func DeleteSource(name string) error {
fullPath := SourceDir(name)
wwlog.Verbose("Removing path: %s", fullPath)
return os.RemoveAll(fullPath)
}
/*
Delete the image of an image
*/
func DeleteImage(name string) error {
imageFile := ImageFile(name)
if util.IsFile(imageFile) {
wwlog.Verbose("removing %s for image %s", imageFile, name)
errImg := os.Remove(imageFile)
wwlog.Verbose("removing %s for image %s", imageFile+".gz", name)
errGz := os.Remove(imageFile + ".gz")
if errImg != nil {
return fmt.Errorf("problem deleting %s for image %s: %s", imageFile, name, errImg)
}
if errGz != nil {
return fmt.Errorf("problem deleting %s for image %s: %s", imageFile+".gz", name, errGz)
}
return nil
}
return fmt.Errorf("image %s of image %s doesn't exist", imageFile, name)
}