inspect_test.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. package network // import "github.com/docker/docker/integration/network"
  2. import (
  3. "testing"
  4. "time"
  5. "github.com/docker/docker/api/types"
  6. "github.com/docker/docker/api/types/filters"
  7. swarmtypes "github.com/docker/docker/api/types/swarm"
  8. "github.com/docker/docker/client"
  9. "github.com/docker/docker/integration/internal/swarm"
  10. "github.com/gotestyourself/gotestyourself/assert"
  11. "github.com/gotestyourself/gotestyourself/poll"
  12. "golang.org/x/net/context"
  13. )
  14. const defaultSwarmPort = 2477
  15. func TestInspectNetwork(t *testing.T) {
  16. defer setupTest(t)()
  17. d := swarm.NewSwarm(t, testEnv)
  18. defer d.Stop(t)
  19. client := d.NewClientT(t)
  20. defer client.Close()
  21. overlayName := "overlay1"
  22. networkCreate := types.NetworkCreate{
  23. CheckDuplicate: true,
  24. Driver: "overlay",
  25. }
  26. netResp, err := client.NetworkCreate(context.Background(), overlayName, networkCreate)
  27. assert.NilError(t, err)
  28. overlayID := netResp.ID
  29. var instances uint64 = 4
  30. serviceName := "TestService"
  31. // FIXME(vdemeester) consolidate with swarm.CreateService
  32. serviceSpec := swarmServiceSpec(serviceName, instances)
  33. serviceSpec.TaskTemplate.Networks = append(serviceSpec.TaskTemplate.Networks, swarmtypes.NetworkAttachmentConfig{Target: overlayName})
  34. serviceResp, err := client.ServiceCreate(context.Background(), serviceSpec, types.ServiceCreateOptions{
  35. QueryRegistry: false,
  36. })
  37. assert.NilError(t, err)
  38. serviceID := serviceResp.ID
  39. poll.WaitOn(t, serviceRunningTasksCount(client, serviceID, instances), swarm.ServicePoll)
  40. _, _, err = client.ServiceInspectWithRaw(context.Background(), serviceID, types.ServiceInspectOptions{})
  41. assert.NilError(t, err)
  42. // Test inspect verbose with full NetworkID
  43. networkVerbose, err := client.NetworkInspect(context.Background(), overlayID, types.NetworkInspectOptions{
  44. Verbose: true,
  45. })
  46. assert.NilError(t, err)
  47. assert.Assert(t, validNetworkVerbose(networkVerbose, serviceName, instances))
  48. // Test inspect verbose with partial NetworkID
  49. networkVerbose, err = client.NetworkInspect(context.Background(), overlayID[0:11], types.NetworkInspectOptions{
  50. Verbose: true,
  51. })
  52. assert.NilError(t, err)
  53. assert.Assert(t, validNetworkVerbose(networkVerbose, serviceName, instances))
  54. // Test inspect verbose with Network name and swarm scope
  55. networkVerbose, err = client.NetworkInspect(context.Background(), overlayName, types.NetworkInspectOptions{
  56. Verbose: true,
  57. Scope: "swarm",
  58. })
  59. assert.NilError(t, err)
  60. assert.Assert(t, validNetworkVerbose(networkVerbose, serviceName, instances))
  61. err = client.ServiceRemove(context.Background(), serviceID)
  62. assert.NilError(t, err)
  63. poll.WaitOn(t, serviceIsRemoved(client, serviceID), swarm.ServicePoll)
  64. poll.WaitOn(t, noTasks(client), swarm.ServicePoll)
  65. serviceResp, err = client.ServiceCreate(context.Background(), serviceSpec, types.ServiceCreateOptions{
  66. QueryRegistry: false,
  67. })
  68. assert.NilError(t, err)
  69. serviceID2 := serviceResp.ID
  70. poll.WaitOn(t, serviceRunningTasksCount(client, serviceID2, instances), swarm.ServicePoll)
  71. err = client.ServiceRemove(context.Background(), serviceID2)
  72. assert.NilError(t, err)
  73. poll.WaitOn(t, serviceIsRemoved(client, serviceID2), swarm.ServicePoll)
  74. poll.WaitOn(t, noTasks(client), swarm.ServicePoll)
  75. err = client.NetworkRemove(context.Background(), overlayID)
  76. assert.NilError(t, err)
  77. poll.WaitOn(t, networkIsRemoved(client, overlayID), poll.WithTimeout(1*time.Minute), poll.WithDelay(10*time.Second))
  78. }
  79. func swarmServiceSpec(name string, replicas uint64) swarmtypes.ServiceSpec {
  80. return swarmtypes.ServiceSpec{
  81. Annotations: swarmtypes.Annotations{
  82. Name: name,
  83. },
  84. TaskTemplate: swarmtypes.TaskSpec{
  85. ContainerSpec: &swarmtypes.ContainerSpec{
  86. Image: "busybox:latest",
  87. Command: []string{"/bin/top"},
  88. },
  89. },
  90. Mode: swarmtypes.ServiceMode{
  91. Replicated: &swarmtypes.ReplicatedService{
  92. Replicas: &replicas,
  93. },
  94. },
  95. }
  96. }
  97. func serviceRunningTasksCount(client client.ServiceAPIClient, serviceID string, instances uint64) func(log poll.LogT) poll.Result {
  98. return func(log poll.LogT) poll.Result {
  99. filter := filters.NewArgs()
  100. filter.Add("service", serviceID)
  101. tasks, err := client.TaskList(context.Background(), types.TaskListOptions{
  102. Filters: filter,
  103. })
  104. switch {
  105. case err != nil:
  106. return poll.Error(err)
  107. case len(tasks) == int(instances):
  108. for _, task := range tasks {
  109. if task.Status.State != swarmtypes.TaskStateRunning {
  110. return poll.Continue("waiting for tasks to enter run state")
  111. }
  112. }
  113. return poll.Success()
  114. default:
  115. return poll.Continue("task count at %d waiting for %d", len(tasks), instances)
  116. }
  117. }
  118. }
  119. func networkIsRemoved(client client.NetworkAPIClient, networkID string) func(log poll.LogT) poll.Result {
  120. return func(log poll.LogT) poll.Result {
  121. _, err := client.NetworkInspect(context.Background(), networkID, types.NetworkInspectOptions{})
  122. if err == nil {
  123. return poll.Continue("waiting for network %s to be removed", networkID)
  124. }
  125. return poll.Success()
  126. }
  127. }
  128. func serviceIsRemoved(client client.ServiceAPIClient, serviceID string) func(log poll.LogT) poll.Result {
  129. return func(log poll.LogT) poll.Result {
  130. filter := filters.NewArgs()
  131. filter.Add("service", serviceID)
  132. _, err := client.TaskList(context.Background(), types.TaskListOptions{
  133. Filters: filter,
  134. })
  135. if err == nil {
  136. return poll.Continue("waiting for service %s to be deleted", serviceID)
  137. }
  138. return poll.Success()
  139. }
  140. }
  141. func noTasks(client client.ServiceAPIClient) func(log poll.LogT) poll.Result {
  142. return func(log poll.LogT) poll.Result {
  143. filter := filters.NewArgs()
  144. tasks, err := client.TaskList(context.Background(), types.TaskListOptions{
  145. Filters: filter,
  146. })
  147. switch {
  148. case err != nil:
  149. return poll.Error(err)
  150. case len(tasks) == 0:
  151. return poll.Success()
  152. default:
  153. return poll.Continue("task count at %d waiting for 0", len(tasks))
  154. }
  155. }
  156. }
  157. // Check to see if Service and Tasks info are part of the inspect verbose response
  158. func validNetworkVerbose(network types.NetworkResource, service string, instances uint64) bool {
  159. if service, ok := network.Services[service]; ok {
  160. if len(service.Tasks) == int(instances) {
  161. return true
  162. }
  163. }
  164. return false
  165. }