update.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package swarm
  2. import (
  3. "fmt"
  4. "golang.org/x/net/context"
  5. "github.com/docker/docker/api/client"
  6. "github.com/docker/docker/cli"
  7. "github.com/docker/engine-api/types/swarm"
  8. "github.com/spf13/cobra"
  9. "github.com/spf13/pflag"
  10. )
  11. func newUpdateCommand(dockerCli *client.DockerCli) *cobra.Command {
  12. opts := swarmOptions{autoAccept: NewAutoAcceptOption()}
  13. cmd := &cobra.Command{
  14. Use: "update",
  15. Short: "Update the Swarm",
  16. Args: cli.NoArgs,
  17. RunE: func(cmd *cobra.Command, args []string) error {
  18. return runUpdate(dockerCli, cmd.Flags(), opts)
  19. },
  20. }
  21. addSwarmFlags(cmd.Flags(), &opts)
  22. return cmd
  23. }
  24. func runUpdate(dockerCli *client.DockerCli, flags *pflag.FlagSet, opts swarmOptions) error {
  25. client := dockerCli.Client()
  26. ctx := context.Background()
  27. swarm, err := client.SwarmInspect(ctx)
  28. if err != nil {
  29. return err
  30. }
  31. err = mergeSwarm(&swarm, flags)
  32. if err != nil {
  33. return err
  34. }
  35. err = client.SwarmUpdate(ctx, swarm.Version, swarm.Spec)
  36. if err != nil {
  37. return err
  38. }
  39. fmt.Fprintln(dockerCli.Out(), "Swarm updated.")
  40. return nil
  41. }
  42. func mergeSwarm(swarm *swarm.Swarm, flags *pflag.FlagSet) error {
  43. spec := &swarm.Spec
  44. if flags.Changed(flagAutoAccept) {
  45. value := flags.Lookup(flagAutoAccept).Value.(*AutoAcceptOption)
  46. spec.AcceptancePolicy.Policies = value.Policies(nil)
  47. }
  48. var psecret *string
  49. if flags.Changed(flagSecret) {
  50. secret, _ := flags.GetString(flagSecret)
  51. psecret = &secret
  52. }
  53. for i := range spec.AcceptancePolicy.Policies {
  54. spec.AcceptancePolicy.Policies[i].Secret = psecret
  55. }
  56. if flags.Changed(flagTaskHistoryLimit) {
  57. spec.Orchestration.TaskHistoryRetentionLimit, _ = flags.GetInt64(flagTaskHistoryLimit)
  58. }
  59. if flags.Changed(flagDispatcherHeartbeat) {
  60. if v, err := flags.GetDuration(flagDispatcherHeartbeat); err == nil {
  61. spec.Dispatcher.HeartbeatPeriod = uint64(v.Nanoseconds())
  62. }
  63. }
  64. if flags.Changed(flagCertExpiry) {
  65. if v, err := flags.GetDuration(flagCertExpiry); err == nil {
  66. spec.CAConfig.NodeCertExpiry = v
  67. }
  68. }
  69. if flags.Changed(flagExternalCA) {
  70. value := flags.Lookup(flagExternalCA).Value.(*ExternalCAOption)
  71. spec.CAConfig.ExternalCAs = value.Value()
  72. }
  73. return nil
  74. }