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  )