@ankhorage/kubernetes 0.4.0 → 0.5.0

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/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  # @ankhorage/kubernetes
5
5
 
6
- ![license: MIT](././paradox/badges/license.svg) ![npm: v0.3.0](././paradox/badges/npm.svg) ![runtime: bun](././paradox/badges/runtime.svg) ![typescript: strict](././paradox/badges/typescript.svg) ![eslint: checked](././paradox/badges/eslint.svg) ![prettier: checked](././paradox/badges/prettier.svg) ![build: checked](././paradox/badges/build.svg) ![tests: checked](././paradox/badges/tests.svg) ![docs: paradox](././paradox/badges/docs.svg)
6
+ ![license: MIT](././paradox/badges/license.svg) ![npm: v0.4.0](././paradox/badges/npm.svg) ![runtime: bun](././paradox/badges/runtime.svg) ![typescript: strict](././paradox/badges/typescript.svg) ![eslint: checked](././paradox/badges/eslint.svg) ![prettier: checked](././paradox/badges/prettier.svg) ![build: checked](././paradox/badges/build.svg) ![tests: checked](././paradox/badges/tests.svg) ![docs: paradox](././paradox/badges/docs.svg)
7
7
 
8
8
  Shared Kubernetes workload driver for provider-neutral Ankhorage infrastructure.
9
9
 
