提交 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) { ...@@ -27,9 +27,16 @@ func TestImageCommand(t *testing.T) {
assert.ErrorContains(t, err, "isula_build.sock") 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) { func TestRunList(t *testing.T) {
ctx := context.Background() ctx := context.Background()
cli := newMockClient(&mockGrpcClient{}) cli := newMockClient(&mockGrpcClient{})
err := runList(ctx, &cli) err := runList(ctx, &cli, "")
assert.NilError(t, err) assert.NilError(t, err)
} }
...@@ -18,11 +18,11 @@ import ( ...@@ -18,11 +18,11 @@ import (
"fmt" "fmt"
"github.com/bndr/gotabulate" "github.com/bndr/gotabulate"
"github.com/pkg/errors"
"github.com/spf13/cobra" "github.com/spf13/cobra"
constant "isula.org/isula-build" constant "isula.org/isula-build"
pb "isula.org/isula-build/api/services" pb "isula.org/isula-build/api/services"
"isula.org/isula-build/util"
) )
const ( const (
...@@ -33,17 +33,17 @@ REPOSITORY TAG IMAGE ID CREATED ...@@ -33,17 +33,17 @@ REPOSITORY TAG IMAGE ID CREATED
) )
const ( const (
imagesExample = `isula-build ctr-img images` imagesExample = `isula-build ctr-img images
isula-build ctr-img images <image name>`
) )
// NewImagesCmd returns images command // NewImagesCmd returns images command
func NewImagesCmd() *cobra.Command { func NewImagesCmd() *cobra.Command {
// imagesCmd represents the "images" command // imagesCmd represents the "images" command
imagesCmd := &cobra.Command{ imagesCmd := &cobra.Command{
Use: "images", Use: "images [REPOSITORY[:TAG]]",
Short: "List locally stored images", Short: "List locally stored images",
Example: imagesExample, Example: imagesExample,
Args: util.NoArgs,
RunE: imagesCommand, RunE: imagesCommand,
} }
...@@ -51,18 +51,29 @@ func NewImagesCmd() *cobra.Command { ...@@ -51,18 +51,29 @@ func NewImagesCmd() *cobra.Command {
} }
func imagesCommand(c *cobra.Command, args []string) error { 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() ctx := context.TODO()
cli, err := NewClient(ctx) cli, err := NewClient(ctx)
if err != nil { if err != nil {
return err 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{ resp, err := cli.Client().List(ctx, &pb.ListRequest{
ImageName: "", ImageName: image,
}) })
if err != nil { if err != nil {
return err return err
......
...@@ -23,6 +23,7 @@ import ( ...@@ -23,6 +23,7 @@ import (
constant "isula.org/isula-build" constant "isula.org/isula-build"
pb "isula.org/isula-build/api/services" pb "isula.org/isula-build/api/services"
"isula.org/isula-build/image"
"isula.org/isula-build/store" "isula.org/isula-build/store"
"isula.org/isula-build/util" "isula.org/isula-build/util"
) )
...@@ -37,14 +38,31 @@ func (b *Backend) List(ctx context.Context, req *pb.ListRequest) (*pb.ListRespon ...@@ -37,14 +38,31 @@ func (b *Backend) List(ctx context.Context, req *pb.ListRequest) (*pb.ListRespon
"ImageName": req.GetImageName(), "ImageName": req.GetImageName(),
}).Info("ListRequest received") }).Info("ListRequest received")
imageName := req.ImageName var reqRepository, reqTag string
reqRepository, reqTag := imageName, ""
const minImageFieldLenWithTag = 2 const minImageFieldLenWithTag = 2
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, ":") parts := strings.Split(imageName, ":")
if len(parts) >= minImageFieldLenWithTag { if len(parts) >= minImageFieldLenWithTag {
reqRepository, reqTag = strings.Join(parts[0:len(parts)-1], ":"), parts[len(parts)-1] 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() images, err := b.daemon.localStore.Images()
if err != nil { if err != nil {
return &pb.ListResponse{}, errors.Wrap(err, "failed list images from local storage") return &pb.ListResponse{}, errors.Wrap(err, "failed list images from local storage")
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册