| 81 | } |
| 82 | |
| 83 | func mergeNodeUpdate(flags *pflag.FlagSet) func(*swarm.Node) error { |
| 84 | return func(node *swarm.Node) error { |
| 85 | spec := &node.Spec |
| 86 | |
| 87 | if flags.Changed(flagRole) { |
| 88 | str, err := flags.GetString(flagRole) |
| 89 | if err != nil { |
| 90 | return err |
| 91 | } |
| 92 | spec.Role = swarm.NodeRole(str) |
| 93 | } |
| 94 | if flags.Changed(flagAvailability) { |
| 95 | str, err := flags.GetString(flagAvailability) |
| 96 | if err != nil { |
| 97 | return err |
| 98 | } |
| 99 | spec.Availability = swarm.NodeAvailability(str) |
| 100 | } |
| 101 | if spec.Annotations.Labels == nil { |
| 102 | spec.Annotations.Labels = make(map[string]string) |
| 103 | } |
| 104 | if flags.Changed(flagLabelAdd) { |
| 105 | labels := flags.Lookup(flagLabelAdd).Value.(*opts.ListOpts).GetSlice() |
| 106 | maps.Copy(spec.Annotations.Labels, opts.ConvertKVStringsToMap(labels)) |
| 107 | } |
| 108 | if flags.Changed(flagLabelRemove) { |
| 109 | keys := flags.Lookup(flagLabelRemove).Value.(*opts.ListOpts).GetSlice() |
| 110 | for _, k := range keys { |
| 111 | // if a key doesn't exist, fail the command explicitly |
| 112 | if _, exists := spec.Annotations.Labels[k]; !exists { |
| 113 | return fmt.Errorf("key %s doesn't exist in node's labels", k) |
| 114 | } |
| 115 | delete(spec.Annotations.Labels, k) |
| 116 | } |
| 117 | } |
| 118 | return nil |
| 119 | } |
| 120 | } |
| 121 | |
| 122 | const ( |
| 123 | flagRole = "role" |