init.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package swarm
  2. import (
  3. "fmt"
  4. "golang.org/x/net/context"
  5. "github.com/docker/docker/api/client"
  6. "github.com/docker/docker/cli"
  7. "github.com/docker/engine-api/types/swarm"
  8. "github.com/spf13/cobra"
  9. )
  10. type initOptions struct {
  11. listenAddr NodeAddrOption
  12. autoAccept AutoAcceptOption
  13. forceNewCluster bool
  14. secret string
  15. }
  16. func newInitCommand(dockerCli *client.DockerCli) *cobra.Command {
  17. opts := initOptions{
  18. listenAddr: NewNodeAddrOption(),
  19. autoAccept: NewAutoAcceptOption(),
  20. }
  21. cmd := &cobra.Command{
  22. Use: "init",
  23. Short: "Initialize a Swarm.",
  24. Args: cli.NoArgs,
  25. RunE: func(cmd *cobra.Command, args []string) error {
  26. return runInit(dockerCli, opts)
  27. },
  28. }
  29. flags := cmd.Flags()
  30. flags.Var(&opts.listenAddr, "listen-addr", "Listen address")
  31. flags.Var(&opts.autoAccept, "auto-accept", "Auto acceptance policy (worker, manager, or none)")
  32. flags.StringVar(&opts.secret, "secret", "", "Set secret value needed to accept nodes into cluster")
  33. flags.BoolVar(&opts.forceNewCluster, "force-new-cluster", false, "Force create a new cluster from current state.")
  34. return cmd
  35. }
  36. func runInit(dockerCli *client.DockerCli, opts initOptions) error {
  37. client := dockerCli.Client()
  38. ctx := context.Background()
  39. req := swarm.InitRequest{
  40. ListenAddr: opts.listenAddr.String(),
  41. ForceNewCluster: opts.forceNewCluster,
  42. }
  43. req.Spec.AcceptancePolicy.Policies = opts.autoAccept.Policies(opts.secret)
  44. nodeID, err := client.SwarmInit(ctx, req)
  45. if err != nil {
  46. return err
  47. }
  48. fmt.Printf("Swarm initialized: current node (%s) is now a manager.\n", nodeID)
  49. return nil
  50. }