init.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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. if err := printJoinCommand(ctx, dockerCli, nodeID, true, false); err != nil {
  63. return err
  64. }
  65. fmt.Fprint(dockerCli.Out(), "To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.\n\n")
  66. return nil
  67. }