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  }