提交 b1534d5f 编写于 作者: X xiadanni

images: support specifying image in images command

isula-build images <image name>
Signed-off-by: Nxiadanni <xiadanni1@huawei.com>
上级 d7f9b8cb
......@@ -27,9 +27,16 @@ func TestImageCommand(t *testing.T) {
assert.ErrorContains(t, err, "isula_build.sock")
}
func TestImageCommandMultipleArgs(t *testing.T) {
imageCmd := NewImagesCmd()
args := []string{"aaa", "bbb"}
err := imagesCommand(imageCmd, args)
assert.ErrorContains(t, err, "requires at most one argument")
}
func TestRunList(t *testing.T) {
ctx := context.Background()
cli := newMockClient(&mockGrpcClient{})
err := runList(ctx, &cli)
err := runList(ctx, &cli, "")
assert.NilError(t, err)
}
......@@ -18,11 +18,11 @@ import (
"fmt"
"github.com/bndr/gotabulate"
"github.com/pkg/errors"
"github.com/spf13/cobra"
constant "isula.org/isula-build"
pb "isula.org/isula-build/api/services"
"isula.org/isula-build/util"
)
const (
......@@ -33,17 +33,17 @@ REPOSITORY TAG IMAGE ID CREATED
)
const (
imagesExample = `isula-build ctr-img images`
imagesExample = `isula-build ctr-img images
isula-build ctr-img images <image name>`
)
// NewImagesCmd returns images command
func NewImagesCmd() *cobra.Command {
// imagesCmd represents the "images" command
imagesCmd := &cobra.Command{
Use: "images",
Use: "images [REPOSITORY[:TAG]]",
Short: "List locally stored images",
Example: imagesExample,
Args: util.NoArgs,
RunE: imagesCommand,
}
......@@ -51,18 +51,29 @@ func NewImagesCmd() *cobra.Command {
}
func imagesCommand(c *cobra.Command, args []string) error {
if len(args) > 1 {
return errors.New("isula-build images requires at most one argument")
}
var image string
if len(args) == 0 {
image = ""
} else {
image = args[0]
}
ctx := context.TODO()
cli, err := NewClient(ctx)
if err != nil {
return err
}
return runList(ctx, cli)
return runList(ctx, cli, image)
}
func runList(ctx context.Context, cli Cli) error {
func runList(ctx context.Context, cli Cli, image string) error {
resp, err := cli.Client().List(ctx, &pb.ListRequest{
ImageName: "",
ImageName: image,
})
if err != nil {
return err
......
......@@ -23,6 +23,7 @@ import (
constant "isula.org/isula-build"
pb "isula.org/isula-build/api/services"
"isula.org/isula-build/image"
"isula.org/isula-build/store"
"isula.org/isula-build/util"
)
......@@ -37,12 +38,29 @@ func (b *Backend) List(ctx context.Context, req *pb.ListRequest) (*pb.ListRespon
"ImageName": req.GetImageName(),
}).Info("ListRequest received")
imageName := req.ImageName
reqRepository, reqTag := imageName, ""
var reqRepository, reqTag string
const minImageFieldLenWithTag = 2
parts := strings.Split(imageName, ":")
if len(parts) >= minImageFieldLenWithTag {
reqRepository, reqTag = strings.Join(parts[0:len(parts)-1], ":"), parts[len(parts)-1]
if req.ImageName != "" {
imageName := req.ImageName
_, img, err := image.FindImage(b.daemon.localStore, imageName)
if err != nil {
return nil, errors.Wrapf(err, "find local image %v error", imageName)
}
parts := strings.Split(imageName, ":")
if len(parts) >= minImageFieldLenWithTag {
reqRepository, reqTag = strings.Join(parts[0:len(parts)-1], ":"), parts[len(parts)-1]
}
imageInfo := &pb.ListResponse_ImageInfo{
Repository: reqRepository,
Tag: reqTag,
Id: img.ID,
Created: img.Created.Format(constant.LayoutTime),
Size_: getImageSize(&b.daemon.localStore, img.ID),
}
return &pb.ListResponse{Images: []*pb.ListResponse_ImageInfo{imageInfo}}, nil
}
images, err := b.daemon.localStore.Images()
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册