github.1git.de/docker/cli@v26.1.3+incompatible/cli/command/swarm/join_token.go (about) 1 package swarm 2 3 import ( 4 "context" 5 "fmt" 6 7 "github.com/docker/cli/cli" 8 "github.com/docker/cli/cli/command" 9 "github.com/docker/docker/api/types/swarm" 10 "github.com/pkg/errors" 11 "github.com/spf13/cobra" 12 ) 13 14 type joinTokenOptions struct { 15 role string 16 rotate bool 17 quiet bool 18 } 19 20 func newJoinTokenCommand(dockerCli command.Cli) *cobra.Command { 21 opts := joinTokenOptions{} 22 23 cmd := &cobra.Command{ 24 Use: "join-token [OPTIONS] (worker|manager)", 25 Short: "Manage join tokens", 26 Args: cli.ExactArgs(1), 27 RunE: func(cmd *cobra.Command, args []string) error { 28 opts.role = args[0] 29 return runJoinToken(cmd.Context(), dockerCli, opts) 30 }, 31 Annotations: map[string]string{ 32 "version": "1.24", 33 "swarm": "manager", 34 }, 35 } 36 37 flags := cmd.Flags() 38 flags.BoolVar(&opts.rotate, flagRotate, false, "Rotate join token") 39 flags.BoolVarP(&opts.quiet, flagQuiet, "q", false, "Only display token") 40 41 return cmd 42 } 43 44 func runJoinToken(ctx context.Context, dockerCli command.Cli, opts joinTokenOptions) error { 45 worker := opts.role == "worker" 46 manager := opts.role == "manager" 47 48 if !worker && !manager { 49 return errors.New("unknown role " + opts.role) 50 } 51 52 client := dockerCli.Client() 53 54 if opts.rotate { 55 flags := swarm.UpdateFlags{ 56 RotateWorkerToken: worker, 57 RotateManagerToken: manager, 58 } 59 60 sw, err := client.SwarmInspect(ctx) 61 if err != nil { 62 return err 63 } 64 65 if err := client.SwarmUpdate(ctx, sw.Version, sw.Spec, flags); err != nil { 66 return err 67 } 68 69 if !opts.quiet { 70 fmt.Fprintf(dockerCli.Out(), "Successfully rotated %s join token.\n\n", opts.role) 71 } 72 } 73 74 // second SwarmInspect in this function, 75 // this is necessary since SwarmUpdate after first changes the join tokens 76 sw, err := client.SwarmInspect(ctx) 77 if err != nil { 78 return err 79 } 80 81 if opts.quiet && worker { 82 fmt.Fprintln(dockerCli.Out(), sw.JoinTokens.Worker) 83 return nil 84 } 85 86 if opts.quiet && manager { 87 fmt.Fprintln(dockerCli.Out(), sw.JoinTokens.Manager) 88 return nil 89 } 90 91 info, err := client.Info(ctx) 92 if err != nil { 93 return err 94 } 95 96 return printJoinCommand(ctx, dockerCli, info.Swarm.NodeID, worker, manager) 97 } 98 99 func printJoinCommand(ctx context.Context, dockerCli command.Cli, nodeID string, worker bool, manager bool) error { 100 client := dockerCli.Client() 101 102 node, _, err := client.NodeInspectWithRaw(ctx, nodeID) 103 if err != nil { 104 return err 105 } 106 107 sw, err := client.SwarmInspect(ctx) 108 if err != nil { 109 return err 110 } 111 112 if node.ManagerStatus != nil { 113 if worker { 114 fmt.Fprintf(dockerCli.Out(), "To add a worker to this swarm, run the following command:\n\n docker swarm join --token %s %s\n\n", sw.JoinTokens.Worker, node.ManagerStatus.Addr) 115 } 116 if manager { 117 fmt.Fprintf(dockerCli.Out(), "To add a manager to this swarm, run the following command:\n\n docker swarm join --token %s %s\n\n", sw.JoinTokens.Manager, node.ManagerStatus.Addr) 118 } 119 } 120 121 return nil 122 }