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