github.com/itscaro/cli@v0.0.0-20190705081621-c9db0fe93829/cli/command/node/update_test.go (about)

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