update.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  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. }
  22. cmd.Flags().BoolVar(&opts.autolock, flagAutolock, false, "Change manager autolocking setting (true|false)")
  23. addSwarmFlags(cmd.Flags(), &opts)
  24. return cmd
  25. }
  26. func runUpdate(dockerCli *command.DockerCli, flags *pflag.FlagSet, opts swarmOptions) error {
  27. client := dockerCli.Client()
  28. ctx := context.Background()
  29. var updateFlags swarm.UpdateFlags
  30. swarm, err := client.SwarmInspect(ctx)
  31. if err != nil {
  32. return err
  33. }
  34. prevAutoLock := swarm.Spec.EncryptionConfig.AutoLockManagers
  35. opts.mergeSwarmSpec(&swarm.Spec, flags)
  36. curAutoLock := swarm.Spec.EncryptionConfig.AutoLockManagers
  37. err = client.SwarmUpdate(ctx, swarm.Version, swarm.Spec, updateFlags)
  38. if err != nil {
  39. return err
  40. }
  41. fmt.Fprintln(dockerCli.Out(), "Swarm updated.")
  42. if curAutoLock && !prevAutoLock {
  43. unlockKeyResp, err := client.SwarmGetUnlockKey(ctx)
  44. if err != nil {
  45. return errors.Wrap(err, "could not fetch unlock key")
  46. }
  47. printUnlockCommand(ctx, dockerCli, unlockKeyResp.UnlockKey)
  48. }
  49. return nil
  50. }