snapshot_test: fix docker cleanup issue when test fail
Signed-off-by: yxxhero <aiopsclub@163.com>
This commit is contained in:
parent
7219273d3b
commit
1715e3e3a3
|
|
@ -4,6 +4,7 @@ import (
|
|||
"bufio"
|
||||
"context"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
|
|
@ -172,21 +173,29 @@ func testHelmfileTemplateWithBuildCommand(t *testing.T, goccyGoYaml bool) {
|
|||
// run the docker registry v2 and push the test charts to the registry
|
||||
// so that it can be accessed by helm and helmfile as a oci registry based chart repository.
|
||||
if config.LocalDockerRegistry.Enabled {
|
||||
containerName := strings.Join([]string{"helmfile_docker_registry", name}, "_")
|
||||
containerName := strings.Join([]string{
|
||||
"helmfile_docker_registry",
|
||||
name,
|
||||
strconv.FormatInt(time.Now().UnixNano(), 10)}, "_")
|
||||
|
||||
hostPort := config.LocalDockerRegistry.Port
|
||||
if hostPort <= 0 {
|
||||
hostPort = 5000
|
||||
}
|
||||
|
||||
execDocker(t, "run", "--rm", "-d", "-p", fmt.Sprintf("%d:5000", hostPort), "--name", containerName, "registry:2")
|
||||
t.Cleanup(func() {
|
||||
execDocker(t, "stop", containerName)
|
||||
})
|
||||
containerPort := fmt.Sprintf("%d:5000", hostPort)
|
||||
|
||||
// FIXME: this is a hack to wait for registry to be up and running
|
||||
// please replace with proper wait for registry
|
||||
time.Sleep(5 * time.Second)
|
||||
// Register cleanup BEFORE starting the container
|
||||
t.Cleanup(func() {
|
||||
cmd := exec.Command("docker", "stop", containerName)
|
||||
_ = cmd.Run() // Ignore errors during cleanup
|
||||
})
|
||||
execDocker(t, "run", "--rm", "-d", "-p", containerPort, "--name", containerName, "registry:2")
|
||||
|
||||
// Wait for the registry to be ready instead of using time.Sleep
|
||||
if err := waitForRegistry(t, fmt.Sprintf("localhost:%d", hostPort), 30*time.Second); err != nil {
|
||||
t.Fatalf("Registry container failed to become ready: %v", err)
|
||||
}
|
||||
|
||||
// We helm-package and helm-push every test chart saved in the ./testdata/charts directory
|
||||
// to the local registry, so that they can be accessed by helmfile and helm invoked while testing.
|
||||
|
|
@ -376,3 +385,30 @@ func execHelm(t *testing.T, args ...string) string {
|
|||
|
||||
return string(out)
|
||||
}
|
||||
|
||||
func waitForRegistry(t *testing.T, address string, timeout time.Duration) error {
|
||||
t.Helper()
|
||||
|
||||
client := http.Client{
|
||||
Timeout: 1 * time.Second,
|
||||
}
|
||||
|
||||
url := fmt.Sprintf("http://%s/v2/", address)
|
||||
deadline := time.Now().Add(timeout)
|
||||
|
||||
for time.Now().Before(deadline) {
|
||||
resp, err := client.Get(url)
|
||||
if err == nil {
|
||||
resp.Body.Close()
|
||||
if resp.StatusCode == http.StatusOK || resp.StatusCode == http.StatusUnauthorized {
|
||||
// Registry is up - a 200 OK or 401 Unauthorized both indicate the registry is running
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// Wait a bit before trying again
|
||||
time.Sleep(500 * time.Millisecond)
|
||||
}
|
||||
|
||||
return fmt.Errorf("timed out waiting for registry at %s after %s", address, timeout)
|
||||
}
|
||||
Loading…
Reference in New Issue