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 }