init.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package swarm
  2. import (
  3. "errors"
  4. "fmt"
  5. "strings"
  6. "golang.org/x/net/context"
  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. "github.com/spf13/pflag"
  12. )
  13. const (
  14. generatedSecretEntropyBytes = 16
  15. generatedSecretBase = 36
  16. // floor(log(2^128-1, 36)) + 1
  17. maxGeneratedSecretLength = 25
  18. )
  19. type initOptions struct {
  20. swarmOptions
  21. listenAddr NodeAddrOption
  22. // Not a NodeAddrOption because it has no default port.
  23. advertiseAddr string
  24. forceNewCluster bool
  25. }
  26. func newInitCommand(dockerCli *client.DockerCli) *cobra.Command {
  27. opts := initOptions{
  28. listenAddr: NewListenAddrOption(),
  29. }
  30. cmd := &cobra.Command{
  31. Use: "init [OPTIONS]",
  32. Short: "Initialize a swarm",
  33. Args: cli.NoArgs,
  34. RunE: func(cmd *cobra.Command, args []string) error {
  35. return runInit(dockerCli, cmd.Flags(), opts)
  36. },
  37. }
  38. flags := cmd.Flags()
  39. flags.Var(&opts.listenAddr, flagListenAddr, "Listen address (format: <ip|interface>[:port])")
  40. flags.StringVar(&opts.advertiseAddr, flagAdvertiseAddr, "", "Advertised address (format: <ip|interface>[:port])")
  41. flags.BoolVar(&opts.forceNewCluster, "force-new-cluster", false, "Force create a new cluster from current state.")
  42. addSwarmFlags(flags, &opts.swarmOptions)
  43. return cmd
  44. }
  45. func runInit(dockerCli *client.DockerCli, flags *pflag.FlagSet, opts initOptions) error {
  46. client := dockerCli.Client()
  47. ctx := context.Background()
  48. req := swarm.InitRequest{
  49. ListenAddr: opts.listenAddr.String(),
  50. AdvertiseAddr: opts.advertiseAddr,
  51. ForceNewCluster: opts.forceNewCluster,
  52. Spec: opts.swarmOptions.ToSpec(),
  53. }
  54. nodeID, err := client.SwarmInit(ctx, req)
  55. if err != nil {
  56. 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") {
  57. return errors.New(err.Error() + " - specify one with --advertise-addr")
  58. }
  59. return err
  60. }
  61. fmt.Fprintf(dockerCli.Out(), "Swarm initialized: current node (%s) is now a manager.\n\n", nodeID)
  62. return printJoinCommand(ctx, dockerCli, nodeID, true, true)
  63. }