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  }