update.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package node
  2. import (
  3. "fmt"
  4. "github.com/docker/docker/api/client"
  5. "github.com/docker/docker/cli"
  6. runconfigopts "github.com/docker/docker/runconfig/opts"
  7. "github.com/docker/engine-api/types/swarm"
  8. "github.com/spf13/cobra"
  9. "github.com/spf13/pflag"
  10. "golang.org/x/net/context"
  11. )
  12. func newUpdateCommand(dockerCli *client.DockerCli) *cobra.Command {
  13. var opts nodeOptions
  14. var flags *pflag.FlagSet
  15. cmd := &cobra.Command{
  16. Use: "update [OPTIONS] NODE",
  17. Short: "Update a node",
  18. Args: cli.ExactArgs(1),
  19. RunE: func(cmd *cobra.Command, args []string) error {
  20. return runUpdate(dockerCli, args[0], mergeNodeUpdate(flags))
  21. },
  22. }
  23. flags = cmd.Flags()
  24. flags.StringVar(&opts.role, "role", "", "Role of the node (worker/manager)")
  25. flags.StringVar(&opts.membership, "membership", "", "Membership of the node (accepted/rejected)")
  26. flags.StringVar(&opts.availability, "availability", "", "Availability of the node (active/pause/drain)")
  27. return cmd
  28. }
  29. func runUpdate(dockerCli *client.DockerCli, nodeID string, mergeNode func(node *swarm.Node)) error {
  30. client := dockerCli.Client()
  31. ctx := context.Background()
  32. node, err := client.NodeInspect(ctx, nodeID)
  33. if err != nil {
  34. return err
  35. }
  36. mergeNode(&node)
  37. err = client.NodeUpdate(ctx, node.ID, node.Version, node.Spec)
  38. if err != nil {
  39. return err
  40. }
  41. fmt.Fprintf(dockerCli.Out(), "%s\n", nodeID)
  42. return nil
  43. }
  44. func mergeNodeUpdate(flags *pflag.FlagSet) func(*swarm.Node) {
  45. return func(node *swarm.Node) {
  46. mergeString := func(flag string, field *string) {
  47. if flags.Changed(flag) {
  48. *field, _ = flags.GetString(flag)
  49. }
  50. }
  51. mergeRole := func(flag string, field *swarm.NodeRole) {
  52. if flags.Changed(flag) {
  53. str, _ := flags.GetString(flag)
  54. *field = swarm.NodeRole(str)
  55. }
  56. }
  57. mergeMembership := func(flag string, field *swarm.NodeMembership) {
  58. if flags.Changed(flag) {
  59. str, _ := flags.GetString(flag)
  60. *field = swarm.NodeMembership(str)
  61. }
  62. }
  63. mergeAvailability := func(flag string, field *swarm.NodeAvailability) {
  64. if flags.Changed(flag) {
  65. str, _ := flags.GetString(flag)
  66. *field = swarm.NodeAvailability(str)
  67. }
  68. }
  69. mergeLabels := func(flag string, field *map[string]string) {
  70. if flags.Changed(flag) {
  71. values, _ := flags.GetStringSlice(flag)
  72. for key, value := range runconfigopts.ConvertKVStringsToMap(values) {
  73. (*field)[key] = value
  74. }
  75. }
  76. }
  77. spec := &node.Spec
  78. mergeString("name", &spec.Name)
  79. // TODO: setting labels is not working
  80. mergeLabels("label", &spec.Labels)
  81. mergeRole("role", &spec.Role)
  82. mergeMembership("membership", &spec.Membership)
  83. mergeAvailability("availability", &spec.Availability)
  84. }
  85. }