* refact(e2e): Move cleanup steps into each test The migration test needed to create some resources, but doesn't care about cleaning up because the test would take care of spinning down the docker container that it's using. To maintain flexibility going forward, we'll establish that tests are responsible for cleaning up (rather than the methods they use) * refact(e2e): Use new env var for skip check Currently, the e2e tests use the E2E_PASSWORD_AUTH_METHOD_ID environment variable to determine if the test should be skipped. However, the new migration test does not require a pre-existing boundary cluster and would not have this environment variable. As a result, we needed an alternative way to check if an e2e test should be skipped when running tests in ci. * refact(e2e): Create more common boundary methods * fix(e2e): Set to string value Co-authored-by: Johan Brandhorst-Satzkorn <johan.brandhorst@gmail.com>
142 lines
4.1 KiB
Go
142 lines
4.1 KiB
Go
// Package vault provides methods for commonly used vault actions that are used in end-to-end tests.
|
|
package vault
|
|
|
|
import (
|
|
"context"
|
|
"embed"
|
|
"fmt"
|
|
"os"
|
|
"testing"
|
|
|
|
"github.com/hashicorp/boundary/testing/internal/e2e"
|
|
"github.com/hashicorp/go-secure-stdlib/base62"
|
|
"github.com/kelseyhightower/envconfig"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
//go:embed testdata/boundary-controller-policy.hcl
|
|
var boundaryPolicyFile embed.FS
|
|
|
|
type config struct {
|
|
VaultAddr string `envconfig:"VAULT_ADDR" required:"true"` // e.g. "http://127.0.0.1:8200"
|
|
VaultToken string `envconfig:"VAULT_TOKEN" required:"true"`
|
|
}
|
|
|
|
type CreateTokenResponse struct {
|
|
Auth struct {
|
|
Client_Token string
|
|
}
|
|
}
|
|
|
|
func loadConfig() (*config, error) {
|
|
var c config
|
|
err := envconfig.Process("", &c)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &c, err
|
|
}
|
|
|
|
// Setup verifies if appropriate credentials are set and adds the boundary controller
|
|
// policy to vault. Returns the vault address.
|
|
func Setup(t testing.TB) (vaultAddr string, boundaryPolicyName string, kvPolicyFilePath string) {
|
|
c, err := loadConfig()
|
|
require.NoError(t, err)
|
|
vaultAddr = c.VaultAddr
|
|
|
|
// Set up boundary policy
|
|
data, err := boundaryPolicyFile.ReadFile("testdata/boundary-controller-policy.hcl")
|
|
require.NoError(t, err)
|
|
boundaryPolicyFilePath := fmt.Sprintf("%s/%s", t.TempDir(), "boundary-controller-policy.hcl")
|
|
f, err := os.Create(boundaryPolicyFilePath)
|
|
require.NoError(t, err)
|
|
_, err = f.WriteString(string(data))
|
|
require.NoError(t, err)
|
|
|
|
boundaryPolicyName = WritePolicy(t, context.Background(), boundaryPolicyFilePath)
|
|
|
|
// Create kv policy
|
|
kvPolicyFilePath = fmt.Sprintf("%s/%s", t.TempDir(), "kv-policy.hcl")
|
|
_, err = os.Create(kvPolicyFilePath)
|
|
require.NoError(t, err)
|
|
|
|
return
|
|
}
|
|
|
|
// CreateKvPrivateKeyCredential creates a private key credential in vault and creates a vault policy
|
|
// to be able to read that credential. Returns the name of the policy.
|
|
func CreateKvPrivateKeyCredential(t testing.TB, secretPath string, user string, keyPath string, kvPolicyFilePath string) string {
|
|
secretName, err := base62.Random(16)
|
|
require.NoError(t, err)
|
|
|
|
// Update policy file
|
|
f, err := os.OpenFile(kvPolicyFilePath, os.O_APPEND|os.O_WRONLY, 0o644)
|
|
require.NoError(t, err)
|
|
_, err = f.WriteString(fmt.Sprintf("path \"%s/data/%s\" { capabilities = [\"read\"] }\n",
|
|
secretPath,
|
|
secretName,
|
|
))
|
|
require.NoError(t, err)
|
|
|
|
// Create secret
|
|
output := e2e.RunCommand(context.Background(), "vault",
|
|
e2e.WithArgs(
|
|
"kv", "put",
|
|
"-mount", secretPath,
|
|
secretName,
|
|
"username="+user,
|
|
"private_key=@"+keyPath,
|
|
),
|
|
)
|
|
require.NoError(t, output.Err, string(output.Stderr))
|
|
|
|
return secretName
|
|
}
|
|
|
|
// CreateKvPasswordCredential creates a username/password credential in vault and creates a vault
|
|
// policy to be able to read that credential. Returns the name of the policy
|
|
func CreateKvPasswordCredential(t testing.TB, secretPath string, user string, kvPolicyFilePath string) (secretName string, password string) {
|
|
secretName, err := base62.Random(16)
|
|
require.NoError(t, err)
|
|
|
|
// Update policy file
|
|
f, err := os.OpenFile(kvPolicyFilePath, os.O_APPEND|os.O_WRONLY, 0o644)
|
|
require.NoError(t, err)
|
|
_, err = f.WriteString(fmt.Sprintf("path \"%s/data/%s\" { capabilities = [\"read\"] }\n",
|
|
secretPath,
|
|
secretName,
|
|
))
|
|
require.NoError(t, err)
|
|
|
|
// Create secret
|
|
password, err = base62.Random(16)
|
|
require.NoError(t, err)
|
|
output := e2e.RunCommand(context.Background(), "vault",
|
|
e2e.WithArgs(
|
|
"kv", "put",
|
|
"-mount", secretPath,
|
|
secretName,
|
|
"username="+user,
|
|
"password="+password,
|
|
),
|
|
)
|
|
require.NoError(t, output.Err, string(output.Stderr))
|
|
|
|
return
|
|
}
|
|
|
|
// WritePolicy adds a policy to vault. Provide a name for the policy that you want to create as well
|
|
// as the path to the file that contains the policy definition. Returns a policy name
|
|
func WritePolicy(t testing.TB, ctx context.Context, policyFilePath string) string {
|
|
policyName, err := base62.Random(16)
|
|
require.NoError(t, err)
|
|
|
|
output := e2e.RunCommand(ctx, "vault",
|
|
e2e.WithArgs("policy", "write", policyName, policyFilePath),
|
|
)
|
|
require.NoError(t, output.Err, string(output.Stderr))
|
|
|
|
return policyName
|
|
}
|