Skip to content

Commit f53f6b6

Browse files
committed
WIP
1 parent 3bb1806 commit f53f6b6

File tree

5 files changed

+82
-84
lines changed

5 files changed

+82
-84
lines changed

internal/services/icinga2/docker.go

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,12 @@ import (
1212
"github.com/icinga/icinga-testing/services"
1313
"github.com/icinga/icinga-testing/utils"
1414
"go.uber.org/zap"
15-
"strconv"
1615
"sync"
1716
"sync/atomic"
1817
"time"
1918
)
2019

21-
const PORT = "5665/tcp"
20+
const PORT = "5665"
2221

2322
type dockerCreator struct {
2423
logger *zap.Logger
@@ -63,30 +62,15 @@ func (i *dockerCreator) CreateIcinga2(name string) services.Icinga2Base {
6362
panic(err)
6463
}
6564

66-
portNumber, err := utils.GetFreePort()
67-
if err != nil {
68-
panic(err)
69-
}
70-
port, err := nat.NewPort("tcp", strconv.Itoa(portNumber))
71-
if err != nil {
72-
panic(err)
73-
}
65+
port := utils.NewPortDecision(i.dockerClient, PORT)
7466

7567
cont, err := i.dockerClient.ContainerCreate(context.Background(), &container.Config{
7668
ExposedPorts: nat.PortSet{
77-
port: struct{}{},
78-
PORT: struct{}{},
69+
nat.Port(fmt.Sprintf("%s/tcp", PORT)): struct{}{},
7970
},
8071
Image: dockerImage,
8172
Env: []string{"ICINGA_MASTER=1"},
82-
}, &container.HostConfig{PortBindings: nat.PortMap{
83-
PORT: []nat.PortBinding{
84-
{
85-
HostIP: "0.0.0.0",
86-
HostPort: port.Port(),
87-
},
88-
},
89-
}}, &network.NetworkingConfig{
73+
}, &container.HostConfig{PortBindings: port.Map()}, &network.NetworkingConfig{
9074
EndpointsConfig: map[string]*network.EndpointSettings{
9175
networkName: {
9276
NetworkID: i.dockerNetworkId,
@@ -115,7 +99,7 @@ func (i *dockerCreator) CreateIcinga2(name string) services.Icinga2Base {
11599

116100
n := &dockerInstance{
117101
info: info{
118-
host: utils.MustString(utils.DockerContainerAddress(context.Background(), i.dockerClient, cont.ID)),
102+
host: port.Address(context.Background(), i.dockerClient, cont.ID),
119103
port: port.Port(),
120104
},
121105
icinga2Docker: i,

internal/services/mysql/docker.go

Lines changed: 10 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,12 @@ import (
66
"github.com/docker/docker/api/types/container"
77
"github.com/docker/docker/api/types/network"
88
"github.com/docker/docker/client"
9-
"github.com/docker/go-connections/nat"
109
"github.com/icinga/icinga-testing/utils"
1110
"go.uber.org/zap"
12-
"strconv"
1311
"time"
1412
)
1513

16-
const PORT = "3306/tcp"
14+
const PORT = "3306"
1715

1816
type dockerCreator struct {
1917
*rootConnection
@@ -42,32 +40,14 @@ func NewDockerCreator(logger *zap.Logger, dockerClient *client.Client, container
4240
panic(err)
4341
}
4442

45-
portNumber, err := utils.GetFreePort()
46-
if err != nil {
47-
panic(err)
48-
}
49-
port, err := nat.NewPort("tcp", strconv.Itoa(portNumber))
50-
if err != nil {
51-
panic(err)
52-
}
43+
port := utils.NewPortDecision(dockerClient, PORT)
5344

5445
rootPassword := utils.RandomString(16)
5546
cont, err := dockerClient.ContainerCreate(context.Background(), &container.Config{
56-
ExposedPorts: nat.PortSet{
57-
port: struct{}{},
58-
PORT: struct{}{},
59-
},
6047
Env: []string{"MYSQL_ROOT_PASSWORD=" + rootPassword},
6148
Cmd: nil,
6249
Image: dockerImage,
63-
}, &container.HostConfig{PortBindings: nat.PortMap{
64-
PORT: []nat.PortBinding{
65-
{
66-
HostIP: "0.0.0.0",
67-
HostPort: port.Port(),
68-
},
69-
},
70-
}}, &network.NetworkingConfig{
50+
}, &container.HostConfig{PortBindings: port.Map()}, &network.NetworkingConfig{
7151
EndpointsConfig: map[string]*network.EndpointSettings{
7252
networkName: {
7353
Aliases: []string{"mysql"},
@@ -96,14 +76,14 @@ func NewDockerCreator(logger *zap.Logger, dockerClient *client.Client, container
9676
}
9777
logger.Debug("started mysql container")
9878

99-
containerAddress := utils.MustString(utils.DockerContainerAddress(context.Background(), dockerClient, cont.ID))
100-
10179
d := &dockerCreator{
102-
rootConnection: newRootConnection(containerAddress, port.Port(), "root", rootPassword),
103-
logger: logger,
104-
client: dockerClient,
105-
containerId: cont.ID,
106-
containerName: containerName,
80+
rootConnection: newRootConnection(
81+
port.Address(context.Background(), dockerClient, cont.ID), port.Port(), "root", rootPassword,
82+
),
83+
logger: logger,
84+
client: dockerClient,
85+
containerId: cont.ID,
86+
containerName: containerName,
10787
}
10888

10989
for attempt := 1; ; attempt++ {

internal/services/redis/docker.go

Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,15 @@ import (
77
"github.com/docker/docker/api/types/container"
88
"github.com/docker/docker/api/types/network"
99
"github.com/docker/docker/client"
10-
"github.com/docker/go-connections/nat"
1110
"github.com/icinga/icinga-testing/services"
1211
"github.com/icinga/icinga-testing/utils"
1312
"go.uber.org/zap"
14-
"strconv"
1513
"sync"
1614
"sync/atomic"
1715
"time"
1816
)
1917

20-
const PORT = "6379/tcp"
18+
const PORT = "6379"
2119

2220
type dockerCreator struct {
2321
logger *zap.Logger
@@ -59,29 +57,11 @@ func (r *dockerCreator) CreateRedisServer() services.RedisServerBase {
5957
panic(err)
6058
}
6159

62-
portNumber, err := utils.GetFreePort()
63-
if err != nil {
64-
panic(err)
65-
}
66-
port, err := nat.NewPort("tcp", strconv.Itoa(portNumber))
67-
if err != nil {
68-
panic(err)
69-
}
60+
port := utils.NewPortDecision(r.dockerClient, PORT)
7061

7162
cont, err := r.dockerClient.ContainerCreate(context.Background(), &container.Config{
72-
ExposedPorts: nat.PortSet{
73-
port: struct{}{},
74-
PORT: struct{}{},
75-
},
7663
Image: dockerImage,
77-
}, &container.HostConfig{PortBindings: nat.PortMap{
78-
PORT: []nat.PortBinding{
79-
{
80-
HostIP: "0.0.0.0",
81-
HostPort: port.Port(),
82-
},
83-
},
84-
}}, &network.NetworkingConfig{
64+
}, &container.HostConfig{PortBindings: port.Map()}, &network.NetworkingConfig{
8565
EndpointsConfig: map[string]*network.EndpointSettings{
8666
networkName: {
8767
NetworkID: r.dockerNetworkId,
@@ -112,7 +92,7 @@ func (r *dockerCreator) CreateRedisServer() services.RedisServerBase {
11292

11393
s := &dockerServer{
11494
info: info{
115-
host: utils.MustString(utils.DockerContainerAddress(context.Background(), r.dockerClient, cont.ID)),
95+
host: port.Address(context.Background(), r.dockerClient, cont.ID),
11696
port: port.Port(),
11797
},
11898
redisDocker: r,

utils/docker.go

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,6 @@ import (
1212
)
1313

1414
func DockerContainerAddress(ctx context.Context, _client *client.Client, id string) (string, error) {
15-
url, err := client.ParseHostURL(_client.DaemonHost())
16-
if err != nil {
17-
return "", err
18-
}
19-
if url.Scheme != "unix" {
20-
return url.Hostname(), nil
21-
}
22-
2315
info, err := _client.ContainerInspect(ctx, id)
2416
if err != nil {
2517
return "", err

utils/port.go

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,68 @@
11
package utils
22

3-
import "net"
3+
import (
4+
"context"
5+
"fmt"
6+
"github.com/docker/docker/client"
7+
"github.com/docker/go-connections/nat"
8+
"net"
9+
"strconv"
10+
)
11+
12+
type PortDecision struct {
13+
dockerHost string
14+
exposed string
15+
port string
16+
remote bool
17+
}
18+
19+
func NewPortDecision(c *client.Client, port string) *PortDecision {
20+
url, err := client.ParseHostURL(c.DaemonHost())
21+
if err != nil {
22+
panic(err)
23+
}
24+
p := &PortDecision{port: port}
25+
if url.Scheme != "unix" {
26+
portNumber, err := GetFreePort()
27+
if err != nil {
28+
panic(err)
29+
}
30+
p.dockerHost = url.Hostname()
31+
p.exposed = strconv.Itoa(portNumber)
32+
p.remote = true
33+
} else {
34+
p.exposed = port
35+
}
36+
37+
return p
38+
}
39+
40+
func (p *PortDecision) Address(ctx context.Context, c *client.Client, id string) string {
41+
if p.remote {
42+
return p.dockerHost
43+
}
44+
45+
return MustString(DockerContainerAddress(ctx, c, id))
46+
}
47+
48+
func (p *PortDecision) Map() nat.PortMap {
49+
if p.remote {
50+
return nat.PortMap{
51+
nat.Port(fmt.Sprintf("%s/tcp", p.port)): []nat.PortBinding{
52+
{
53+
HostIP: "0.0.0.0",
54+
HostPort: p.exposed,
55+
},
56+
},
57+
}
58+
}
59+
60+
return nil
61+
}
62+
63+
func (p *PortDecision) Port() string {
64+
return p.exposed
65+
}
466

567
func GetFreePort() (int, error) {
668
addr, err := net.ResolveTCPAddr("tcp", ":0")

0 commit comments

Comments
 (0)