Skip to content
This repository was archived by the owner on Jul 26, 2022. It is now read-only.

Commit 4273598

Browse files
authored
fix!: Handle JSON in GCP Secrets Manager (#373)
BREAKING CHANGE: Changes the values return type from GCP secret manager Previously secret value was wrapped in an object `{ "value": <secret> }` while now `<secret>` will be returned directly so KES features can be properly used
1 parent d0f3451 commit 4273598

File tree

3 files changed

+20
-14
lines changed

3 files changed

+20
-14
lines changed

examples/hello-service-external-secret-gcp.yml

+12-4
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,16 @@ metadata:
44
name: gcp-secrets-manager-example
55
spec:
66
backendType: gcpSecretsManager
7-
projectId: my-gsm-secret-project
7+
# Project to use for GCP Secrets Manager (use the service account project by default)
8+
projectId: hello-service-project-id
89
data:
9-
- key: my-gsm-secret-name
10-
name: my-kubernetes-secret-name
11-
version: latest
10+
# Key in GCP Secrets Manager (without projet and version)
11+
- key: hello-service-password
12+
# Key to use in Kubernetes secret (not the secret name, who is determined by metadata.name)
13+
name: password
14+
# If the secret is a valid JSON, try to get this property
15+
property: value
16+
# Version of the secret (default: 'latest')
17+
version: 1
18+
# If the secret is encoded in base64 then decodes it (default: false)
19+
isBinary: false

lib/backends/gcp-secrets-manager-backend.js

+7-9
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class GCPSecretsManagerBackend extends KVBackend {
2323

2424
/**
2525
* Get secret property value from GCP Secrets Manager.
26-
* @param {string} key - Key used to store secret property value in Azure Key Vault.
26+
* @param {string} key - Key used to store secret property value in GCP Secrets Manager.
2727
* @param {string} specOptions.projectId - Id of the gcp project, if not passed, this will be fetched from the client auth
2828
* @param {string} keyOptions.version - If version is passed then fetch that version, else fetch the latest version
2929
* @returns {Promise} Promise object representing secret property value.
@@ -34,11 +34,8 @@ class GCPSecretsManagerBackend extends KVBackend {
3434
projectId = this._getProjectId()
3535
}
3636

37-
let secretVersion
38-
if (!keyOptions || !keyOptions.version) {
39-
// get the latest version
40-
secretVersion = 'latest'
41-
} else {
37+
let secretVersion = 'latest'
38+
if (keyOptions && keyOptions.version) {
4239
secretVersion = keyOptions.version
4340
}
4441

@@ -47,12 +44,13 @@ class GCPSecretsManagerBackend extends KVBackend {
4744
const version = await this._client.accessSecretVersion({
4845
name: 'projects/' + projectId + '/secrets/' + key + '/versions/' + secretVersion
4946
})
50-
const secret = { value: version[0].payload.data.toString('utf8') }
47+
const secret = version[0].payload.data.toString('utf8')
5148
// Handle binary files - this is useful when you've stored a base64 encoded string
5249
if (keyOptions && keyOptions.isBinary) {
53-
return Buffer.from(secret.value, 'base64')
50+
return Buffer.from(secret, 'base64')
5451
}
55-
return JSON.stringify(secret)
52+
53+
return secret
5654
}
5755
}
5856

lib/backends/gcp-secrets-manager-backend.test.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ describe('GCPSecretsManagerBackend', () => {
1212
let gcpSecretsManagerBackend
1313
const key = 'password'
1414
const version = [{ name: 'projects/111122223333/secrets/password/versions/1', payload: { data: Buffer.from('test', 'utf8') } }, null, null]
15-
const secret = '{"value":"test"}'
15+
const secret = 'test'
1616

1717
beforeEach(() => {
1818
loggerMock = sinon.mock()

0 commit comments

Comments
 (0)