github.com/kobeld/docker@v1.12.0-rc1/api/client/swarm/update.go (about) 1 package swarm 2 3 import ( 4 "fmt" 5 "time" 6 7 "golang.org/x/net/context" 8 9 "github.com/docker/docker/api/client" 10 "github.com/docker/docker/cli" 11 "github.com/docker/engine-api/types/swarm" 12 "github.com/spf13/cobra" 13 "github.com/spf13/pflag" 14 ) 15 16 type updateOptions struct { 17 autoAccept AutoAcceptOption 18 secret string 19 taskHistoryLimit int64 20 dispatcherHeartbeat time.Duration 21 } 22 23 func newUpdateCommand(dockerCli *client.DockerCli) *cobra.Command { 24 opts := updateOptions{autoAccept: NewAutoAcceptOption()} 25 var flags *pflag.FlagSet 26 27 cmd := &cobra.Command{ 28 Use: "update", 29 Short: "update the Swarm.", 30 Args: cli.NoArgs, 31 RunE: func(cmd *cobra.Command, args []string) error { 32 return runUpdate(dockerCli, flags, opts) 33 }, 34 } 35 36 flags = cmd.Flags() 37 flags.Var(&opts.autoAccept, "auto-accept", "Auto acceptance policy (worker, manager or none)") 38 flags.StringVar(&opts.secret, "secret", "", "Set secret value needed to accept nodes into cluster") 39 flags.Int64Var(&opts.taskHistoryLimit, "task-history-limit", 10, "Task history retention limit") 40 flags.DurationVar(&opts.dispatcherHeartbeat, "dispatcher-heartbeat", time.Duration(5*time.Second), "Dispatcher heartbeat period") 41 return cmd 42 } 43 44 func runUpdate(dockerCli *client.DockerCli, flags *pflag.FlagSet, opts updateOptions) error { 45 client := dockerCli.Client() 46 ctx := context.Background() 47 48 swarm, err := client.SwarmInspect(ctx) 49 if err != nil { 50 return err 51 } 52 53 err = mergeSwarm(&swarm, flags) 54 if err != nil { 55 return err 56 } 57 err = client.SwarmUpdate(ctx, swarm.Version, swarm.Spec) 58 if err != nil { 59 return err 60 } 61 62 fmt.Println("Swarm updated.") 63 return nil 64 } 65 66 func mergeSwarm(swarm *swarm.Swarm, flags *pflag.FlagSet) error { 67 spec := &swarm.Spec 68 69 if flags.Changed("auto-accept") { 70 value := flags.Lookup("auto-accept").Value.(*AutoAcceptOption) 71 if len(spec.AcceptancePolicy.Policies) > 0 { 72 spec.AcceptancePolicy.Policies = value.Policies(spec.AcceptancePolicy.Policies[0].Secret) 73 } else { 74 spec.AcceptancePolicy.Policies = value.Policies("") 75 } 76 } 77 78 if flags.Changed("secret") { 79 secret, _ := flags.GetString("secret") 80 for _, policy := range spec.AcceptancePolicy.Policies { 81 policy.Secret = secret 82 } 83 } 84 85 if flags.Changed("task-history-limit") { 86 spec.Orchestration.TaskHistoryRetentionLimit, _ = flags.GetInt64("task-history-limit") 87 } 88 89 if flags.Changed("dispatcher-heartbeat") { 90 if v, err := flags.GetDuration("dispatcher-heartbeat"); err == nil { 91 spec.Dispatcher.HeartbeatPeriod = uint64(v.Nanoseconds()) 92 } 93 } 94 95 return nil 96 }