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