Add ContainerService.Info to get info about a single container

For clients which only want to know about one container this is simpler than
searching the result of execution.List.

Signed-off-by: Ian Campbell <ian.campbell@docker.com>
This commit is contained in:
Ian Campbell 2017-02-24 17:39:59 +00:00
parent 660783cb00
commit cc253b0f18
5 changed files with 291 additions and 57 deletions

View file

@ -14,6 +14,7 @@
StartRequest
DeleteRequest
DeleteResponse
InfoRequest
ListRequest
ListResponse
EventsRequest
@ -99,12 +100,20 @@ func (m *DeleteResponse) Reset() { *m = DeleteResponse{} }
func (*DeleteResponse) ProtoMessage() {}
func (*DeleteResponse) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{4} }
type InfoRequest struct {
ID string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
}
func (m *InfoRequest) Reset() { *m = InfoRequest{} }
func (*InfoRequest) ProtoMessage() {}
func (*InfoRequest) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{5} }
type ListRequest struct {
}
func (m *ListRequest) Reset() { *m = ListRequest{} }
func (*ListRequest) ProtoMessage() {}
func (*ListRequest) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{5} }
func (*ListRequest) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{6} }
type ListResponse struct {
Containers []*containerd_v1_types1.Container `protobuf:"bytes,1,rep,name=containers" json:"containers,omitempty"`
@ -112,14 +121,14 @@ type ListResponse struct {
func (m *ListResponse) Reset() { *m = ListResponse{} }
func (*ListResponse) ProtoMessage() {}
func (*ListResponse) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{6} }
func (*ListResponse) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{7} }
type EventsRequest struct {
}
func (m *EventsRequest) Reset() { *m = EventsRequest{} }
func (*EventsRequest) ProtoMessage() {}
func (*EventsRequest) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{7} }
func (*EventsRequest) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{8} }
func init() {
proto.RegisterType((*CreateRequest)(nil), "containerd.v1.services.CreateRequest")
@ -127,6 +136,7 @@ func init() {
proto.RegisterType((*StartRequest)(nil), "containerd.v1.services.StartRequest")
proto.RegisterType((*DeleteRequest)(nil), "containerd.v1.services.DeleteRequest")
proto.RegisterType((*DeleteResponse)(nil), "containerd.v1.services.DeleteResponse")
proto.RegisterType((*InfoRequest)(nil), "containerd.v1.services.InfoRequest")
proto.RegisterType((*ListRequest)(nil), "containerd.v1.services.ListRequest")
proto.RegisterType((*ListResponse)(nil), "containerd.v1.services.ListResponse")
proto.RegisterType((*EventsRequest)(nil), "containerd.v1.services.EventsRequest")
@ -146,6 +156,7 @@ type ContainerServiceClient interface {
Create(ctx context.Context, in *CreateRequest, opts ...grpc.CallOption) (*CreateResponse, error)
Start(ctx context.Context, in *StartRequest, opts ...grpc.CallOption) (*google_protobuf.Empty, error)
Delete(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*google_protobuf.Empty, error)
Info(ctx context.Context, in *InfoRequest, opts ...grpc.CallOption) (*containerd_v1_types1.Container, error)
List(ctx context.Context, in *ListRequest, opts ...grpc.CallOption) (*ListResponse, error)
Events(ctx context.Context, in *EventsRequest, opts ...grpc.CallOption) (ContainerService_EventsClient, error)
}
@ -185,6 +196,15 @@ func (c *containerServiceClient) Delete(ctx context.Context, in *DeleteRequest,
return out, nil
}
func (c *containerServiceClient) Info(ctx context.Context, in *InfoRequest, opts ...grpc.CallOption) (*containerd_v1_types1.Container, error) {
out := new(containerd_v1_types1.Container)
err := grpc.Invoke(ctx, "/containerd.v1.services.ContainerService/Info", in, out, c.cc, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *containerServiceClient) List(ctx context.Context, in *ListRequest, opts ...grpc.CallOption) (*ListResponse, error) {
out := new(ListResponse)
err := grpc.Invoke(ctx, "/containerd.v1.services.ContainerService/List", in, out, c.cc, opts...)
@ -232,6 +252,7 @@ type ContainerServiceServer interface {
Create(context.Context, *CreateRequest) (*CreateResponse, error)
Start(context.Context, *StartRequest) (*google_protobuf.Empty, error)
Delete(context.Context, *DeleteRequest) (*google_protobuf.Empty, error)
Info(context.Context, *InfoRequest) (*containerd_v1_types1.Container, error)
List(context.Context, *ListRequest) (*ListResponse, error)
Events(*EventsRequest, ContainerService_EventsServer) error
}
@ -294,6 +315,24 @@ func _ContainerService_Delete_Handler(srv interface{}, ctx context.Context, dec
return interceptor(ctx, in, info, handler)
}
func _ContainerService_Info_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(InfoRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(ContainerServiceServer).Info(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/containerd.v1.services.ContainerService/Info",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(ContainerServiceServer).Info(ctx, req.(*InfoRequest))
}
return interceptor(ctx, in, info, handler)
}
func _ContainerService_List_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(ListRequest)
if err := dec(in); err != nil {
@ -349,6 +388,10 @@ var _ContainerService_serviceDesc = grpc.ServiceDesc{
MethodName: "Delete",
Handler: _ContainerService_Delete_Handler,
},
{
MethodName: "Info",
Handler: _ContainerService_Info_Handler,
},
{
MethodName: "List",
Handler: _ContainerService_List_Handler,
@ -550,6 +593,30 @@ func (m *DeleteResponse) MarshalTo(dAtA []byte) (int, error) {
return i, nil
}
func (m *InfoRequest) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalTo(dAtA)
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *InfoRequest) MarshalTo(dAtA []byte) (int, error) {
var i int
_ = i
var l int
_ = l
if len(m.ID) > 0 {
dAtA[i] = 0xa
i++
i = encodeVarintExecution(dAtA, i, uint64(len(m.ID)))
i += copy(dAtA[i:], m.ID)
}
return i, nil
}
func (m *ListRequest) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
@ -728,6 +795,16 @@ func (m *DeleteResponse) Size() (n int) {
return n
}
func (m *InfoRequest) Size() (n int) {
var l int
_ = l
l = len(m.ID)
if l > 0 {
n += 1 + l + sovExecution(uint64(l))
}
return n
}
func (m *ListRequest) Size() (n int) {
var l int
_ = l
@ -824,6 +901,16 @@ func (this *DeleteResponse) String() string {
}, "")
return s
}
func (this *InfoRequest) String() string {
if this == nil {
return "nil"
}
s := strings.Join([]string{`&InfoRequest{`,
`ID:` + fmt.Sprintf("%v", this.ID) + `,`,
`}`,
}, "")
return s
}
func (this *ListRequest) String() string {
if this == nil {
return "nil"
@ -1493,6 +1580,85 @@ func (m *DeleteResponse) Unmarshal(dAtA []byte) error {
}
return nil
}
func (m *InfoRequest) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowExecution
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: InfoRequest: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: InfoRequest: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowExecution
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthExecution
}
postIndex := iNdEx + intStringLen
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.ID = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipExecution(dAtA[iNdEx:])
if err != nil {
return err
}
if skippy < 0 {
return ErrInvalidLengthExecution
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *ListRequest) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
@ -1784,41 +1950,42 @@ func init() {
}
var fileDescriptorExecution = []byte{
// 569 bytes of a gzipped FileDescriptorProto
// 589 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x53, 0x4d, 0x6f, 0xd3, 0x40,
0x10, 0xad, 0x93, 0xd6, 0x0d, 0x93, 0xa6, 0x54, 0xab, 0x28, 0x32, 0x46, 0x72, 0x23, 0x53, 0x4a,
0x4e, 0x36, 0x84, 0x0b, 0xe2, 0x80, 0xa0, 0x69, 0x84, 0x2a, 0x51, 0x24, 0x9c, 0x03, 0x47, 0xe4,
0xd8, 0xd3, 0xb0, 0x22, 0xf1, 0x9a, 0xdd, 0x75, 0xd4, 0xdc, 0xe0, 0x87, 0xf0, 0x7f, 0x7a, 0xe4,
0xc8, 0x09, 0xd1, 0xfc, 0x12, 0xe4, 0xb5, 0x9d, 0x0f, 0x88, 0x09, 0x17, 0x6b, 0xe6, 0xf9, 0xcd,
0xf8, 0xcd, 0x1b, 0x0f, 0xf4, 0x46, 0x54, 0x7e, 0x4c, 0x86, 0x4e, 0xc0, 0x26, 0x6e, 0xc8, 0x82,
0x4f, 0xc8, 0xdd, 0x80, 0x45, 0xd2, 0xa7, 0x11, 0xf2, 0xd0, 0xf5, 0x63, 0xea, 0x0a, 0xe4, 0x53,
0x1a, 0xa0, 0x70, 0xf1, 0x1a, 0x83, 0x44, 0x52, 0x16, 0x2d, 0x23, 0x27, 0xe6, 0x4c, 0x32, 0xd2,
0x5a, 0x96, 0x38, 0xd3, 0x27, 0x4e, 0x51, 0x61, 0xde, 0x1f, 0x31, 0x36, 0x1a, 0xa3, 0xab, 0x58,
0xc3, 0xe4, 0xca, 0xc5, 0x49, 0x2c, 0x67, 0x59, 0x91, 0x79, 0xef, 0xcf, 0x97, 0x7e, 0x54, 0xbc,
0x6a, 0x8e, 0xd8, 0x88, 0xa9, 0xd0, 0x4d, 0xa3, 0x1c, 0x7d, 0xb6, 0x55, 0xaa, 0x9c, 0xc5, 0x28,
0xdc, 0x09, 0x4b, 0x22, 0x99, 0x3d, 0xf3, 0xca, 0x97, 0xff, 0x59, 0xb9, 0x00, 0x97, 0x51, 0xd6,
0xc1, 0xfe, 0x5a, 0x81, 0x46, 0x8f, 0xa3, 0x2f, 0xd1, 0xc3, 0xcf, 0x09, 0x0a, 0x49, 0x5a, 0x50,
0xa1, 0xa1, 0xa1, 0xb5, 0xb5, 0xce, 0x9d, 0x33, 0x7d, 0xfe, 0xf3, 0xb8, 0x72, 0x71, 0xee, 0x55,
0x68, 0x48, 0x3a, 0xb0, 0x2b, 0x62, 0x0c, 0x8c, 0x4a, 0x5b, 0xeb, 0xd4, 0xbb, 0x4d, 0x27, 0x9b,
0xd2, 0x29, 0xa6, 0x74, 0x5e, 0x45, 0x33, 0x4f, 0x31, 0x48, 0x17, 0x74, 0xce, 0x98, 0xbc, 0x12,
0x46, 0xb5, 0x5d, 0xed, 0xd4, 0xbb, 0xa6, 0xb3, 0x6e, 0xa3, 0xd2, 0xe4, 0x5c, 0xa6, 0x73, 0x78,
0x39, 0x93, 0x18, 0xb0, 0xcf, 0x93, 0x48, 0xd2, 0x09, 0x1a, 0xbb, 0xe9, 0xa7, 0xbd, 0x22, 0x25,
0x4d, 0xd8, 0x13, 0x32, 0xa4, 0x91, 0xb1, 0xa7, 0xf0, 0x2c, 0x21, 0x2d, 0xd0, 0x85, 0x0c, 0x59,
0x22, 0x0d, 0x5d, 0xc1, 0x79, 0x96, 0xe3, 0xc8, 0xb9, 0xb1, 0xbf, 0xc0, 0x91, 0x73, 0x62, 0x42,
0x4d, 0x22, 0x9f, 0xd0, 0xc8, 0x1f, 0x1b, 0xb5, 0xb6, 0xd6, 0xa9, 0x79, 0x8b, 0xdc, 0x7e, 0x0e,
0x87, 0x85, 0x05, 0x22, 0x66, 0x91, 0xc0, 0x52, 0x0f, 0x8e, 0xa0, 0x1a, 0xd3, 0x50, 0x59, 0xd0,
0xf0, 0xd2, 0xd0, 0x3e, 0x85, 0x83, 0x81, 0xf4, 0xb9, 0xdc, 0xe2, 0x9e, 0xfd, 0x08, 0x1a, 0xe7,
0x38, 0xc6, 0xad, 0x36, 0xdb, 0x17, 0x70, 0x58, 0x10, 0xb7, 0x88, 0x39, 0x86, 0x3a, 0x5e, 0x53,
0xf9, 0x41, 0x48, 0x5f, 0x26, 0x22, 0x17, 0x05, 0x29, 0x34, 0x50, 0x88, 0xdd, 0x80, 0xfa, 0x1b,
0x2a, 0x0a, 0x69, 0xf6, 0x5b, 0x38, 0xc8, 0xd2, 0xbc, 0xef, 0x0b, 0x80, 0xc5, 0x5e, 0x84, 0xa1,
0xa9, 0x55, 0x59, 0x1b, 0x57, 0xd5, 0x2b, 0x30, 0x6f, 0xa5, 0xc2, 0xbe, 0x0b, 0x8d, 0xfe, 0x14,
0x23, 0x29, 0xf2, 0x0f, 0x74, 0xbf, 0x55, 0xe1, 0x68, 0x41, 0x1d, 0x64, 0xb7, 0x42, 0xde, 0x83,
0x9e, 0x99, 0x4b, 0x1e, 0x3a, 0x9b, 0xaf, 0xc9, 0x59, 0xfb, 0xff, 0xcc, 0xd3, 0x6d, 0xb4, 0x5c,
0x7e, 0x1f, 0xf6, 0x94, 0xf3, 0xe4, 0xa4, 0xac, 0x60, 0x75, 0x31, 0x66, 0xeb, 0xaf, 0x1f, 0xb6,
0x9f, 0xde, 0x2c, 0x79, 0x0d, 0x7a, 0xe6, 0x77, 0xb9, 0xbe, 0xb5, 0xc5, 0x95, 0x36, 0x7a, 0x07,
0xbb, 0xa9, 0xbd, 0xe4, 0x41, 0x59, 0x9b, 0x95, 0x5d, 0x98, 0x27, 0xff, 0x26, 0xe5, 0x23, 0x5e,
0x82, 0x9e, 0x39, 0x5c, 0xae, 0x6d, 0x6d, 0x03, 0xe6, 0xe6, 0x4b, 0x53, 0x9c, 0xc7, 0xda, 0x99,
0x71, 0x73, 0x6b, 0xed, 0xfc, 0xb8, 0xb5, 0x76, 0xbe, 0xcc, 0x2d, 0xed, 0x66, 0x6e, 0x69, 0xdf,
0xe7, 0x96, 0xf6, 0x6b, 0x6e, 0x69, 0x43, 0x5d, 0xcd, 0xf2, 0xf4, 0x77, 0x00, 0x00, 0x00, 0xff,
0xff, 0xb8, 0xe7, 0x52, 0x19, 0x35, 0x05, 0x00, 0x00,
0x10, 0xad, 0x93, 0xd4, 0x2d, 0x93, 0xa6, 0x54, 0xab, 0x2a, 0x32, 0x46, 0x72, 0x23, 0xd3, 0x96,
0x9c, 0x6c, 0x08, 0x17, 0xc4, 0x01, 0x41, 0xd3, 0x08, 0x45, 0x50, 0x24, 0x9c, 0x03, 0x47, 0xe4,
0xd8, 0x9b, 0xb0, 0x22, 0xd9, 0x35, 0xbb, 0xeb, 0xa8, 0xb9, 0xc1, 0xbf, 0xeb, 0x91, 0x23, 0x27,
0x44, 0x73, 0xe4, 0x57, 0x20, 0xaf, 0xed, 0x7c, 0x40, 0x8c, 0xb9, 0x58, 0x33, 0xcf, 0x6f, 0x76,
0x67, 0xde, 0xdb, 0x81, 0xee, 0x98, 0xc8, 0x8f, 0xf1, 0xd0, 0x09, 0xd8, 0xd4, 0x0d, 0x59, 0xf0,
0x09, 0x73, 0x37, 0x60, 0x54, 0xfa, 0x84, 0x62, 0x1e, 0xba, 0x7e, 0x44, 0x5c, 0x81, 0xf9, 0x8c,
0x04, 0x58, 0xb8, 0xf8, 0x1a, 0x07, 0xb1, 0x24, 0x8c, 0xae, 0x22, 0x27, 0xe2, 0x4c, 0x32, 0xd4,
0x5c, 0x95, 0x38, 0xb3, 0xc7, 0x4e, 0x5e, 0x61, 0xde, 0x1f, 0x33, 0x36, 0x9e, 0x60, 0x57, 0xb1,
0x86, 0xf1, 0xc8, 0xc5, 0xd3, 0x48, 0xce, 0xd3, 0x22, 0xf3, 0xde, 0x9f, 0x3f, 0x7d, 0x9a, 0xff,
0x3a, 0x1e, 0xb3, 0x31, 0x53, 0xa1, 0x9b, 0x44, 0x19, 0xfa, 0xb4, 0xb4, 0x55, 0x39, 0x8f, 0xb0,
0x70, 0xa7, 0x2c, 0xa6, 0x32, 0xfd, 0x66, 0x95, 0x2f, 0xfe, 0xb3, 0x72, 0x09, 0xae, 0xa2, 0xf4,
0x04, 0xfb, 0x6b, 0x05, 0x1a, 0x5d, 0x8e, 0x7d, 0x89, 0x3d, 0xfc, 0x39, 0xc6, 0x42, 0xa2, 0x26,
0x54, 0x48, 0x68, 0x68, 0x2d, 0xad, 0x7d, 0xe7, 0x42, 0x5f, 0xfc, 0x38, 0xa9, 0xf4, 0x2f, 0xbd,
0x0a, 0x09, 0x51, 0x1b, 0x6a, 0x22, 0xc2, 0x81, 0x51, 0x69, 0x69, 0xed, 0x7a, 0xe7, 0xd8, 0x49,
0xa7, 0x74, 0xf2, 0x29, 0x9d, 0x97, 0x74, 0xee, 0x29, 0x06, 0xea, 0x80, 0xce, 0x19, 0x93, 0x23,
0x61, 0x54, 0x5b, 0xd5, 0x76, 0xbd, 0x63, 0x3a, 0x9b, 0x32, 0xaa, 0x9e, 0x9c, 0xab, 0x64, 0x0e,
0x2f, 0x63, 0x22, 0x03, 0xf6, 0x78, 0x4c, 0x25, 0x99, 0x62, 0xa3, 0x96, 0x5c, 0xed, 0xe5, 0x29,
0x3a, 0x86, 0x5d, 0x21, 0x43, 0x42, 0x8d, 0x5d, 0x85, 0xa7, 0x09, 0x6a, 0x82, 0x2e, 0x64, 0xc8,
0x62, 0x69, 0xe8, 0x0a, 0xce, 0xb2, 0x0c, 0xc7, 0x9c, 0x1b, 0x7b, 0x4b, 0x1c, 0x73, 0x8e, 0x4c,
0xd8, 0x97, 0x98, 0x4f, 0x09, 0xf5, 0x27, 0xc6, 0x7e, 0x4b, 0x6b, 0xef, 0x7b, 0xcb, 0xdc, 0x7e,
0x06, 0x87, 0xb9, 0x04, 0x22, 0x62, 0x54, 0xe0, 0x42, 0x0d, 0x8e, 0xa0, 0x1a, 0x91, 0x50, 0x49,
0xd0, 0xf0, 0x92, 0xd0, 0x3e, 0x87, 0x83, 0x81, 0xf4, 0xb9, 0x2c, 0x51, 0xcf, 0x7e, 0x08, 0x8d,
0x4b, 0x3c, 0xc1, 0xa5, 0x32, 0xdb, 0x7d, 0x38, 0xcc, 0x89, 0x25, 0xcd, 0x9c, 0x40, 0x1d, 0x5f,
0x13, 0xf9, 0x41, 0x48, 0x5f, 0xc6, 0x22, 0x6b, 0x0a, 0x12, 0x68, 0xa0, 0x10, 0xfb, 0x0c, 0xea,
0x7d, 0x3a, 0x62, 0x65, 0x37, 0x36, 0xa0, 0xfe, 0x86, 0x88, 0x7c, 0x02, 0xfb, 0x2d, 0x1c, 0xa4,
0x69, 0x76, 0xfd, 0x73, 0x80, 0xa5, 0x7d, 0xc2, 0xd0, 0x94, 0xa3, 0xd6, 0x56, 0x47, 0xbb, 0x39,
0xe6, 0xad, 0x55, 0xd8, 0x77, 0xa1, 0xd1, 0x9b, 0x61, 0x2a, 0x45, 0x76, 0x41, 0xe7, 0x57, 0x15,
0x8e, 0x96, 0xd4, 0x41, 0xba, 0x52, 0xe8, 0x3d, 0xe8, 0xa9, 0x07, 0xe8, 0xcc, 0xd9, 0xbe, 0x74,
0xce, 0xc6, 0x33, 0x35, 0xcf, 0xcb, 0x68, 0x59, 0xfb, 0x3d, 0xd8, 0x55, 0x06, 0xa1, 0xd3, 0xa2,
0x82, 0x75, 0xff, 0xcc, 0xe6, 0x5f, 0xef, 0xba, 0x97, 0xac, 0x36, 0x7a, 0x05, 0x7a, 0x6a, 0x4b,
0x71, 0x7f, 0x1b, 0xfe, 0x16, 0x1e, 0xf4, 0x1a, 0x6a, 0x89, 0x29, 0xe8, 0x41, 0xd1, 0x31, 0x6b,
0x96, 0x99, 0x25, 0x3a, 0xa3, 0x77, 0x50, 0x4b, 0xbc, 0x2a, 0x3e, 0x6c, 0xcd, 0x58, 0xf3, 0xf4,
0xdf, 0xa4, 0x4c, 0xaf, 0x2b, 0xd0, 0x53, 0xbb, 0x8a, 0x07, 0xdd, 0xb0, 0xd3, 0xdc, 0xbe, 0xdd,
0x8a, 0xf3, 0x48, 0xbb, 0x30, 0x6e, 0x6e, 0xad, 0x9d, 0xef, 0xb7, 0xd6, 0xce, 0x97, 0x85, 0xa5,
0xdd, 0x2c, 0x2c, 0xed, 0xdb, 0xc2, 0xd2, 0x7e, 0x2e, 0x2c, 0x6d, 0xa8, 0x2b, 0x61, 0x9e, 0xfc,
0x0e, 0x00, 0x00, 0xff, 0xff, 0x81, 0xbf, 0xf2, 0x2b, 0xa9, 0x05, 0x00, 0x00,
}

View file

@ -12,6 +12,7 @@ service ContainerService {
rpc Create(CreateRequest) returns (CreateResponse);
rpc Start(StartRequest) returns (google.protobuf.Empty);
rpc Delete(DeleteRequest) returns (google.protobuf.Empty);
rpc Info(InfoRequest) returns (containerd.v1.types.Container);
rpc List(ListRequest) returns (ListResponse);
rpc Events(EventsRequest) returns (stream containerd.v1.types.Event);
}
@ -45,6 +46,10 @@ message DeleteResponse {
uint32 exit_status = 2;
}
message InfoRequest {
string id = 1 [(gogoproto.customname) = "ID"];
}
message ListRequest {
}

44
cmd/ctr/info.go Normal file
View file

@ -0,0 +1,44 @@
package main
import (
"encoding/json"
gocontext "context"
"fmt"
"github.com/docker/containerd/api/services/execution"
"github.com/pkg/errors"
"github.com/urfave/cli"
)
var infoCommand = cli.Command{
Name: "info",
Usage: "get info about a container",
Flags: []cli.Flag{
cli.StringFlag{
Name: "id",
Usage: "id of the container",
},
},
Action: func(context *cli.Context) error {
id := context.String("id")
if id == "" {
return errors.New("container id must be provided")
}
containers, err := getExecutionService(context)
if err != nil {
return err
}
response, err := containers.Info(gocontext.Background(), &execution.InfoRequest{ID: id})
if err != nil {
return err
}
json, err := json.MarshalIndent(response, "", " ")
if err != nil {
return err
}
fmt.Println(string(json))
return nil
},
}

View file

@ -44,6 +44,7 @@ containerd client
eventsCommand,
deleteCommand,
listCommand,
infoCommand,
shimCommand,
pprofCommand,
}

View file

@ -131,31 +131,48 @@ func (s *Service) Delete(ctx context.Context, r *api.DeleteRequest) (*google_pro
return empty, nil
}
func containerFromContainerd(ctx context.Context, c containerd.Container) (*container.Container, error) {
state, err := c.State(ctx)
if err != nil {
return nil, err
}
var status container.Status
switch state.Status() {
case containerd.CreatedStatus:
status = container.Status_CREATED
case containerd.RunningStatus:
status = container.Status_RUNNING
case containerd.StoppedStatus:
status = container.Status_STOPPED
case containerd.PausedStatus:
status = container.Status_PAUSED
}
return &container.Container{
ID: c.Info().ID,
Pid: state.Pid(),
Status: status,
}, nil
}
func (s *Service) Info(ctx context.Context, r *api.InfoRequest) (*container.Container, error) {
c, err := s.getContainer(r.ID)
if err != nil {
return nil, err
}
return containerFromContainerd(ctx, c)
}
func (s *Service) List(ctx context.Context, r *api.ListRequest) (*api.ListResponse, error) {
resp := &api.ListResponse{}
s.mu.Lock()
defer s.mu.Unlock()
for _, c := range s.containers {
state, err := c.State(ctx)
for _, cd := range s.containers {
c, err := containerFromContainerd(ctx, cd)
if err != nil {
return nil, err
}
var status container.Status
switch state.Status() {
case containerd.CreatedStatus:
status = container.Status_CREATED
case containerd.RunningStatus:
status = container.Status_RUNNING
case containerd.StoppedStatus:
status = container.Status_STOPPED
case containerd.PausedStatus:
status = container.Status_PAUSED
}
resp.Containers = append(resp.Containers, &container.Container{
ID: c.Info().ID,
Pid: state.Pid(),
Status: status,
})
resp.Containers = append(resp.Containers, c)
}
return resp, nil
}