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  }