github.com/fabiokung/docker@v0.11.2-0.20170222101415-4534dcd49497/cli/command/node/update_test.go (about)

     1  package node
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"io/ioutil"
     7  	"testing"
     8  
     9  	"github.com/docker/docker/api/types/swarm"
    10  	"github.com/docker/docker/cli/internal/test"
    11  	// Import builders to get the builder function as package function
    12  	. "github.com/docker/docker/cli/internal/test/builders"
    13  	"github.com/docker/docker/pkg/testutil/assert"
    14  )
    15  
    16  func TestNodeUpdateErrors(t *testing.T) {
    17  	testCases := []struct {
    18  		args            []string
    19  		flags           map[string]string
    20  		nodeInspectFunc func() (swarm.Node, []byte, error)
    21  		nodeUpdateFunc  func(nodeID string, version swarm.Version, node swarm.NodeSpec) error
    22  		expectedError   string
    23  	}{
    24  		{
    25  			expectedError: "requires exactly 1 argument",
    26  		},
    27  		{
    28  			args:          []string{"node1", "node2"},
    29  			expectedError: "requires exactly 1 argument",
    30  		},
    31  		{
    32  			args: []string{"nodeID"},
    33  			nodeInspectFunc: func() (swarm.Node, []byte, error) {
    34  				return swarm.Node{}, []byte{}, fmt.Errorf("error inspecting the node")
    35  			},
    36  			expectedError: "error inspecting the node",
    37  		},
    38  		{
    39  			args: []string{"nodeID"},
    40  			nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error {
    41  				return fmt.Errorf("error updating the node")
    42  			},
    43  			expectedError: "error updating the node",
    44  		},
    45  		{
    46  			args: []string{"nodeID"},
    47  			nodeInspectFunc: func() (swarm.Node, []byte, error) {
    48  				return *Node(NodeLabels(map[string]string{
    49  					"key": "value",
    50  				})), []byte{}, nil
    51  			},
    52  			flags: map[string]string{
    53  				"label-rm": "notpresent",
    54  			},
    55  			expectedError: "key notpresent doesn't exist in node's labels",
    56  		},
    57  	}
    58  	for _, tc := range testCases {
    59  		buf := new(bytes.Buffer)
    60  		cmd := newUpdateCommand(
    61  			test.NewFakeCli(&fakeClient{
    62  				nodeInspectFunc: tc.nodeInspectFunc,
    63  				nodeUpdateFunc:  tc.nodeUpdateFunc,
    64  			}, buf))
    65  		cmd.SetArgs(tc.args)
    66  		for key, value := range tc.flags {
    67  			cmd.Flags().Set(key, value)
    68  		}
    69  		cmd.SetOutput(ioutil.Discard)
    70  		assert.Error(t, cmd.Execute(), tc.expectedError)
    71  	}
    72  }
    73  
    74  func TestNodeUpdate(t *testing.T) {
    75  	testCases := []struct {
    76  		args            []string
    77  		flags           map[string]string
    78  		nodeInspectFunc func() (swarm.Node, []byte, error)
    79  		nodeUpdateFunc  func(nodeID string, version swarm.Version, node swarm.NodeSpec) error
    80  	}{
    81  		{
    82  			args: []string{"nodeID"},
    83  			flags: map[string]string{
    84  				"role": "manager",
    85  			},
    86  			nodeInspectFunc: func() (swarm.Node, []byte, error) {
    87  				return *Node(), []byte{}, nil
    88  			},
    89  			nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error {
    90  				if node.Role != swarm.NodeRoleManager {
    91  					return fmt.Errorf("expected role manager, got %s", node.Role)
    92  				}
    93  				return nil
    94  			},
    95  		},
    96  		{
    97  			args: []string{"nodeID"},
    98  			flags: map[string]string{
    99  				"availability": "drain",
   100  			},
   101  			nodeInspectFunc: func() (swarm.Node, []byte, error) {
   102  				return *Node(), []byte{}, nil
   103  			},
   104  			nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error {
   105  				if node.Availability != swarm.NodeAvailabilityDrain {
   106  					return fmt.Errorf("expected drain availability, got %s", node.Availability)
   107  				}
   108  				return nil
   109  			},
   110  		},
   111  		{
   112  			args: []string{"nodeID"},
   113  			flags: map[string]string{
   114  				"label-add": "lbl",
   115  			},
   116  			nodeInspectFunc: func() (swarm.Node, []byte, error) {
   117  				return *Node(), []byte{}, nil
   118  			},
   119  			nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error {
   120  				if _, present := node.Annotations.Labels["lbl"]; !present {
   121  					return fmt.Errorf("expected 'lbl' label, got %v", node.Annotations.Labels)
   122  				}
   123  				return nil
   124  			},
   125  		},
   126  		{
   127  			args: []string{"nodeID"},
   128  			flags: map[string]string{
   129  				"label-add": "key=value",
   130  			},
   131  			nodeInspectFunc: func() (swarm.Node, []byte, error) {
   132  				return *Node(), []byte{}, nil
   133  			},
   134  			nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error {
   135  				if value, present := node.Annotations.Labels["key"]; !present || value != "value" {
   136  					return fmt.Errorf("expected 'key' label to be 'value', got %v", node.Annotations.Labels)
   137  				}
   138  				return nil
   139  			},
   140  		},
   141  		{
   142  			args: []string{"nodeID"},
   143  			flags: map[string]string{
   144  				"label-rm": "key",
   145  			},
   146  			nodeInspectFunc: func() (swarm.Node, []byte, error) {
   147  				return *Node(NodeLabels(map[string]string{
   148  					"key": "value",
   149  				})), []byte{}, nil
   150  			},
   151  			nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error {
   152  				if len(node.Annotations.Labels) > 0 {
   153  					return fmt.Errorf("expected no labels, got %v", node.Annotations.Labels)
   154  				}
   155  				return nil
   156  			},
   157  		},
   158  	}
   159  	for _, tc := range testCases {
   160  		buf := new(bytes.Buffer)
   161  		cmd := newUpdateCommand(
   162  			test.NewFakeCli(&fakeClient{
   163  				nodeInspectFunc: tc.nodeInspectFunc,
   164  				nodeUpdateFunc:  tc.nodeUpdateFunc,
   165  			}, buf))
   166  		cmd.SetArgs(tc.args)
   167  		for key, value := range tc.flags {
   168  			cmd.Flags().Set(key, value)
   169  		}
   170  		assert.NilError(t, cmd.Execute())
   171  	}
   172  }