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  }