serve.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package cmd
  2. import (
  3. "context"
  4. "net"
  5. "github.com/pkg/errors"
  6. "github.com/sirupsen/logrus"
  7. cliv1 "github.com/docker/api/cli/v1"
  8. containersv1 "github.com/docker/api/containers/v1"
  9. "github.com/docker/api/context/store"
  10. "github.com/docker/api/server"
  11. "github.com/docker/api/server/proxy"
  12. "github.com/spf13/cobra"
  13. )
  14. type serveOpts struct {
  15. address string
  16. }
  17. func ServeCommand() *cobra.Command {
  18. var opts serveOpts
  19. cmd := &cobra.Command{
  20. Use: "serve",
  21. Short: "Start an api server",
  22. RunE: func(cmd *cobra.Command, args []string) error {
  23. return runServe(cmd.Context(), opts)
  24. },
  25. }
  26. cmd.Flags().StringVar(&opts.address, "address", "", "The address to listen to")
  27. return cmd
  28. }
  29. func runServe(ctx context.Context, opts serveOpts) error {
  30. s := server.New()
  31. listener, err := net.Listen("unix", opts.address)
  32. if err != nil {
  33. return errors.Wrap(err, "listen unix socket")
  34. }
  35. defer listener.Close()
  36. p := proxy.NewContainerApi()
  37. containersv1.RegisterContainersServer(s, p)
  38. cliv1.RegisterCliServer(s, &cliServer{
  39. ctx,
  40. })
  41. go func() {
  42. <-ctx.Done()
  43. logrus.Info("stopping server")
  44. s.Stop()
  45. }()
  46. logrus.WithField("address", opts.address).Info("serving daemon API")
  47. // start the GRPC server to serve on the listener
  48. return s.Serve(listener)
  49. }
  50. type cliServer struct {
  51. ctx context.Context
  52. }
  53. func (cs *cliServer) Contexts(ctx context.Context, request *cliv1.ContextsRequest) (*cliv1.ContextsResponse, error) {
  54. s, err := store.New()
  55. if err != nil {
  56. logrus.Error(err)
  57. return &cliv1.ContextsResponse{}, err
  58. }
  59. contexts, err := s.List()
  60. if err != nil {
  61. logrus.Error(err)
  62. return &cliv1.ContextsResponse{}, err
  63. }
  64. result := &cliv1.ContextsResponse{}
  65. for _, c := range contexts {
  66. result.Contexts = append(result.Contexts, &cliv1.Context{
  67. Name: c.Name,
  68. ContextType: c.Metadata.Type,
  69. })
  70. }
  71. return result, nil
  72. }