join.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package swarm
  2. import (
  3. "fmt"
  4. "github.com/docker/docker/api/types/swarm"
  5. "github.com/docker/docker/cli"
  6. "github.com/docker/docker/cli/command"
  7. "github.com/spf13/cobra"
  8. "golang.org/x/net/context"
  9. )
  10. type joinOptions struct {
  11. remote string
  12. listenAddr NodeAddrOption
  13. // Not a NodeAddrOption because it has no default port.
  14. advertiseAddr string
  15. token string
  16. }
  17. func newJoinCommand(dockerCli *command.DockerCli) *cobra.Command {
  18. opts := joinOptions{
  19. listenAddr: NewListenAddrOption(),
  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, flagListenAddr, "Listen address (format: <ip|interface>[:port])")
  32. flags.StringVar(&opts.advertiseAddr, flagAdvertiseAddr, "", "Advertised address (format: <ip|interface>[:port])")
  33. flags.StringVar(&opts.token, flagToken, "", "Token for entry into the swarm")
  34. return cmd
  35. }
  36. func runJoin(dockerCli *command.DockerCli, opts joinOptions) error {
  37. client := dockerCli.Client()
  38. ctx := context.Background()
  39. req := swarm.JoinRequest{
  40. JoinToken: opts.token,
  41. ListenAddr: opts.listenAddr.String(),
  42. AdvertiseAddr: opts.advertiseAddr,
  43. RemoteAddrs: []string{opts.remote},
  44. }
  45. err := client.SwarmJoin(ctx, req)
  46. if err != nil {
  47. return err
  48. }
  49. info, err := client.Info(ctx)
  50. if err != nil {
  51. return err
  52. }
  53. if info.Swarm.ControlAvailable {
  54. fmt.Fprintln(dockerCli.Out(), "This node joined a swarm as a manager.")
  55. } else {
  56. fmt.Fprintln(dockerCli.Out(), "This node joined a swarm as a worker.")
  57. }
  58. return nil
  59. }