github.com/kobeld/docker@v1.12.0-rc1/api/client/swarm/join.go (about)

     1  package swarm
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/docker/docker/api/client"
     7  	"github.com/docker/docker/cli"
     8  	"github.com/docker/engine-api/types/swarm"
     9  	"github.com/spf13/cobra"
    10  	"golang.org/x/net/context"
    11  )
    12  
    13  type joinOptions struct {
    14  	remote     string
    15  	listenAddr NodeAddrOption
    16  	manager    bool
    17  	secret     string
    18  	CACertHash string
    19  }
    20  
    21  func newJoinCommand(dockerCli *client.DockerCli) *cobra.Command {
    22  	opts := joinOptions{
    23  		listenAddr: NodeAddrOption{addr: defaultListenAddr},
    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, "listen-addr", "Listen address")
    38  	flags.BoolVar(&opts.manager, "manager", false, "Try joining as a manager.")
    39  	flags.StringVar(&opts.secret, "secret", "", "Secret for node acceptance")
    40  	flags.StringVar(&opts.CACertHash, "ca-hash", "", "Hash of the Root Certificate Authority certificate used for trusted join")
    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  		Manager:     opts.manager,
    50  		Secret:      opts.secret,
    51  		ListenAddr:  opts.listenAddr.String(),
    52  		RemoteAddrs: []string{opts.remote},
    53  		CACertHash:  opts.CACertHash,
    54  	}
    55  	err := client.SwarmJoin(ctx, req)
    56  	if err != nil {
    57  		return err
    58  	}
    59  	if opts.manager {
    60  		fmt.Fprintln(dockerCli.Out(), "This node joined a Swarm as a manager.")
    61  	} else {
    62  		fmt.Fprintln(dockerCli.Out(), "This node joined a Swarm as a worker.")
    63  	}
    64  	return nil
    65  }