github.com/tommi2day/gomodules@v1.13.2-0.20240423190010-b7d55d252a27/pwlib/kms_docker_test.go (about) 1 package pwlib 2 3 import ( 4 "fmt" 5 "net" 6 "os" 7 "time" 8 9 "github.com/tommi2day/gomodules/common" 10 "github.com/tommi2day/gomodules/test" 11 12 "github.com/ory/dockertest/v3" 13 "github.com/ory/dockertest/v3/docker" 14 ) 15 16 const kmsImage = "docker.io/nsmithuk/local-kms" 17 const kmsImageTag = "3.12.0" 18 const kmsContainerTimeout = 120 19 const kmsPort = 18080 20 21 var kmsContainerName string 22 var kmsHost = common.GetEnv("KMS_HOST", "127.0.0.1") 23 var kmsAddress = fmt.Sprintf("http://%s:%d", kmsHost, kmsPort) 24 25 // https://github.com/nsmithuk/local-kms 26 // prepareKmsContainer create an Oracle Docker Container 27 func prepareKmsContainer() (kmsContainer *dockertest.Resource, err error) { 28 if os.Getenv("SKIP_KMS") != "" { 29 err = fmt.Errorf("skipping KMS Container in CI environment") 30 return 31 } 32 kmsContainerName = os.Getenv("KMS_CONTAINER_NAME") 33 if kmsContainerName == "" { 34 kmsContainerName = "pwlib-kms" 35 } 36 pool, err := common.GetDockerPool() 37 if err != nil { 38 err = fmt.Errorf("cannot attach to docker: %v", err) 39 return 40 } 41 42 vendorImagePrefix := os.Getenv("VENDOR_IMAGE_PREFIX") 43 repoString := vendorImagePrefix + kmsImage 44 45 fmt.Printf("Try to start docker kmsContainer for %s:%s\n", kmsImage, kmsImageTag) 46 kmsContainer, err = pool.RunWithOptions(&dockertest.RunOptions{ 47 Repository: repoString, 48 Tag: kmsImageTag, 49 Env: []string{ 50 "PORT=8080", 51 "KMS_ACCOUNT_ID=111122223333", 52 "KMS_REGION=eu-central-1", 53 "KMS_SEED_PATH=/init/seed.yaml", 54 "KMS_DATA_PATH=/data", 55 }, 56 Hostname: kmsContainerName, 57 Name: kmsContainerName, 58 ExposedPorts: []string{"8080"}, 59 PortBindings: map[docker.Port][]docker.PortBinding{ 60 "8080": { 61 {HostIP: "0.0.0.0", HostPort: fmt.Sprintf("%d", kmsPort)}, 62 }, 63 }, 64 Mounts: []string{ 65 test.TestDir + "/docker/kms/init:/init", 66 }, 67 }, func(config *docker.HostConfig) { 68 // set AutoRemove to true so that stopped kmsContainer goes away by itself 69 config.AutoRemove = true 70 config.RestartPolicy = docker.RestartPolicy{Name: "no"} 71 }) 72 73 if err != nil { 74 err = fmt.Errorf("error starting vault docker kmsContainer: %v", err) 75 return 76 } 77 78 pool.MaxWait = kmsContainerTimeout * time.Second 79 // host, port := common.GetContainerHostAndPort(kmsContainer, "8080/tcp") 80 81 fmt.Printf("Wait to successfully connect to KMS with %s (max %ds)...\n", kmsAddress, kmsContainerTimeout) 82 start := time.Now() 83 var c net.Conn 84 if err = pool.Retry(func() error { 85 c, err = net.Dial("tcp", fmt.Sprintf("%s:%d", kmsHost, kmsPort)) 86 if err != nil { 87 fmt.Printf("Err:%s\n", err) 88 } 89 return err 90 }); err != nil { 91 fmt.Printf("Could not connect to KMS Container: %d", err) 92 return 93 } 94 _ = c.Close() 95 96 // wait 5s to init kmsContainer 97 time.Sleep(5 * time.Second) 98 elapsed := time.Since(start) 99 fmt.Printf("Local KMS Container is available after %s\n", elapsed.Round(time.Millisecond)) 100 err = nil 101 return 102 }