update.go 2.7 KB

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