Also share mode code between update commands
and use flag constants
Signed-off-by: Daniel Nephin <dnephin@docker.com>
(cherry picked from commit cacaeab9db51f42c33872c6cce1adc3e55f1c9c5)
| ... | ... |
@@ -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) {
|