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