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