79 lines
2.0 KiB
Go
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("Problems delete %s for image %s: %s", imageFile, name, errImg)
|
|
}
|
|
if errGz != nil {
|
|
return fmt.Errorf("Problems delete %s for image %s: %s", imageFile+".gz", name, errGz)
|
|
}
|
|
return nil
|
|
}
|
|
return fmt.Errorf("Image %s of image %s doesn't exist", imageFile, name)
|
|
}
|