update.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package swarm
  2. import (
  3. "fmt"
  4. "golang.org/x/net/context"
  5. "github.com/docker/docker/api/types/swarm"
  6. "github.com/docker/docker/cli"
  7. "github.com/docker/docker/cli/command"
  8. "github.com/pkg/errors"
  9. "github.com/spf13/cobra"
  10. "github.com/spf13/pflag"
  11. )
  12. func newUpdateCommand(dockerCli *command.DockerCli) *cobra.Command {
  13. opts := swarmOptions{}
  14. cmd := &cobra.Command{
  15. Use: "update [OPTIONS]",
  16. Short: "Update the swarm",
  17. Args: cli.NoArgs,
  18. RunE: func(cmd *cobra.Command, args []string) error {
  19. return runUpdate(dockerCli, cmd.Flags(), opts)
  20. },
  21. PreRunE: func(cmd *cobra.Command, args []string) error {
  22. if cmd.Flags().NFlag() == 0 {
  23. return pflag.ErrHelp
  24. }
  25. return nil
  26. },
  27. }
  28. cmd.Flags().BoolVar(&opts.autolock, flagAutolock, false, "Change manager autolocking setting (true|false)")
  29. addSwarmFlags(cmd.Flags(), &opts)
  30. return cmd
  31. }
  32. func runUpdate(dockerCli *command.DockerCli, flags *pflag.FlagSet, opts swarmOptions) error {
  33. client := dockerCli.Client()
  34. ctx := context.Background()
  35. var updateFlags swarm.UpdateFlags
  36. swarm, err := client.SwarmInspect(ctx)
  37. if err != nil {
  38. return err
  39. }
  40. prevAutoLock := swarm.Spec.EncryptionConfig.AutoLockManagers
  41. opts.mergeSwarmSpec(&swarm.Spec, flags)
  42. curAutoLock := swarm.Spec.EncryptionConfig.AutoLockManagers
  43. err = client.SwarmUpdate(ctx, swarm.Version, swarm.Spec, updateFlags)
  44. if err != nil {
  45. return err
  46. }
  47. fmt.Fprintln(dockerCli.Out(), "Swarm updated.")
  48. if curAutoLock && !prevAutoLock {
  49. unlockKeyResp, err := client.SwarmGetUnlockKey(ctx)
  50. if err != nil {
  51. return errors.Wrap(err, "could not fetch unlock key")
  52. }
  53. printUnlockCommand(ctx, dockerCli, unlockKeyResp.UnlockKey)
  54. }
  55. return nil
  56. }