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

Commit a2a9dff

Browse files
authored
feat: use spec in external secret resource, keeping secretDescriptor for backwards compat (#204)
1 parent 7ccd87e commit a2a9dff

14 files changed

+62
-38
lines changed

README.md

+5-5
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ apiVersion: 'kubernetes-client.io/v1'
120120
kind: ExternalSecret
121121
metadata:
122122
name: hello-service
123-
secretDescriptor:
123+
spec:
124124
backendType: secretsManager
125125
# optional: specify role to assume when retrieving the data
126126
roleArn: arn:aws:iam::123456789012:role/test-role
@@ -142,7 +142,7 @@ apiVersion: 'kubernetes-client.io/v1'
142142
kind: ExternalSecret
143143
metadata:
144144
name: hello-service
145-
secretDescriptor:
145+
spec:
146146
backendType: systemManager
147147
data:
148148
- key: /hello-service/password
@@ -242,7 +242,7 @@ apiVersion: 'kubernetes-client.io/v1'
242242
kind: ExternalSecret
243243
metadata:
244244
name: hello-service
245-
secretDescriptor:
245+
spec:
246246
backendType: secretsManager
247247
# optional: specify role to assume when retrieving the data
248248
roleArn: arn:aws:iam::123456789012:role/test-role
@@ -262,7 +262,7 @@ apiVersion: 'kubernetes-client.io/v1'
262262
kind: ExternalSecret
263263
metadata:
264264
name: hello-service
265-
secretDescriptor:
265+
spec:
266266
backendType: secretsManager
267267
# optional: specify role to assume when retrieving the data
268268
roleArn: arn:aws:iam::123456789012:role/test-role
@@ -277,7 +277,7 @@ apiVersion: 'kubernetes-client.io/v1'
277277
kind: ExternalSecret
278278
metadata:
279279
name: hello-service
280-
secretDescriptor:
280+
spec:
281281
backendType: secretsManager
282282
# optional: specify role to assume when retrieving the data
283283
roleArn: arn:aws:iam::123456789012:role/test-role

api.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ apiVersion: 'kubernetes-client.io/v1'
6767
kind: ExternalSecret
6868
metadata:
6969
name: db-secrets
70-
secretDescriptor:
70+
spec:
7171
backendType: secretsManager
7272
data:
7373
- key: db/password
@@ -79,7 +79,7 @@ apiVersion: 'kubernetes-client.io/v1'
7979
kind: ExternalSecret
8080
metadata:
8181
name: client-secrets
82-
secretDescriptor:
82+
spec:
8383
backendType: secretsManager
8484
data:
8585
- key: api/key

charts/kubernetes-external-secrets/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ apiVersion: 'kubernetes-client.io/v1'
9797
kind: ExternalSecret
9898
metadata:
9999
name: hello-service
100-
secretDescriptor:
100+
spec:
101101
backendType: secretsManager
102102
data:
103103
- key: hello-service/password

examples/dockerconfig-example.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ apiVersion: kubernetes-client.io/v1
22
kind: ExternalSecret
33
metadata:
44
name: dockerhub-secret
5-
secretDescriptor:
5+
spec:
66
backendType: secretsManager
77
type: kubernetes.io/dockerconfigjson
88
data:

examples/hello-service-external-secret.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ apiVersion: 'kubernetes-client.io/v1'
22
kind: ExternalSecret
33
metadata:
44
name: hello-service
5-
secretDescriptor:
5+
spec:
66
backendType: secretsManager
77
data:
88
- key: hello-service/password

examples/secretsmanager-example.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ apiVersion: 'kubernetes-client.io/v1'
22
kind: ExternalSecret
33
metadata:
44
name: demo-service
5-
secretDescriptor:
5+
spec:
66
backendType: secretsManager
77
# optional: specify role to assume when retrieving the data
88
roleArn: arn:aws:iam::123412341234:role/let-other-account-access-secrets

examples/ssm-example.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ apiVersion: 'kubernetes-client.io/v1'
22
kind: ExternalSecret
33
metadata:
44
name: ssm-secret-key
5-
secretDescriptor:
5+
spec:
66
backendType: systemManager
77
# optional: specify role to assume when retrieving the data
88
roleArn: arn:aws:iam::123456789012:role/test-role

examples/tls-example.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ apiVersion: kubernetes-client.io/v1
22
kind: ExternalSecret
33
metadata:
44
name: dockerhub-secret
5-
secretDescriptor:
5+
spec:
66
backendType: secretsManager
77
type: kubernetes.io/tls
88
data:

lib/backends/kv-backend.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -81,12 +81,12 @@ class KVBackend extends AbstractBackend {
8181

8282
/**
8383
* Fetch Kubernetes secret manifest data.
84-
* @param {SecretDescriptor} secretDescriptor - Kubernetes secret descriptor.
84+
* @param {ExternalSecretSpec} spec - Kubernetes ExternalSecret spec.
8585
* @returns {Promise} Promise object representing Kubernetes secret manifest data.
8686
*/
8787
async getSecretManifestData ({
88-
secretDescriptor: {
89-
// Use secretDescriptor.properties to be backwards compatible.
88+
spec: {
89+
// Use properties to be backwards compatible.
9090
properties = [],
9191
data = properties,
9292
dataFrom = [],

lib/backends/kv-backend.test.js

+6-6
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const sinon = require('sinon')
66

77
const KVBackend = require('./kv-backend')
88

9-
describe('SecretsManagerBackend', () => {
9+
describe('kv-backend', () => {
1010
let loggerMock
1111
let kvBackend
1212

@@ -220,7 +220,7 @@ describe('SecretsManagerBackend', () => {
220220

221221
const manifestData = await kvBackend
222222
.getSecretManifestData({
223-
secretDescriptor: { }
223+
spec: { }
224224
})
225225

226226
expect(manifestData).deep.equals({
@@ -238,14 +238,14 @@ describe('SecretsManagerBackend', () => {
238238
kvBackend._fetchDataFromValues.resolves([undefined])
239239

240240
const manifestData = await kvBackend
241-
.getSecretManifestData({ secretDescriptor: { } })
241+
.getSecretManifestData({ spec: { } })
242242

243243
expect(manifestData).deep.equals({})
244244
})
245245

246246
it('makes correct calls - with data and role', async () => {
247247
await kvBackend.getSecretManifestData({
248-
secretDescriptor: {
248+
spec: {
249249
data: [
250250
{
251251
key: 'fakePropertyKey1',
@@ -278,7 +278,7 @@ describe('SecretsManagerBackend', () => {
278278

279279
it('makes correct calls - with properties and dataFrom', async () => {
280280
await kvBackend.getSecretManifestData({
281-
secretDescriptor: {
281+
spec: {
282282
properties: [
283283
{
284284
key: 'fakePropertyKey1',
@@ -313,7 +313,7 @@ describe('SecretsManagerBackend', () => {
313313

314314
it('makes correct calls - with only dataFrom', async () => {
315315
await kvBackend.getSecretManifestData({
316-
secretDescriptor: {
316+
spec: {
317317
dataFrom: [
318318
'fakeDataFromKey1',
319319
'fakeDataFromKey2'

lib/daemon.test.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ describe('Daemon', () => {
4444
namespace: 'foo',
4545
resourceVersion: '1'
4646
},
47-
secretDescriptor: {}
47+
spec: {}
4848
}
4949
}
5050
}())

lib/external-secret.test.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ describe('getExternalSecretEvents', () => {
5454
name: 'my-secret',
5555
namespace: 'default'
5656
},
57-
secretDescriptor: { backendType: 'secretsManager', data: [] }
57+
spec: { backendType: 'secretsManager', data: [] }
5858
}
5959

6060
const events = getExternalSecretEvents({

lib/poller.js

+9-9
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ class Poller {
4949
this._customResourceManifest = customResourceManifest
5050

5151
this._externalSecret = externalSecret
52-
this._secretDescriptor = externalSecret.secretDescriptor
52+
this._spec = externalSecret.spec || externalSecret.secretDescriptor
5353

5454
const { name, uid, namespace } = externalSecret.metadata
5555

@@ -74,10 +74,10 @@ class Poller {
7474
* @returns {Object} Promise object representing Kubernetes manifest.
7575
*/
7676
async _createSecretManifest () {
77-
const secretDescriptor = this._secretDescriptor
78-
const template = secretDescriptor.template
79-
const data = await this._backends[secretDescriptor.backendType]
80-
.getSecretManifestData({ secretDescriptor })
77+
const spec = this._spec
78+
const template = spec.template
79+
const data = await this._backends[spec.backendType]
80+
.getSecretManifestData({ spec })
8181
let secretManifest = {
8282
apiVersion: 'v1',
8383
kind: 'Secret',
@@ -87,7 +87,7 @@ class Poller {
8787
this._ownerReference
8888
]
8989
},
90-
type: secretDescriptor.type || 'Opaque',
90+
type: spec.type || 'Opaque',
9191
data
9292
}
9393

@@ -112,7 +112,7 @@ class Poller {
112112
this._metrics.observeSync({
113113
name: this._name,
114114
namespace: this._namespace,
115-
backend: this._secretDescriptor.backendType,
115+
backend: this._spec.backendType,
116116
status: 'success'
117117
})
118118
} catch (err) {
@@ -122,7 +122,7 @@ class Poller {
122122
this._metrics.observeSync({
123123
name: this._name,
124124
namespace: this._namespace,
125-
backend: this._secretDescriptor.backendType,
125+
backend: this._spec.backendType,
126126
status: 'error'
127127
})
128128
}
@@ -137,7 +137,7 @@ class Poller {
137137

138138
// check if namespace is allowed to fetch this secret
139139
const ns = await kubeNamespace.get()
140-
const verdict = this._isPermitted(ns.body, this._secretDescriptor)
140+
const verdict = this._isPermitted(ns.body, this._spec)
141141

142142
if (!verdict.allowed) {
143143
throw (new Error(`not allowed to fetch secret: ${this._namespace}/${this._name}: ${verdict.reason}`))

lib/poller.test.js

+29-5
Original file line numberDiff line numberDiff line change
@@ -75,14 +75,14 @@ describe('Poller', () => {
7575
}
7676
}
7777

78-
pollerFactory = (secretDescriptor = {
78+
pollerFactory = (spec = {
7979
backendType: 'fakeBackendType',
8080
properties: [
8181
'fakePropertyName1',
8282
'fakePropertyName2'
8383
]
8484
}) => {
85-
fakeExternalSecret.secretDescriptor = secretDescriptor
85+
fakeExternalSecret.spec = spec
8686
return new Poller({
8787
backends: {
8888
fakeBackendType: backendMock
@@ -102,6 +102,30 @@ describe('Poller', () => {
102102
sinon.restore()
103103
})
104104

105+
it('backwards compat with secretDescriptor', () => {
106+
const mySpec = {
107+
dataFrom: ['some-key', 'some-other'],
108+
backendType: 'my-magical-backend'
109+
}
110+
111+
fakeExternalSecret.secretDescriptor = mySpec
112+
113+
const myPoller = new Poller({
114+
backends: {
115+
fakeBackendType: backendMock
116+
},
117+
metrics: metricsMock,
118+
intervalMilliseconds: 5000,
119+
kubeClient: kubeClientMock,
120+
logger: loggerMock,
121+
externalSecret: fakeExternalSecret,
122+
rolePermittedAnnotation,
123+
customResourceManifest: fakeCustomResourceManifest
124+
})
125+
126+
expect(myPoller._spec).to.deep.equal(mySpec)
127+
})
128+
105129
describe('_createSecretManifest', () => {
106130
let clock
107131

@@ -134,7 +158,7 @@ describe('Poller', () => {
134158
const secretManifest = await poller._createSecretManifest()
135159

136160
expect(backendMock.getSecretManifestData.calledWith({
137-
secretDescriptor: {
161+
spec: {
138162
backendType: 'fakeBackendType',
139163
name: 'fakeSecretName',
140164
properties: [
@@ -178,7 +202,7 @@ describe('Poller', () => {
178202
const secretManifest = await poller._createSecretManifest()
179203

180204
expect(backendMock.getSecretManifestData.calledWith({
181-
secretDescriptor: {
205+
spec: {
182206
type: 'dummy-test-type',
183207
backendType: 'fakeBackendType',
184208
name: 'fakeSecretName',
@@ -234,7 +258,7 @@ describe('Poller', () => {
234258
const secretManifest = await poller._createSecretManifest()
235259

236260
expect(backendMock.getSecretManifestData.calledWith({
237-
secretDescriptor: {
261+
spec: {
238262
type: 'dummy-test-type',
239263
backendType: 'fakeBackendType',
240264
name: 'fakeSecretName',

0 commit comments

Comments
 (0)