join.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package swarm
  2. import (
  3. "fmt"
  4. "github.com/docker/docker/api/client"
  5. "github.com/docker/docker/cli"
  6. "github.com/docker/engine-api/types/swarm"
  7. "github.com/spf13/cobra"
  8. "golang.org/x/net/context"
  9. )
  10. type joinOptions struct {
  11. remote string
  12. listenAddr NodeAddrOption
  13. manager bool
  14. secret string
  15. CACertHash string
  16. }
  17. func newJoinCommand(dockerCli *client.DockerCli) *cobra.Command {
  18. opts := joinOptions{
  19. listenAddr: NodeAddrOption{addr: defaultListenAddr},
  20. }
  21. cmd := &cobra.Command{
  22. Use: "join [OPTIONS] HOST:PORT",
  23. Short: "Join a Swarm as a node and/or manager",
  24. Args: cli.ExactArgs(1),
  25. RunE: func(cmd *cobra.Command, args []string) error {
  26. opts.remote = args[0]
  27. return runJoin(dockerCli, opts)
  28. },
  29. }
  30. flags := cmd.Flags()
  31. flags.Var(&opts.listenAddr, "listen-addr", "Listen address")
  32. flags.BoolVar(&opts.manager, "manager", false, "Try joining as a manager.")
  33. flags.StringVar(&opts.secret, "secret", "", "Secret for node acceptance")
  34. flags.StringVar(&opts.CACertHash, "ca-hash", "", "Hash of the Root Certificate Authority certificate used for trusted join")
  35. return cmd
  36. }
  37. func runJoin(dockerCli *client.DockerCli, opts joinOptions) error {
  38. client := dockerCli.Client()
  39. ctx := context.Background()
  40. req := swarm.JoinRequest{
  41. Manager: opts.manager,
  42. Secret: opts.secret,
  43. ListenAddr: opts.listenAddr.String(),
  44. RemoteAddrs: []string{opts.remote},
  45. CACertHash: opts.CACertHash,
  46. }
  47. err := client.SwarmJoin(ctx, req)
  48. if err != nil {
  49. return err
  50. }
  51. if opts.manager {
  52. fmt.Fprintln(dockerCli.Out(), "This node joined a Swarm as a manager.")
  53. } else {
  54. fmt.Fprintln(dockerCli.Out(), "This node joined a Swarm as a worker.")
  55. }
  56. return nil
  57. }