Add labels and fileters to content

Update list content command to support filters
Add label subcommand to content in dist tool to update labels
Add uncompressed label on unpack

Signed-off-by: Derek McGowan <derek@mcgstyle.net>
This commit is contained in:
Derek McGowan
2017-07-05 17:00:11 -07:00
parent 1a49f5ea79
commit fba7463ed3
14 changed files with 973 additions and 160 deletions

View File

@@ -79,14 +79,22 @@ func (s *Service) Info(ctx context.Context, req *api.InfoRequest) (*api.InfoResp
}
return &api.InfoResponse{
Info: api.Info{
Digest: bi.Digest,
Size_: bi.Size,
CommittedAt: bi.CommittedAt,
},
Info: infoToGRPC(bi),
}, nil
}
func (s *Service) Update(ctx context.Context, req *api.UpdateRequest) (*empty.Empty, error) {
if err := req.Info.Digest.Validate(); err != nil {
return nil, grpc.Errorf(codes.InvalidArgument, "%q failed validation", req.Info.Digest)
}
if err := s.store.Update(ctx, infoFromGRPC(req.Info), req.UpdateMask.GetPaths()...); err != nil {
return nil, errdefs.ToGRPC(err)
}
return &empty.Empty{}, nil
}
func (s *Service) List(req *api.ListContentRequest, session api.Content_ListServer) error {
var (
buffer []api.Info
@@ -103,6 +111,7 @@ func (s *Service) List(req *api.ListContentRequest, session api.Content_ListServ
Digest: info.Digest,
Size_: info.Size,
CommittedAt: info.CommittedAt,
Labels: info.Labels,
})
if len(buffer) >= 100 {
@@ -114,7 +123,7 @@ func (s *Service) List(req *api.ListContentRequest, session api.Content_ListServ
}
return nil
}); err != nil {
}, req.Filters...); err != nil {
return err
}

View File

@@ -7,6 +7,7 @@ import (
contentapi "github.com/containerd/containerd/api/services/content/v1"
"github.com/containerd/containerd/content"
"github.com/containerd/containerd/errdefs"
protobuftypes "github.com/gogo/protobuf/types"
digest "github.com/opencontainers/go-digest"
)
@@ -28,15 +29,13 @@ func (rs *remoteStore) Info(ctx context.Context, dgst digest.Digest) (content.In
return content.Info{}, errdefs.FromGRPC(err)
}
return content.Info{
Digest: resp.Info.Digest,
Size: resp.Info.Size_,
CommittedAt: resp.Info.CommittedAt,
}, nil
return infoFromGRPC(resp.Info), nil
}
func (rs *remoteStore) Walk(ctx context.Context, fn content.WalkFunc) error {
session, err := rs.client.List(ctx, &contentapi.ListContentRequest{})
func (rs *remoteStore) Walk(ctx context.Context, fn content.WalkFunc, filters ...string) error {
session, err := rs.client.List(ctx, &contentapi.ListContentRequest{
Filters: filters,
})
if err != nil {
return errdefs.FromGRPC(err)
}
@@ -52,11 +51,7 @@ func (rs *remoteStore) Walk(ctx context.Context, fn content.WalkFunc) error {
}
for _, info := range msg.Info {
if err := fn(content.Info{
Digest: info.Digest,
Size: info.Size_,
CommittedAt: info.CommittedAt,
}); err != nil {
if err := fn(infoFromGRPC(info)); err != nil {
return err
}
}
@@ -113,6 +108,18 @@ func (rs *remoteStore) Status(ctx context.Context, ref string) (content.Status,
}, nil
}
func (rs *remoteStore) Update(ctx context.Context, info content.Info, fieldpaths ...string) error {
if _, err := rs.client.Update(ctx, &contentapi.UpdateRequest{
Info: infoToGRPC(info),
UpdateMask: &protobuftypes.FieldMask{
Paths: fieldpaths,
},
}); err != nil {
return errdefs.FromGRPC(err)
}
return nil
}
func (rs *remoteStore) ListStatuses(ctx context.Context, filters ...string) ([]content.Status, error) {
resp, err := rs.client.ListStatuses(ctx, &contentapi.ListStatusesRequest{
Filters: filters,
@@ -182,3 +189,23 @@ func (rs *remoteStore) negotiate(ctx context.Context, ref string, size int64, ex
return wrclient, resp.Offset, nil
}
func infoToGRPC(info content.Info) contentapi.Info {
return contentapi.Info{
Digest: info.Digest,
Size_: info.Size,
CommittedAt: info.CommittedAt,
UpdatedAt: info.UpdatedAt,
Labels: info.Labels,
}
}
func infoFromGRPC(info contentapi.Info) content.Info {
return content.Info{
Digest: info.Digest,
Size: info.Size_,
CommittedAt: info.CommittedAt,
UpdatedAt: info.UpdatedAt,
Labels: info.Labels,
}
}