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

Commit 36d5bbb

Browse files
authored
fix(azure)!: Unwraps the value returned from Azure Key vault (migration: "property: value" -> remove property selector) (#460)
Previously secret value was wrapped in an object { "value": <secret> } while now <secret> will be returned so KES features can be properly used
1 parent da09d37 commit 36d5bbb

File tree

3 files changed

+34
-8
lines changed

3 files changed

+34
-8
lines changed

README.md

-1
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,6 @@ spec:
422422
data:
423423
- key: hello-service/credentials
424424
name: password
425-
property: value
426425
```
427426

428427
Due to the way Azure handles binary files, you need to explicitly let the ExternalSecret know that the secret is binary.

lib/backends/azure-keyvault-backend.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class AzureKeyVaultBackend extends KVBackend {
3838
if (keyOptions && keyOptions.isBinary) {
3939
return Buffer.from(secret.value, 'base64')
4040
}
41-
return JSON.stringify(secret)
41+
return secret.value
4242
}
4343
}
4444

lib/backends/azure-keyvault-backend.test.js

+33-6
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,20 @@ describe('AzureKeyVaultBackend', () => {
1515
const secret = 'fakeSecretPropertyValue'
1616
const key = 'password'
1717
const keyVaultName = 'vault_name'
18-
const quotedSecretValue = '"' + secret + '"'
18+
const quotedSecretValueAsBase64 = Buffer.from(secret).toString('base64')
19+
20+
const azureSecret = {
21+
properties: {},
22+
value: secret,
23+
name: key
24+
}
1925

2026
beforeEach(() => {
2127
credentialMock = sinon.mock()
2228
loggerMock = sinon.mock()
2329
credentialFactoryMock = sinon.fake.returns(credentialMock)
2430
clientMock = sinon.mock()
31+
clientMock.getSecret = sinon.stub().returns(azureSecret)
2532
loggerMock.info = sinon.stub()
2633

2734
azureKeyVaultBackend = new AzureKeyVaultBackend({
@@ -32,18 +39,38 @@ describe('AzureKeyVaultBackend', () => {
3239
})
3340

3441
describe('_get', () => {
35-
beforeEach(() => {
36-
clientMock.getSecret = sinon.stub().returns(secret)
37-
})
38-
3942
it('returns secret property value', async () => {
4043
const secretPropertyValue = await azureKeyVaultBackend._get({
4144
key: key,
4245
specOptions: {
4346
keyVaultName: keyVaultName
4447
}
4548
})
46-
expect(secretPropertyValue).equals(quotedSecretValue)
49+
expect(secretPropertyValue).equals(secret)
50+
})
51+
})
52+
53+
describe('getSecretManifestData', () => {
54+
it('returns secret property value', async () => {
55+
const returnedData = await azureKeyVaultBackend.getSecretManifestData({
56+
spec: {
57+
backendType: 'vault',
58+
keyVaultName: keyVaultName,
59+
data: [{
60+
key: key,
61+
name: 'name-in-k8s'
62+
}]
63+
}
64+
})
65+
66+
// First, we get the client...
67+
sinon.assert.calledWith(azureKeyVaultBackend._keyvaultClient, { keyVaultName })
68+
69+
// ... then we fetch the secret ...
70+
sinon.assert.calledWith(clientMock.getSecret, key)
71+
72+
// ... and expect to get the full proper value
73+
expect(returnedData['name-in-k8s']).equals(quotedSecretValueAsBase64)
4774
})
4875
})
4976
})

0 commit comments

Comments
 (0)