github.com/noxiouz/docker@v0.7.3-0.20160629055221-3d231c78e8c5/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 "github.com/docker/engine-api/types/swarm" 9 "github.com/spf13/cobra" 10 "github.com/spf13/pflag" 11 "golang.org/x/net/context" 12 ) 13 14 func newUpdateCommand(dockerCli *client.DockerCli) *cobra.Command { 15 var opts nodeOptions 16 17 cmd := &cobra.Command{ 18 Use: "update [OPTIONS] NODE", 19 Short: "Update a node", 20 Args: cli.ExactArgs(1), 21 RunE: func(cmd *cobra.Command, args []string) error { 22 return runUpdate(dockerCli, cmd.Flags(), args[0]) 23 }, 24 } 25 26 flags := cmd.Flags() 27 flags.StringVar(&opts.role, flagRole, "", "Role of the node (worker/manager)") 28 flags.StringVar(&opts.membership, flagMembership, "", "Membership of the node (accepted/rejected)") 29 flags.StringVar(&opts.availability, flagAvailability, "", "Availability of the node (active/pause/drain)") 30 return cmd 31 } 32 33 func runUpdate(dockerCli *client.DockerCli, flags *pflag.FlagSet, nodeID string) error { 34 success := func(_ string) { 35 fmt.Fprintln(dockerCli.Out(), nodeID) 36 } 37 return updateNodes(dockerCli, []string{nodeID}, mergeNodeUpdate(flags), success) 38 } 39 40 func updateNodes(dockerCli *client.DockerCli, nodes []string, mergeNode func(node *swarm.Node), success func(nodeID string)) error { 41 client := dockerCli.Client() 42 ctx := context.Background() 43 44 for _, nodeID := range nodes { 45 node, err := client.NodeInspect(ctx, nodeID) 46 if err != nil { 47 return err 48 } 49 50 mergeNode(&node) 51 err = client.NodeUpdate(ctx, node.ID, node.Version, node.Spec) 52 if err != nil { 53 return err 54 } 55 success(nodeID) 56 } 57 return nil 58 } 59 60 func mergeNodeUpdate(flags *pflag.FlagSet) func(*swarm.Node) { 61 return func(node *swarm.Node) { 62 spec := &node.Spec 63 64 if flags.Changed(flagRole) { 65 str, _ := flags.GetString(flagRole) 66 spec.Role = swarm.NodeRole(str) 67 } 68 if flags.Changed(flagMembership) { 69 str, _ := flags.GetString(flagMembership) 70 spec.Membership = swarm.NodeMembership(str) 71 } 72 if flags.Changed(flagAvailability) { 73 str, _ := flags.GetString(flagAvailability) 74 spec.Availability = swarm.NodeAvailability(str) 75 } 76 } 77 } 78 79 const ( 80 flagRole = "role" 81 flagMembership = "membership" 82 flagAvailability = "availability" 83 )