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 }