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

Commit 25e2f74

Browse files
iAnomalyFlydiverny
authored andcommitted
feat: allow setting additional markup on generated secret resource using template (#192)
The template will be deep merged without mutating any existing fields. For example: you cannot override metadata.name. ```yaml apiVersion: 'kubernetes-client.io/v1' kind: ExternalSecret metadata: name: hello-service secretDescriptor: template: metadata: annotations: cat: cheese labels: dog: farfel data: ... ```
1 parent 90f01c5 commit 25e2f74

File tree

5 files changed

+116
-7
lines changed

5 files changed

+116
-7
lines changed

README.md

+12
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,14 @@ secretDescriptor:
127127
data:
128128
- key: hello-service/password
129129
name: password
130+
# optional: specify a template with any additional markup you would like added to the downstream Secret resource.
131+
# This template will be deep merged without mutating any existing fields. For example: you cannot override metadata.name.
132+
template:
133+
metadata:
134+
annotations:
135+
cat: cheese
136+
labels:
137+
dog: farfel
130138
```
131139
or
132140
```yml
@@ -198,6 +206,10 @@ apiVersion: v1
198206
kind: Secret
199207
metadata:
200208
name: hello-service
209+
annotations:
210+
cat: cheese
211+
labels:
212+
dog: farfel
201213
type: Opaque
202214
data:
203215
password: MTIzNA==

lib/poller.js

+11-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
'use strict'
22

3+
const clonedeep = require('lodash.clonedeep')
4+
const merge = require('lodash.merge')
5+
36
/**
47
* Kubernetes secret descriptor.
58
* @typedef {Object} SecretDescriptor
@@ -72,10 +75,10 @@ class Poller {
7275
*/
7376
async _createSecretManifest () {
7477
const secretDescriptor = this._secretDescriptor
78+
const template = secretDescriptor.template
7579
const data = await this._backends[secretDescriptor.backendType]
7680
.getSecretManifestData({ secretDescriptor })
77-
78-
return {
81+
let secretManifest = {
7982
apiVersion: 'v1',
8083
kind: 'Secret',
8184
metadata: {
@@ -87,6 +90,12 @@ class Poller {
8790
type: secretDescriptor.type || 'Opaque',
8891
data
8992
}
93+
94+
if (template) {
95+
secretManifest = merge(clonedeep(template), secretManifest)
96+
}
97+
98+
return secretManifest
9099
}
91100

92101
/**

lib/poller.test.js

+73
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,79 @@ describe('Poller', () => {
203203
}
204204
})
205205
})
206+
207+
it('creates secret manifest - with template', async () => {
208+
const poller = pollerFactory({
209+
type: 'dummy-test-type',
210+
backendType: 'fakeBackendType',
211+
name: 'fakeSecretName',
212+
properties: [
213+
'fakePropertyName1',
214+
'fakePropertyName2'
215+
],
216+
template: {
217+
metadata: {
218+
annotations: {
219+
cat: 'cheese'
220+
},
221+
labels: {
222+
dog: 'farfel'
223+
},
224+
name: 'fakerSecretName'
225+
}
226+
}
227+
})
228+
229+
backendMock.getSecretManifestData.resolves({
230+
fakePropertyName1: 'ZmFrZVByb3BlcnR5VmFsdWUx', // base 64 value
231+
fakePropertyName2: 'ZmFrZVByb3BlcnR5VmFsdWUy' // base 64 value
232+
})
233+
234+
const secretManifest = await poller._createSecretManifest()
235+
236+
expect(backendMock.getSecretManifestData.calledWith({
237+
secretDescriptor: {
238+
type: 'dummy-test-type',
239+
backendType: 'fakeBackendType',
240+
name: 'fakeSecretName',
241+
properties: [
242+
'fakePropertyName1',
243+
'fakePropertyName2'
244+
],
245+
template: {
246+
metadata: {
247+
annotations: {
248+
cat: 'cheese'
249+
},
250+
labels: {
251+
dog: 'farfel'
252+
},
253+
name: 'fakerSecretName'
254+
}
255+
}
256+
}
257+
})).to.equal(true)
258+
259+
expect(secretManifest).deep.equals({
260+
apiVersion: 'v1',
261+
kind: 'Secret',
262+
metadata: {
263+
name: 'fakeSecretName',
264+
ownerReferences: [getOwnerReference()],
265+
annotations: {
266+
cat: 'cheese'
267+
},
268+
labels: {
269+
dog: 'farfel'
270+
}
271+
},
272+
type: 'dummy-test-type',
273+
data: {
274+
fakePropertyName1: 'ZmFrZVByb3BlcnR5VmFsdWUx', // base 64 value
275+
fakePropertyName2: 'ZmFrZVByb3BlcnR5VmFsdWUy' // base 64 value
276+
}
277+
})
278+
})
206279
})
207280

208281
describe('_poll', () => {

package-lock.json

+19-5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
"json-stream": "^1.0.0",
3535
"kubernetes-client": "^8.3.0",
3636
"lodash.clonedeep": "^4.5.0",
37+
"lodash.merge": "^4.6.2",
3738
"make-promises-safe": "^5.0.0",
3839
"pino": "^5.12.0",
3940
"prom-client": "^11.5.3"

0 commit comments

Comments
 (0)