update_test.go 4.8 KB

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