service_test.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. package network // import "github.com/docker/docker/integration/network"
  2. import (
  3. "testing"
  4. "time"
  5. "github.com/docker/docker/api/types"
  6. swarmtypes "github.com/docker/docker/api/types/swarm"
  7. "github.com/docker/docker/client"
  8. "github.com/docker/docker/integration/internal/swarm"
  9. "github.com/gotestyourself/gotestyourself/assert"
  10. "github.com/gotestyourself/gotestyourself/poll"
  11. "golang.org/x/net/context"
  12. )
  13. func TestServiceWithPredefinedNetwork(t *testing.T) {
  14. defer setupTest(t)()
  15. d := swarm.NewSwarm(t, testEnv)
  16. defer d.Stop(t)
  17. client := d.NewClientT(t)
  18. defer client.Close()
  19. hostName := "host"
  20. var instances uint64 = 1
  21. serviceName := "TestService"
  22. serviceSpec := swarmServiceSpec(serviceName, instances)
  23. serviceSpec.TaskTemplate.Networks = append(serviceSpec.TaskTemplate.Networks, swarmtypes.NetworkAttachmentConfig{Target: hostName})
  24. serviceResp, err := client.ServiceCreate(context.Background(), serviceSpec, types.ServiceCreateOptions{
  25. QueryRegistry: false,
  26. })
  27. assert.NilError(t, err)
  28. serviceID := serviceResp.ID
  29. poll.WaitOn(t, serviceRunningCount(client, serviceID, instances), swarm.ServicePoll)
  30. _, _, err = client.ServiceInspectWithRaw(context.Background(), serviceID, types.ServiceInspectOptions{})
  31. assert.NilError(t, err)
  32. err = client.ServiceRemove(context.Background(), serviceID)
  33. assert.NilError(t, err)
  34. }
  35. const ingressNet = "ingress"
  36. func TestServiceRemoveKeepsIngressNetwork(t *testing.T) {
  37. defer setupTest(t)()
  38. d := swarm.NewSwarm(t, testEnv)
  39. defer d.Stop(t)
  40. client := d.NewClientT(t)
  41. defer client.Close()
  42. poll.WaitOn(t, swarmIngressReady(client), swarm.NetworkPoll)
  43. var instances uint64 = 1
  44. serviceSpec := swarmServiceSpec(t.Name()+"-service", instances)
  45. serviceSpec.EndpointSpec = &swarmtypes.EndpointSpec{
  46. Ports: []swarmtypes.PortConfig{
  47. {
  48. Protocol: swarmtypes.PortConfigProtocolTCP,
  49. TargetPort: 80,
  50. PublishMode: swarmtypes.PortConfigPublishModeIngress,
  51. },
  52. },
  53. }
  54. serviceResp, err := client.ServiceCreate(context.Background(), serviceSpec, types.ServiceCreateOptions{
  55. QueryRegistry: false,
  56. })
  57. assert.NilError(t, err)
  58. serviceID := serviceResp.ID
  59. poll.WaitOn(t, serviceRunningCount(client, serviceID, instances), swarm.ServicePoll)
  60. _, _, err = client.ServiceInspectWithRaw(context.Background(), serviceID, types.ServiceInspectOptions{})
  61. assert.NilError(t, err)
  62. err = client.ServiceRemove(context.Background(), serviceID)
  63. assert.NilError(t, err)
  64. poll.WaitOn(t, serviceIsRemoved(client, serviceID), swarm.ServicePoll)
  65. poll.WaitOn(t, noServices(client), swarm.ServicePoll)
  66. // Ensure that "ingress" is not removed or corrupted
  67. time.Sleep(10 * time.Second)
  68. netInfo, err := client.NetworkInspect(context.Background(), ingressNet, types.NetworkInspectOptions{
  69. Verbose: true,
  70. Scope: "swarm",
  71. })
  72. assert.NilError(t, err, "Ingress network was removed after removing service!")
  73. assert.Assert(t, len(netInfo.Containers) != 0, "No load balancing endpoints in ingress network")
  74. assert.Assert(t, len(netInfo.Peers) != 0, "No peers (including self) in ingress network")
  75. _, ok := netInfo.Containers["ingress-sbox"]
  76. assert.Assert(t, ok, "ingress-sbox not present in ingress network")
  77. }
  78. func serviceRunningCount(client client.ServiceAPIClient, serviceID string, instances uint64) func(log poll.LogT) poll.Result {
  79. return func(log poll.LogT) poll.Result {
  80. services, err := client.ServiceList(context.Background(), types.ServiceListOptions{})
  81. if err != nil {
  82. return poll.Error(err)
  83. }
  84. if len(services) != int(instances) {
  85. return poll.Continue("Service count at %d waiting for %d", len(services), instances)
  86. }
  87. return poll.Success()
  88. }
  89. }
  90. func swarmIngressReady(client client.NetworkAPIClient) func(log poll.LogT) poll.Result {
  91. return func(log poll.LogT) poll.Result {
  92. netInfo, err := client.NetworkInspect(context.Background(), ingressNet, types.NetworkInspectOptions{
  93. Verbose: true,
  94. Scope: "swarm",
  95. })
  96. if err != nil {
  97. return poll.Error(err)
  98. }
  99. np := len(netInfo.Peers)
  100. nc := len(netInfo.Containers)
  101. if np == 0 || nc == 0 {
  102. return poll.Continue("ingress not ready: %d peers and %d containers", nc, np)
  103. }
  104. _, ok := netInfo.Containers["ingress-sbox"]
  105. if !ok {
  106. return poll.Continue("ingress not ready: does not contain the ingress-sbox")
  107. }
  108. return poll.Success()
  109. }
  110. }
  111. func noServices(client client.ServiceAPIClient) func(log poll.LogT) poll.Result {
  112. return func(log poll.LogT) poll.Result {
  113. services, err := client.ServiceList(context.Background(), types.ServiceListOptions{})
  114. switch {
  115. case err != nil:
  116. return poll.Error(err)
  117. case len(services) == 0:
  118. return poll.Success()
  119. default:
  120. return poll.Continue("Service count at %d waiting for 0", len(services))
  121. }
  122. }
  123. }