Skip to content

Commit 86b8ae0

Browse files
merllj-zimnowodaAni1357dennisvankekem
authored
feat: added upgrade script for secrets (#1967)
Co-authored-by: Jehoszafat Zimnowoda <[email protected]> Co-authored-by: Ani Argjiri <[email protected]> Co-authored-by: Dennis van Kekem <[email protected]>
1 parent c557cbf commit 86b8ae0

8 files changed

+138
-13
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
apiVersion: bitnami.com/v1alpha1
2+
kind: SealedSecret
3+
metadata:
4+
name: test
5+
namespace: team-beta
6+
annotations:
7+
sealedsecrets.bitnami.com/namespace-wide: 'true'
8+
spec:
9+
encryptedData:
10+
test: ghi
11+
template:
12+
immutable: false
13+
metadata:
14+
name: test
15+
namespace: team-beta
16+
annotations: {}
17+
labels: {}
18+
type: kubernetes.io/opaque
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
apiVersion: bitnami.com/v1alpha1
2+
kind: SealedSecret
3+
metadata:
4+
name: beta
5+
namespace: team-beta
6+
annotations:
7+
sealedsecrets.bitnami.com/namespace-wide: 'true'
8+
spec:
9+
encryptedData:
10+
password: abc
11+
username: def
12+
template:
13+
immutable: false
14+
metadata:
15+
name: beta
16+
namespace: team-beta
17+
annotations: {}
18+
labels: {}
19+
type: kubernetes.io/opaque

tests/fixtures/env/teams/sealedsecrets.admin.yaml

-3
This file was deleted.

tests/fixtures/env/teams/sealedsecrets.demo.yaml

-3
This file was deleted.

tests/fixtures/env/teams/sealedsecrets.dev.yaml

-3
This file was deleted.

upgrades.yaml

+3
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,6 @@ operations:
8787
- version: 3.0.0
8888
pre:
8989
- upgrades/pre/upgrade-3-0-0.sh || true
90+
- version: 4.4.0
91+
pre:
92+
- upgrades/pre/upgrade-4-4-0.mjs || true

upgrades/pre/upgrade-4-4-0.mjs

+98
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
#!/usr/bin/env zx
2+
3+
import { Glob } from "glob";
4+
import fs from 'fs/promises'
5+
import yaml from 'js-yaml'
6+
import envalid, { str } from "envalid";
7+
8+
9+
function createSealedSecret(oldSecret) {
10+
const { name, namespace, type, immutable, encryptedData } = oldSecret
11+
const annotations = {}
12+
const labels = {}
13+
14+
const oldMetadata = oldSecret.metadata
15+
if (oldMetadata) {
16+
for (const annotation of oldMetadata.annotations || []) {
17+
annotations[annotation.key] = annotation.value
18+
}
19+
for (const label of oldMetadata.labels || []) {
20+
labels[label.key] = label.value
21+
}
22+
}
23+
24+
return {
25+
'apiVersion': 'bitnami.com/v1alpha1',
26+
'kind': 'SealedSecret',
27+
'metadata': {
28+
name,
29+
namespace,
30+
'annotations': {
31+
'sealedsecrets.bitnami.com/namespace-wide': 'true',
32+
},
33+
},
34+
'spec': {
35+
'encryptedData': encryptedData,
36+
'template': {
37+
'immutable': immutable || false,
38+
'metadata': {
39+
name,
40+
namespace,
41+
annotations,
42+
labels,
43+
},
44+
'type': type || 'kubernetes.io/opaque',
45+
}
46+
}
47+
}
48+
}
49+
50+
51+
async function readSecretFile(filename) {
52+
const secretYaml = await fs.readFile(filename, 'utf8')
53+
return yaml.load(secretYaml)
54+
}
55+
56+
57+
async function writeSecretFile(filename, secret) {
58+
const secretYaml = yaml.dump(secret)
59+
await fs.writeFile(filename, secretYaml, 'utf8')
60+
}
61+
62+
63+
async function main() {
64+
console.log('Migrating secret files')
65+
const env = envalid.cleanEnv(process.env, {
66+
ENV_DIR: str({desc: 'Values store'}),
67+
})
68+
69+
const secretFiles = new Glob(`${env.ENV_DIR}/env/teams/sealedsecrets.*.yaml`, {})
70+
for await (const secretFile of secretFiles) {
71+
console.log('Migrating secrets from', secretFile)
72+
const oldSecretFile = await readSecretFile(secretFile)
73+
// Team values are wrapped in teamConfig.<teamName>.sealedsecrets
74+
await Promise.all(
75+
Object.entries(oldSecretFile.teamConfig).map(async ([teamName, teamValues]) => {
76+
const teamSecretList = teamValues.sealedsecrets
77+
if (teamSecretList && teamSecretList.length > 0) {
78+
for (const oldSecret of teamSecretList) {
79+
const secretId = oldSecret.id
80+
const dirName = `${env.ENV_DIR}/env/teams/${teamName}/sealedsecrets`
81+
await fs.mkdir(dirName, { recursive: true })
82+
const sealedSecretFilename = `${dirName}/${secretId}.yaml`
83+
const sealedSecret = createSealedSecret(oldSecret)
84+
console.log('Writing migrated secret to', sealedSecretFilename)
85+
await writeSecretFile(sealedSecretFilename, sealedSecret)
86+
}
87+
console.log('Completed migration of secrets in', secretFile)
88+
} else {
89+
console.log('No secrets found to migrate in', secretFile)
90+
}
91+
})
92+
)
93+
console.log('Cleaning up', secretFile)
94+
await fs.rm(secretFile)
95+
}
96+
console.log('Finished migrating secret files.')
97+
}
98+
await main()

values-changes.yaml

-4
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,3 @@ changes:
336336
- databases.harbor.resources.limits.cpu: '200m'
337337
- databases.harbor.resources.requests.memory: '192Mi'
338338
- databases.harbor.resources.requests.cpu: '200m'
339-
- version: 33
340-
deletions:
341-
# FIXME: perform migration of to sealedsecrets dir before performin the removal of the property
342-
- 'teamConfig.{team}.sealedsecrets'

0 commit comments

Comments
 (0)