@@ -1 +1 @@
1
- {"version":3,"file":"materializeKubernetesSecretsAsync.d.ts","sourceRoot":"","sources":["../../../../../src/features/workload-reconciliation/application/use-cases/materializeKubernetesSecretsAsync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE/E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAClF,OAAO,KAAK,EACV,yBAAyB,EACzB,oBAAoB,EACrB,MAAM,uCAAuC,CAAC;AAG/C,6EAA6E;AAC7E,wBAAsB,iCAAiC,CACrD,OAAO,EAAE,uBAAuB,EAChC,UAAU,EAAE,oBAAoB,GAC/B,OAAO,CAAC,WAAW,CAAC,SAAS,yBAAyB,EAAE,CAAC,CAAC,CA6B5D"}
1
+ {"version":3,"file":"materializeKubernetesSecretsAsync.d.ts","sourceRoot":"","sources":["../../../../../src/features/workload-reconciliation/application/use-cases/materializeKubernetesSecretsAsync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE/E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAClF,OAAO,KAAK,EACV,yBAAyB,EACzB,oBAAoB,EACrB,MAAM,uCAAuC,CAAC;AAG/C,6EAA6E;AAC7E,wBAAsB,iCAAiC,CACrD,OAAO,EAAE,uBAAuB,EAChC,UAAU,EAAE,oBAAoB,GAC/B,OAAO,CAAC,WAAW,CAAC,SAAS,yBAAyB,EAAE,CAAC,CAAC,CAgC5D"}
@@ -4,7 +4,9 @@ export async function materializeKubernetesSecretsAsync(request, projection) {
4
4
  const values = new Map();
5
5
  const diagnostics = [];
6
6
  for (const binding of projection.secretBindings) {
7
- const resolved = await request.context.secrets.resolveAsync(binding.reference);
7
+ const resolved = binding.reference.source === 'secret-store'
8
+ ? await request.context.secrets.resolveAsync(binding.reference)
9
+ : await resolveCredentialValueAsync(request, binding.reference);
8
10
  if (!resolved.ok) {
9
11
  diagnostics.push(...resolved.diagnostics);
10
12
  continue;
@@ -29,4 +31,22 @@ export async function materializeKubernetesSecretsAsync(request, projection) {
29
31
  diagnostics: [],
30
32
  };
31
33
  }
34
+ async function resolveCredentialValueAsync(request, reference) {
35
+ const resolved = await request.context.credentials.resolveAsync(reference);
36
+ if (!resolved.ok)
37
+ return resolved;
38
+ const value = resolved.value[reference.key];
39
+ return value === undefined
40
+ ? {
41
+ ok: false,
42
+ diagnostics: [
43
+ {
44
+ severity: 'error',
45
+ code: 'kubernetes-credential-key-missing',
46
+ message: 'A required control-plane credential field is missing.',
47
+ },
48
+ ],
49
+ }
50
+ : { ok: true, value, diagnostics: [] };
51
+ }
32
52
  //# sourceMappingURL=materializeKubernetesSecretsAsync.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"materializeKubernetesSecretsAsync.js","sourceRoot":"","sources":["../../../../../src/features/workload-reconciliation/application/use-cases/materializeKubernetesSecretsAsync.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AAEhF,6EAA6E;AAC7E,MAAM,CAAC,KAAK,UAAU,iCAAiC,CACrD,OAAgC,EAChC,UAAgC;IAEhC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkC,CAAC;IACzD,MAAM,WAAW,GAAsB,EAAE,CAAC;IAE1C,KAAK,MAAM,OAAO,IAAI,UAAU,CAAC,cAAc,EAAE,CAAC;QAChD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC/E,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,WAAW,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;YAC1C,SAAS;QACX,CAAC;QACD,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC,wBAAwB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QACpF,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;QAC7C,MAAM,CAAC,GAAG,CAAC,wBAAwB,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IAE9D,OAAO;QACL,EAAE,EAAE,IAAI;QACR,KAAK,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YAC1C,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;YAChE,IAAI,YAAY,KAAK,SAAS;gBAAE,OAAO,OAAO,CAAC;YAC/C,OAAO;gBACL,GAAG,OAAO;gBACV,QAAQ,EAAE,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE;aAC5D,CAAC;QACJ,CAAC,CAAC;QACF,WAAW,EAAE,EAAE;KAChB,CAAC;AACJ,CAAC","sourcesContent":["import type { InfraDiagnostic, InfraResult } from '@ankhorage/contracts/infra';\n\nimport type { KubernetesDriverRequest } from '../../../../types/kubernetesDriver';\nimport type {\n KubernetesDesiredResource,\n KubernetesProjection,\n} from '../../../../types/kubernetesResources';\nimport { getKubernetesResourceKey } from '../../utils/getKubernetesResourceKey';\n\n/*** Resolve referenced secrets into ephemeral Kubernetes apply resources. */\nexport async function materializeKubernetesSecretsAsync(\n request: KubernetesDriverRequest,\n projection: KubernetesProjection,\n): Promise<InfraResult<readonly KubernetesDesiredResource[]>> {\n const values = new Map<string, Record<string, string>>();\n const diagnostics: InfraDiagnostic[] = [];\n\n for (const binding of projection.secretBindings) {\n const resolved = await request.context.secrets.resolveAsync(binding.reference);\n if (!resolved.ok) {\n diagnostics.push(...resolved.diagnostics);\n continue;\n }\n const resourceValues = values.get(getKubernetesResourceKey(binding.resource)) ?? {};\n resourceValues[binding.key] = resolved.value;\n values.set(getKubernetesResourceKey(binding.resource), resourceValues);\n }\n\n if (diagnostics.length > 0) return { ok: false, diagnostics };\n\n return {\n ok: true,\n value: projection.resources.map((desired) => {\n const secretValues = values.get(desired.owner.externalId ?? '');\n if (secretValues === undefined) return desired;\n return {\n ...desired,\n resource: { ...desired.resource, stringData: secretValues },\n };\n }),\n diagnostics: [],\n };\n}\n"]}
1
+ {"version":3,"file":"materializeKubernetesSecretsAsync.js","sourceRoot":"","sources":["../../../../../src/features/workload-reconciliation/application/use-cases/materializeKubernetesSecretsAsync.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AAEhF,6EAA6E;AAC7E,MAAM,CAAC,KAAK,UAAU,iCAAiC,CACrD,OAAgC,EAChC,UAAgC;IAEhC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkC,CAAC;IACzD,MAAM,WAAW,GAAsB,EAAE,CAAC;IAE1C,KAAK,MAAM,OAAO,IAAI,UAAU,CAAC,cAAc,EAAE,CAAC;QAChD,MAAM,QAAQ,GACZ,OAAO,CAAC,SAAS,CAAC,MAAM,KAAK,cAAc;YACzC,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC;YAC/D,CAAC,CAAC,MAAM,2BAA2B,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QACpE,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,WAAW,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;YAC1C,SAAS;QACX,CAAC;QACD,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC,wBAAwB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QACpF,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;QAC7C,MAAM,CAAC,GAAG,CAAC,wBAAwB,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IAE9D,OAAO;QACL,EAAE,EAAE,IAAI;QACR,KAAK,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YAC1C,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;YAChE,IAAI,YAAY,KAAK,SAAS;gBAAE,OAAO,OAAO,CAAC;YAC/C,OAAO;gBACL,GAAG,OAAO;gBACV,QAAQ,EAAE,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE;aAC5D,CAAC;QACJ,CAAC,CAAC;QACF,WAAW,EAAE,EAAE;KAChB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,2BAA2B,CACxC,OAAgC,EAChC,SAGC;IAED,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IAC3E,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,OAAO,QAAQ,CAAC;IAClC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC5C,OAAO,KAAK,KAAK,SAAS;QACxB,CAAC,CAAC;YACE,EAAE,EAAE,KAAK;YACT,WAAW,EAAE;gBACX;oBACE,QAAQ,EAAE,OAAO;oBACjB,IAAI,EAAE,mCAAmC;oBACzC,OAAO,EAAE,uDAAuD;iBACjE;aACF;SACF;QACH,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;AAC3C,CAAC","sourcesContent":["import type { InfraDiagnostic, InfraResult } from '@ankhorage/contracts/infra';\n\nimport type { KubernetesDriverRequest } from '../../../../types/kubernetesDriver';\nimport type {\n KubernetesDesiredResource,\n KubernetesProjection,\n} from '../../../../types/kubernetesResources';\nimport { getKubernetesResourceKey } from '../../utils/getKubernetesResourceKey';\n\n/*** Resolve referenced secrets into ephemeral Kubernetes apply resources. */\nexport async function materializeKubernetesSecretsAsync(\n request: KubernetesDriverRequest,\n projection: KubernetesProjection,\n): Promise<InfraResult<readonly KubernetesDesiredResource[]>> {\n const values = new Map<string, Record<string, string>>();\n const diagnostics: InfraDiagnostic[] = [];\n\n for (const binding of projection.secretBindings) {\n const resolved =\n binding.reference.source === 'secret-store'\n ? await request.context.secrets.resolveAsync(binding.reference)\n : await resolveCredentialValueAsync(request, binding.reference);\n if (!resolved.ok) {\n diagnostics.push(...resolved.diagnostics);\n continue;\n }\n const resourceValues = values.get(getKubernetesResourceKey(binding.resource)) ?? {};\n resourceValues[binding.key] = resolved.value;\n values.set(getKubernetesResourceKey(binding.resource), resourceValues);\n }\n\n if (diagnostics.length > 0) return { ok: false, diagnostics };\n\n return {\n ok: true,\n value: projection.resources.map((desired) => {\n const secretValues = values.get(desired.owner.externalId ?? '');\n if (secretValues === undefined) return desired;\n return {\n ...desired,\n resource: { ...desired.resource, stringData: secretValues },\n };\n }),\n diagnostics: [],\n };\n}\n\nasync function resolveCredentialValueAsync(\n request: KubernetesDriverRequest,\n reference: Extract<\n KubernetesProjection['secretBindings'][number]['reference'],\n { source: 'control-plane' }\n >,\n): Promise<InfraResult<string>> {\n const resolved = await request.context.credentials.resolveAsync(reference);\n if (!resolved.ok) return resolved;\n const value = resolved.value[reference.key];\n return value === undefined\n ? {\n ok: false,\n diagnostics: [\n {\n severity: 'error',\n code: 'kubernetes-credential-key-missing',\n message: 'A required control-plane credential field is missing.',\n },\n ],\n }\n : { ok: true, value, diagnostics: [] };\n}\n"]}
@@ -26,6 +26,14 @@ function assignValue(outputs, value, target, publicValues, secrets, diagnostics,
26
26
  secrets.push({ key: toKubernetesName(key), reference: value.reference, target });
27
27
  return;
28
28
  }
29
+ if (value.kind === 'credential') {
30
+ secrets.push({
31
+ key: toKubernetesName(key),
32
+ reference: { ...value.reference, key: value.key },
33
+ target,
34
+ });
35
+ return;
36
+ }
29
37
  const matches = outputs.filter((output) => output.owner.resourceId === value.resourceId && output.name === value.output);
30
38
  const [output] = matches;
31
39
  if (matches.length !== 1 || output === undefined) {
@@ -1 +1 @@
1
- {"version":3,"file":"resolveKubernetesWorkloadValues.js","sourceRoot":"","sources":["../../../../../src/features/workload-reconciliation/application/use-cases/resolveKubernetesWorkloadValues.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n InfraDiagnostic,\n InfraOutput,\n InfraResult,\n InfraWorkloadSpec,\n InfraWorkloadValue,\n} from '@ankhorage/contracts/infra';\n\nimport type {\n KubernetesResolvedWorkloadValues,\n KubernetesSecretTarget,\n} from '../../../../types/kubernetesResources';\nimport { toKubernetesName } from '../../utils/toKubernetesName';\n\n/*** Resolve public outputs while retaining privileged workload values as secret references. */\nexport function resolveKubernetesWorkloadValues(\n outputs: readonly InfraOutput[],\n workload: InfraWorkloadSpec,\n): InfraResult<KubernetesResolvedWorkloadValues> {\n const environment: Record<string, string> = {};\n const files: Record<string, string> = {};\n const secrets: KubernetesSecretTarget[] = [];\n const diagnostics: InfraDiagnostic[] = [];\n\n for (const [name, value] of Object.entries(workload.environment ?? {}).sort(([a], [b]) =>\n a.localeCompare(b),\n )) {\n assignValue(\n outputs,\n value,\n { kind: 'environment', name },\n environment,\n secrets,\n diagnostics,\n `env-${name}`,\n );\n }\n for (const [index, file] of (workload.files ?? []).entries()) {\n assignValue(\n outputs,\n file.content,\n { kind: 'file', path: file.path },\n files,\n secrets,\n diagnostics,\n `file-${index}`,\n );\n }\n\n return diagnostics.length > 0\n ? { ok: false, diagnostics }\n : { ok: true, value: { environment, files, secrets }, diagnostics: [] };\n}\n\n/*** Assign one portable value without resolving privileged content. */\nfunction assignValue(\n outputs: readonly InfraOutput[],\n value: InfraWorkloadValue,\n target: KubernetesSecretTarget['target'],\n publicValues: Record<string, string>,\n secrets: KubernetesSecretTarget[],\n diagnostics: InfraDiagnostic[],\n key: string,\n): void {\n const publicKey = target.kind === 'environment' ? target.name : target.path;\n if (value.kind === 'literal') {\n Object.assign(publicValues, { [publicKey]: value.value });\n return;\n }\n if (value.kind === 'secret') {\n secrets.push({ key: toKubernetesName(key), reference: value.reference, target });\n return;\n }\n\n const matches = outputs.filter(\n (output) => output.owner.resourceId === value.resourceId && output.name === value.output,\n );\n const [output] = matches;\n if (matches.length !== 1 || output === undefined) {\n diagnostics.push({\n severity: 'error',\n code: 'kubernetes-output-unresolved',\n message: `Workload output ${value.resourceId}.${value.output} did not resolve uniquely.`,\n });\n return;\n }\n if (output.visibility === 'secret') {\n secrets.push({ key: toKubernetesName(key), reference: output.reference, target });\n return;\n }\n Object.assign(publicValues, { [publicKey]: String(output.value) });\n}\n"]}
1
+ {"version":3,"file":"resolveKubernetesWorkloadValues.js","sourceRoot":"","sources":["../../../../../src/features/workload-reconciliation/application/use-cases/resolveKubernetesWorkloadValues.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n InfraDiagnostic,\n InfraOutput,\n InfraResult,\n InfraWorkloadSpec,\n InfraWorkloadValue,\n} from '@ankhorage/contracts/infra';\n\nimport type {\n KubernetesResolvedWorkloadValues,\n KubernetesSecretTarget,\n} from '../../../../types/kubernetesResources';\nimport { toKubernetesName } from '../../utils/toKubernetesName';\n\n/*** Resolve public outputs while retaining privileged workload values as secret references. */\nexport function resolveKubernetesWorkloadValues(\n outputs: readonly InfraOutput[],\n workload: InfraWorkloadSpec,\n): InfraResult<KubernetesResolvedWorkloadValues> {\n const environment: Record<string, string> = {};\n const files: Record<string, string> = {};\n const secrets: KubernetesSecretTarget[] = [];\n const diagnostics: InfraDiagnostic[] = [];\n\n for (const [name, value] of Object.entries(workload.environment ?? {}).sort(([a], [b]) =>\n a.localeCompare(b),\n )) {\n assignValue(\n outputs,\n value,\n { kind: 'environment', name },\n environment,\n secrets,\n diagnostics,\n `env-${name}`,\n );\n }\n for (const [index, file] of (workload.files ?? []).entries()) {\n assignValue(\n outputs,\n file.content,\n { kind: 'file', path: file.path },\n files,\n secrets,\n diagnostics,\n `file-${index}`,\n );\n }\n\n return diagnostics.length > 0\n ? { ok: false, diagnostics }\n : { ok: true, value: { environment, files, secrets }, diagnostics: [] };\n}\n\n/*** Assign one portable value without resolving privileged content. */\nfunction assignValue(\n outputs: readonly InfraOutput[],\n value: InfraWorkloadValue,\n target: KubernetesSecretTarget['target'],\n publicValues: Record<string, string>,\n secrets: KubernetesSecretTarget[],\n diagnostics: InfraDiagnostic[],\n key: string,\n): void {\n const publicKey = target.kind === 'environment' ? target.name : target.path;\n if (value.kind === 'literal') {\n Object.assign(publicValues, { [publicKey]: value.value });\n return;\n }\n if (value.kind === 'secret') {\n secrets.push({ key: toKubernetesName(key), reference: value.reference, target });\n return;\n }\n if (value.kind === 'credential') {\n secrets.push({\n key: toKubernetesName(key),\n reference: { ...value.reference, key: value.key },\n target,\n });\n return;\n }\n\n const matches = outputs.filter(\n (output) => output.owner.resourceId === value.resourceId && output.name === value.output,\n );\n const [output] = matches;\n if (matches.length !== 1 || output === undefined) {\n diagnostics.push({\n severity: 'error',\n code: 'kubernetes-output-unresolved',\n message: `Workload output ${value.resourceId}.${value.output} did not resolve uniquely.`,\n });\n return;\n }\n if (output.visibility === 'secret') {\n secrets.push({ key: toKubernetesName(key), reference: output.reference, target });\n return;\n }\n Object.assign(publicValues, { [publicKey]: String(output.value) });\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -4,5 +4,5 @@ export { projectKubernetesResourcesAsync } from './features/workload-reconciliat
4
4
  export { createKubernetesDriver } from './features/workload-reconciliation/composition/createKubernetesDriver';
5
5
  export type { KubectlKubernetesApi, KubectlKubernetesApiOptions, KubernetesCommandRequest, KubernetesCommandResult, KubernetesCommandRunner, } from './types/kubectl';
6
6
  export type { KubernetesDriver, KubernetesDriverOptions, KubernetesDriverRequest, } from './types/kubernetesDriver';
7
- export type { KubernetesApi, KubernetesDesiredResource, KubernetesOwnershipQuery, KubernetesProjection, KubernetesResource, KubernetesResourceMetadata, KubernetesResourceObservation, KubernetesResourceReference, KubernetesSecretBinding, } from './types/kubernetesResources';
7
+ export type { KubernetesApi, KubernetesDesiredResource, KubernetesOwnershipQuery, KubernetesPrivilegedReference, KubernetesProjection, KubernetesResource, KubernetesResourceMetadata, KubernetesResourceObservation, KubernetesResourceReference, KubernetesSecretBinding, } from './types/kubernetesResources';
8
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,OAAO,EAAE,0BAA0B,EAAE,MAAM,wEAAwE,CAAC;AACpH,OAAO,EAAE,+BAA+B,EAAE,MAAM,0FAA0F,CAAC;AAC3I,OAAO,EAAE,sBAAsB,EAAE,MAAM,uEAAuE,CAAC;AAC/G,YAAY,EACV,oBAAoB,EACpB,2BAA2B,EAC3B,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,gBAAgB,EAChB,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,aAAa,EACb,yBAAyB,EACzB,wBAAwB,EACxB,oBAAoB,EACpB,kBAAkB,EAClB,0BAA0B,EAC1B,6BAA6B,EAC7B,2BAA2B,EAC3B,uBAAuB,GACxB,MAAM,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,OAAO,EAAE,0BAA0B,EAAE,MAAM,wEAAwE,CAAC;AACpH,OAAO,EAAE,+BAA+B,EAAE,MAAM,0FAA0F,CAAC;AAC3I,OAAO,EAAE,sBAAsB,EAAE,MAAM,uEAAuE,CAAC;AAC/G,YAAY,EACV,oBAAoB,EACpB,2BAA2B,EAC3B,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,gBAAgB,EAChB,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,aAAa,EACb,yBAAyB,EACzB,wBAAwB,EACxB,6BAA6B,EAC7B,oBAAoB,EACpB,kBAAkB,EAClB,0BAA0B,EAC1B,6BAA6B,EAC7B,2BAA2B,EAC3B,uBAAuB,GACxB,MAAM,6BAA6B,CAAC"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,OAAO,EAAE,0BAA0B,EAAE,MAAM,wEAAwE,CAAC;AACpH,OAAO,EAAE,+BAA+B,EAAE,MAAM,0FAA0F,CAAC;AAC3I,OAAO,EAAE,sBAAsB,EAAE,MAAM,uEAAuE,CAAC","sourcesContent":["/** Public shared Kubernetes workload-driver boundary. */\nexport { createKubectlKubernetesApi } from './features/workload-reconciliation/adapters/createKubectlKubernetesApi';\nexport { projectKubernetesResourcesAsync } from './features/workload-reconciliation/application/use-cases/projectKubernetesResourcesAsync';\nexport { createKubernetesDriver } from './features/workload-reconciliation/composition/createKubernetesDriver';\nexport type {\n KubectlKubernetesApi,\n KubectlKubernetesApiOptions,\n KubernetesCommandRequest,\n KubernetesCommandResult,\n KubernetesCommandRunner,\n} from './types/kubectl';\nexport type {\n KubernetesDriver,\n KubernetesDriverOptions,\n KubernetesDriverRequest,\n} from './types/kubernetesDriver';\nexport type {\n KubernetesApi,\n KubernetesDesiredResource,\n KubernetesOwnershipQuery,\n KubernetesProjection,\n KubernetesResource,\n KubernetesResourceMetadata,\n KubernetesResourceObservation,\n KubernetesResourceReference,\n KubernetesSecretBinding,\n} from './types/kubernetesResources';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,OAAO,EAAE,0BAA0B,EAAE,MAAM,wEAAwE,CAAC;AACpH,OAAO,EAAE,+BAA+B,EAAE,MAAM,0FAA0F,CAAC;AAC3I,OAAO,EAAE,sBAAsB,EAAE,MAAM,uEAAuE,CAAC","sourcesContent":["/** Public shared Kubernetes workload-driver boundary. */\nexport { createKubectlKubernetesApi } from './features/workload-reconciliation/adapters/createKubectlKubernetesApi';\nexport { projectKubernetesResourcesAsync } from './features/workload-reconciliation/application/use-cases/projectKubernetesResourcesAsync';\nexport { createKubernetesDriver } from './features/workload-reconciliation/composition/createKubernetesDriver';\nexport type {\n KubectlKubernetesApi,\n KubectlKubernetesApiOptions,\n KubernetesCommandRequest,\n KubernetesCommandResult,\n KubernetesCommandRunner,\n} from './types/kubectl';\nexport type {\n KubernetesDriver,\n KubernetesDriverOptions,\n KubernetesDriverRequest,\n} from './types/kubernetesDriver';\nexport type {\n KubernetesApi,\n KubernetesDesiredResource,\n KubernetesOwnershipQuery,\n KubernetesPrivilegedReference,\n KubernetesProjection,\n KubernetesResource,\n KubernetesResourceMetadata,\n KubernetesResourceObservation,\n KubernetesResourceReference,\n KubernetesSecretBinding,\n} from './types/kubernetesResources';\n"]}
@@ -1,4 +1,7 @@
1
- import type { InfraOwnedResource, InfraPlanAction, InfraResourceStatus, InfraSecretReference } from '@ankhorage/contracts/infra';
1
+ import type { InfraControlPlaneCredentialRef, InfraOwnedResource, InfraPlanAction, InfraResourceStatus, InfraSecretReference } from '@ankhorage/contracts/infra';
2
+ export type KubernetesPrivilegedReference = InfraSecretReference | (InfraControlPlaneCredentialRef & {
3
+ readonly key: string;
4
+ });
2
5
  export interface KubernetesResourceMetadata {
3
6
  readonly name: string;
4
7
  readonly namespace?: string;
@@ -44,7 +47,7 @@ export interface KubernetesApi {
44
47
  export interface KubernetesSecretBinding {
45
48
  readonly resource: KubernetesResourceReference;
46
49
  readonly key: string;
47
- readonly reference: InfraSecretReference;
50
+ readonly reference: KubernetesPrivilegedReference;
48
51
  }
49
52
  export interface KubernetesDesiredResource {
50
53
  readonly resource: KubernetesResource;
@@ -67,7 +70,7 @@ export interface KubernetesResolvedWorkloadValues {
67
70
  }
68
71
  export interface KubernetesSecretTarget {
69
72
  readonly key: string;
70
- readonly reference: InfraSecretReference;
73
+ readonly reference: KubernetesPrivilegedReference;
71
74
  readonly target: {
72
75
  readonly kind: 'environment';
73
76
  readonly name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"kubernetesResources.d.ts","sourceRoot":"","sources":["../../src/types/kubernetesResources.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"kubernetesResources.d.ts","sourceRoot":"","sources":["../../src/types/kubernetesResources.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"kubernetesResources.js","sourceRoot":"","sources":["../../src/types/kubernetesResources.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n InfraOwnedResource,\n InfraPlanAction,\n InfraResourceStatus,\n InfraSecretReference,\n} from '@ankhorage/contracts/infra';\n\nexport interface KubernetesResourceMetadata {\n readonly name: string;\n readonly namespace?: string;\n readonly labels: Readonly<Record<string, string>>;\n readonly annotations: Readonly<Record<string, string>>;\n}\n\nexport interface KubernetesResource {\n readonly apiVersion: string;\n readonly kind: string;\n readonly metadata: KubernetesResourceMetadata;\n readonly data?: Readonly<Record<string, string>>;\n readonly stringData?: Readonly<Record<string, string>>;\n readonly spec?: Readonly<Record<string, unknown>>;\n}\n\nexport interface KubernetesResourceReference {\n readonly apiVersion: string;\n readonly kind: string;\n readonly name: string;\n readonly namespace?: string;\n}\n\nexport interface KubernetesOwnershipQuery {\n readonly namespace: string;\n readonly labels: Readonly<Record<string, string>>;\n readonly signal?: AbortSignal;\n}\n\nexport interface KubernetesResourceObservation {\n readonly state: InfraResourceStatus['state'];\n readonly detail?: string;\n /** Values that are explicitly safe to expose through Infra public outputs. */\n readonly publicOutputs?: Readonly<Record<string, string | number | boolean>>;\n}\n\n/** Generic Kubernetes API boundary implemented from already authenticated cluster access. */\nexport interface KubernetesApi {\n listOwnedAsync(query: KubernetesOwnershipQuery): Promise<readonly KubernetesResource[]>;\n applyAsync(resource: KubernetesResource, signal?: AbortSignal): Promise<void>;\n deleteAsync(resource: KubernetesResourceReference, signal?: AbortSignal): Promise<void>;\n observeAsync(\n resource: KubernetesResourceReference,\n signal?: AbortSignal,\n ): Promise<KubernetesResourceObservation>;\n waitUntilReadyAsync(\n resource: KubernetesResourceReference,\n options: { readonly timeoutSeconds: number; readonly signal?: AbortSignal },\n ): Promise<KubernetesResourceObservation>;\n}\n\nexport interface KubernetesSecretBinding {\n readonly resource: KubernetesResourceReference;\n readonly key: string;\n readonly reference: InfraSecretReference;\n}\n\nexport interface KubernetesDesiredResource {\n readonly resource: KubernetesResource;\n readonly owner: InfraOwnedResource;\n}\n\n/** Serializable desired resources contain references, never resolved secret values. */\nexport interface KubernetesProjection {\n readonly resources: readonly KubernetesDesiredResource[];\n readonly secretBindings: readonly KubernetesSecretBinding[];\n}\n\nexport interface KubernetesPreparedChange {\n readonly action: InfraPlanAction;\n readonly desired?: KubernetesDesiredResource;\n readonly actual?: KubernetesResource;\n}\n\nexport interface KubernetesResolvedWorkloadValues {\n readonly environment: Readonly<Record<string, string>>;\n readonly files: Readonly<Record<string, string>>;\n readonly secrets: readonly KubernetesSecretTarget[];\n}\n\nexport interface KubernetesSecretTarget {\n readonly key: string;\n readonly reference: InfraSecretReference;\n readonly target:\n | { readonly kind: 'environment'; readonly name: string }\n | { readonly kind: 'file'; readonly path: string };\n}\n\nexport interface KubernetesWorkloadProjection {\n readonly resources: readonly KubernetesDesiredResource[];\n readonly secretBindings: readonly KubernetesSecretBinding[];\n}\n\nexport interface KubernetesPreparedChanges {\n readonly changes: readonly KubernetesPreparedChange[];\n readonly projection: KubernetesProjection;\n}\n"]}
1
+ {"version":3,"file":"kubernetesResources.js","sourceRoot":"","sources":["../../src/types/kubernetesResources.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n InfraControlPlaneCredentialRef,\n InfraOwnedResource,\n InfraPlanAction,\n InfraResourceStatus,\n InfraSecretReference,\n} from '@ankhorage/contracts/infra';\n\nexport type KubernetesPrivilegedReference =\n InfraSecretReference | (InfraControlPlaneCredentialRef & { readonly key: string });\n\nexport interface KubernetesResourceMetadata {\n readonly name: string;\n readonly namespace?: string;\n readonly labels: Readonly<Record<string, string>>;\n readonly annotations: Readonly<Record<string, string>>;\n}\n\nexport interface KubernetesResource {\n readonly apiVersion: string;\n readonly kind: string;\n readonly metadata: KubernetesResourceMetadata;\n readonly data?: Readonly<Record<string, string>>;\n readonly stringData?: Readonly<Record<string, string>>;\n readonly spec?: Readonly<Record<string, unknown>>;\n}\n\nexport interface KubernetesResourceReference {\n readonly apiVersion: string;\n readonly kind: string;\n readonly name: string;\n readonly namespace?: string;\n}\n\nexport interface KubernetesOwnershipQuery {\n readonly namespace: string;\n readonly labels: Readonly<Record<string, string>>;\n readonly signal?: AbortSignal;\n}\n\nexport interface KubernetesResourceObservation {\n readonly state: InfraResourceStatus['state'];\n readonly detail?: string;\n /** Values that are explicitly safe to expose through Infra public outputs. */\n readonly publicOutputs?: Readonly<Record<string, string | number | boolean>>;\n}\n\n/** Generic Kubernetes API boundary implemented from already authenticated cluster access. */\nexport interface KubernetesApi {\n listOwnedAsync(query: KubernetesOwnershipQuery): Promise<readonly KubernetesResource[]>;\n applyAsync(resource: KubernetesResource, signal?: AbortSignal): Promise<void>;\n deleteAsync(resource: KubernetesResourceReference, signal?: AbortSignal): Promise<void>;\n observeAsync(\n resource: KubernetesResourceReference,\n signal?: AbortSignal,\n ): Promise<KubernetesResourceObservation>;\n waitUntilReadyAsync(\n resource: KubernetesResourceReference,\n options: { readonly timeoutSeconds: number; readonly signal?: AbortSignal },\n ): Promise<KubernetesResourceObservation>;\n}\n\nexport interface KubernetesSecretBinding {\n readonly resource: KubernetesResourceReference;\n readonly key: string;\n readonly reference: KubernetesPrivilegedReference;\n}\n\nexport interface KubernetesDesiredResource {\n readonly resource: KubernetesResource;\n readonly owner: InfraOwnedResource;\n}\n\n/** Serializable desired resources contain references, never resolved secret values. */\nexport interface KubernetesProjection {\n readonly resources: readonly KubernetesDesiredResource[];\n readonly secretBindings: readonly KubernetesSecretBinding[];\n}\n\nexport interface KubernetesPreparedChange {\n readonly action: InfraPlanAction;\n readonly desired?: KubernetesDesiredResource;\n readonly actual?: KubernetesResource;\n}\n\nexport interface KubernetesResolvedWorkloadValues {\n readonly environment: Readonly<Record<string, string>>;\n readonly files: Readonly<Record<string, string>>;\n readonly secrets: readonly KubernetesSecretTarget[];\n}\n\nexport interface KubernetesSecretTarget {\n readonly key: string;\n readonly reference: KubernetesPrivilegedReference;\n readonly target:\n | { readonly kind: 'environment'; readonly name: string }\n | { readonly kind: 'file'; readonly path: string };\n}\n\nexport interface KubernetesWorkloadProjection {\n readonly resources: readonly KubernetesDesiredResource[];\n readonly secretBindings: readonly KubernetesSecretBinding[];\n}\n\nexport interface KubernetesPreparedChanges {\n readonly changes: readonly KubernetesPreparedChange[];\n readonly projection: KubernetesProjection;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ankhorage/kubernetes",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "Shared Kubernetes workload driver for provider-neutral Ankhorage infrastructure.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -55,7 +55,7 @@
55
55
  "version-packages": "ankhorage-changeset version"
56
56
  },
57
57
  "dependencies": {
58
- "@ankhorage/contracts": "^16.0.0"
58
+ "@ankhorage/contracts": "^17.0.0"
59
59
  },
60
60
  "devDependencies": {
61
61
  "@ankhorage/devtools": "^1.14.6",