@vibesdotdev/integrations-kubernetes 0.0.0-stage → 1.0.0-rc.1
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 +18 -0
- package/README.md +19 -2
- package/dist/helm-chart.d.ts +13 -0
- package/dist/helm-chart.d.ts.map +1 -0
- package/dist/helm-chart.js +508 -0
- package/dist/helm-chart.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/k8s-configmap.d.ts +25 -0
- package/dist/k8s-configmap.d.ts.map +1 -0
- package/dist/k8s-configmap.js +168 -0
- package/dist/k8s-configmap.js.map +1 -0
- package/dist/k8s-gpu-operator.d.ts +3 -0
- package/dist/k8s-gpu-operator.d.ts.map +1 -0
- package/dist/k8s-gpu-operator.js +53 -0
- package/dist/k8s-gpu-operator.js.map +1 -0
- package/dist/k8s-namespace.d.ts +51 -0
- package/dist/k8s-namespace.d.ts.map +1 -0
- package/dist/k8s-namespace.js +280 -0
- package/dist/k8s-namespace.js.map +1 -0
- package/dist/k8s-pod-health.d.ts +60 -0
- package/dist/k8s-pod-health.d.ts.map +1 -0
- package/dist/k8s-pod-health.js +376 -0
- package/dist/k8s-pod-health.js.map +1 -0
- package/dist/k8s-secret.d.ts +55 -0
- package/dist/k8s-secret.d.ts.map +1 -0
- package/dist/k8s-secret.js +391 -0
- package/dist/k8s-secret.js.map +1 -0
- package/dist/kind-cluster.d.ts +84 -0
- package/dist/kind-cluster.d.ts.map +1 -0
- package/dist/kind-cluster.js +694 -0
- package/dist/kind-cluster.js.map +1 -0
- package/dist/kubectl-budget.client.d.ts +13 -0
- package/dist/kubectl-budget.client.d.ts.map +1 -0
- package/dist/kubectl-budget.client.js +38 -0
- package/dist/kubectl-budget.client.js.map +1 -0
- package/dist/kubectl.d.ts +59 -0
- package/dist/kubectl.d.ts.map +1 -0
- package/dist/kubectl.js +121 -0
- package/dist/kubectl.js.map +1 -0
- package/dist/port-forward-command.d.ts +6 -0
- package/dist/port-forward-command.d.ts.map +1 -0
- package/dist/port-forward-command.js +24 -0
- package/dist/port-forward-command.js.map +1 -0
- package/dist/port-forward-compat.d.ts +11 -0
- package/dist/port-forward-compat.d.ts.map +1 -0
- package/dist/port-forward-compat.js +21 -0
- package/dist/port-forward-compat.js.map +1 -0
- package/dist/port-forward-identity.d.ts +23 -0
- package/dist/port-forward-identity.d.ts.map +1 -0
- package/dist/port-forward-identity.js +72 -0
- package/dist/port-forward-identity.js.map +1 -0
- package/dist/port-forward.consumer.plugin.d.ts +3 -0
- package/dist/port-forward.consumer.plugin.d.ts.map +1 -0
- package/dist/port-forward.consumer.plugin.js +10 -0
- package/dist/port-forward.consumer.plugin.js.map +1 -0
- package/dist/port-forward.d.ts +18 -0
- package/dist/port-forward.d.ts.map +1 -0
- package/dist/port-forward.descriptor.d.ts +7 -0
- package/dist/port-forward.descriptor.d.ts.map +1 -0
- package/dist/port-forward.descriptor.js +3 -0
- package/dist/port-forward.descriptor.js.map +1 -0
- package/dist/port-forward.impl.consumer.d.ts +22 -0
- package/dist/port-forward.impl.consumer.d.ts.map +1 -0
- package/dist/port-forward.impl.consumer.js +32 -0
- package/dist/port-forward.impl.consumer.js.map +1 -0
- package/dist/port-forward.js +26 -0
- package/dist/port-forward.js.map +1 -0
- package/dist/port-forward.kind.d.ts +13 -0
- package/dist/port-forward.kind.d.ts.map +1 -0
- package/dist/port-forward.kind.js +12 -0
- package/dist/port-forward.kind.js.map +1 -0
- package/dist/resource-providers.consumer.plugin.d.ts +3 -0
- package/dist/resource-providers.consumer.plugin.d.ts.map +1 -0
- package/dist/resource-providers.consumer.plugin.js +56 -0
- package/dist/resource-providers.consumer.plugin.js.map +1 -0
- package/dist/schemas/helm-chart.d.ts +14 -0
- package/dist/schemas/helm-chart.d.ts.map +1 -0
- package/dist/schemas/helm-chart.js +12 -0
- package/dist/schemas/helm-chart.js.map +1 -0
- package/dist/schemas/k8s-pod-health.d.ts +17 -0
- package/dist/schemas/k8s-pod-health.d.ts.map +1 -0
- package/dist/schemas/k8s-pod-health.js +21 -0
- package/dist/schemas/k8s-pod-health.js.map +1 -0
- package/dist/schemas/port-forward.d.ts +62 -0
- package/dist/schemas/port-forward.d.ts.map +1 -0
- package/dist/schemas/port-forward.js +24 -0
- package/dist/schemas/port-forward.js.map +1 -0
- package/dist/tool-env.d.ts +19 -0
- package/dist/tool-env.d.ts.map +1 -0
- package/dist/tool-env.js +32 -0
- package/dist/tool-env.js.map +1 -0
- package/package.json +80 -4
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kubernetes ConfigMap Resource Provider (k8s/configmap)
|
|
3
|
+
*
|
|
4
|
+
* Creates a ConfigMap from key/value pairs. The manifest is built in-process
|
|
5
|
+
* and applied on stdin (`kubectl apply -f -`, idempotent): a value never goes
|
|
6
|
+
* on a command line, where every process on the host can read it (SPEC:153).
|
|
7
|
+
*
|
|
8
|
+
* Readiness verifies the configmap exists by name AND that every declared
|
|
9
|
+
* data key is present — so a partial apply (e.g., a key dropped from the
|
|
10
|
+
* descriptor between deploys) surfaces as an error rather than silent drift.
|
|
11
|
+
*/
|
|
12
|
+
import { CapabilityError } from '@vibesdotdev/kernel';
|
|
13
|
+
import * as z from 'zod/v4';
|
|
14
|
+
import { readJsonObject, setupErrorResult, toolFailure, toolOutputExcerpt } from '@vibesdotdev/pm/resources/tool-env';
|
|
15
|
+
import { runKubeCapture } from "./tool-env.js";
|
|
16
|
+
import { attempt } from '@vibesdotdev/pm/utils/attempt';
|
|
17
|
+
import { JsonObjectSchema } from '@vibesdotdev/kernel/schemas/json';
|
|
18
|
+
const KUBECTL_REQUEST_TIMEOUT = '5s';
|
|
19
|
+
const ConfigMapConfigSchema = z.object({
|
|
20
|
+
name: z.string().min(1),
|
|
21
|
+
namespace: z.string().min(1),
|
|
22
|
+
context: z.string().optional(),
|
|
23
|
+
data: z.record(z.string().min(1), z.string()).refine((d) => Object.keys(d).length > 0, {
|
|
24
|
+
message: 'data must contain at least one key/value pair'
|
|
25
|
+
})
|
|
26
|
+
});
|
|
27
|
+
async function inspectConfigMap(runtime, cfg) {
|
|
28
|
+
const cmd = [
|
|
29
|
+
'kubectl',
|
|
30
|
+
'get',
|
|
31
|
+
'configmap',
|
|
32
|
+
cfg.name,
|
|
33
|
+
'--namespace',
|
|
34
|
+
cfg.namespace,
|
|
35
|
+
'--request-timeout',
|
|
36
|
+
KUBECTL_REQUEST_TIMEOUT,
|
|
37
|
+
'-o',
|
|
38
|
+
'json'
|
|
39
|
+
];
|
|
40
|
+
if (cfg.context)
|
|
41
|
+
cmd.push('--context', cfg.context);
|
|
42
|
+
const { exitCode, stdout, stderr } = await runKubeCapture(runtime, cmd[0], cmd.slice(1));
|
|
43
|
+
if (exitCode !== 0) {
|
|
44
|
+
if (stderr.includes('NotFound') || stderr.includes('not found')) {
|
|
45
|
+
return { exists: false, dataKeys: [] };
|
|
46
|
+
}
|
|
47
|
+
return { exists: false, dataKeys: [], error: toolOutputExcerpt(stderr, Object.values(cfg.data)) };
|
|
48
|
+
}
|
|
49
|
+
// Only the key names of the object kubectl printed are read.
|
|
50
|
+
const object = readJsonObject(ConfigMapObjectSchema, stdout);
|
|
51
|
+
if (!object) {
|
|
52
|
+
return { exists: false, dataKeys: [], error: `kubectl get configmap ${cfg.name} answered an unreadable object` };
|
|
53
|
+
}
|
|
54
|
+
return { exists: true, dataKeys: Object.keys(object.data ?? {}) };
|
|
55
|
+
}
|
|
56
|
+
const ConfigMapObjectSchema = z.object({ data: JsonObjectSchema.optional() });
|
|
57
|
+
/** A ConfigMap manifest built in-process, applied on stdin (never `--from-literal` argv). */
|
|
58
|
+
export function buildConfigMapManifest(name, namespace, data) {
|
|
59
|
+
return JSON.stringify({ apiVersion: 'v1', kind: 'ConfigMap', metadata: { name, namespace }, data });
|
|
60
|
+
}
|
|
61
|
+
/** Apply the ConfigMap manifest on stdin, then verify it is visible with every declared key. */
|
|
62
|
+
async function applyConfigMap(runtime, config, cfg) {
|
|
63
|
+
const manifest = buildConfigMapManifest(cfg.name, cfg.namespace, cfg.data);
|
|
64
|
+
const applyCmd = ['kubectl', 'apply', '-f', '-', '--namespace', cfg.namespace];
|
|
65
|
+
if (cfg.context)
|
|
66
|
+
applyCmd.push('--context', cfg.context);
|
|
67
|
+
const applyRun = await runKubeCapture(runtime, applyCmd[0], applyCmd.slice(1), { stdin: manifest });
|
|
68
|
+
if (applyRun.exitCode !== 0) {
|
|
69
|
+
throw toolFailure({ tool: 'kubectl', action: 'apply', outcome: applyRun, secrets: Object.values(cfg.data) });
|
|
70
|
+
}
|
|
71
|
+
const info = await inspectConfigMap(runtime, cfg);
|
|
72
|
+
if (!info.exists) {
|
|
73
|
+
throw new CapabilityError(`ConfigMap '${cfg.name}' was applied but is not visible`, 'UNAVAILABLE', {
|
|
74
|
+
reason: 'pm-configmap-not-visible',
|
|
75
|
+
retryable: true,
|
|
76
|
+
details: { name: cfg.name, namespace: cfg.namespace }
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
const expected = new Set(Object.keys(cfg.data));
|
|
80
|
+
const missing = [...expected].filter((k) => !info.dataKeys.includes(k));
|
|
81
|
+
if (missing.length > 0) {
|
|
82
|
+
throw new CapabilityError(`ConfigMap '${cfg.name}' missing expected keys: ${missing.join(', ')}`, 'UNAVAILABLE', {
|
|
83
|
+
reason: 'pm-configmap-keys-missing',
|
|
84
|
+
retryable: true,
|
|
85
|
+
details: { name: cfg.name, namespace: cfg.namespace, missing }
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
state: {
|
|
90
|
+
id: config.id,
|
|
91
|
+
type: config.type,
|
|
92
|
+
status: 'ready',
|
|
93
|
+
createdAt: new Date(),
|
|
94
|
+
lastChecked: new Date(),
|
|
95
|
+
metadata: { name: cfg.name, namespace: cfg.namespace, keys: info.dataKeys }
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
export const k8sConfigMapProvider = {
|
|
100
|
+
type: 'k8s/configmap',
|
|
101
|
+
async setup(config, { runtime }) {
|
|
102
|
+
const cfg = ConfigMapConfigSchema.parse(config.config);
|
|
103
|
+
const applied = await attempt(() => applyConfigMap(runtime, config, cfg));
|
|
104
|
+
return applied.ok ? applied.value : setupErrorResult(config, applied.failure);
|
|
105
|
+
},
|
|
106
|
+
async teardown(id, _state, { runtime, config: providerConfig }) {
|
|
107
|
+
const stored = providerConfig;
|
|
108
|
+
if (!stored)
|
|
109
|
+
return;
|
|
110
|
+
const cfg = ConfigMapConfigSchema.parse(stored.config);
|
|
111
|
+
const cmd = [
|
|
112
|
+
'kubectl',
|
|
113
|
+
'delete',
|
|
114
|
+
'configmap',
|
|
115
|
+
cfg.name,
|
|
116
|
+
'--namespace',
|
|
117
|
+
cfg.namespace,
|
|
118
|
+
'--ignore-not-found=true'
|
|
119
|
+
];
|
|
120
|
+
if (cfg.context)
|
|
121
|
+
cmd.push('--context', cfg.context);
|
|
122
|
+
const outcome = await runKubeCapture(runtime, cmd[0], cmd.slice(1));
|
|
123
|
+
if (outcome.exitCode !== 0)
|
|
124
|
+
throw toolFailure({ tool: 'kubectl', action: 'delete configmap', outcome });
|
|
125
|
+
},
|
|
126
|
+
async status(id, { runtime, config: providerConfig }) {
|
|
127
|
+
const stored = providerConfig;
|
|
128
|
+
if (!stored)
|
|
129
|
+
return { status: 'missing' };
|
|
130
|
+
const cfg = ConfigMapConfigSchema.parse(stored.config);
|
|
131
|
+
const info = await inspectConfigMap(runtime, cfg);
|
|
132
|
+
if (info.error)
|
|
133
|
+
return { status: 'error', error: info.error };
|
|
134
|
+
if (!info.exists)
|
|
135
|
+
return { status: 'missing' };
|
|
136
|
+
const missing = Object.keys(cfg.data).filter((k) => !info.dataKeys.includes(k));
|
|
137
|
+
if (missing.length > 0) {
|
|
138
|
+
return {
|
|
139
|
+
status: 'error',
|
|
140
|
+
error: `ConfigMap exists but is missing keys: ${missing.join(', ')}`
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
return { status: 'ready', metadata: { keys: info.dataKeys } };
|
|
144
|
+
},
|
|
145
|
+
async checkReady(config, _state, { runtime }) {
|
|
146
|
+
const cfg = ConfigMapConfigSchema.parse(config.config);
|
|
147
|
+
const info = await inspectConfigMap(runtime, cfg);
|
|
148
|
+
if (!info.exists) {
|
|
149
|
+
return {
|
|
150
|
+
ready: false,
|
|
151
|
+
reason: `ConfigMap '${cfg.name}' not found in ${cfg.namespace}`
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
const missing = Object.keys(cfg.data).filter((k) => !info.dataKeys.includes(k));
|
|
155
|
+
if (missing.length > 0) {
|
|
156
|
+
return { ready: false, reason: `Missing keys: ${missing.join(', ')}` };
|
|
157
|
+
}
|
|
158
|
+
return { ready: true };
|
|
159
|
+
},
|
|
160
|
+
validateConfig(config) {
|
|
161
|
+
return ConfigMapConfigSchema.parse(config);
|
|
162
|
+
},
|
|
163
|
+
describe(config) {
|
|
164
|
+
const cfg = ConfigMapConfigSchema.parse(config.config);
|
|
165
|
+
return `k8s ConfigMap '${cfg.name}' in ${cfg.namespace}`;
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
//# sourceMappingURL=k8s-configmap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"k8s-configmap.js","sourceRoot":"","sources":["../src/k8s-configmap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"k8s-gpu-operator.d.ts","sourceRoot":"","sources":["../src/k8s-gpu-operator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAA2B,MAAM,oCAAoC,CAAC;AA2BpG,eAAO,MAAM,sBAAsB,EAAE,gBA2BpC,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { CapabilityError } from '@vibesdotdev/kernel';
|
|
2
|
+
import { getRuntimeExecution } from '@vibesdotdev/kernel/execution';
|
|
3
|
+
import { resolvePMToolEnv } from '@vibesdotdev/pm/helpers/process-env';
|
|
4
|
+
import { pollUntil } from '@vibesdotdev/pm/utils/bounded-wait';
|
|
5
|
+
import { toolFailure } from '@vibesdotdev/pm/resources/tool-env';
|
|
6
|
+
import { KUBE_TOOL_INHERIT_ENV } from "./tool-env.js";
|
|
7
|
+
function readyState(config) {
|
|
8
|
+
return { id: config.id, type: config.type, status: 'ready', lastChecked: new Date() };
|
|
9
|
+
}
|
|
10
|
+
async function run(runtime, command, args) {
|
|
11
|
+
return (await getRuntimeExecution(runtime)).execute({
|
|
12
|
+
command,
|
|
13
|
+
args,
|
|
14
|
+
env: await resolvePMToolEnv(runtime, { inheritEnv: KUBE_TOOL_INHERIT_ENV }),
|
|
15
|
+
envMode: 'replace',
|
|
16
|
+
timeout: 120_000,
|
|
17
|
+
killTree: true
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
async function requireSuccess(runtime, command, args) {
|
|
21
|
+
const result = await run(runtime, command, args);
|
|
22
|
+
if (result.exitCode !== 0)
|
|
23
|
+
throw toolFailure({ tool: command, action: args.slice(0, 2).join(' '), outcome: result });
|
|
24
|
+
return result;
|
|
25
|
+
}
|
|
26
|
+
const probeArgs = ['get', 'ds', 'nvidia-gpu-operator', '-n', 'gpu-operator'];
|
|
27
|
+
export const k8sGpuOperatorProvider = {
|
|
28
|
+
type: 'k8s/gpu-operator',
|
|
29
|
+
validateConfig(config) { return config; },
|
|
30
|
+
async setup(config, { runtime }) {
|
|
31
|
+
if ((await run(runtime, 'kubectl', probeArgs)).exitCode === 0)
|
|
32
|
+
return { state: readyState(config) };
|
|
33
|
+
await requireSuccess(runtime, 'helm', ['repo', 'add', 'gpu-operator', 'https://nvidia.github.io/gpu-operator']);
|
|
34
|
+
await requireSuccess(runtime, 'helm', ['repo', 'update']);
|
|
35
|
+
await requireSuccess(runtime, 'helm', ['upgrade', '--install', 'gpu-operator', 'gpu-operator/gpu-operator', '--namespace', 'gpu-operator', '--create-namespace']);
|
|
36
|
+
// Bounded by the runtime lifecycle (RC07). Poll: the daemonset (owner)
|
|
37
|
+
// answers readiness only when asked; it publishes no event here.
|
|
38
|
+
const ready = await pollUntil(runtime, async () => {
|
|
39
|
+
const result = await run(runtime, 'kubectl', [...probeArgs, '-o', 'jsonpath={.status.numberReady}']);
|
|
40
|
+
return result.exitCode === 0 && Number.parseInt(result.stdout, 10) > 0;
|
|
41
|
+
}, { timeoutMs: 60_000, intervalMs: 2_000, reason: 'pm-gpu-operator-ready' });
|
|
42
|
+
if (ready)
|
|
43
|
+
return { state: readyState(config) };
|
|
44
|
+
throw new CapabilityError('GPU Operator failed to become ready after timeout', 'TIMEOUT', {
|
|
45
|
+
reason: 'pm-gpu-operator-not-ready',
|
|
46
|
+
retryable: true,
|
|
47
|
+
details: { timeoutMs: 60_000 }
|
|
48
|
+
});
|
|
49
|
+
},
|
|
50
|
+
async status(_id, { runtime }) { return { status: (await run(runtime, 'kubectl', probeArgs)).exitCode === 0 ? 'ready' : 'missing' }; },
|
|
51
|
+
async teardown(_id, _state, { runtime }) { await requireSuccess(runtime, 'helm', ['uninstall', 'gpu-operator', '-n', 'gpu-operator', '--ignore-not-found']); }
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=k8s-gpu-operator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"k8s-gpu-operator.js","sourceRoot":"","sources":["../src/k8s-gpu-operator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kubernetes Namespace Resource Provider
|
|
3
|
+
* Manages K8s namespace creation and deletion
|
|
4
|
+
*/
|
|
5
|
+
import * as z from 'zod/v4';
|
|
6
|
+
import type { ResourceProvider, ResourceProviderContext, ResourceSetupResult, ResourceStatusResult, ResourceReadyCheckResult } from '@vibesdotdev/pm/resources/provider';
|
|
7
|
+
import type { ProviderPayload, ResourceConfig, ResourceState } from '@vibesdotdev/pm/schemas/resource';
|
|
8
|
+
/**
|
|
9
|
+
* K8s namespace provider configuration schema
|
|
10
|
+
*/
|
|
11
|
+
declare const K8sNamespaceConfigSchema: z.ZodObject<{
|
|
12
|
+
namespace: z.ZodOptional<z.ZodString>;
|
|
13
|
+
context: z.ZodOptional<z.ZodString>;
|
|
14
|
+
labels: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
15
|
+
annotations: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
16
|
+
}, z.core.$strip>;
|
|
17
|
+
type K8sNamespaceConfig = z.infer<typeof K8sNamespaceConfigSchema>;
|
|
18
|
+
/**
|
|
19
|
+
* Kubernetes Namespace Provider
|
|
20
|
+
* Creates and manages K8s namespaces
|
|
21
|
+
*/
|
|
22
|
+
export declare class K8sNamespaceProvider implements ResourceProvider<K8sNamespaceConfig> {
|
|
23
|
+
readonly type = "k8s";
|
|
24
|
+
readonly subType = "namespace";
|
|
25
|
+
/**
|
|
26
|
+
* Setup (create or ensure) a namespace
|
|
27
|
+
*/
|
|
28
|
+
setup(config: ResourceConfig, { runtime }: ResourceProviderContext): Promise<ResourceSetupResult>;
|
|
29
|
+
/**
|
|
30
|
+
* Teardown (delete) a namespace
|
|
31
|
+
*/
|
|
32
|
+
teardown(id: string, state: ResourceState | undefined, { runtime }: ResourceProviderContext): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Get status of a namespace
|
|
35
|
+
*/
|
|
36
|
+
status(id: string, { runtime, config: storedConfig }: ResourceProviderContext): Promise<ResourceStatusResult>;
|
|
37
|
+
/**
|
|
38
|
+
* Check if namespace is ready
|
|
39
|
+
*/
|
|
40
|
+
checkReady(config: ResourceConfig, _state: ResourceState, { runtime }: ResourceProviderContext): Promise<ResourceReadyCheckResult>;
|
|
41
|
+
/**
|
|
42
|
+
* Validate provider-specific configuration
|
|
43
|
+
*/
|
|
44
|
+
validateConfig(config: ProviderPayload): K8sNamespaceConfig;
|
|
45
|
+
/**
|
|
46
|
+
* Get human-readable description
|
|
47
|
+
*/
|
|
48
|
+
describe(config: ResourceConfig): string;
|
|
49
|
+
}
|
|
50
|
+
export {};
|
|
51
|
+
//# sourceMappingURL=k8s-namespace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"k8s-namespace.d.ts","sourceRoot":"","sources":["../src/k8s-namespace.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAC5B,OAAO,KAAK,EACX,gBAAgB,EAChB,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,EACpB,wBAAwB,EACxB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAKvG;;GAEG;AACH,QAAA,MAAM,wBAAwB;;;;;iBAK5B,CAAC;AAEH,KAAK,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAiNnE;;;GAGG;AACH,qBAAa,oBAAqB,YAAW,gBAAgB,CAAC,kBAAkB,CAAC;IAChF,QAAQ,CAAC,IAAI,SAAS;IACtB,QAAQ,CAAC,OAAO,eAAe;IAE/B;;OAEG;IACG,KAAK,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,EAAE,uBAAuB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA2BvG;;OAEG;IACG,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,SAAS,EAAE,EAAE,OAAO,EAAE,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBjH;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,uBAAuB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IASnH;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,OAAO,EAAE,EAAE,uBAAuB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IA+BxI;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,eAAe,GAAG,kBAAkB;IAI3D;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM;CAMxC"}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kubernetes Namespace Resource Provider
|
|
3
|
+
* Manages K8s namespace creation and deletion
|
|
4
|
+
*/
|
|
5
|
+
import { CapabilityError } from '@vibesdotdev/kernel';
|
|
6
|
+
import * as z from 'zod/v4';
|
|
7
|
+
import { attempt } from '@vibesdotdev/pm/utils/attempt';
|
|
8
|
+
import { providerFailureText, toolFailure, toolOutputExcerpt } from '@vibesdotdev/pm/resources/tool-env';
|
|
9
|
+
import { runKubeCapture } from "./tool-env.js";
|
|
10
|
+
/**
|
|
11
|
+
* K8s namespace provider configuration schema
|
|
12
|
+
*/
|
|
13
|
+
const K8sNamespaceConfigSchema = z.object({
|
|
14
|
+
namespace: z.string().min(1).optional(), // Namespace name (defaults to resource ID)
|
|
15
|
+
context: z.string().optional(), // K8s context to use
|
|
16
|
+
labels: z.record(z.string(), z.string()).optional(), // Additional labels
|
|
17
|
+
annotations: z.record(z.string(), z.string()).optional() // Additional annotations
|
|
18
|
+
});
|
|
19
|
+
/** What a namespace's stored state remembers: the namespace and the context it was created in. */
|
|
20
|
+
const NamespaceStateMetadataSchema = z.object({
|
|
21
|
+
namespace: z.string().optional().catch(undefined),
|
|
22
|
+
context: z.string().optional().catch(undefined)
|
|
23
|
+
});
|
|
24
|
+
/** The parts of `kubectl get namespace -o json` this provider reports. */
|
|
25
|
+
const NamespaceObjectSchema = z.object({
|
|
26
|
+
status: z.object({ phase: z.string().optional() }).optional(),
|
|
27
|
+
metadata: z.object({ creationTimestamp: z.string().optional() }).optional()
|
|
28
|
+
});
|
|
29
|
+
/** A namespace step's failure, typed, its code and reason kept and its cause carried. */
|
|
30
|
+
function namespaceFailure(prefix, caught) {
|
|
31
|
+
const failure = CapabilityError.from(caught);
|
|
32
|
+
return new CapabilityError(`${prefix}: ${failure.message}`, failure.code, {
|
|
33
|
+
reason: failure.reason,
|
|
34
|
+
retryable: failure.retryable,
|
|
35
|
+
details: failure.details,
|
|
36
|
+
cause: failure
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
function isContextMissingError(stderr) {
|
|
40
|
+
return (stderr.includes('context "') ||
|
|
41
|
+
stderr.includes('no context exists with the name') ||
|
|
42
|
+
stderr.includes('context was not found'));
|
|
43
|
+
}
|
|
44
|
+
async function getNamespaceStatus(runtime, namespace, context) {
|
|
45
|
+
const args = ['get', 'namespace', namespace, '-o', 'json', '--request-timeout=5s'];
|
|
46
|
+
if (context) {
|
|
47
|
+
args.unshift('--context', context);
|
|
48
|
+
}
|
|
49
|
+
const { exitCode, stdout, stderr } = await runKubeCapture(runtime, 'kubectl', args);
|
|
50
|
+
return {
|
|
51
|
+
exitCode,
|
|
52
|
+
stdout,
|
|
53
|
+
stderr
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Check if K8s cluster is reachable (fast check with short timeout)
|
|
58
|
+
*/
|
|
59
|
+
async function checkClusterConnectivity(runtime, context) {
|
|
60
|
+
const args = ['cluster-info', '--request-timeout=5s'];
|
|
61
|
+
if (context) {
|
|
62
|
+
args.unshift('--context', context);
|
|
63
|
+
}
|
|
64
|
+
const probe = await attempt(() => runKubeCapture(runtime, 'kubectl', args));
|
|
65
|
+
if (!probe.ok) {
|
|
66
|
+
return { reachable: false, suggestion: 'kubectl command failed. Is kubectl installed?', failure: probe.failure };
|
|
67
|
+
}
|
|
68
|
+
{
|
|
69
|
+
const { exitCode, stderr } = probe.value;
|
|
70
|
+
if (exitCode === 0) {
|
|
71
|
+
return { reachable: true };
|
|
72
|
+
}
|
|
73
|
+
// Analyze error to provide helpful suggestions
|
|
74
|
+
let suggestion = 'Check your Kubernetes cluster status';
|
|
75
|
+
const isKindContext = context?.includes('kind') || context?.startsWith('kind-');
|
|
76
|
+
if (stderr.includes('dial tcp') ||
|
|
77
|
+
stderr.includes('connection refused') ||
|
|
78
|
+
stderr.includes('operation timed out') ||
|
|
79
|
+
stderr.includes('deadline exceeded') ||
|
|
80
|
+
stderr.includes('Unable to connect')) {
|
|
81
|
+
// Check if it's a kind cluster
|
|
82
|
+
if (isKindContext) {
|
|
83
|
+
const clusterName = context?.replace('kind-', '') || 'vibes-local';
|
|
84
|
+
suggestion =
|
|
85
|
+
`Kind cluster '${clusterName}' is not running. Try:\n` +
|
|
86
|
+
` 1. Check Docker: docker info\n` +
|
|
87
|
+
` 2. List clusters: kind get clusters\n` +
|
|
88
|
+
` 3. Create cluster: kind create cluster --name ${clusterName}`;
|
|
89
|
+
}
|
|
90
|
+
else if (stderr.includes('docker')) {
|
|
91
|
+
suggestion = 'Docker may not be running. Start Docker Desktop or run: docker info';
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
suggestion = 'Kubernetes API server is unreachable. Check if your cluster is running';
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
else if (stderr.includes('certificate') || stderr.includes('x509')) {
|
|
98
|
+
suggestion = 'Certificate error. Your kubeconfig may be stale. Try: kubectl config view';
|
|
99
|
+
}
|
|
100
|
+
return { reachable: false, error: toolOutputExcerpt(stderr), suggestion };
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/** Render the namespace manifest with a client dry run, then apply it (idempotent). */
|
|
104
|
+
async function createNamespace(runtime, config, providerConfig, namespace, kubectlArgs) {
|
|
105
|
+
// Create namespace manifest
|
|
106
|
+
const createRun = await runKubeCapture(runtime, 'kubectl', kubectlArgs);
|
|
107
|
+
const createOutput = createRun.stdout;
|
|
108
|
+
if (createRun.exitCode !== 0) {
|
|
109
|
+
throw toolFailure({ tool: 'kubectl', action: 'create namespace --dry-run', outcome: createRun });
|
|
110
|
+
}
|
|
111
|
+
// Apply the manifest (idempotent)
|
|
112
|
+
const applyArgs = ['apply', '-f', '-'];
|
|
113
|
+
if (providerConfig.context) {
|
|
114
|
+
applyArgs.unshift('--context', providerConfig.context);
|
|
115
|
+
}
|
|
116
|
+
const applyRun = await runKubeCapture(runtime, 'kubectl', applyArgs, { stdin: createOutput });
|
|
117
|
+
const applyOutput = applyRun.stdout;
|
|
118
|
+
if (applyRun.exitCode !== 0) {
|
|
119
|
+
throw toolFailure({ tool: 'kubectl', action: 'apply namespace', outcome: applyRun });
|
|
120
|
+
}
|
|
121
|
+
// Return success state
|
|
122
|
+
const state = {
|
|
123
|
+
id: config.id,
|
|
124
|
+
type: 'k8s/namespace',
|
|
125
|
+
status: 'ready',
|
|
126
|
+
createdAt: new Date(),
|
|
127
|
+
lastChecked: new Date(),
|
|
128
|
+
metadata: {
|
|
129
|
+
namespace,
|
|
130
|
+
context: providerConfig.context,
|
|
131
|
+
output: applyOutput.trim()
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
return {
|
|
135
|
+
state,
|
|
136
|
+
metadata: {
|
|
137
|
+
namespace,
|
|
138
|
+
message: applyOutput.trim()
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
/** The namespace's status through `kubectl get`, falling back from an inferred context that does not exist. */
|
|
143
|
+
async function probeNamespaceStatus(runtime, namespace, preferredContext, providerConfig) {
|
|
144
|
+
let statusResult = await getNamespaceStatus(runtime, namespace, preferredContext);
|
|
145
|
+
// If inferred context is missing, fall back to current context.
|
|
146
|
+
if (!providerConfig?.context &&
|
|
147
|
+
statusResult.exitCode !== 0 &&
|
|
148
|
+
isContextMissingError(statusResult.stderr)) {
|
|
149
|
+
statusResult = await getNamespaceStatus(runtime, namespace);
|
|
150
|
+
}
|
|
151
|
+
if (statusResult.exitCode === 0) {
|
|
152
|
+
const ns = NamespaceObjectSchema.parse(JSON.parse(statusResult.stdout));
|
|
153
|
+
return {
|
|
154
|
+
status: 'ready',
|
|
155
|
+
metadata: {
|
|
156
|
+
phase: ns.status?.phase,
|
|
157
|
+
creationTimestamp: ns.metadata?.creationTimestamp,
|
|
158
|
+
context: preferredContext
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
if (statusResult.stderr.includes('not found')) {
|
|
163
|
+
return {
|
|
164
|
+
status: 'missing'
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
return {
|
|
168
|
+
status: 'error',
|
|
169
|
+
error: toolOutputExcerpt(statusResult.stderr)
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Kubernetes Namespace Provider
|
|
174
|
+
* Creates and manages K8s namespaces
|
|
175
|
+
*/
|
|
176
|
+
export class K8sNamespaceProvider {
|
|
177
|
+
type = 'k8s';
|
|
178
|
+
subType = 'namespace';
|
|
179
|
+
/**
|
|
180
|
+
* Setup (create or ensure) a namespace
|
|
181
|
+
*/
|
|
182
|
+
async setup(config, { runtime }) {
|
|
183
|
+
const providerConfig = this.validateConfig(config.config);
|
|
184
|
+
const namespace = providerConfig.namespace || config.id;
|
|
185
|
+
// Fast cluster connectivity check (5s timeout instead of 30s)
|
|
186
|
+
const connectivity = await checkClusterConnectivity(runtime, providerConfig.context);
|
|
187
|
+
if (!connectivity.reachable) {
|
|
188
|
+
const contextInfo = providerConfig.context ? ` (context: ${providerConfig.context})` : '';
|
|
189
|
+
throw new CapabilityError(`K8s cluster unreachable${contextInfo}.`, 'UNAVAILABLE', {
|
|
190
|
+
reason: 'pm-k8s-cluster-unreachable',
|
|
191
|
+
recoveryHint: connectivity.suggestion || 'Check cluster status',
|
|
192
|
+
cause: connectivity.failure
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
// Build kubectl command
|
|
196
|
+
const kubectlArgs = ['create', 'namespace', namespace, '--dry-run=client', '-o', 'yaml'];
|
|
197
|
+
if (providerConfig.context) {
|
|
198
|
+
kubectlArgs.unshift('--context', providerConfig.context);
|
|
199
|
+
}
|
|
200
|
+
const created = await attempt(() => createNamespace(runtime, config, providerConfig, namespace, kubectlArgs));
|
|
201
|
+
if (!created.ok)
|
|
202
|
+
throw namespaceFailure(`Failed to set up K8s namespace '${namespace}'`, created.failure);
|
|
203
|
+
return created.value;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Teardown (delete) a namespace
|
|
207
|
+
*/
|
|
208
|
+
async teardown(id, state, { runtime }) {
|
|
209
|
+
const remembered = NamespaceStateMetadataSchema.parse(state?.metadata ?? {});
|
|
210
|
+
const namespace = remembered.namespace || id;
|
|
211
|
+
const context = remembered.context;
|
|
212
|
+
const args = ['delete', 'namespace', namespace, '--ignore-not-found=true'];
|
|
213
|
+
if (context) {
|
|
214
|
+
args.unshift('--context', context);
|
|
215
|
+
}
|
|
216
|
+
const deleted = await attempt(async () => {
|
|
217
|
+
const { exitCode, stderr } = await runKubeCapture(runtime, 'kubectl', args);
|
|
218
|
+
if (exitCode !== 0 && !stderr.includes('not found')) {
|
|
219
|
+
throw toolFailure({ tool: 'kubectl', action: 'delete namespace', outcome: { exitCode, stderr } });
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
if (!deleted.ok)
|
|
223
|
+
throw namespaceFailure(`Failed to tear down K8s namespace '${namespace}'`, deleted.failure);
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Get status of a namespace
|
|
227
|
+
*/
|
|
228
|
+
async status(id, { runtime, config: storedConfig }) {
|
|
229
|
+
const providerConfig = storedConfig ? this.validateConfig(storedConfig.config) : undefined;
|
|
230
|
+
const namespace = providerConfig?.namespace || id;
|
|
231
|
+
const preferredContext = providerConfig?.context ?? `kind-${namespace}`;
|
|
232
|
+
const probed = await attempt(() => probeNamespaceStatus(runtime, namespace, preferredContext, providerConfig));
|
|
233
|
+
return probed.ok ? probed.value : { status: 'error', error: providerFailureText(probed.failure) };
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Check if namespace is ready
|
|
237
|
+
*/
|
|
238
|
+
async checkReady(config, _state, { runtime }) {
|
|
239
|
+
const providerConfig = this.validateConfig(config.config);
|
|
240
|
+
const namespace = providerConfig.namespace || config.id;
|
|
241
|
+
const context = providerConfig.context;
|
|
242
|
+
const args = ['get', 'namespace', namespace, '-o', 'jsonpath={.status.phase}'];
|
|
243
|
+
if (context) {
|
|
244
|
+
args.unshift('--context', context);
|
|
245
|
+
}
|
|
246
|
+
const probed = await attempt(() => runKubeCapture(runtime, 'kubectl', args));
|
|
247
|
+
if (!probed.ok) {
|
|
248
|
+
return {
|
|
249
|
+
ready: false,
|
|
250
|
+
reason: providerFailureText(probed.failure),
|
|
251
|
+
retryAfter: 2000
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
const { exitCode, stdout } = probed.value;
|
|
255
|
+
if (exitCode === 0 && stdout.trim() === 'Active') {
|
|
256
|
+
return { ready: true };
|
|
257
|
+
}
|
|
258
|
+
return {
|
|
259
|
+
ready: false,
|
|
260
|
+
reason: `Namespace phase: ${stdout.trim() || 'unknown'}`,
|
|
261
|
+
retryAfter: 1000
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Validate provider-specific configuration
|
|
266
|
+
*/
|
|
267
|
+
validateConfig(config) {
|
|
268
|
+
return K8sNamespaceConfigSchema.parse(config);
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Get human-readable description
|
|
272
|
+
*/
|
|
273
|
+
describe(config) {
|
|
274
|
+
const providerConfig = this.validateConfig(config.config);
|
|
275
|
+
const namespace = providerConfig.namespace || config.id;
|
|
276
|
+
const context = providerConfig.context ? ` (context: ${providerConfig.context})` : '';
|
|
277
|
+
return `Kubernetes namespace '${namespace}'${context}`;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=k8s-namespace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"k8s-namespace.js","sourceRoot":"","sources":["../src/k8s-namespace.ts"],"names":[],"mappings":"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"}
|