github.com/portworx/docker@v1.12.1/api/client/swarm/join.go (about) 1 package swarm 2 3 import ( 4 "fmt" 5 "strings" 6 7 "github.com/docker/docker/api/client" 8 "github.com/docker/docker/cli" 9 "github.com/docker/engine-api/types/swarm" 10 "github.com/spf13/cobra" 11 "golang.org/x/net/context" 12 ) 13 14 type joinOptions struct { 15 remote string 16 listenAddr NodeAddrOption 17 // Not a NodeAddrOption because it has no default port. 18 advertiseAddr string 19 token string 20 } 21 22 func newJoinCommand(dockerCli *client.DockerCli) *cobra.Command { 23 opts := joinOptions{ 24 listenAddr: NewListenAddrOption(), 25 } 26 27 cmd := &cobra.Command{ 28 Use: "join [OPTIONS] HOST:PORT", 29 Short: "Join a swarm as a node and/or manager", 30 Args: cli.ExactArgs(1), 31 RunE: func(cmd *cobra.Command, args []string) error { 32 opts.remote = args[0] 33 return runJoin(dockerCli, opts) 34 }, 35 } 36 37 flags := cmd.Flags() 38 flags.Var(&opts.listenAddr, flagListenAddr, "Listen address (format: <ip|interface>[:port])") 39 flags.StringVar(&opts.advertiseAddr, flagAdvertiseAddr, "", "Advertised address (format: <ip|interface>[:port])") 40 flags.StringVar(&opts.token, flagToken, "", "Token for entry into the swarm") 41 return cmd 42 } 43 44 func runJoin(dockerCli *client.DockerCli, opts joinOptions) error { 45 client := dockerCli.Client() 46 ctx := context.Background() 47 48 req := swarm.JoinRequest{ 49 JoinToken: opts.token, 50 ListenAddr: opts.listenAddr.String(), 51 AdvertiseAddr: opts.advertiseAddr, 52 RemoteAddrs: []string{opts.remote}, 53 } 54 err := client.SwarmJoin(ctx, req) 55 if err != nil { 56 return err 57 } 58 59 info, err := client.Info(ctx) 60 if err != nil { 61 return err 62 } 63 64 _, _, err = client.NodeInspectWithRaw(ctx, info.Swarm.NodeID) 65 if err != nil { 66 // TODO(aaronl): is there a better way to do this? 67 if strings.Contains(err.Error(), "This node is not a swarm manager.") { 68 fmt.Fprintln(dockerCli.Out(), "This node joined a swarm as a worker.") 69 } 70 } else { 71 fmt.Fprintln(dockerCli.Out(), "This node joined a swarm as a manager.") 72 } 73 74 return nil 75 }