list_test.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. package node
  2. import (
  3. "bytes"
  4. "io/ioutil"
  5. "testing"
  6. "github.com/docker/docker/api/types"
  7. "github.com/docker/docker/api/types/swarm"
  8. "github.com/docker/docker/cli/config/configfile"
  9. "github.com/docker/docker/cli/internal/test"
  10. "github.com/pkg/errors"
  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. func TestNodeListErrorOnAPIFailure(t *testing.T) {
  16. testCases := []struct {
  17. nodeListFunc func() ([]swarm.Node, error)
  18. infoFunc func() (types.Info, error)
  19. expectedError string
  20. }{
  21. {
  22. nodeListFunc: func() ([]swarm.Node, error) {
  23. return []swarm.Node{}, errors.Errorf("error listing nodes")
  24. },
  25. expectedError: "error listing nodes",
  26. },
  27. {
  28. nodeListFunc: func() ([]swarm.Node, error) {
  29. return []swarm.Node{
  30. {
  31. ID: "nodeID",
  32. },
  33. }, nil
  34. },
  35. infoFunc: func() (types.Info, error) {
  36. return types.Info{}, errors.Errorf("error asking for node info")
  37. },
  38. expectedError: "error asking for node info",
  39. },
  40. }
  41. for _, tc := range testCases {
  42. buf := new(bytes.Buffer)
  43. cli := test.NewFakeCli(&fakeClient{
  44. nodeListFunc: tc.nodeListFunc,
  45. infoFunc: tc.infoFunc,
  46. }, buf)
  47. cli.SetConfigfile(&configfile.ConfigFile{})
  48. cmd := newListCommand(cli)
  49. cmd.SetOutput(ioutil.Discard)
  50. assert.Error(t, cmd.Execute(), tc.expectedError)
  51. }
  52. }
  53. func TestNodeList(t *testing.T) {
  54. buf := new(bytes.Buffer)
  55. cli := test.NewFakeCli(&fakeClient{
  56. nodeListFunc: func() ([]swarm.Node, error) {
  57. return []swarm.Node{
  58. *Node(NodeID("nodeID1"), Hostname("nodeHostname1"), Manager(Leader())),
  59. *Node(NodeID("nodeID2"), Hostname("nodeHostname2"), Manager()),
  60. *Node(NodeID("nodeID3"), Hostname("nodeHostname3")),
  61. }, nil
  62. },
  63. infoFunc: func() (types.Info, error) {
  64. return types.Info{
  65. Swarm: swarm.Info{
  66. NodeID: "nodeID1",
  67. },
  68. }, nil
  69. },
  70. }, buf)
  71. cli.SetConfigfile(&configfile.ConfigFile{})
  72. cmd := newListCommand(cli)
  73. assert.NilError(t, cmd.Execute())
  74. assert.Contains(t, buf.String(), `nodeID1 * nodeHostname1 Ready Active Leader`)
  75. assert.Contains(t, buf.String(), `nodeID2 nodeHostname2 Ready Active Reachable`)
  76. assert.Contains(t, buf.String(), `nodeID3 nodeHostname3 Ready Active`)
  77. }
  78. func TestNodeListQuietShouldOnlyPrintIDs(t *testing.T) {
  79. buf := new(bytes.Buffer)
  80. cli := test.NewFakeCli(&fakeClient{
  81. nodeListFunc: func() ([]swarm.Node, error) {
  82. return []swarm.Node{
  83. *Node(),
  84. }, nil
  85. },
  86. }, buf)
  87. cli.SetConfigfile(&configfile.ConfigFile{})
  88. cmd := newListCommand(cli)
  89. cmd.Flags().Set("quiet", "true")
  90. assert.NilError(t, cmd.Execute())
  91. assert.Contains(t, buf.String(), "nodeID")
  92. }
  93. // Test case for #24090
  94. func TestNodeListContainsHostname(t *testing.T) {
  95. buf := new(bytes.Buffer)
  96. cli := test.NewFakeCli(&fakeClient{}, buf)
  97. cli.SetConfigfile(&configfile.ConfigFile{})
  98. cmd := newListCommand(cli)
  99. assert.NilError(t, cmd.Execute())
  100. assert.Contains(t, buf.String(), "HOSTNAME")
  101. }
  102. func TestNodeListDefaultFormat(t *testing.T) {
  103. buf := new(bytes.Buffer)
  104. cli := test.NewFakeCli(&fakeClient{
  105. nodeListFunc: func() ([]swarm.Node, error) {
  106. return []swarm.Node{
  107. *Node(NodeID("nodeID1"), Hostname("nodeHostname1"), Manager(Leader())),
  108. *Node(NodeID("nodeID2"), Hostname("nodeHostname2"), Manager()),
  109. *Node(NodeID("nodeID3"), Hostname("nodeHostname3")),
  110. }, nil
  111. },
  112. infoFunc: func() (types.Info, error) {
  113. return types.Info{
  114. Swarm: swarm.Info{
  115. NodeID: "nodeID1",
  116. },
  117. }, nil
  118. },
  119. }, buf)
  120. cli.SetConfigfile(&configfile.ConfigFile{
  121. NodesFormat: "{{.ID}}: {{.Hostname}} {{.Status}}/{{.ManagerStatus}}",
  122. })
  123. cmd := newListCommand(cli)
  124. assert.NilError(t, cmd.Execute())
  125. assert.Contains(t, buf.String(), `nodeID1: nodeHostname1 Ready/Leader`)
  126. assert.Contains(t, buf.String(), `nodeID2: nodeHostname2 Ready/Reachable`)
  127. assert.Contains(t, buf.String(), `nodeID3: nodeHostname3 Ready`)
  128. }
  129. func TestNodeListFormat(t *testing.T) {
  130. buf := new(bytes.Buffer)
  131. cli := test.NewFakeCli(&fakeClient{
  132. nodeListFunc: func() ([]swarm.Node, error) {
  133. return []swarm.Node{
  134. *Node(NodeID("nodeID1"), Hostname("nodeHostname1"), Manager(Leader())),
  135. *Node(NodeID("nodeID2"), Hostname("nodeHostname2"), Manager()),
  136. }, nil
  137. },
  138. infoFunc: func() (types.Info, error) {
  139. return types.Info{
  140. Swarm: swarm.Info{
  141. NodeID: "nodeID1",
  142. },
  143. }, nil
  144. },
  145. }, buf)
  146. cli.SetConfigfile(&configfile.ConfigFile{
  147. NodesFormat: "{{.ID}}: {{.Hostname}} {{.Status}}/{{.ManagerStatus}}",
  148. })
  149. cmd := newListCommand(cli)
  150. cmd.Flags().Set("format", "{{.Hostname}}: {{.ManagerStatus}}")
  151. assert.NilError(t, cmd.Execute())
  152. assert.Contains(t, buf.String(), `nodeHostname1: Leader`)
  153. assert.Contains(t, buf.String(), `nodeHostname2: Reachable`)
  154. }