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