inspect_test.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. package network // import "github.com/docker/docker/integration/network"
  2. import (
  3. "context"
  4. "testing"
  5. "time"
  6. "github.com/docker/docker/api/types"
  7. "github.com/docker/docker/api/types/filters"
  8. swarmtypes "github.com/docker/docker/api/types/swarm"
  9. "github.com/docker/docker/client"
  10. "github.com/docker/docker/integration/internal/network"
  11. "github.com/docker/docker/integration/internal/swarm"
  12. "gotest.tools/assert"
  13. "gotest.tools/poll"
  14. "gotest.tools/skip"
  15. )
  16. const defaultSwarmPort = 2477
  17. func TestInspectNetwork(t *testing.T) {
  18. skip.If(t, testEnv.OSType == "windows", "FIXME")
  19. defer setupTest(t)()
  20. d := swarm.NewSwarm(t, testEnv)
  21. defer d.Stop(t)
  22. client := d.NewClientT(t)
  23. defer client.Close()
  24. overlayName := "overlay1"
  25. overlayID := network.CreateNoError(t, context.Background(), client, overlayName,
  26. network.WithDriver("overlay"),
  27. network.WithCheckDuplicate(),
  28. )
  29. var instances uint64 = 4
  30. serviceName := "TestService" + t.Name()
  31. serviceID := swarm.CreateService(t, d,
  32. swarm.ServiceWithReplicas(instances),
  33. swarm.ServiceWithName(serviceName),
  34. swarm.ServiceWithNetwork(overlayName),
  35. )
  36. poll.WaitOn(t, serviceRunningTasksCount(client, serviceID, instances), swarm.ServicePoll)
  37. _, _, err := client.ServiceInspectWithRaw(context.Background(), serviceID, types.ServiceInspectOptions{})
  38. assert.NilError(t, err)
  39. // Test inspect verbose with full NetworkID
  40. networkVerbose, err := client.NetworkInspect(context.Background(), overlayID, types.NetworkInspectOptions{
  41. Verbose: true,
  42. })
  43. assert.NilError(t, err)
  44. assert.Assert(t, validNetworkVerbose(networkVerbose, serviceName, instances))
  45. // Test inspect verbose with partial NetworkID
  46. networkVerbose, err = client.NetworkInspect(context.Background(), overlayID[0:11], types.NetworkInspectOptions{
  47. Verbose: true,
  48. })
  49. assert.NilError(t, err)
  50. assert.Assert(t, validNetworkVerbose(networkVerbose, serviceName, instances))
  51. // Test inspect verbose with Network name and swarm scope
  52. networkVerbose, err = client.NetworkInspect(context.Background(), overlayName, types.NetworkInspectOptions{
  53. Verbose: true,
  54. Scope: "swarm",
  55. })
  56. assert.NilError(t, err)
  57. assert.Assert(t, validNetworkVerbose(networkVerbose, serviceName, instances))
  58. err = client.ServiceRemove(context.Background(), serviceID)
  59. assert.NilError(t, err)
  60. poll.WaitOn(t, serviceIsRemoved(client, serviceID), swarm.ServicePoll)
  61. poll.WaitOn(t, noTasks(client), swarm.ServicePoll)
  62. serviceID2 := swarm.CreateService(t, d,
  63. swarm.ServiceWithReplicas(instances),
  64. swarm.ServiceWithName(serviceName),
  65. swarm.ServiceWithNetwork(overlayName),
  66. )
  67. poll.WaitOn(t, serviceRunningTasksCount(client, serviceID2, instances), swarm.ServicePoll)
  68. err = client.ServiceRemove(context.Background(), serviceID2)
  69. assert.NilError(t, err)
  70. poll.WaitOn(t, serviceIsRemoved(client, serviceID2), swarm.ServicePoll)
  71. poll.WaitOn(t, noTasks(client), swarm.ServicePoll)
  72. err = client.NetworkRemove(context.Background(), overlayID)
  73. assert.NilError(t, err)
  74. poll.WaitOn(t, network.IsRemoved(context.Background(), client, overlayID), poll.WithTimeout(1*time.Minute), poll.WithDelay(10*time.Second))
  75. }
  76. func serviceRunningTasksCount(client client.ServiceAPIClient, serviceID string, instances uint64) func(log poll.LogT) poll.Result {
  77. return func(log poll.LogT) poll.Result {
  78. filter := filters.NewArgs()
  79. filter.Add("service", serviceID)
  80. tasks, err := client.TaskList(context.Background(), types.TaskListOptions{
  81. Filters: filter,
  82. })
  83. switch {
  84. case err != nil:
  85. return poll.Error(err)
  86. case len(tasks) == int(instances):
  87. for _, task := range tasks {
  88. if task.Status.State != swarmtypes.TaskStateRunning {
  89. return poll.Continue("waiting for tasks to enter run state")
  90. }
  91. }
  92. return poll.Success()
  93. default:
  94. return poll.Continue("task count at %d waiting for %d", len(tasks), instances)
  95. }
  96. }
  97. }
  98. func serviceIsRemoved(client client.ServiceAPIClient, serviceID string) func(log poll.LogT) poll.Result {
  99. return func(log poll.LogT) poll.Result {
  100. filter := filters.NewArgs()
  101. filter.Add("service", serviceID)
  102. _, err := client.TaskList(context.Background(), types.TaskListOptions{
  103. Filters: filter,
  104. })
  105. if err == nil {
  106. return poll.Continue("waiting for service %s to be deleted", serviceID)
  107. }
  108. return poll.Success()
  109. }
  110. }
  111. func noTasks(client client.ServiceAPIClient) func(log poll.LogT) poll.Result {
  112. return func(log poll.LogT) poll.Result {
  113. filter := filters.NewArgs()
  114. tasks, err := client.TaskList(context.Background(), types.TaskListOptions{
  115. Filters: filter,
  116. })
  117. switch {
  118. case err != nil:
  119. return poll.Error(err)
  120. case len(tasks) == 0:
  121. return poll.Success()
  122. default:
  123. return poll.Continue("task count at %d waiting for 0", len(tasks))
  124. }
  125. }
  126. }
  127. // Check to see if Service and Tasks info are part of the inspect verbose response
  128. func validNetworkVerbose(network types.NetworkResource, service string, instances uint64) bool {
  129. if service, ok := network.Services[service]; ok {
  130. if len(service.Tasks) != int(instances) {
  131. return false
  132. }
  133. }
  134. if network.IPAM.Config == nil {
  135. return false
  136. }
  137. for _, cfg := range network.IPAM.Config {
  138. if cfg.Gateway == "" || cfg.Subnet == "" {
  139. return false
  140. }
  141. }
  142. return true
  143. }