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

View File

@ -131,31 +131,48 @@ func (s *Service) Delete(ctx context.Context, r *api.DeleteRequest) (*google_pro
return empty, nil 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) { func (s *Service) List(ctx context.Context, r *api.ListRequest) (*api.ListResponse, error) {
resp := &api.ListResponse{} resp := &api.ListResponse{}
s.mu.Lock() s.mu.Lock()
defer s.mu.Unlock() defer s.mu.Unlock()
for _, c := range s.containers { for _, cd := range s.containers {
state, err := c.State(ctx) c, err := containerFromContainerd(ctx, cd)
if err != nil { if err != nil {
return nil, err return nil, err
} }
var status container.Status resp.Containers = append(resp.Containers, c)
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,
})
} }
return resp, nil return resp, nil
} }