github.com/flavio/docker@v0.1.3-0.20170117145210-f63d1a6eec47/cli/command/swarm/join.go (about) 1 package swarm 2 3 import ( 4 "fmt" 5 "strings" 6 7 "golang.org/x/net/context" 8 9 "github.com/docker/docker/api/types/swarm" 10 "github.com/docker/docker/cli" 11 "github.com/docker/docker/cli/command" 12 "github.com/spf13/cobra" 13 "github.com/spf13/pflag" 14 ) 15 16 type joinOptions struct { 17 remote string 18 listenAddr NodeAddrOption 19 // Not a NodeAddrOption because it has no default port. 20 advertiseAddr string 21 token string 22 availability string 23 } 24 25 func newJoinCommand(dockerCli command.Cli) *cobra.Command { 26 opts := joinOptions{ 27 listenAddr: NewListenAddrOption(), 28 } 29 30 cmd := &cobra.Command{ 31 Use: "join [OPTIONS] HOST:PORT", 32 Short: "Join a swarm as a node and/or manager", 33 Args: cli.ExactArgs(1), 34 RunE: func(cmd *cobra.Command, args []string) error { 35 opts.remote = args[0] 36 return runJoin(dockerCli, cmd.Flags(), opts) 37 }, 38 } 39 40 flags := cmd.Flags() 41 flags.Var(&opts.listenAddr, flagListenAddr, "Listen address (format: <ip|interface>[:port])") 42 flags.StringVar(&opts.advertiseAddr, flagAdvertiseAddr, "", "Advertised address (format: <ip|interface>[:port])") 43 flags.StringVar(&opts.token, flagToken, "", "Token for entry into the swarm") 44 flags.StringVar(&opts.availability, flagAvailability, "active", "Availability of the node (active/pause/drain)") 45 return cmd 46 } 47 48 func runJoin(dockerCli command.Cli, flags *pflag.FlagSet, opts joinOptions) error { 49 client := dockerCli.Client() 50 ctx := context.Background() 51 52 req := swarm.JoinRequest{ 53 JoinToken: opts.token, 54 ListenAddr: opts.listenAddr.String(), 55 AdvertiseAddr: opts.advertiseAddr, 56 RemoteAddrs: []string{opts.remote}, 57 } 58 if flags.Changed(flagAvailability) { 59 availability := swarm.NodeAvailability(strings.ToLower(opts.availability)) 60 switch availability { 61 case swarm.NodeAvailabilityActive, swarm.NodeAvailabilityPause, swarm.NodeAvailabilityDrain: 62 req.Availability = availability 63 default: 64 return fmt.Errorf("invalid availability %q, only active, pause and drain are supported", opts.availability) 65 } 66 } 67 68 err := client.SwarmJoin(ctx, req) 69 if err != nil { 70 return err 71 } 72 73 info, err := client.Info(ctx) 74 if err != nil { 75 return err 76 } 77 78 if info.Swarm.ControlAvailable { 79 fmt.Fprintln(dockerCli.Out(), "This node joined a swarm as a manager.") 80 } else { 81 fmt.Fprintln(dockerCli.Out(), "This node joined a swarm as a worker.") 82 } 83 return nil 84 }