提交 d456304f 编写于 作者: X xiadanni

remove: support remove by image name

Signed-off-by: Nxiadanni <xiadanni1@huawei.com>
上级 949b153e
......@@ -32,7 +32,7 @@ type removeOptions struct {
var removeOpts removeOptions
const (
removeExample = `isula-build ctr-img rm <imageID>
removeExample = `isula-build ctr-img rm <imageID>/<image name>
isula-build ctr-img rm --prune
isula-build ctr-img rm --all`
)
......@@ -93,17 +93,17 @@ func runRemove(ctx context.Context, cli Cli, args []string) error {
func checkArgsAndOptions(args []string) error {
if len(args) > 0 {
if removeOpts.all {
return errors.New("imageID is not allowed when using --all")
return errors.New("imageID/name is not allowed when using --all")
}
if removeOpts.prune {
return errors.New("imageID is not allowed when using --prune")
return errors.New("imageID/name is not allowed when using --prune")
}
return nil
}
if !removeOpts.all && !removeOpts.prune {
return errors.New("imageID must be specified")
return errors.New("imageID/name must be specified")
}
if removeOpts.all && removeOpts.prune {
......
......@@ -41,7 +41,7 @@ func TestRunRemove(t *testing.T) {
name: "test 1",
all: false,
prune: false,
errString: "imageID must be specified",
errString: "imageID/name must be specified",
isErr: true,
},
{
......@@ -75,7 +75,7 @@ func TestRunRemove(t *testing.T) {
args: []string{"abc"},
all: false,
prune: true,
errString: "imageID is not allowed when using --prune",
errString: "imageID/name is not allowed when using --prune",
isErr: true,
},
{
......@@ -83,7 +83,7 @@ func TestRunRemove(t *testing.T) {
args: []string{"abc"},
all: true,
prune: false,
errString: "imageID is not allowed when using --all",
errString: "imageID/name is not allowed when using --all",
isErr: true,
},
{
......@@ -91,7 +91,7 @@ func TestRunRemove(t *testing.T) {
args: []string{"abc"},
all: true,
prune: true,
errString: "imageID is not allowed when using --all",
errString: "imageID/name is not allowed when using --all",
isErr: true,
},
}
......
......@@ -16,9 +16,12 @@ package daemon
import (
"fmt"
"github.com/containers/storage"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
pb "isula.org/isula-build/api/services"
"isula.org/isula-build/image"
"isula.org/isula-build/store"
)
......@@ -45,7 +48,39 @@ func (b *Backend) Remove(req *pb.RemoveRequest, stream pb.Control_RemoveServer)
}
for _, imageID := range rmImageIDs {
layers, err := s.DeleteImage(imageID, true)
_, img, err := image.FindImage(s, imageID)
if err != nil {
errMsg := fmt.Sprintf("Find local image %s error: %v", imageID, err.Error())
logrus.Error(errMsg)
if err = stream.Send(&pb.RemoveResponse{LayerMessage: errMsg}); err != nil {
return err
}
continue
}
// just untag image name if it refers to multiple tags
if len(img.Names) > 1 {
removed, uerr := untagImage(imageID, s, img)
if uerr != nil {
errMsg := fmt.Sprintf("Untag image %s error: %v", imageID, uerr.Error())
logrus.Error(errMsg)
if err = stream.Send(&pb.RemoveResponse{LayerMessage: errMsg}); err != nil {
return err
}
continue
}
if removed == true {
imageString := fmt.Sprintf("Untagged image: %v", imageID)
logrus.Debug(imageString)
if err = stream.Send(&pb.RemoveResponse{LayerMessage: imageString}); err != nil {
return err
}
continue
}
}
layers, err := s.DeleteImage(img.ID, true)
if err != nil {
// if delete failed, print out message and continue deleting the rest images
errMsg := fmt.Sprintf("Remove image %s failed: %v", imageID, err.Error())
......@@ -75,6 +110,26 @@ func (b *Backend) Remove(req *pb.RemoveRequest, stream pb.Control_RemoveServer)
return nil
}
func untagImage(imageID string, store storage.Store, image *storage.Image) (bool, error) {
newNames := make([]string, 0, 0)
removed := false
for _, imgName := range image.Names {
if imgName == imageID {
removed = true
continue
}
newNames = append(newNames, imgName)
}
if removed == true {
if err := store.SetNames(image.ID, newNames); err != nil {
return false, errors.Wrapf(err, "remove name %v from image %v error", imageID, image.ID)
}
}
return removed, nil
}
func getImageIDs(s store.Store, prune bool) ([]string, error) {
images, err := s.Images()
if err != nil {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册