github.com/DaoCloud/dao@v0.0.0-20161212064103-c3dbfd13ee36/api/client/swarm/init.go (about)

     1  package swarm
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"strings"
     7  
     8  	"golang.org/x/net/context"
     9  
    10  	"github.com/docker/docker/api/client"
    11  	"github.com/docker/docker/cli"
    12  	"github.com/docker/engine-api/types/swarm"
    13  	"github.com/spf13/cobra"
    14  	"github.com/spf13/pflag"
    15  )
    16  
    17  const (
    18  	generatedSecretEntropyBytes = 16
    19  	generatedSecretBase         = 36
    20  	// floor(log(2^128-1, 36)) + 1
    21  	maxGeneratedSecretLength = 25
    22  )
    23  
    24  type initOptions struct {
    25  	swarmOptions
    26  	listenAddr NodeAddrOption
    27  	// Not a NodeAddrOption because it has no default port.
    28  	advertiseAddr   string
    29  	forceNewCluster bool
    30  }
    31  
    32  func newInitCommand(dockerCli *client.DockerCli) *cobra.Command {
    33  	opts := initOptions{
    34  		listenAddr: NewListenAddrOption(),
    35  	}
    36  
    37  	cmd := &cobra.Command{
    38  		Use:   "init [OPTIONS]",
    39  		Short: "初始化Swarm集群",
    40  		Args:  cli.NoArgs,
    41  		RunE: func(cmd *cobra.Command, args []string) error {
    42  			return runInit(dockerCli, cmd.Flags(), opts)
    43  		},
    44  	}
    45  
    46  	flags := cmd.Flags()
    47  	flags.Var(&opts.listenAddr, flagListenAddr, "Swarm监听地址 (格式: <IP地址|网卡>[:端口])")
    48  	flags.StringVar(&opts.advertiseAddr, flagAdvertiseAddr, "", "广播地址 (格式: <IP地址|网卡>[:端口])")
    49  	flags.BoolVar(&opts.forceNewCluster, "force-new-cluster", false, "从节点当前状态强制创建一个集群。")
    50  	addSwarmFlags(flags, &opts.swarmOptions)
    51  	return cmd
    52  }
    53  
    54  func runInit(dockerCli *client.DockerCli, flags *pflag.FlagSet, opts initOptions) error {
    55  	client := dockerCli.Client()
    56  	ctx := context.Background()
    57  
    58  	req := swarm.InitRequest{
    59  		ListenAddr:      opts.listenAddr.String(),
    60  		AdvertiseAddr:   opts.advertiseAddr,
    61  		ForceNewCluster: opts.forceNewCluster,
    62  		Spec:            opts.swarmOptions.ToSpec(),
    63  	}
    64  
    65  	nodeID, err := client.SwarmInit(ctx, req)
    66  	if err != nil {
    67  		if strings.Contains(err.Error(), "could not choose an IP address to advertise") || strings.Contains(err.Error(), "could not find the system's IP address") {
    68  			return errors.New(err.Error() + " - specify one with --advertise-addr")
    69  		}
    70  		return err
    71  	}
    72  
    73  	fmt.Fprintf(dockerCli.Out(), "成功初始化Swarm集群: 当前节点 (%s) 现在已经是管理者角色。\n\n", nodeID)
    74  
    75  	if err := printJoinCommand(ctx, dockerCli, nodeID, true, false); err != nil {
    76  		return err
    77  	}
    78  
    79  	fmt.Fprint(dockerCli.Out(), "在此Swarm集群中添加一个管理者角色, 运行 'docker swarm join-token manager' 并遵循相应的说明。\n\n")
    80  	return nil
    81  }