@decaf-ts/integrations 0.14.2 → 0.15.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +373 -21
- package/README.md +11 -1
- package/dist/integrations.cjs +1 -1
- package/dist/integrations.cjs.map +1 -1
- package/dist/integrations.js.map +1 -1
- package/jest.config.cjs +0 -1
- package/lib/cjs/feature-flags/services/FeatureFlag.service.cjs +1 -0
- package/lib/cjs/feature-flags/services/FeatureFlag.service.cjs.map +1 -1
- package/lib/cjs/index.cjs +3 -3
- package/lib/cjs/secrets/core/SecretReference.cjs +1 -0
- package/lib/cjs/secrets/core/SecretReference.cjs.map +1 -1
- package/lib/cjs/secrets/kubernetes/KubernetesSecretEnvironment.cjs +34 -0
- package/lib/cjs/secrets/kubernetes/KubernetesSecretEnvironment.cjs.map +1 -0
- package/lib/cjs/secrets/kubernetes/KubernetesSecretService.cjs +479 -0
- package/lib/cjs/secrets/kubernetes/KubernetesSecretService.cjs.map +1 -0
- package/lib/cjs/secrets/kubernetes/KubernetesSecretServiceConfig.cjs +4 -0
- package/lib/cjs/secrets/kubernetes/KubernetesSecretServiceConfig.cjs.map +1 -0
- package/lib/cjs/secrets/kubernetes/index.cjs +27 -0
- package/lib/cjs/secrets/kubernetes/index.cjs.map +1 -0
- package/lib/esm/feature-flags/services/FeatureFlag.service.js +1 -0
- package/lib/esm/feature-flags/services/FeatureFlag.service.js.map +1 -1
- package/lib/esm/index.js +3 -3
- package/lib/esm/secrets/core/SecretReference.js +1 -0
- package/lib/esm/secrets/core/SecretReference.js.map +1 -1
- package/lib/esm/secrets/kubernetes/KubernetesSecretEnvironment.js +30 -0
- package/lib/esm/secrets/kubernetes/KubernetesSecretEnvironment.js.map +1 -0
- package/lib/esm/secrets/kubernetes/KubernetesSecretService.js +474 -0
- package/lib/esm/secrets/kubernetes/KubernetesSecretService.js.map +1 -0
- package/lib/esm/secrets/kubernetes/KubernetesSecretServiceConfig.js +9 -0
- package/lib/esm/secrets/kubernetes/KubernetesSecretServiceConfig.js.map +1 -0
- package/lib/esm/secrets/kubernetes/index.js +10 -0
- package/lib/esm/secrets/kubernetes/index.js.map +1 -0
- package/lib/types/index.d.cts +2 -2
- package/lib/types/index.d.mts +2 -2
- package/lib/types/secrets/core/SecretTypes.d.cts +13 -1
- package/lib/types/secrets/core/SecretTypes.d.mts +13 -1
- package/lib/types/secrets/kubernetes/KubernetesSecretEnvironment.d.cts +34 -0
- package/lib/types/secrets/kubernetes/KubernetesSecretEnvironment.d.mts +34 -0
- package/lib/types/secrets/kubernetes/KubernetesSecretService.d.cts +45 -0
- package/lib/types/secrets/kubernetes/KubernetesSecretService.d.mts +45 -0
- package/lib/types/secrets/kubernetes/KubernetesSecretServiceConfig.d.cts +49 -0
- package/lib/types/secrets/kubernetes/KubernetesSecretServiceConfig.d.mts +49 -0
- package/lib/types/secrets/kubernetes/index.d.cts +9 -0
- package/lib/types/secrets/kubernetes/index.d.mts +9 -0
- package/package.json +91 -50
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SecretReference.js","sourceRoot":"","sources":["../../../../src/secrets/core/SecretReference.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,0BAAuB;AAE7C,MAAM,WAAW,GACf,oGAAyH,CAAC;AAC5H,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAK9C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAErC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAC5B,MAAM,IAAI,WAAW,CACnB,qBAAqB,EACrB,oCAAoC,GAAG,EAAE,CAC1C,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC;IAEjD,IAAI,CAAC,eAAe,CAAC,QAA0B,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,WAAW,CACnB,qBAAqB,EACrB,kCAAkC,QAAQ,EAAE,CAC7C,CAAC;IACJ,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,QAA0B;QACpC,IAAI;QACJ,OAAO;KACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,QAAwB,EACxB,IAAY,EACZ,OAAgB;IAEhB,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,WAAW,QAAQ,IAAI,IAAI,YAAY,OAAO,EAAE,CAAC;IAC1D,CAAC;IACD,OAAO,WAAW,QAAQ,IAAI,IAAI,EAAE,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,GAAW;IAChD,IAAI,CAAC;QACH,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,QAAgB;IACvC,MAAM,cAAc,GAAqB;QACvC,OAAO;QACP,QAAQ;QACR,YAAY;QACZ,iBAAiB;QACjB,qBAAqB;QACrB,iBAAiB;QACjB,oBAAoB;QACpB,WAAW;
|
|
1
|
+
{"version":3,"file":"SecretReference.js","sourceRoot":"","sources":["../../../../src/secrets/core/SecretReference.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,0BAAuB;AAE7C,MAAM,WAAW,GACf,oGAAyH,CAAC;AAC5H,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAK9C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAErC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAC5B,MAAM,IAAI,WAAW,CACnB,qBAAqB,EACrB,oCAAoC,GAAG,EAAE,CAC1C,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC;IAEjD,IAAI,CAAC,eAAe,CAAC,QAA0B,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,WAAW,CACnB,qBAAqB,EACrB,kCAAkC,QAAQ,EAAE,CAC7C,CAAC;IACJ,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,QAA0B;QACpC,IAAI;QACJ,OAAO;KACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,QAAwB,EACxB,IAAY,EACZ,OAAgB;IAEhB,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,WAAW,QAAQ,IAAI,IAAI,YAAY,OAAO,EAAE,CAAC;IAC1D,CAAC;IACD,OAAO,WAAW,QAAQ,IAAI,IAAI,EAAE,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,GAAW;IAChD,IAAI,CAAC;QACH,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,QAAgB;IACvC,MAAM,cAAc,GAAqB;QACvC,OAAO;QACP,QAAQ;QACR,YAAY;QACZ,iBAAiB;QACjB,qBAAqB;QACrB,iBAAiB;QACjB,oBAAoB;QACpB,WAAW;QACX,YAAY;KACb,CAAC;IACF,OAAO,cAAc,CAAC,QAAQ,CAAC,QAA0B,CAAC,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module integrations/secrets/kubernetes/environment
|
|
3
|
+
* @summary Kubernetes secret environment.
|
|
4
|
+
* @description Extends the common secrets environment with the `secrets.kubernetes`
|
|
5
|
+
* shape matching {@link KubernetesSecretServiceConfig}, so
|
|
6
|
+
* {@link KubernetesSecretService} can fall back to it when no config is passed to
|
|
7
|
+
* `initialize`.
|
|
8
|
+
*/
|
|
9
|
+
import { SecretEnvironment } from "./../core/SecretEnvironment.js";
|
|
10
|
+
export const KubernetesSecretEnvironment = SecretEnvironment.accumulate({
|
|
11
|
+
secrets: {
|
|
12
|
+
kubernetes: {
|
|
13
|
+
namespace: "",
|
|
14
|
+
kubeconfig: "",
|
|
15
|
+
context: "",
|
|
16
|
+
server: "",
|
|
17
|
+
token: "",
|
|
18
|
+
tokenFile: "",
|
|
19
|
+
caFile: "",
|
|
20
|
+
caData: "",
|
|
21
|
+
certFile: "",
|
|
22
|
+
keyFile: "",
|
|
23
|
+
certData: "",
|
|
24
|
+
keyData: "",
|
|
25
|
+
skipTLSVerify: false,
|
|
26
|
+
serviceAccount: false,
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
//# sourceMappingURL=KubernetesSecretEnvironment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KubernetesSecretEnvironment.js","sourceRoot":"","sources":["../../../../src/secrets/kubernetes/KubernetesSecretEnvironment.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,iBAAiB,EAAE,uCAAkC;AAyB9D,MAAM,CAAC,MAAM,2BAA2B,GAAG,iBAAiB,CAAC,UAAU,CAAC;IACtE,OAAO,EAAE;QACP,UAAU,EAAE;YACV,SAAS,EAAE,EAAE;YACb,UAAU,EAAE,EAAE;YACd,OAAO,EAAE,EAAE;YACX,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,EAAE;YACT,SAAS,EAAE,EAAE;YACb,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,EAAE;YACV,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE,EAAE;YACX,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE,EAAE;YACX,aAAa,EAAE,KAAK;YACpB,cAAc,EAAE,KAAK;SACtB;KACF;CACkC,CAAC,CAAC"}
|
|
@@ -0,0 +1,474 @@
|
|
|
1
|
+
import { ApiException, CoreV1Api, KubeConfig, } from "@kubernetes/client-node";
|
|
2
|
+
import { AuthorizationError } from "@decaf-ts/core";
|
|
3
|
+
import { ClientBasedSecretService, SecretError, } from "./../core/index.js";
|
|
4
|
+
import { validateSecretName, normalizeSecretName } from "./../core/index.js";
|
|
5
|
+
import { serializeSecretPayload, deserializeSecretPayload, } from "./../core/index.js";
|
|
6
|
+
import { KubernetesSecretEnvironment } from "./KubernetesSecretEnvironment.js";
|
|
7
|
+
import { envBoolean, envString } from "./../../shared/environmentValue.js";
|
|
8
|
+
import { BadRequestError, BaseError, ConflictError, InternalError, NotFoundError, } from "@decaf-ts/db-decorators";
|
|
9
|
+
const PAYLOAD_DATA_KEY = "payload";
|
|
10
|
+
const MANAGED_LABEL = "decaf-ts.io/managed";
|
|
11
|
+
const ANNOTATION_PREFIX = "decaf-ts.io/";
|
|
12
|
+
const ENCODING_ANNOTATION = `${ANNOTATION_PREFIX}encoding`;
|
|
13
|
+
const CONTENT_TYPE_ANNOTATION = `${ANNOTATION_PREFIX}content-type`;
|
|
14
|
+
const TAGS_ANNOTATION = `${ANNOTATION_PREFIX}tags`;
|
|
15
|
+
const VERSION_ANNOTATION = `${ANNOTATION_PREFIX}version`;
|
|
16
|
+
const UPDATED_AT_ANNOTATION = `${ANNOTATION_PREFIX}updated-at`;
|
|
17
|
+
const TENANT_ANNOTATION = `${ANNOTATION_PREFIX}tenant-id`;
|
|
18
|
+
const ORG_UNIT_ANNOTATION = `${ANNOTATION_PREFIX}org-unit-id`;
|
|
19
|
+
const OWNER_ANNOTATION = `${ANNOTATION_PREFIX}owner-principal-id`;
|
|
20
|
+
const DNS_SUBDOMAIN_PATTERN = /^[a-z0-9]([-a-z0-9.]*[a-z0-9])?$/;
|
|
21
|
+
const DNS_LABEL_PATTERN = /^[a-z0-9]([-a-z0-9]*[a-z0-9])?$/;
|
|
22
|
+
function assertKubernetesName(name) {
|
|
23
|
+
if (name.length > 253 || !DNS_SUBDOMAIN_PATTERN.test(name)) {
|
|
24
|
+
throw new SecretError("SECRET_INVALID_NAME", `Invalid Kubernetes secret name: "${name}". Names must be lowercase DNS-1123 subdomains (letters, digits, '-', and '.').`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function assertKubernetesNamespace(namespace) {
|
|
28
|
+
if (namespace.length > 63 || !DNS_LABEL_PATTERN.test(namespace)) {
|
|
29
|
+
throw new SecretError("SECRET_INVALID_NAME", `Invalid Kubernetes namespace: "${namespace}". Namespaces must be lowercase DNS-1123 labels.`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function toDate(value) {
|
|
33
|
+
if (!value)
|
|
34
|
+
return undefined;
|
|
35
|
+
const date = value instanceof Date ? value : new Date(value);
|
|
36
|
+
return Number.isNaN(date.getTime()) ? undefined : date;
|
|
37
|
+
}
|
|
38
|
+
function parseTags(raw) {
|
|
39
|
+
if (!raw)
|
|
40
|
+
return undefined;
|
|
41
|
+
try {
|
|
42
|
+
const parsed = JSON.parse(raw);
|
|
43
|
+
return parsed && typeof parsed === "object"
|
|
44
|
+
? parsed
|
|
45
|
+
: undefined;
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* @class KubernetesSecretService
|
|
53
|
+
* @summary Native Kubernetes Secrets backend.
|
|
54
|
+
* @description Implements the {@link SecretService} contract on top of
|
|
55
|
+
* namespaced Kubernetes `Secret` objects. Each DECAF secret is stored as an
|
|
56
|
+
* `Opaque` Secret whose `payload` data key holds the serialized
|
|
57
|
+
* {@link SerializedSecretPayload} envelope, while encoding, content type, tags,
|
|
58
|
+
* logical version, and ownership hints live in `decaf-ts.io/*` annotations.
|
|
59
|
+
*
|
|
60
|
+
* Authentication uses the standard Kubernetes client resolution order:
|
|
61
|
+
* explicit `server` credentials, an explicit `kubeconfig` path, `KUBECONFIG`,
|
|
62
|
+
* `~/.kube/config`, and finally the in-cluster service account.
|
|
63
|
+
*/
|
|
64
|
+
export class KubernetesSecretService extends ClientBasedSecretService {
|
|
65
|
+
constructor() {
|
|
66
|
+
super(...arguments);
|
|
67
|
+
this.provider = "kubernetes";
|
|
68
|
+
}
|
|
69
|
+
configFromEnvironment() {
|
|
70
|
+
const env = KubernetesSecretEnvironment.secrets.kubernetes;
|
|
71
|
+
const namespace = envString(env?.namespace);
|
|
72
|
+
const kubeconfig = envString(env?.kubeconfig);
|
|
73
|
+
const context = envString(env?.context);
|
|
74
|
+
const server = envString(env?.server);
|
|
75
|
+
if (!namespace && !kubeconfig && !context && !server)
|
|
76
|
+
return undefined;
|
|
77
|
+
return {
|
|
78
|
+
provider: "kubernetes",
|
|
79
|
+
namespace,
|
|
80
|
+
kubeconfig,
|
|
81
|
+
context,
|
|
82
|
+
server,
|
|
83
|
+
token: envString(env.token),
|
|
84
|
+
tokenFile: envString(env.tokenFile),
|
|
85
|
+
caFile: envString(env.caFile),
|
|
86
|
+
caData: envString(env.caData),
|
|
87
|
+
certFile: envString(env.certFile),
|
|
88
|
+
keyFile: envString(env.keyFile),
|
|
89
|
+
certData: envString(env.certData),
|
|
90
|
+
keyData: envString(env.keyData),
|
|
91
|
+
skipTLSVerify: envBoolean(env.skipTLSVerify),
|
|
92
|
+
serviceAccount: envBoolean(env.serviceAccount),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
async initialize(...args) {
|
|
96
|
+
const { log } = (await this.logCtx(args, "initialize", true)).for(this.initialize);
|
|
97
|
+
const config = this.getConfigFromArgs(...args);
|
|
98
|
+
const kubeConfig = this.buildKubeConfig(config);
|
|
99
|
+
const namespace = this.resolveNamespace(config, kubeConfig);
|
|
100
|
+
const resolved = { ...config, namespace };
|
|
101
|
+
const client = kubeConfig.makeApiClient(CoreV1Api);
|
|
102
|
+
this._config = resolved;
|
|
103
|
+
this._client = client;
|
|
104
|
+
log.verbose(`Initialized Kubernetes secret service for namespace "${namespace}"`);
|
|
105
|
+
return { config: resolved, client };
|
|
106
|
+
}
|
|
107
|
+
async store(name, value, options = {}, ...args) {
|
|
108
|
+
const { log } = (await this.logCtx(args, "store", true)).for(this.store);
|
|
109
|
+
const normalizedName = this.normalizeName(name);
|
|
110
|
+
const namespace = this.resolveNamespaceOption(options.namespace);
|
|
111
|
+
log.verbose(`Storing secret ${normalizedName} in namespace ${namespace}`);
|
|
112
|
+
const serialized = serializeSecretPayload(value);
|
|
113
|
+
const body = this.buildSecret(normalizedName, namespace, serialized, options);
|
|
114
|
+
try {
|
|
115
|
+
await this.client.createNamespacedSecret({ namespace, body });
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
if (this.statusOf(error) === 409) {
|
|
119
|
+
try {
|
|
120
|
+
const existing = await this.client.readNamespacedSecret({
|
|
121
|
+
name: normalizedName,
|
|
122
|
+
namespace,
|
|
123
|
+
});
|
|
124
|
+
body.metadata = {
|
|
125
|
+
...(body.metadata || {}),
|
|
126
|
+
resourceVersion: existing.metadata?.resourceVersion,
|
|
127
|
+
};
|
|
128
|
+
await this.client.replaceNamespacedSecret({
|
|
129
|
+
name: normalizedName,
|
|
130
|
+
namespace,
|
|
131
|
+
body,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
catch (replaceError) {
|
|
135
|
+
throw this.parseError(replaceError);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
throw this.parseError(error);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return {
|
|
143
|
+
provider: this.provider,
|
|
144
|
+
name: normalizedName,
|
|
145
|
+
namespace,
|
|
146
|
+
version: options.version,
|
|
147
|
+
uri: `kubernetes://${namespace}/${normalizedName}`,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
async retrieve(nameOrRef, options = {}, ...args) {
|
|
151
|
+
const { log } = (await this.logCtx(args, "retrieve", true)).for(this.retrieve);
|
|
152
|
+
const { name, namespace, version } = this.resolveReference(nameOrRef, options);
|
|
153
|
+
log.verbose(`Retrieving secret ${name} from namespace ${namespace}`);
|
|
154
|
+
const secret = await this.readSecret(name, namespace);
|
|
155
|
+
this.assertVersion(secret, version);
|
|
156
|
+
const raw = secret.data?.[PAYLOAD_DATA_KEY];
|
|
157
|
+
if (!raw) {
|
|
158
|
+
throw new NotFoundError(`No secret value found for "${name}" in namespace "${namespace}"`);
|
|
159
|
+
}
|
|
160
|
+
let payload;
|
|
161
|
+
try {
|
|
162
|
+
payload = JSON.parse(Buffer.from(raw, "base64").toString("utf8"));
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
throw new SecretError("SECRET_DESERIALIZATION_FAILED", `Failed to parse secret payload for "${name}": ${error.message}`, error);
|
|
166
|
+
}
|
|
167
|
+
return deserializeSecretPayload(payload);
|
|
168
|
+
}
|
|
169
|
+
async delete(nameOrRef, options = {}, ...args) {
|
|
170
|
+
const { log } = (await this.logCtx(args, "delete", true)).for(this.delete);
|
|
171
|
+
const { name, namespace, version } = this.resolveReference(nameOrRef, options);
|
|
172
|
+
log.verbose(`Deleting secret ${name} from namespace ${namespace}`);
|
|
173
|
+
if (version) {
|
|
174
|
+
const secret = await this.readSecret(name, namespace);
|
|
175
|
+
this.assertVersion(secret, version);
|
|
176
|
+
}
|
|
177
|
+
try {
|
|
178
|
+
await this.client.deleteNamespacedSecret({ name, namespace });
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
throw this.parseError(error);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
async exists(nameOrRef, options = {}, ...args) {
|
|
185
|
+
const { log } = (await this.logCtx(args, "exists", true)).for(this.exists);
|
|
186
|
+
const { name, namespace, version } = this.resolveReference(nameOrRef, options);
|
|
187
|
+
log.verbose(`Checking if secret ${name} exists in namespace ${namespace}`);
|
|
188
|
+
try {
|
|
189
|
+
const secret = await this.readSecret(name, namespace);
|
|
190
|
+
this.assertVersion(secret, version);
|
|
191
|
+
return true;
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
if (error instanceof NotFoundError)
|
|
195
|
+
return false;
|
|
196
|
+
throw error;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
async list(options = {}, ...args) {
|
|
200
|
+
const { log } = (await this.logCtx(args, "list", true)).for(this.list);
|
|
201
|
+
const namespace = this.resolveNamespaceOption(options.namespace);
|
|
202
|
+
log.verbose(`Listing secrets in namespace ${namespace}`);
|
|
203
|
+
const result = [];
|
|
204
|
+
let continueToken;
|
|
205
|
+
try {
|
|
206
|
+
do {
|
|
207
|
+
const response = await this.client.listNamespacedSecret({
|
|
208
|
+
namespace,
|
|
209
|
+
labelSelector: `${MANAGED_LABEL}=true`,
|
|
210
|
+
limit: 100,
|
|
211
|
+
_continue: continueToken,
|
|
212
|
+
});
|
|
213
|
+
for (const secret of response.items || []) {
|
|
214
|
+
result.push(this.toMetadata(secret, namespace));
|
|
215
|
+
}
|
|
216
|
+
continueToken = response.metadata?._continue;
|
|
217
|
+
} while (continueToken);
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
throw this.parseError(error);
|
|
221
|
+
}
|
|
222
|
+
const filtered = result.filter((meta) => {
|
|
223
|
+
if (options.enabled === false)
|
|
224
|
+
return false;
|
|
225
|
+
if (!options.tags)
|
|
226
|
+
return true;
|
|
227
|
+
return Object.entries(options.tags).every(([key, value]) => meta.tags?.[key] === value);
|
|
228
|
+
});
|
|
229
|
+
const offset = options.offset ?? 0;
|
|
230
|
+
const end = typeof options.limit === "number" ? offset + options.limit : undefined;
|
|
231
|
+
return filtered.slice(offset, end);
|
|
232
|
+
}
|
|
233
|
+
async metadata(nameOrRef, options = {}, ...args) {
|
|
234
|
+
const { log } = (await this.logCtx(args, "metadata", true)).for(this.metadata);
|
|
235
|
+
const { name, namespace, version } = this.resolveReference(nameOrRef, options);
|
|
236
|
+
log.verbose(`Getting metadata for secret ${name} in namespace ${namespace}`);
|
|
237
|
+
try {
|
|
238
|
+
const secret = await this.readSecret(name, namespace);
|
|
239
|
+
this.assertVersion(secret, version);
|
|
240
|
+
return this.toMetadata(secret, namespace);
|
|
241
|
+
}
|
|
242
|
+
catch (error) {
|
|
243
|
+
if (error instanceof NotFoundError)
|
|
244
|
+
return undefined;
|
|
245
|
+
throw error;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
async rotate(nameOrRef, value, options = {}, ...args) {
|
|
249
|
+
const { name, namespace } = this.resolveReference(nameOrRef, options);
|
|
250
|
+
return this.store(name, value, { version: options.newVersion, namespace }, ...args);
|
|
251
|
+
}
|
|
252
|
+
buildKubeConfig(config) {
|
|
253
|
+
const kubeConfig = new KubeConfig();
|
|
254
|
+
try {
|
|
255
|
+
if (config.serviceAccount) {
|
|
256
|
+
kubeConfig.loadFromCluster();
|
|
257
|
+
}
|
|
258
|
+
else if (config.server) {
|
|
259
|
+
const clusterName = "decaf-cluster";
|
|
260
|
+
const userName = "decaf-user";
|
|
261
|
+
const contextName = "decaf-context";
|
|
262
|
+
kubeConfig.loadFromOptions({
|
|
263
|
+
clusters: [
|
|
264
|
+
{
|
|
265
|
+
name: clusterName,
|
|
266
|
+
server: config.server,
|
|
267
|
+
caData: config.caData,
|
|
268
|
+
caFile: config.caFile,
|
|
269
|
+
skipTLSVerify: config.skipTLSVerify,
|
|
270
|
+
},
|
|
271
|
+
],
|
|
272
|
+
users: [
|
|
273
|
+
{
|
|
274
|
+
name: userName,
|
|
275
|
+
token: config.token,
|
|
276
|
+
tokenFile: config.tokenFile,
|
|
277
|
+
certData: config.certData,
|
|
278
|
+
certFile: config.certFile,
|
|
279
|
+
keyData: config.keyData,
|
|
280
|
+
keyFile: config.keyFile,
|
|
281
|
+
},
|
|
282
|
+
],
|
|
283
|
+
contexts: [
|
|
284
|
+
{
|
|
285
|
+
name: contextName,
|
|
286
|
+
cluster: clusterName,
|
|
287
|
+
user: userName,
|
|
288
|
+
namespace: config.namespace,
|
|
289
|
+
},
|
|
290
|
+
],
|
|
291
|
+
currentContext: contextName,
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
else if (config.kubeconfig) {
|
|
295
|
+
kubeConfig.loadFromFile(config.kubeconfig);
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
kubeConfig.loadFromDefault();
|
|
299
|
+
}
|
|
300
|
+
if (config.context) {
|
|
301
|
+
kubeConfig.setCurrentContext(config.context);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
catch (error) {
|
|
305
|
+
throw this.parseError(error);
|
|
306
|
+
}
|
|
307
|
+
return kubeConfig;
|
|
308
|
+
}
|
|
309
|
+
resolveNamespace(config, kubeConfig) {
|
|
310
|
+
const namespace = config.namespace ||
|
|
311
|
+
kubeConfig.getContextObject(kubeConfig.getCurrentContext())?.namespace ||
|
|
312
|
+
"default";
|
|
313
|
+
assertKubernetesNamespace(namespace);
|
|
314
|
+
return namespace;
|
|
315
|
+
}
|
|
316
|
+
resolveNamespaceOption(namespace) {
|
|
317
|
+
const resolved = namespace || this.config.namespace || "default";
|
|
318
|
+
assertKubernetesNamespace(resolved);
|
|
319
|
+
return resolved;
|
|
320
|
+
}
|
|
321
|
+
resolveReference(nameOrRef, options) {
|
|
322
|
+
const name = typeof nameOrRef === "string" ? nameOrRef : nameOrRef.name;
|
|
323
|
+
const namespace = options.namespace ||
|
|
324
|
+
(typeof nameOrRef === "string" ? undefined : nameOrRef.namespace) ||
|
|
325
|
+
this.config.namespace ||
|
|
326
|
+
"default";
|
|
327
|
+
assertKubernetesNamespace(namespace);
|
|
328
|
+
const version = options.version ||
|
|
329
|
+
(typeof nameOrRef === "string" ? undefined : nameOrRef.version);
|
|
330
|
+
return { name: this.normalizeName(name), namespace, version };
|
|
331
|
+
}
|
|
332
|
+
normalizeName(name) {
|
|
333
|
+
try {
|
|
334
|
+
validateSecretName(name);
|
|
335
|
+
}
|
|
336
|
+
catch (error) {
|
|
337
|
+
throw this.parseError(error);
|
|
338
|
+
}
|
|
339
|
+
const normalizedName = normalizeSecretName(name);
|
|
340
|
+
assertKubernetesName(normalizedName);
|
|
341
|
+
return normalizedName;
|
|
342
|
+
}
|
|
343
|
+
buildSecret(name, namespace, serialized, options) {
|
|
344
|
+
const annotations = {
|
|
345
|
+
[ENCODING_ANNOTATION]: serialized.encoding,
|
|
346
|
+
[UPDATED_AT_ANNOTATION]: new Date().toISOString(),
|
|
347
|
+
};
|
|
348
|
+
if (options.contentType) {
|
|
349
|
+
annotations[CONTENT_TYPE_ANNOTATION] = options.contentType;
|
|
350
|
+
}
|
|
351
|
+
if (options.tags) {
|
|
352
|
+
annotations[TAGS_ANNOTATION] = JSON.stringify(options.tags);
|
|
353
|
+
}
|
|
354
|
+
if (options.version) {
|
|
355
|
+
annotations[VERSION_ANNOTATION] = options.version;
|
|
356
|
+
}
|
|
357
|
+
if (options.tenantId) {
|
|
358
|
+
annotations[TENANT_ANNOTATION] = options.tenantId;
|
|
359
|
+
}
|
|
360
|
+
if (options.orgUnitId) {
|
|
361
|
+
annotations[ORG_UNIT_ANNOTATION] = options.orgUnitId;
|
|
362
|
+
}
|
|
363
|
+
if (options.ownerPrincipalId) {
|
|
364
|
+
annotations[OWNER_ANNOTATION] = options.ownerPrincipalId;
|
|
365
|
+
}
|
|
366
|
+
return {
|
|
367
|
+
apiVersion: "v1",
|
|
368
|
+
kind: "Secret",
|
|
369
|
+
type: "Opaque",
|
|
370
|
+
metadata: {
|
|
371
|
+
name,
|
|
372
|
+
namespace,
|
|
373
|
+
labels: {
|
|
374
|
+
[MANAGED_LABEL]: "true",
|
|
375
|
+
},
|
|
376
|
+
annotations,
|
|
377
|
+
},
|
|
378
|
+
stringData: {
|
|
379
|
+
[PAYLOAD_DATA_KEY]: JSON.stringify(serialized),
|
|
380
|
+
},
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
async readSecret(name, namespace) {
|
|
384
|
+
try {
|
|
385
|
+
return await this.client.readNamespacedSecret({ name, namespace });
|
|
386
|
+
}
|
|
387
|
+
catch (error) {
|
|
388
|
+
throw this.parseError(error);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
assertVersion(secret, version) {
|
|
392
|
+
if (!version)
|
|
393
|
+
return;
|
|
394
|
+
const stored = secret.metadata?.annotations?.[VERSION_ANNOTATION];
|
|
395
|
+
if (stored !== version) {
|
|
396
|
+
throw new NotFoundError(`Secret "${secret.metadata?.name}" version "${version}" not found`);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
toMetadata(secret, namespace) {
|
|
400
|
+
const annotations = secret.metadata?.annotations || {};
|
|
401
|
+
const updatedAt = annotations[UPDATED_AT_ANNOTATION];
|
|
402
|
+
const name = secret.metadata?.name || "";
|
|
403
|
+
return {
|
|
404
|
+
provider: this.provider,
|
|
405
|
+
name,
|
|
406
|
+
version: annotations[VERSION_ANNOTATION],
|
|
407
|
+
createdAt: toDate(secret.metadata?.creationTimestamp),
|
|
408
|
+
updatedAt: updatedAt
|
|
409
|
+
? new Date(updatedAt)
|
|
410
|
+
: toDate(secret.metadata?.creationTimestamp),
|
|
411
|
+
enabled: true,
|
|
412
|
+
contentType: annotations[CONTENT_TYPE_ANNOTATION],
|
|
413
|
+
tags: parseTags(annotations[TAGS_ANNOTATION]),
|
|
414
|
+
externalId: secret.metadata?.uid,
|
|
415
|
+
uri: `kubernetes://${namespace}/${name}`,
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
statusOf(error) {
|
|
419
|
+
if (error instanceof ApiException)
|
|
420
|
+
return error.code;
|
|
421
|
+
const candidate = error;
|
|
422
|
+
if (typeof candidate?.code === "number")
|
|
423
|
+
return candidate.code;
|
|
424
|
+
if (typeof candidate?.statusCode === "number") {
|
|
425
|
+
return candidate.statusCode;
|
|
426
|
+
}
|
|
427
|
+
return undefined;
|
|
428
|
+
}
|
|
429
|
+
messageOf(error) {
|
|
430
|
+
const err = error;
|
|
431
|
+
return err?.body?.message || err?.body?.reason || err?.message || err?.name || "Unknown error";
|
|
432
|
+
}
|
|
433
|
+
parseError(error) {
|
|
434
|
+
if (error instanceof BaseError)
|
|
435
|
+
return error;
|
|
436
|
+
const status = this.statusOf(error);
|
|
437
|
+
const message = this.messageOf(error);
|
|
438
|
+
const lowerMessage = message.toLowerCase();
|
|
439
|
+
if (status === 404 ||
|
|
440
|
+
lowerMessage.includes("not found") ||
|
|
441
|
+
lowerMessage.includes("404")) {
|
|
442
|
+
return new NotFoundError(message);
|
|
443
|
+
}
|
|
444
|
+
if (status === 409 ||
|
|
445
|
+
lowerMessage.includes("already exists") ||
|
|
446
|
+
lowerMessage.includes("conflict") ||
|
|
447
|
+
lowerMessage.includes("409")) {
|
|
448
|
+
return new ConflictError(message);
|
|
449
|
+
}
|
|
450
|
+
if (status === 401 || lowerMessage.includes("unauthorized")) {
|
|
451
|
+
return new AuthorizationError(`Authentication failed: ${message}`);
|
|
452
|
+
}
|
|
453
|
+
if (status === 403 || lowerMessage.includes("forbidden")) {
|
|
454
|
+
return new AuthorizationError(`Permission denied: ${message}`);
|
|
455
|
+
}
|
|
456
|
+
if (status === 400 ||
|
|
457
|
+
status === 422 ||
|
|
458
|
+
lowerMessage.includes("bad request")) {
|
|
459
|
+
return new BadRequestError(message);
|
|
460
|
+
}
|
|
461
|
+
if (status === 429 || lowerMessage.includes("rate limit")) {
|
|
462
|
+
return new SecretError("SECRET_PROVIDER_RATE_LIMITED", `Rate limited: ${message}`, error);
|
|
463
|
+
}
|
|
464
|
+
if (status === undefined ||
|
|
465
|
+
(status !== undefined && status >= 500) ||
|
|
466
|
+
lowerMessage.includes("connection") ||
|
|
467
|
+
lowerMessage.includes("timeout") ||
|
|
468
|
+
lowerMessage.includes("unavailable")) {
|
|
469
|
+
return new SecretError("SECRET_PROVIDER_UNAVAILABLE", `Provider unavailable: ${message}`, error);
|
|
470
|
+
}
|
|
471
|
+
return new InternalError(message);
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
//# sourceMappingURL=KubernetesSecretService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KubernetesSecretService.js","sourceRoot":"","sources":["../../../../src/secrets/kubernetes/KubernetesSecretService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module integrations/secrets/kubernetes/config
|
|
3
|
+
* @summary Kubernetes secret service configuration.
|
|
4
|
+
* @description Configuration schema for the native Kubernetes Secrets integration,
|
|
5
|
+
* including kubeconfig selection, explicit API-server credentials, and the
|
|
6
|
+
* default namespace used by every operation.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=KubernetesSecretServiceConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KubernetesSecretServiceConfig.js","sourceRoot":"","sources":["../../../../src/secrets/kubernetes/KubernetesSecretServiceConfig.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module integrations/secrets/kubernetes
|
|
3
|
+
* @summary Kubernetes secret service exports.
|
|
4
|
+
* @description Re-exports the native Kubernetes Secrets service, its configuration,
|
|
5
|
+
* and its environment slice.
|
|
6
|
+
*/
|
|
7
|
+
export * from "./KubernetesSecretService.js";
|
|
8
|
+
export * from "./KubernetesSecretServiceConfig.js";
|
|
9
|
+
export * from "./KubernetesSecretEnvironment.js";
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/secrets/kubernetes/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,6CAA0C;AAC1C,mDAAgD;AAChD,iDAA8C"}
|
package/lib/types/index.d.cts
CHANGED
|
@@ -7,6 +7,6 @@ export * from "./utils.d.cts";
|
|
|
7
7
|
export * from "./namespaces/index.d.cts";
|
|
8
8
|
export * from "./feature-flags/index.d.cts";
|
|
9
9
|
export declare const VERSION: string;
|
|
10
|
-
export declare const COMMIT = "
|
|
11
|
-
export declare const FULL_VERSION = "0.
|
|
10
|
+
export declare const COMMIT = "86da5d7";
|
|
11
|
+
export declare const FULL_VERSION = "0.15.3-86da5d7";
|
|
12
12
|
export declare const PACKAGE_NAME: string;
|
package/lib/types/index.d.mts
CHANGED
|
@@ -7,6 +7,6 @@ export * from "./utils.d.mts";
|
|
|
7
7
|
export * from "./namespaces/index.d.mts";
|
|
8
8
|
export * from "./feature-flags/index.d.mts";
|
|
9
9
|
export declare const VERSION: string;
|
|
10
|
-
export declare const COMMIT = "
|
|
11
|
-
export declare const FULL_VERSION = "0.
|
|
10
|
+
export declare const COMMIT = "86da5d7";
|
|
11
|
+
export declare const FULL_VERSION = "0.15.3-86da5d7";
|
|
12
12
|
export declare const PACKAGE_NAME: string;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* @summary Secret core types.
|
|
4
4
|
* @description Shared payload, metadata, option, and configuration types for secret service implementations.
|
|
5
5
|
*/
|
|
6
|
-
export type SecretProvider = "model" | "memory" | "filesystem" | "hashicorp-vault" | "aws-secrets-manager" | "azure-key-vault" | "gcp-secret-manager" | "1password";
|
|
6
|
+
export type SecretProvider = "model" | "memory" | "filesystem" | "hashicorp-vault" | "aws-secrets-manager" | "azure-key-vault" | "gcp-secret-manager" | "1password" | "kubernetes";
|
|
7
7
|
export type SecretName = string;
|
|
8
8
|
export type SecretPayload = string | Record<string, unknown> | Uint8Array;
|
|
9
9
|
export interface SerializedSecretPayload {
|
|
@@ -61,30 +61,42 @@ export interface StoreSecretOptions {
|
|
|
61
61
|
* @description Principal that owns the secret.
|
|
62
62
|
*/
|
|
63
63
|
ownerPrincipalId?: string;
|
|
64
|
+
/**
|
|
65
|
+
* @description Backend namespace or tenant partition for the secret.
|
|
66
|
+
* @summary Kubernetes uses this as the object namespace; other providers may
|
|
67
|
+
* ignore it when their backend is not namespace-scoped.
|
|
68
|
+
*/
|
|
69
|
+
namespace?: string;
|
|
64
70
|
}
|
|
65
71
|
export interface RetrieveSecretOptions {
|
|
66
72
|
version?: string;
|
|
67
73
|
includeMetadata?: boolean;
|
|
74
|
+
namespace?: string;
|
|
68
75
|
}
|
|
69
76
|
export interface DeleteSecretOptions {
|
|
70
77
|
force?: boolean;
|
|
71
78
|
version?: string;
|
|
79
|
+
namespace?: string;
|
|
72
80
|
}
|
|
73
81
|
export interface ExistsSecretOptions {
|
|
74
82
|
version?: string;
|
|
83
|
+
namespace?: string;
|
|
75
84
|
}
|
|
76
85
|
export interface ListSecretsOptions {
|
|
77
86
|
limit?: number;
|
|
78
87
|
offset?: number;
|
|
79
88
|
tags?: Record<string, string>;
|
|
80
89
|
enabled?: boolean;
|
|
90
|
+
namespace?: string;
|
|
81
91
|
}
|
|
82
92
|
export interface SecretMetadataOptions {
|
|
83
93
|
version?: string;
|
|
84
94
|
includeTags?: boolean;
|
|
95
|
+
namespace?: string;
|
|
85
96
|
}
|
|
86
97
|
export interface RotateSecretOptions {
|
|
87
98
|
oldVersion?: string;
|
|
88
99
|
newVersion?: string;
|
|
89
100
|
keyId?: string;
|
|
101
|
+
namespace?: string;
|
|
90
102
|
}
|