join_token.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package swarm
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/spf13/cobra"
  6. "github.com/docker/docker/api/client"
  7. "github.com/docker/docker/cli"
  8. "github.com/docker/engine-api/types/swarm"
  9. "golang.org/x/net/context"
  10. )
  11. const (
  12. flagRotate = "rotate"
  13. flagQuiet = "quiet"
  14. )
  15. func newJoinTokenCommand(dockerCli *client.DockerCli) *cobra.Command {
  16. var rotate, quiet bool
  17. cmd := &cobra.Command{
  18. Use: "join-token [-q] [--rotate] (worker|manager)",
  19. Short: "Manage join tokens",
  20. Args: cli.ExactArgs(1),
  21. RunE: func(cmd *cobra.Command, args []string) error {
  22. if args[0] != "worker" && args[0] != "manager" {
  23. return errors.New("unknown role " + args[0])
  24. }
  25. client := dockerCli.Client()
  26. ctx := context.Background()
  27. if rotate {
  28. var flags swarm.UpdateFlags
  29. swarm, err := client.SwarmInspect(ctx)
  30. if err != nil {
  31. return err
  32. }
  33. if args[0] == "worker" {
  34. flags.RotateWorkerToken = true
  35. } else if args[0] == "manager" {
  36. flags.RotateManagerToken = true
  37. }
  38. err = client.SwarmUpdate(ctx, swarm.Version, swarm.Spec, flags)
  39. if err != nil {
  40. return err
  41. }
  42. }
  43. swarm, err := client.SwarmInspect(ctx)
  44. if err != nil {
  45. return err
  46. }
  47. if quiet {
  48. if args[0] == "worker" {
  49. fmt.Fprintln(dockerCli.Out(), swarm.JoinTokens.Worker)
  50. } else if args[0] == "manager" {
  51. fmt.Fprintln(dockerCli.Out(), swarm.JoinTokens.Manager)
  52. }
  53. } else {
  54. info, err := client.Info(ctx)
  55. if err != nil {
  56. return err
  57. }
  58. return printJoinCommand(ctx, dockerCli, info.Swarm.NodeID, args[0] == "worker", args[0] == "manager")
  59. }
  60. return nil
  61. },
  62. }
  63. flags := cmd.Flags()
  64. flags.BoolVar(&rotate, flagRotate, false, "Rotate join token")
  65. flags.BoolVarP(&quiet, flagQuiet, "q", false, "Only display token")
  66. return cmd
  67. }
  68. func printJoinCommand(ctx context.Context, dockerCli *client.DockerCli, nodeID string, worker bool, manager bool) error {
  69. client := dockerCli.Client()
  70. swarm, err := client.SwarmInspect(ctx)
  71. if err != nil {
  72. return err
  73. }
  74. node, _, err := client.NodeInspectWithRaw(ctx, nodeID)
  75. if err != nil {
  76. return err
  77. }
  78. if node.ManagerStatus != nil {
  79. if worker {
  80. fmt.Fprintf(dockerCli.Out(), "To add a worker to this swarm, run the following command:\n docker swarm join \\\n --token %s \\\n %s\n", swarm.JoinTokens.Worker, node.ManagerStatus.Addr)
  81. }
  82. if manager {
  83. if worker {
  84. fmt.Fprintln(dockerCli.Out())
  85. }
  86. fmt.Fprintf(dockerCli.Out(), "To add a manager to this swarm, run the following command:\n docker swarm join \\\n --token %s \\\n %s\n", swarm.JoinTokens.Manager, node.ManagerStatus.Addr)
  87. }
  88. }
  89. return nil
  90. }