Browse code

Remove dead code from node update.

Also share mode code between update commands
and use flag constants

Signed-off-by: Daniel Nephin <dnephin@docker.com>
(cherry picked from commit cacaeab9db51f42c33872c6cce1adc3e55f1c9c5)

Daniel Nephin authored on 2016/06/18 00:26:53
Showing 5 changed files
... ...
@@ -7,34 +7,25 @@ import (
7 7
 	"github.com/docker/docker/cli"
8 8
 	"github.com/docker/engine-api/types/swarm"
9 9
 	"github.com/spf13/cobra"
10
-	"github.com/spf13/pflag"
11 10
 )
12 11
 
13 12
 func newAcceptCommand(dockerCli *client.DockerCli) *cobra.Command {
14
-	var flags *pflag.FlagSet
15
-
16
-	cmd := &cobra.Command{
13
+	return &cobra.Command{
17 14
 		Use:   "accept NODE [NODE...]",
18 15
 		Short: "Accept a node in the swarm",
19 16
 		Args:  cli.RequiresMinArgs(1),
20 17
 		RunE: func(cmd *cobra.Command, args []string) error {
21
-			return runAccept(dockerCli, flags, args)
18
+			return runAccept(dockerCli, args)
22 19
 		},
23 20
 	}
24
-
25
-	flags = cmd.Flags()
26
-	return cmd
27 21
 }
28 22
 
29
-func runAccept(dockerCli *client.DockerCli, flags *pflag.FlagSet, args []string) error {
30
-	for _, id := range args {
31
-		if err := runUpdate(dockerCli, id, func(node *swarm.Node) {
32
-			node.Spec.Membership = swarm.NodeMembershipAccepted
33
-		}); err != nil {
34
-			return err
35
-		}
36
-		fmt.Fprintf(dockerCli.Out(), "Node %s accepted in the swarm.\n", id)
23
+func runAccept(dockerCli *client.DockerCli, nodes []string) error {
24
+	accept := func(node *swarm.Node) {
25
+		node.Spec.Membership = swarm.NodeMembershipAccepted
37 26
 	}
38
-
39
-	return nil
27
+	success := func(nodeID string) {
28
+		fmt.Fprintf(dockerCli.Out(), "Node %s accepted in the swarm.\n", nodeID)
29
+	}
30
+	return updateNodes(dockerCli, nodes, accept, success)
40 31
 }
... ...
@@ -7,34 +7,25 @@ import (
7 7
 	"github.com/docker/docker/cli"
8 8
 	"github.com/docker/engine-api/types/swarm"
9 9
 	"github.com/spf13/cobra"
10
-	"github.com/spf13/pflag"
11 10
 )
12 11
 
13 12
 func newDemoteCommand(dockerCli *client.DockerCli) *cobra.Command {
14
-	var flags *pflag.FlagSet
15
-
16
-	cmd := &cobra.Command{
13
+	return &cobra.Command{
17 14
 		Use:   "demote NODE [NODE...]",
18 15
 		Short: "Demote a node from manager in the swarm",
19 16
 		Args:  cli.RequiresMinArgs(1),
20 17
 		RunE: func(cmd *cobra.Command, args []string) error {
21
-			return runDemote(dockerCli, flags, args)
18
+			return runDemote(dockerCli, args)
22 19
 		},
23 20
 	}
24
-
25
-	flags = cmd.Flags()
26
-	return cmd
27 21
 }
28 22
 
29
-func runDemote(dockerCli *client.DockerCli, flags *pflag.FlagSet, args []string) error {
30
-	for _, id := range args {
31
-		if err := runUpdate(dockerCli, id, func(node *swarm.Node) {
32
-			node.Spec.Role = swarm.NodeRoleWorker
33
-		}); err != nil {
34
-			return err
35
-		}
36
-		fmt.Fprintf(dockerCli.Out(), "Manager %s demoted in the swarm.\n", id)
23
+func runDemote(dockerCli *client.DockerCli, nodes []string) error {
24
+	demote := func(node *swarm.Node) {
25
+		node.Spec.Role = swarm.NodeRoleWorker
37 26
 	}
38
-
39
-	return nil
27
+	success := func(nodeID string) {
28
+		fmt.Fprintf(dockerCli.Out(), "Manager %s demoted in the swarm.\n", nodeID)
29
+	}
30
+	return updateNodes(dockerCli, nodes, demote, success)
40 31
 }
... ...
@@ -7,34 +7,25 @@ import (
7 7
 	"github.com/docker/docker/cli"
8 8
 	"github.com/docker/engine-api/types/swarm"
9 9
 	"github.com/spf13/cobra"
10
-	"github.com/spf13/pflag"
11 10
 )
12 11
 
13 12
 func newPromoteCommand(dockerCli *client.DockerCli) *cobra.Command {
14
-	var flags *pflag.FlagSet
15
-
16
-	cmd := &cobra.Command{
13
+	return &cobra.Command{
17 14
 		Use:   "promote NODE [NODE...]",
18 15
 		Short: "Promote a node to a manager in the swarm",
19 16
 		Args:  cli.RequiresMinArgs(1),
20 17
 		RunE: func(cmd *cobra.Command, args []string) error {
21
-			return runPromote(dockerCli, flags, args)
18
+			return runPromote(dockerCli, args)
22 19
 		},
23 20
 	}
24
-
25
-	flags = cmd.Flags()
26
-	return cmd
27 21
 }
28 22
 
29
-func runPromote(dockerCli *client.DockerCli, flags *pflag.FlagSet, args []string) error {
30
-	for _, id := range args {
31
-		if err := runUpdate(dockerCli, id, func(node *swarm.Node) {
32
-			node.Spec.Role = swarm.NodeRoleManager
33
-		}); err != nil {
34
-			return err
35
-		}
36
-		fmt.Fprintf(dockerCli.Out(), "Node %s promoted to a manager in the swarm.\n", id)
23
+func runPromote(dockerCli *client.DockerCli, nodes []string) error {
24
+	promote := func(node *swarm.Node) {
25
+		node.Spec.Role = swarm.NodeRoleManager
37 26
 	}
38
-
39
-	return nil
27
+	success := func(nodeID string) {
28
+		fmt.Fprintf(dockerCli.Out(), "Node %s promoted to a manager in the swarm.\n", nodeID)
29
+	}
30
+	return updateNodes(dockerCli, nodes, promote, success)
40 31
 }
... ...
@@ -5,7 +5,6 @@ import (
5 5
 
6 6
 	"github.com/docker/docker/api/client"
7 7
 	"github.com/docker/docker/cli"
8
-	runconfigopts "github.com/docker/docker/runconfig/opts"
9 8
 	"github.com/docker/engine-api/types/swarm"
10 9
 	"github.com/spf13/cobra"
11 10
 	"github.com/spf13/pflag"
... ...
@@ -14,90 +13,71 @@ import (
14 14
 
15 15
 func newUpdateCommand(dockerCli *client.DockerCli) *cobra.Command {
16 16
 	var opts nodeOptions
17
-	var flags *pflag.FlagSet
18 17
 
19 18
 	cmd := &cobra.Command{
20 19
 		Use:   "update [OPTIONS] NODE",
21 20
 		Short: "Update a node",
22 21
 		Args:  cli.ExactArgs(1),
23 22
 		RunE: func(cmd *cobra.Command, args []string) error {
24
-			if err := runUpdate(dockerCli, args[0], mergeNodeUpdate(flags)); err != nil {
25
-				return err
26
-			}
27
-			fmt.Fprintln(dockerCli.Out(), args[0])
28
-			return nil
23
+			return runUpdate(dockerCli, cmd.Flags(), args[0])
29 24
 		},
30 25
 	}
31 26
 
32
-	flags = cmd.Flags()
33
-	flags.StringVar(&opts.role, "role", "", "Role of the node (worker/manager)")
34
-	flags.StringVar(&opts.membership, "membership", "", "Membership of the node (accepted/rejected)")
35
-	flags.StringVar(&opts.availability, "availability", "", "Availability of the node (active/pause/drain)")
27
+	flags := cmd.Flags()
28
+	flags.StringVar(&opts.role, flagRole, "", "Role of the node (worker/manager)")
29
+	flags.StringVar(&opts.membership, flagMembership, "", "Membership of the node (accepted/rejected)")
30
+	flags.StringVar(&opts.availability, flagAvailability, "", "Availability of the node (active/pause/drain)")
36 31
 	return cmd
37 32
 }
38 33
 
39
-func runUpdate(dockerCli *client.DockerCli, nodeID string, mergeNode func(node *swarm.Node)) error {
34
+func runUpdate(dockerCli *client.DockerCli, flags *pflag.FlagSet, nodeID string) error {
35
+	success := func(_ string) {
36
+		fmt.Fprintln(dockerCli.Out(), nodeID)
37
+	}
38
+	return updateNodes(dockerCli, []string{nodeID}, mergeNodeUpdate(flags), success)
39
+}
40
+
41
+func updateNodes(dockerCli *client.DockerCli, nodes []string, mergeNode func(node *swarm.Node), success func(nodeID string)) error {
40 42
 	client := dockerCli.Client()
41 43
 	ctx := context.Background()
42 44
 
43
-	node, err := client.NodeInspect(ctx, nodeID)
44
-	if err != nil {
45
-		return err
46
-	}
45
+	for _, nodeID := range nodes {
46
+		node, err := client.NodeInspect(ctx, nodeID)
47
+		if err != nil {
48
+			return err
49
+		}
47 50
 
48
-	mergeNode(&node)
49
-	err = client.NodeUpdate(ctx, node.ID, node.Version, node.Spec)
50
-	if err != nil {
51
-		return err
51
+		mergeNode(&node)
52
+		err = client.NodeUpdate(ctx, node.ID, node.Version, node.Spec)
53
+		if err != nil {
54
+			return err
55
+		}
56
+		success(nodeID)
52 57
 	}
53
-
54 58
 	return nil
55 59
 }
56 60
 
57 61
 func mergeNodeUpdate(flags *pflag.FlagSet) func(*swarm.Node) {
58 62
 	return func(node *swarm.Node) {
59
-		mergeString := func(flag string, field *string) {
60
-			if flags.Changed(flag) {
61
-				*field, _ = flags.GetString(flag)
62
-			}
63
-		}
64
-
65
-		mergeRole := func(flag string, field *swarm.NodeRole) {
66
-			if flags.Changed(flag) {
67
-				str, _ := flags.GetString(flag)
68
-				*field = swarm.NodeRole(str)
69
-			}
70
-		}
63
+		spec := &node.Spec
71 64
 
72
-		mergeMembership := func(flag string, field *swarm.NodeMembership) {
73
-			if flags.Changed(flag) {
74
-				str, _ := flags.GetString(flag)
75
-				*field = swarm.NodeMembership(str)
76
-			}
65
+		if flags.Changed(flagRole) {
66
+			str, _ := flags.GetString(flagRole)
67
+			spec.Role = swarm.NodeRole(str)
77 68
 		}
78
-
79
-		mergeAvailability := func(flag string, field *swarm.NodeAvailability) {
80
-			if flags.Changed(flag) {
81
-				str, _ := flags.GetString(flag)
82
-				*field = swarm.NodeAvailability(str)
83
-			}
69
+		if flags.Changed(flagMembership) {
70
+			str, _ := flags.GetString(flagMembership)
71
+			spec.Membership = swarm.NodeMembership(str)
84 72
 		}
85
-
86
-		mergeLabels := func(flag string, field *map[string]string) {
87
-			if flags.Changed(flag) {
88
-				values, _ := flags.GetStringSlice(flag)
89
-				for key, value := range runconfigopts.ConvertKVStringsToMap(values) {
90
-					(*field)[key] = value
91
-				}
92
-			}
73
+		if flags.Changed(flagAvailability) {
74
+			str, _ := flags.GetString(flagAvailability)
75
+			spec.Availability = swarm.NodeAvailability(str)
93 76
 		}
94
-
95
-		spec := &node.Spec
96
-		mergeString("name", &spec.Name)
97
-		// TODO: setting labels is not working
98
-		mergeLabels("label", &spec.Labels)
99
-		mergeRole("role", &spec.Role)
100
-		mergeMembership("membership", &spec.Membership)
101
-		mergeAvailability("availability", &spec.Availability)
102 77
 	}
103 78
 }
79
+
80
+const (
81
+	flagRole         = "role"
82
+	flagMembership   = "membership"
83
+	flagAvailability = "availability"
84
+)
... ...
@@ -212,7 +212,6 @@ func anyChanged(flags *pflag.FlagSet, fields ...string) bool {
212 212
 	return false
213 213
 }
214 214
 
215
-
216 215
 // TODO: should this override by destination path, or does swarm handle that?
217 216
 func updateMounts(flags *pflag.FlagSet, mounts *[]swarm.Mount) {
218 217
 	if !flags.Changed(flagMount) {