containers.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package proxy
  2. import (
  3. "context"
  4. "github.com/docker/api/containers"
  5. v1 "github.com/docker/api/containers/v1"
  6. )
  7. // NewContainerAPI creates a proxy container server
  8. func NewContainerAPI() v1.ContainersServer {
  9. return &proxyContainerAPI{}
  10. }
  11. type proxyContainerAPI struct {
  12. }
  13. func portsToGrpc(ports []containers.Port) []*v1.Port {
  14. var result []*v1.Port
  15. for _, port := range ports {
  16. result = append(result, &v1.Port{
  17. ContainerPort: port.ContainerPort,
  18. HostPort: port.HostPort,
  19. HostIp: port.HostIP,
  20. Protocol: port.Protocol,
  21. })
  22. }
  23. return result
  24. }
  25. func (p *proxyContainerAPI) List(ctx context.Context, request *v1.ListRequest) (*v1.ListResponse, error) {
  26. client := Client(ctx)
  27. c, err := client.ContainerService().List(ctx, request.GetAll())
  28. if err != nil {
  29. return &v1.ListResponse{}, nil
  30. }
  31. response := &v1.ListResponse{
  32. Containers: []*v1.Container{},
  33. }
  34. for _, container := range c {
  35. response.Containers = append(response.Containers, &v1.Container{
  36. Id: container.ID,
  37. Image: container.Image,
  38. Command: container.Command,
  39. Status: container.Status,
  40. CpuTime: container.CPUTime,
  41. Labels: container.Labels,
  42. MemoryLimit: container.MemoryLimit,
  43. MemoryUsage: container.MemoryUsage,
  44. PidsCurrent: container.PidsCurrent,
  45. PidsLimit: container.PidsLimit,
  46. Ports: portsToGrpc(container.Ports),
  47. })
  48. }
  49. return response, nil
  50. }
  51. func (p *proxyContainerAPI) Create(ctx context.Context, request *v1.CreateRequest) (*v1.CreateResponse, error) {
  52. client := Client(ctx)
  53. err := client.ContainerService().Run(ctx, containers.ContainerConfig{
  54. ID: request.Id,
  55. Image: request.Image,
  56. })
  57. return &v1.CreateResponse{}, err
  58. }
  59. func (p *proxyContainerAPI) Start(_ context.Context, request *v1.StartRequest) (*v1.StartResponse, error) {
  60. panic("not implemented") // TODO: Implement
  61. }
  62. func (p *proxyContainerAPI) Stop(ctx context.Context, request *v1.StopRequest) (*v1.StopResponse, error) {
  63. c := Client(ctx)
  64. timeoutValue := request.GetTimeout()
  65. return &v1.StopResponse{}, c.ContainerService().Stop(ctx, request.Id, &timeoutValue)
  66. }
  67. func (p *proxyContainerAPI) Kill(ctx context.Context, request *v1.KillRequest) (*v1.KillResponse, error) {
  68. c := Client(ctx)
  69. return &v1.KillResponse{}, c.ContainerService().Delete(ctx, request.Id, false)
  70. }
  71. func (p *proxyContainerAPI) Delete(ctx context.Context, request *v1.DeleteRequest) (*v1.DeleteResponse, error) {
  72. err := Client(ctx).ContainerService().Delete(ctx, request.Id, request.Force)
  73. if err != nil {
  74. return &v1.DeleteResponse{}, err
  75. }
  76. return &v1.DeleteResponse{}, nil
  77. }
  78. func (p *proxyContainerAPI) Update(_ context.Context, _ *v1.UpdateRequest) (*v1.UpdateResponse, error) {
  79. panic("not implemented") // TODO: Implement
  80. }
  81. func (p *proxyContainerAPI) Exec(_ context.Context, _ *v1.ExecRequest) (*v1.ExecResponse, error) {
  82. panic("not implemented") // TODO: Implement
  83. }
  84. func (p *proxyContainerAPI) Logs(request *v1.LogsRequest, stream v1.Containers_LogsServer) error {
  85. ctx := stream.Context()
  86. c := Client(ctx)
  87. return c.ContainerService().Logs(ctx, request.GetContainerId(), containers.LogsRequest{
  88. Follow: request.Follow,
  89. Writer: &streamWriter{stream},
  90. })
  91. }