You've already forked sap-jenkins-library
mirror of
https://github.com/SAP/jenkins-library.git
synced 2025-09-16 09:26:22 +02:00
feat(Vault): custom prefix for test credentials (#3043)
Co-authored-by: Sven Merk <33895725+nevskrem@users.noreply.github.com>
This commit is contained in:
@@ -117,4 +117,10 @@ The `vaultTestCredentialPath` parameter is the endpoint of your credential path
|
||||
|
||||
The `vaultTestCredentialKeys`parameter is a list of credential IDs. The secret value of the credential will be exposed as an environment variable prefixed by "PIPER_TESTCREDENTIAL_" and transformed to a valid variable name. For a credential ID named `myAppId` the forwarded environment variable to the step will be `PIPER_TESTCREDENTIAL_MYAPPID` containing the secret. Hyphens will be replaced by underscores and other non-alphanumeric characters will be removed.
|
||||
|
||||
!!! hint "Using a custom prefix for test credentials"
|
||||
By default the prefix for test credentials is `PIPER_TESTCREDENTIAL_`.
|
||||
|
||||
It is possible to use a custom prefix by setting for example `vaultTestCredentialEnvPrefix: MY_CUSTOM_PREFIX` in your configuration.
|
||||
With this above credential ID named `myAppId` will be populated into an environment variable with the name `MY_CUSTOM_PREFIX_MYAPPID`.
|
||||
|
||||
Extended logging for vault secret fetching (e.g. found credentials and environment variable names) can be activated via `verbose: true` configuration.
|
||||
|
@@ -15,7 +15,7 @@ import (
|
||||
const (
|
||||
vaultTestCredentialPath = "vaultTestCredentialPath"
|
||||
vaultTestCredentialKeys = "vaultTestCredentialKeys"
|
||||
vaultTestCredentialEnvPrefix = "PIPER_TESTCREDENTIAL_"
|
||||
vaultTestCredentialEnvPrefix_Default = "PIPER_TESTCREDENTIAL_"
|
||||
)
|
||||
|
||||
var (
|
||||
@@ -27,6 +27,7 @@ var (
|
||||
"vaultBasePath",
|
||||
"vaultPipelineName",
|
||||
"vaultPath",
|
||||
"vaultTestCredentialEnvPrefix",
|
||||
"skipVault",
|
||||
"vaultDisableOverwrite",
|
||||
vaultTestCredentialPath,
|
||||
@@ -165,7 +166,7 @@ func resolveVaultTestCredentials(config *StepConfig, client vaultClient) {
|
||||
continue
|
||||
}
|
||||
secretsResolved := false
|
||||
secretsResolved = populateTestCredentialsAsEnvs(secret, keys)
|
||||
secretsResolved = populateTestCredentialsAsEnvs(config, secret, keys)
|
||||
if secretsResolved {
|
||||
// prevent overwriting resolved secrets
|
||||
// only allows vault test credentials on one / the same vault path
|
||||
@@ -174,7 +175,12 @@ func resolveVaultTestCredentials(config *StepConfig, client vaultClient) {
|
||||
}
|
||||
}
|
||||
|
||||
func populateTestCredentialsAsEnvs(secret map[string]string, keys []string) (matched bool) {
|
||||
func populateTestCredentialsAsEnvs(config *StepConfig, secret map[string]string, keys []string) (matched bool) {
|
||||
|
||||
vaultTestCredentialEnvPrefix, ok := config.Config["vaultTestCredentialEnvPrefix"].(string)
|
||||
if !ok || len(vaultTestCredentialEnvPrefix) == 0 {
|
||||
vaultTestCredentialEnvPrefix = vaultTestCredentialEnvPrefix_Default
|
||||
}
|
||||
for secretKey, secretValue := range secret {
|
||||
for _, key := range keys {
|
||||
if secretKey == key {
|
||||
|
@@ -219,7 +219,10 @@ func addAlias(param *StepParameters, aliasName string) {
|
||||
param.Aliases = append(param.Aliases, alias)
|
||||
}
|
||||
|
||||
func Test_resolveVaultTestCredentials(t *testing.T) {
|
||||
func TestResolveVaultTestCredentials(t *testing.T) {
|
||||
t.Parallel()
|
||||
t.Run("Default credential prefix", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
// init
|
||||
vaultMock := &mocks.VaultMock{}
|
||||
envPrefix := "PIPER_TESTCREDENTIAL_"
|
||||
@@ -245,6 +248,37 @@ func Test_resolveVaultTestCredentials(t *testing.T) {
|
||||
assert.NotEmpty(t, os.Getenv(env))
|
||||
assert.Equal(t, os.Getenv(env), v)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("Custom credential prefix", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
// init
|
||||
vaultMock := &mocks.VaultMock{}
|
||||
envPrefix := "CUSTOM_CREDENTIAL_"
|
||||
stepConfig := StepConfig{Config: map[string]interface{}{
|
||||
"vaultPath": "team1",
|
||||
"vaultTestCredentialPath": "appCredentials",
|
||||
"vaultTestCredentialKeys": []interface{}{"appUser", "appUserPw"},
|
||||
"vaultTestCredentialEnvPrefix": envPrefix,
|
||||
}}
|
||||
|
||||
defer os.Unsetenv("CUSTOM_CREDENTIAL_APPUSER")
|
||||
defer os.Unsetenv("CUSTOM_CREDENTIAL_APPUSERPW")
|
||||
|
||||
// mock
|
||||
vaultData := map[string]string{"appUser": "test-user", "appUserPw": "password1234"}
|
||||
vaultMock.On("GetKvSecret", "team1/appCredentials").Return(vaultData, nil)
|
||||
|
||||
// test
|
||||
resolveVaultTestCredentials(&stepConfig, vaultMock)
|
||||
|
||||
// assert
|
||||
for k, v := range vaultData {
|
||||
env := envPrefix + strings.ToUpper(k)
|
||||
assert.NotEmpty(t, os.Getenv(env))
|
||||
assert.Equal(t, os.Getenv(env), v)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func Test_convertEnvVar(t *testing.T) {
|
||||
|
Reference in New Issue
Block a user