Skip to content

Commit 6b32abf

Browse files
authored
create kind network (#67)
* create kind network * ensure container is removed * add tcp connection check * add retry * remove container after failure Signed-off-by: Manabu Mccloskey <[email protected]>
1 parent f6a3d8b commit 6b32abf

File tree

2 files changed

+91
-14
lines changed

2 files changed

+91
-14
lines changed

pkg/controllers/gitserver/image_test.go

Lines changed: 65 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,16 @@ package gitserver
33
import (
44
"context"
55
"fmt"
6+
"github.com/cnoe-io/idpbuilder/pkg/kind"
7+
"github.com/docker/docker/api/types/container"
8+
"github.com/docker/go-connections/nat"
9+
"io"
10+
"net"
11+
"os"
12+
"strconv"
613
"strings"
714
"testing"
15+
"time"
816

917
"github.com/cnoe-io/idpbuilder/api/v1alpha1"
1018
"github.com/cnoe-io/idpbuilder/pkg/apps"
@@ -39,23 +47,74 @@ func TestReconcileGitServerImage(t *testing.T) {
3947
},
4048
}
4149

42-
_, err = r.reconcileGitServerImage(ctx, controllerruntime.Request{}, &resource)
50+
dockerClient, err := docker.GetDockerClient()
51+
if err != nil {
52+
t.Errorf("Getting docker client: %v", err)
53+
}
54+
defer dockerClient.Close()
55+
reader, err := dockerClient.ImagePull(ctx, "docker.io/library/registry:2", types.ImagePullOptions{})
56+
defer reader.Close()
57+
// blocks until pull is completed
58+
io.Copy(os.Stdout, reader)
4359
if err != nil {
44-
t.Errorf("reconcile error: %v", err)
60+
t.Fatalf("failed pulilng registry image: %v", err)
4561
}
4662

47-
if !strings.HasPrefix(resource.Status.ImageID, "sha256") {
48-
t.Errorf("Invalid or no Image ID in status: %q", resource.Status.ImageID)
63+
waitTimeout := time.Second * 90
64+
waitInterval := time.Second * 3
65+
// very crude. no guarantee that the port will be available by the time request is sent to docker
66+
endTime := time.Now().Add(waitTimeout)
67+
for {
68+
if time.Now().After(endTime) {
69+
t.Fatalf("Timed out waiting for port %d to be available", kind.ExposedRegistryPort)
70+
}
71+
conn, cErr := net.DialTimeout("tcp", net.JoinHostPort("0.0.0.0", strconv.Itoa(int(kind.ExposedRegistryPort))), time.Second*3)
72+
if cErr != nil {
73+
break
74+
}
75+
conn.Close()
76+
time.Sleep(waitInterval)
4977
}
5078

51-
dockerClient, err := docker.GetDockerClient()
79+
resp, err := dockerClient.ContainerCreate(ctx, &container.Config{
80+
Image: "docker.io/library/registry:2",
81+
Tty: false,
82+
ExposedPorts: nat.PortSet{
83+
nat.Port(fmt.Sprintf("%d/tcp", kind.InternalRegistryPort)): struct{}{},
84+
},
85+
}, &container.HostConfig{
86+
PortBindings: nat.PortMap{
87+
nat.Port(fmt.Sprintf("%d/tcp", kind.InternalRegistryPort)): []nat.PortBinding{
88+
{
89+
HostIP: "0.0.0.0",
90+
HostPort: fmt.Sprintf("%d", kind.ExposedRegistryPort),
91+
},
92+
},
93+
},
94+
}, nil, nil, "testcase-registry")
5295
if err != nil {
53-
t.Errorf("Getting docker client: %v", err)
96+
t.Fatalf("failed creating registry container %v", err)
5497
}
5598

99+
defer dockerClient.ContainerRemove(ctx, resp.ID, types.ContainerRemoveOptions{Force: true})
100+
101+
err = dockerClient.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{})
102+
if err != nil {
103+
t.Fatalf("failed starting container %v", err)
104+
}
105+
106+
_, err = r.reconcileGitServerImage(ctx, controllerruntime.Request{}, &resource)
107+
if err != nil {
108+
t.Fatalf("reconcile error: %v", err)
109+
}
110+
111+
if !strings.HasPrefix(resource.Status.ImageID, "sha256") {
112+
t.Fatalf("Invalid or no Image ID in status: %q", resource.Status.ImageID)
113+
}
56114
imageNameID := fmt.Sprintf("%s@%s", GetImageTag(&resource), resource.Status.ImageID)
57115
_, err = dockerClient.ImageRemove(ctx, imageNameID, types.ImageRemoveOptions{})
58116
if err != nil {
59117
t.Errorf("Removing docker image: %v", err)
60118
}
61119
}
120+

pkg/kind/registry_test.go

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package kind
33
import (
44
"context"
55
"testing"
6+
"time"
67

78
"github.com/cnoe-io/idpbuilder/pkg/docker"
89
"github.com/docker/docker/api/types"
@@ -19,23 +20,44 @@ func TestReconcileRegistry(t *testing.T) {
1920
}
2021
defer dockerCli.Close()
2122

23+
kindNetwork, err := dockerCli.NetworkCreate(ctx, "kind", types.NetworkCreate{})
24+
if err != nil {
25+
t.Fatalf("Failed creaking kind network: %v", err)
26+
}
27+
defer dockerCli.NetworkRemove(ctx, kindNetwork.ID)
28+
2229
// Create cluster
2330
cluster, err := NewCluster("testcase", "v1.26.3", "", "", "")
2431
if err != nil {
2532
t.Fatalf("Initializing cluster resource: %v", err)
2633
}
2734

2835
// Create registry
29-
err = cluster.ReconcileRegistry(ctx)
30-
if err != nil {
31-
t.Fatalf("Error reconciling registry: %v", err)
36+
defer dockerCli.ContainerRemove(ctx, cluster.getRegistryContainerName(), types.ContainerRemoveOptions{Force: true})
37+
waitTimeout := time.Second * 90
38+
waitInterval := time.Second * 3
39+
endTime := time.Now().Add(waitTimeout)
40+
41+
for {
42+
if time.Now().After(endTime) {
43+
t.Fatalf("Timed out waiting for registry. recent error: %v", err)
44+
}
45+
err = cluster.ReconcileRegistry(ctx)
46+
if err == nil {
47+
break
48+
}
49+
t.Logf("Failed to reconcile: %v", err)
50+
dockerCli.ContainerRemove(ctx, cluster.getRegistryContainerName(), types.ContainerRemoveOptions{Force: true})
51+
time.Sleep(waitInterval)
3252
}
3353

3454
// Get resulting container
3555
container, err := cluster.getRegistryContainer(ctx, dockerCli)
3656
if err != nil {
3757
t.Fatalf("Error getting registry container after reconcile: %v", err)
3858
}
59+
defer dockerCli.ImageRemove(ctx, container.ImageID, types.ImageRemoveOptions{})
60+
3961
if container == nil {
4062
t.Fatal("Expected registry container after reconcile but got nil")
4163
}
@@ -45,9 +67,5 @@ func TestReconcileRegistry(t *testing.T) {
4567
if err != nil {
4668
t.Fatalf("Error reconciling registry: %v", err)
4769
}
48-
49-
// Cleanup
50-
if err = dockerCli.ContainerRemove(ctx, container.ID, types.ContainerRemoveOptions{Force: true}); err != nil {
51-
t.Fatalf("Error removing registry docker container after reconcile: %v", err)
52-
}
5370
}
71+

0 commit comments

Comments
 (0)