update_test.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. package node
  2. import (
  3. "bytes"
  4. "io/ioutil"
  5. "testing"
  6. "github.com/docker/docker/api/types/swarm"
  7. "github.com/docker/docker/cli/internal/test"
  8. "github.com/pkg/errors"
  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"
  12. "github.com/stretchr/testify/assert"
  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. buf := new(bytes.Buffer)
  58. cmd := newUpdateCommand(
  59. test.NewFakeCli(&fakeClient{
  60. nodeInspectFunc: tc.nodeInspectFunc,
  61. nodeUpdateFunc: tc.nodeUpdateFunc,
  62. }, buf))
  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. testutil.ErrorContains(t, cmd.Execute(), tc.expectedError)
  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. buf := new(bytes.Buffer)
  158. cmd := newUpdateCommand(
  159. test.NewFakeCli(&fakeClient{
  160. nodeInspectFunc: tc.nodeInspectFunc,
  161. nodeUpdateFunc: tc.nodeUpdateFunc,
  162. }, buf))
  163. cmd.SetArgs(tc.args)
  164. for key, value := range tc.flags {
  165. cmd.Flags().Set(key, value)
  166. }
  167. assert.NoError(t, cmd.Execute())
  168. }
  169. }