github.com/olljanat/moby@v1.13.1/cli/command/swarm/join.go (about)

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