-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcontainers.go
77 lines (68 loc) · 2.28 KB
/
containers.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package testcontainernetwork
import (
"context"
"fmt"
"github.com/docker/go-connections/nat"
"github.com/testcontainers/testcontainers-go"
"github.com/testcontainers/testcontainers-go/network"
"log"
"time"
)
type StartableDockerContainer interface {
MappedPort() int
StartUsing(ctx context.Context, dockerNetwork *testcontainers.DockerNetwork) error
Stop(ctx context.Context) error
}
type DockerContainer struct {
testContainer testcontainers.Container
internalServicePort int
}
func (c *DockerContainer) MappedPort() int {
mappedPort, err := c.testContainer.MappedPort(context.Background(), nat.Port(fmt.Sprintf("%d/tcp", c.internalServicePort)))
if err != nil {
log.Fatalf("getting mapped port for %d: %v", c.internalServicePort, err)
}
return mappedPort.Int()
}
func (c *DockerContainer) Stop(ctx context.Context) error {
return c.testContainer.Terminate(ctx)
}
type NetworkOfDockerContainers struct {
dockerNetwork *testcontainers.DockerNetwork
dockerContainers []StartableDockerContainer
}
func (n NetworkOfDockerContainers) WithDockerContainer(dockerContainer StartableDockerContainer) NetworkOfDockerContainers {
n.dockerContainers = append(n.dockerContainers, dockerContainer)
return n
}
// StartWithDelay has intentional mixed use of pointer and value receivers because this method
// has side effects and thus this fits better with a functional programming paradigm
func (n *NetworkOfDockerContainers) StartWithDelay(delay time.Duration) error {
ctx := context.Background()
var err error
if n.dockerNetwork, err = network.New(ctx); err != nil {
return fmt.Errorf("creating network: %s", err)
}
for _, dockerContainer := range n.dockerContainers {
if err := dockerContainer.StartUsing(ctx, n.dockerNetwork); err != nil {
return fmt.Errorf("starting docker container: %s", err)
}
}
if delay > 0 {
fmt.Printf("Sleeping for %s while containers start\n", delay)
time.Sleep(delay)
}
return nil
}
func (n *NetworkOfDockerContainers) Stop() error {
ctx := context.Background()
for _, dockerContainer := range n.dockerContainers {
if err := dockerContainer.Stop(ctx); err != nil {
return fmt.Errorf("stopping docker container: %v", err)
}
}
if err := n.dockerNetwork.Remove(ctx); err != nil {
return fmt.Errorf("removing network: %v", err)
}
return nil
}