@cat-factory/integrations 0.34.0 → 0.35.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/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/modules/environments/EnvironmentConnectionService.d.ts +38 -40
- package/dist/modules/environments/EnvironmentConnectionService.d.ts.map +1 -1
- package/dist/modules/environments/EnvironmentConnectionService.js +106 -114
- package/dist/modules/environments/EnvironmentConnectionService.js.map +1 -1
- package/dist/modules/environments/EnvironmentProvisioningService.d.ts +15 -6
- package/dist/modules/environments/EnvironmentProvisioningService.d.ts.map +1 -1
- package/dist/modules/environments/EnvironmentProvisioningService.js +21 -7
- package/dist/modules/environments/EnvironmentProvisioningService.js.map +1 -1
- package/dist/modules/environments/EnvironmentTeardownService.d.ts +0 -2
- package/dist/modules/environments/EnvironmentTeardownService.d.ts.map +1 -1
- package/dist/modules/environments/EnvironmentTeardownService.js +5 -5
- package/dist/modules/environments/EnvironmentTeardownService.js.map +1 -1
- package/dist/modules/environments/HttpEnvironmentProvider.js +1 -1
- package/dist/modules/environments/HttpEnvironmentProvider.js.map +1 -1
- package/dist/modules/environments/environment-backends.d.ts +53 -0
- package/dist/modules/environments/environment-backends.d.ts.map +1 -0
- package/dist/modules/environments/environment-backends.js +101 -0
- package/dist/modules/environments/environment-backends.js.map +1 -0
- package/dist/modules/environments/environments.logic.d.ts +5 -1
- package/dist/modules/environments/environments.logic.d.ts.map +1 -1
- package/dist/modules/environments/environments.logic.js +24 -0
- package/dist/modules/environments/environments.logic.js.map +1 -1
- package/dist/modules/kubernetes/KubernetesApiClient.d.ts +27 -0
- package/dist/modules/kubernetes/KubernetesApiClient.d.ts.map +1 -0
- package/dist/modules/kubernetes/KubernetesApiClient.js +77 -0
- package/dist/modules/kubernetes/KubernetesApiClient.js.map +1 -0
- package/dist/modules/kubernetes/KubernetesEnvironmentProvider.d.ts +33 -0
- package/dist/modules/kubernetes/KubernetesEnvironmentProvider.d.ts.map +1 -0
- package/dist/modules/kubernetes/KubernetesEnvironmentProvider.js +250 -0
- package/dist/modules/kubernetes/KubernetesEnvironmentProvider.js.map +1 -0
- package/dist/modules/kubernetes/KubernetesRunnerTransport.d.ts +1 -13
- package/dist/modules/kubernetes/KubernetesRunnerTransport.d.ts.map +1 -1
- package/dist/modules/kubernetes/KubernetesRunnerTransport.js +6 -69
- package/dist/modules/kubernetes/KubernetesRunnerTransport.js.map +1 -1
- package/dist/modules/kubernetes/kubernetes-environment.logic.d.ts +68 -0
- package/dist/modules/kubernetes/kubernetes-environment.logic.d.ts.map +1 -0
- package/dist/modules/kubernetes/kubernetes-environment.logic.js +189 -0
- package/dist/modules/kubernetes/kubernetes-environment.logic.js.map +1 -0
- package/dist/modules/kubernetes/kubernetes.logic.d.ts +14 -2
- package/dist/modules/kubernetes/kubernetes.logic.d.ts.map +1 -1
- package/dist/modules/kubernetes/kubernetes.logic.js +45 -12
- package/dist/modules/kubernetes/kubernetes.logic.js.map +1 -1
- package/dist/modules/runners/HttpRunnerPoolProvider.d.ts.map +1 -1
- package/dist/modules/runners/HttpRunnerPoolProvider.js +9 -0
- package/dist/modules/runners/HttpRunnerPoolProvider.js.map +1 -1
- package/dist/modules/runners/runner-backends.d.ts.map +1 -1
- package/dist/modules/runners/runner-backends.js +3 -2
- package/dist/modules/runners/runner-backends.js.map +1 -1
- package/package.json +4 -3
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import { KubernetesApiClient, safeText } from './KubernetesApiClient.js';
|
|
2
|
+
import { apiBase, classifyDeploymentReadiness } from './kubernetes.logic.js';
|
|
3
|
+
import { deriveUrl, extractLoadBalancerAddress, isManifestFile, namespaceUrl, parseKubernetesEnvConfig, parseManifests, resolveNamespace, resourceUrl, templateVars, } from './kubernetes-environment.logic.js';
|
|
4
|
+
// Native Kubernetes ephemeral-environment provider. It applies an operator-authored
|
|
5
|
+
// set of k3s/Kubernetes manifests (read from the PR repo or a separate repo) into a
|
|
6
|
+
// per-PR namespace via the apiserver, using the SAME KubernetesApiClient (bearer
|
|
7
|
+
// token + custom-CA TLS) as the runner backend. Per-PR isolation means provisioning
|
|
8
|
+
// is idempotent (server-side apply) and teardown is a single namespace delete.
|
|
9
|
+
//
|
|
10
|
+
// The per-workspace config rides the stored manifest's `providerConfig` bag (parsed +
|
|
11
|
+
// validated here); the apiserver token is the `apiToken` secret. The provider is a
|
|
12
|
+
// stateless singleton — every call re-derives the client from the manifest, so one
|
|
13
|
+
// instance serves every workspace.
|
|
14
|
+
const APPLY_TIMEOUT_MS = 30_000;
|
|
15
|
+
const READ_TIMEOUT_MS = 30_000;
|
|
16
|
+
const FIELD_MANAGER = 'cat-factory';
|
|
17
|
+
export class KubernetesEnvironmentProvider {
|
|
18
|
+
options;
|
|
19
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
20
|
+
constructor(options = {}) {
|
|
21
|
+
this.options = options;
|
|
22
|
+
}
|
|
23
|
+
async provision(req) {
|
|
24
|
+
const config = parseKubernetesEnvConfig(req.manifest);
|
|
25
|
+
const client = new KubernetesApiClient(config, req.resolveSecret);
|
|
26
|
+
const inputs = req.inputs;
|
|
27
|
+
const namespace = resolveNamespace(config, inputs);
|
|
28
|
+
const image = config.imageTemplate ? renderImage(config.imageTemplate, inputs) : undefined;
|
|
29
|
+
const vars = templateVars(inputs, namespace, image);
|
|
30
|
+
await this.ensureNamespace(client, config, namespace);
|
|
31
|
+
const texts = await this.readManifests(req, config);
|
|
32
|
+
const resources = [];
|
|
33
|
+
for (const text of texts) {
|
|
34
|
+
resources.push(...parseManifests(text, vars, namespace, inputs.blockId, config.labels));
|
|
35
|
+
}
|
|
36
|
+
if (resources.length === 0) {
|
|
37
|
+
throw new Error('No Kubernetes manifests were found at the configured source path');
|
|
38
|
+
}
|
|
39
|
+
for (const resource of resources) {
|
|
40
|
+
await this.apply(client, config, namespace, resource);
|
|
41
|
+
}
|
|
42
|
+
// For an ingress-template URL the address is known immediately; status-backed
|
|
43
|
+
// sources resolve to null until `status()` reads the live LoadBalancer address.
|
|
44
|
+
const url = deriveUrl(config.url, vars, null);
|
|
45
|
+
return {
|
|
46
|
+
externalId: namespace,
|
|
47
|
+
url,
|
|
48
|
+
status: 'provisioning',
|
|
49
|
+
expiresAt: null,
|
|
50
|
+
access: null,
|
|
51
|
+
// Persist the FULL template var set (not just namespace/branch): `status()`
|
|
52
|
+
// re-derives an ingress-template URL from these, so dropping e.g. `{{pullNumber}}`
|
|
53
|
+
// / `{{image}}` here would silently corrupt a previously-correct URL on the next
|
|
54
|
+
// status poll. The vars are non-secret PR/repo context.
|
|
55
|
+
fields: { ...vars },
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
async status(req) {
|
|
59
|
+
const config = parseKubernetesEnvConfig(req.manifest);
|
|
60
|
+
const namespace = req.provisionFields.namespace ?? req.externalId;
|
|
61
|
+
if (!namespace) {
|
|
62
|
+
return {
|
|
63
|
+
externalId: null,
|
|
64
|
+
url: null,
|
|
65
|
+
status: 'failed',
|
|
66
|
+
expiresAt: null,
|
|
67
|
+
access: null,
|
|
68
|
+
fields: {},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
const client = new KubernetesApiClient(config, req.resolveSecret);
|
|
72
|
+
const status = await this.deploymentStatus(client, config, namespace);
|
|
73
|
+
const url = await this.resolveLiveUrl(client, config, namespace, req.provisionFields);
|
|
74
|
+
return {
|
|
75
|
+
externalId: namespace,
|
|
76
|
+
url,
|
|
77
|
+
status,
|
|
78
|
+
expiresAt: null,
|
|
79
|
+
access: null,
|
|
80
|
+
fields: req.provisionFields,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
async teardown(req) {
|
|
84
|
+
const config = parseKubernetesEnvConfig(req.manifest);
|
|
85
|
+
const namespace = req.provisionFields.namespace ?? req.externalId;
|
|
86
|
+
if (!namespace)
|
|
87
|
+
return { status: 'torn_down' };
|
|
88
|
+
const client = new KubernetesApiClient(config, req.resolveSecret);
|
|
89
|
+
const res = await client.fetch('DELETE', namespaceUrl(config, namespace), undefined, APPLY_TIMEOUT_MS);
|
|
90
|
+
// 404 ⇒ already gone (idempotent). 409 ⇒ a delete is already in flight.
|
|
91
|
+
if (!res.ok && res.status !== 404 && res.status !== 409) {
|
|
92
|
+
throw new Error(`Failed to delete namespace '${namespace}' (HTTP ${res.status}): ${await safeText(res)}`);
|
|
93
|
+
}
|
|
94
|
+
return { status: 'torn_down' };
|
|
95
|
+
}
|
|
96
|
+
async testConnection(req) {
|
|
97
|
+
if (!req.manifest)
|
|
98
|
+
return { ok: false, message: 'Expected a Kubernetes environment manifest.' };
|
|
99
|
+
let config;
|
|
100
|
+
try {
|
|
101
|
+
config = parseKubernetesEnvConfig(req.manifest);
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
return { ok: false, message: err instanceof Error ? err.message : String(err) };
|
|
105
|
+
}
|
|
106
|
+
const client = new KubernetesApiClient(config, req.resolveSecret);
|
|
107
|
+
try {
|
|
108
|
+
const res = await client.fetch('GET', `${namespaceUrl(config)}?limit=1`, undefined, READ_TIMEOUT_MS);
|
|
109
|
+
if (res.ok)
|
|
110
|
+
return { ok: true, message: `Reached ${apiBase(config)}.` };
|
|
111
|
+
return { ok: false, message: `apiserver responded ${res.status}: ${await safeText(res)}` };
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
return { ok: false, message: err instanceof Error ? err.message : String(err) };
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
describeConfig() {
|
|
118
|
+
// The structured fields (apiserver URL, namespace template, manifest source, URL
|
|
119
|
+
// source) are collected by the bespoke Kubernetes connect form; the only secret is
|
|
120
|
+
// the ServiceAccount token, surfaced here so the unconfigured banner can clear.
|
|
121
|
+
return [{ key: 'apiToken', label: 'ServiceAccount token', secret: true, required: true }];
|
|
122
|
+
}
|
|
123
|
+
// --- internals ----------------------------------------------------------
|
|
124
|
+
async ensureNamespace(client, config, namespace) {
|
|
125
|
+
const body = {
|
|
126
|
+
apiVersion: 'v1',
|
|
127
|
+
kind: 'Namespace',
|
|
128
|
+
metadata: {
|
|
129
|
+
name: namespace,
|
|
130
|
+
...(config.labels ? { labels: config.labels } : {}),
|
|
131
|
+
...(config.annotations ? { annotations: config.annotations } : {}),
|
|
132
|
+
},
|
|
133
|
+
};
|
|
134
|
+
const res = await client.fetch('POST', namespaceUrl(config), body, APPLY_TIMEOUT_MS);
|
|
135
|
+
if (res.ok || res.status === 409)
|
|
136
|
+
return; // 409 AlreadyExists ⇒ idempotent
|
|
137
|
+
throw new Error(`Failed to create namespace '${namespace}' (HTTP ${res.status}): ${await safeText(res)}`);
|
|
138
|
+
}
|
|
139
|
+
async apply(client, config, namespace, resource) {
|
|
140
|
+
const name = resource.metadata.name;
|
|
141
|
+
const url = `${resourceUrl(config, resource.apiVersion, resource.kind, namespace, name)}?fieldManager=${FIELD_MANAGER}&force=true`;
|
|
142
|
+
const res = await client.fetch('PATCH', url, JSON.stringify(resource), APPLY_TIMEOUT_MS, 'application/apply-patch+json');
|
|
143
|
+
if (!res.ok) {
|
|
144
|
+
throw new Error(`Failed to apply ${resource.kind}/${name} (HTTP ${res.status}): ${await safeText(res)}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/** Aggregate the namespace's Deployments into one lifecycle verdict. */
|
|
148
|
+
async deploymentStatus(client, config, namespace) {
|
|
149
|
+
const res = await client.fetch('GET', resourceUrl(config, 'apps/v1', 'Deployment', namespace), undefined, READ_TIMEOUT_MS);
|
|
150
|
+
if (res.status === 404)
|
|
151
|
+
return 'failed';
|
|
152
|
+
if (!res.ok)
|
|
153
|
+
return 'provisioning';
|
|
154
|
+
const body = (await res.json());
|
|
155
|
+
const items = Array.isArray(body.items) ? body.items : [];
|
|
156
|
+
if (items.length === 0)
|
|
157
|
+
return 'ready'; // nothing to roll out (e.g. a static Service)
|
|
158
|
+
let anyPending = false;
|
|
159
|
+
for (const item of items) {
|
|
160
|
+
const readiness = classifyDeploymentReadiness(item);
|
|
161
|
+
if (readiness === 'gone')
|
|
162
|
+
return 'failed';
|
|
163
|
+
if (readiness !== 'ready')
|
|
164
|
+
anyPending = true;
|
|
165
|
+
}
|
|
166
|
+
return anyPending ? 'provisioning' : 'ready';
|
|
167
|
+
}
|
|
168
|
+
/** Resolve the live URL, reading the LoadBalancer address for status-backed sources. */
|
|
169
|
+
async resolveLiveUrl(client, config, namespace, fields) {
|
|
170
|
+
const url = config.url;
|
|
171
|
+
const vars = { ...fields, namespace };
|
|
172
|
+
if (url.source === 'ingressTemplate')
|
|
173
|
+
return deriveUrl(url, vars, null);
|
|
174
|
+
const address = await this.readLoadBalancerAddress(client, config, namespace);
|
|
175
|
+
return address ? deriveUrl(url, vars, address) : null;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Read the LoadBalancer address backing a status source: the named Service/Ingress, or
|
|
179
|
+
* — when `ingressStatus` omits the name — the single Ingress applied in the namespace
|
|
180
|
+
* (the schema/UI documents "absent ⇒ the only Ingress applied"). Null until assigned.
|
|
181
|
+
*/
|
|
182
|
+
async readLoadBalancerAddress(client, config, namespace) {
|
|
183
|
+
const url = config.url;
|
|
184
|
+
if (url.source === 'serviceStatus') {
|
|
185
|
+
const res = await client.fetch('GET', resourceUrl(config, 'v1', 'Service', namespace, url.serviceName), undefined, READ_TIMEOUT_MS);
|
|
186
|
+
return res.ok ? extractLoadBalancerAddress(await res.json()) : null;
|
|
187
|
+
}
|
|
188
|
+
// ingressTemplate is resolved by the caller; only ingressStatus reaches here.
|
|
189
|
+
if (url.source !== 'ingressStatus')
|
|
190
|
+
return null;
|
|
191
|
+
// ingressStatus: a named Ingress, else the only Ingress in the namespace.
|
|
192
|
+
if (url.ingressName) {
|
|
193
|
+
const res = await client.fetch('GET', resourceUrl(config, 'networking.k8s.io/v1', 'Ingress', namespace, url.ingressName), undefined, READ_TIMEOUT_MS);
|
|
194
|
+
return res.ok ? extractLoadBalancerAddress(await res.json()) : null;
|
|
195
|
+
}
|
|
196
|
+
const res = await client.fetch('GET', resourceUrl(config, 'networking.k8s.io/v1', 'Ingress', namespace), undefined, READ_TIMEOUT_MS);
|
|
197
|
+
if (!res.ok)
|
|
198
|
+
return null;
|
|
199
|
+
const body = (await res.json());
|
|
200
|
+
const items = Array.isArray(body.items) ? body.items : [];
|
|
201
|
+
if (items.length === 0)
|
|
202
|
+
return null;
|
|
203
|
+
return extractLoadBalancerAddress(items[0]);
|
|
204
|
+
}
|
|
205
|
+
/** Read the manifest file(s) from the configured source (co-located or separate repo). */
|
|
206
|
+
async readManifests(req, config) {
|
|
207
|
+
const source = config.manifestSource;
|
|
208
|
+
let ctx;
|
|
209
|
+
let ref;
|
|
210
|
+
if (source.type === 'colocated') {
|
|
211
|
+
ctx = req.runRepo ?? null;
|
|
212
|
+
if (!ctx) {
|
|
213
|
+
throw new Error('Co-located manifests require the run repo (is GitHub connected?)');
|
|
214
|
+
}
|
|
215
|
+
ref = req.inputs.branch || ctx.baseBranch;
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
const [owner, repo] = source.repo.split('/');
|
|
219
|
+
ctx = (await req.resolveRepoFiles?.({ owner: owner, repo: repo, ref: source.ref })) ?? null;
|
|
220
|
+
if (!ctx) {
|
|
221
|
+
throw new Error(`Could not resolve the separate manifests repo '${source.repo}'`);
|
|
222
|
+
}
|
|
223
|
+
ref = source.ref || ctx.baseBranch;
|
|
224
|
+
}
|
|
225
|
+
return this.readPath(ctx.repo, source.path, ref);
|
|
226
|
+
}
|
|
227
|
+
/** Read a single manifest file, or every manifest file in a directory. */
|
|
228
|
+
async readPath(repo, path, ref) {
|
|
229
|
+
const entries = await repo.listDirectory(path, ref);
|
|
230
|
+
const files = entries.filter((e) => e.type === 'file' && isManifestFile(e.path));
|
|
231
|
+
if (files.length > 0) {
|
|
232
|
+
const texts = [];
|
|
233
|
+
for (const entry of files) {
|
|
234
|
+
const file = await repo.getFile(entry.path, ref);
|
|
235
|
+
if (file)
|
|
236
|
+
texts.push(file.content);
|
|
237
|
+
}
|
|
238
|
+
return texts;
|
|
239
|
+
}
|
|
240
|
+
const single = await repo.getFile(path, ref);
|
|
241
|
+
if (!single)
|
|
242
|
+
throw new Error(`No manifests found at '${path}'`);
|
|
243
|
+
return [single.content];
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/** Render the optional image template over the provision inputs. */
|
|
247
|
+
function renderImage(template, inputs) {
|
|
248
|
+
return template.replace(/\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g, (_m, key) => inputs[key] ?? '');
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=KubernetesEnvironmentProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KubernetesEnvironmentProvider.js","sourceRoot":"","sources":["../../../src/modules/kubernetes/KubernetesEnvironmentProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { ConnectionTestResult, KubernetesRunnerConfig, RunnerDispatchKind, RunnerDispatchOptions, RunnerJobRef, RunnerJobView, RunnerTransport, SecretResolver } from '@cat-factory/kernel';
|
|
2
2
|
export declare class KubernetesRunnerTransport implements RunnerTransport {
|
|
3
3
|
private readonly config;
|
|
4
|
-
private readonly
|
|
4
|
+
private readonly client;
|
|
5
5
|
constructor(config: KubernetesRunnerConfig, resolveSecret: SecretResolver);
|
|
6
6
|
dispatch(ref: RunnerJobRef, spec: Record<string, unknown>, kind?: RunnerDispatchKind, options?: RunnerDispatchOptions): Promise<void>;
|
|
7
7
|
poll(ref: RunnerJobRef): Promise<RunnerJobView>;
|
|
@@ -13,17 +13,5 @@ export declare class KubernetesRunnerTransport implements RunnerTransport {
|
|
|
13
13
|
private waitForPodReady;
|
|
14
14
|
private proxyFetch;
|
|
15
15
|
private apiFetch;
|
|
16
|
-
/**
|
|
17
|
-
* Build the undici dispatcher carrying the cluster CA / insecure-skip flag, when
|
|
18
|
-
* configured. A kube-apiserver usually presents a private CA, which `fetch` can't
|
|
19
|
-
* verify without this. Loaded lazily (Node only) so the Worker bundle never pulls
|
|
20
|
-
* in `undici`; on a runtime without it, a custom-CA/insecure config fails clearly.
|
|
21
|
-
*
|
|
22
|
-
* The Agent is cached at MODULE scope keyed by the CA/insecure pair, not per
|
|
23
|
-
* instance: the wiring builds a fresh transport on every dispatch/poll resolve, so
|
|
24
|
-
* a per-instance cache would create (and abandon) one Agent — a TLS connection pool
|
|
25
|
-
* — per poll tick, defeating keep-alive and leaking sockets.
|
|
26
|
-
*/
|
|
27
|
-
private tlsDispatcher;
|
|
28
16
|
}
|
|
29
17
|
//# sourceMappingURL=KubernetesRunnerTransport.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KubernetesRunnerTransport.d.ts","sourceRoot":"","sources":["../../../src/modules/kubernetes/KubernetesRunnerTransport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,EAClB,qBAAqB,EACrB,YAAY,EACZ,aAAa,EACb,eAAe,EACf,cAAc,EACf,MAAM,qBAAqB,CAAA;AA2C5B,qBAAa,yBAA0B,YAAW,eAAe;
|
|
1
|
+
{"version":3,"file":"KubernetesRunnerTransport.d.ts","sourceRoot":"","sources":["../../../src/modules/kubernetes/KubernetesRunnerTransport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,EAClB,qBAAqB,EACrB,YAAY,EACZ,aAAa,EACb,eAAe,EACf,cAAc,EACf,MAAM,qBAAqB,CAAA;AA2C5B,qBAAa,yBAA0B,YAAW,eAAe;IAI7D,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAE5C,YACmB,MAAM,EAAE,sBAAsB,EAC/C,aAAa,EAAE,cAAc,EAG9B;IAEK,QAAQ,CACZ,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,IAAI,GAAE,kBAA4B,EAClC,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAQf;IAEK,IAAI,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CAmBpD;IAED,qEAAqE;IAC/D,OAAO,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB9C;IAED,mFAAmF;IAC7E,cAAc,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAqBpD;YAIa,SAAS;YAaT,eAAe;IA+C7B,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,QAAQ;CAQjB"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { KubernetesApiClient, safeText } from './KubernetesApiClient.js';
|
|
2
|
+
import { analyzePodStatus, apiBase, buildPodManifest, classifyPodReadiness, podName, podUrl, podsUrl, proxyUrl, } from './kubernetes.logic.js';
|
|
2
3
|
// Native Kubernetes runner transport (target k8s 1.35+). One bare Pod per RUN,
|
|
3
4
|
// named deterministically from `ref.runId`; every step of the run re-attaches to
|
|
4
5
|
// that pod by `ref.jobId` — mirroring CloudflareContainerTransport's per-run model
|
|
@@ -28,10 +29,10 @@ const READY_WAIT_MS = 120_000;
|
|
|
28
29
|
const READY_POLL_INTERVAL_MS = 1_500;
|
|
29
30
|
export class KubernetesRunnerTransport {
|
|
30
31
|
config;
|
|
31
|
-
|
|
32
|
+
client;
|
|
32
33
|
constructor(config, resolveSecret) {
|
|
33
34
|
this.config = config;
|
|
34
|
-
this.
|
|
35
|
+
this.client = new KubernetesApiClient(config, resolveSecret);
|
|
35
36
|
}
|
|
36
37
|
async dispatch(ref, spec, kind = 'agent', options) {
|
|
37
38
|
const name = podName(ref.runId);
|
|
@@ -146,72 +147,8 @@ export class KubernetesRunnerTransport {
|
|
|
146
147
|
proxyFetch(method, name, path, body, timeoutMs) {
|
|
147
148
|
return this.apiFetch(method, proxyUrl(this.config, name, path), body, timeoutMs);
|
|
148
149
|
}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
if (!token)
|
|
152
|
-
throw new Error(`Missing Kubernetes ServiceAccount token ('${KUBERNETES_TOKEN_KEY}')`);
|
|
153
|
-
const headers = {
|
|
154
|
-
authorization: `Bearer ${token}`,
|
|
155
|
-
accept: 'application/json',
|
|
156
|
-
};
|
|
157
|
-
let payload;
|
|
158
|
-
if (body !== undefined && method !== 'GET' && method !== 'DELETE') {
|
|
159
|
-
payload = JSON.stringify(body);
|
|
160
|
-
headers['content-type'] = 'application/json';
|
|
161
|
-
}
|
|
162
|
-
const init = {
|
|
163
|
-
method,
|
|
164
|
-
headers,
|
|
165
|
-
body: payload,
|
|
166
|
-
signal: AbortSignal.timeout(timeoutMs),
|
|
167
|
-
};
|
|
168
|
-
const dispatcher = await this.tlsDispatcher();
|
|
169
|
-
if (dispatcher)
|
|
170
|
-
init.dispatcher = dispatcher;
|
|
171
|
-
return fetch(url, init);
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* Build the undici dispatcher carrying the cluster CA / insecure-skip flag, when
|
|
175
|
-
* configured. A kube-apiserver usually presents a private CA, which `fetch` can't
|
|
176
|
-
* verify without this. Loaded lazily (Node only) so the Worker bundle never pulls
|
|
177
|
-
* in `undici`; on a runtime without it, a custom-CA/insecure config fails clearly.
|
|
178
|
-
*
|
|
179
|
-
* The Agent is cached at MODULE scope keyed by the CA/insecure pair, not per
|
|
180
|
-
* instance: the wiring builds a fresh transport on every dispatch/poll resolve, so
|
|
181
|
-
* a per-instance cache would create (and abandon) one Agent — a TLS connection pool
|
|
182
|
-
* — per poll tick, defeating keep-alive and leaking sockets.
|
|
183
|
-
*/
|
|
184
|
-
async tlsDispatcher() {
|
|
185
|
-
if (!this.config.caCertPem && !this.config.insecureSkipTlsVerify)
|
|
186
|
-
return undefined;
|
|
187
|
-
const key = `${this.config.insecureSkipTlsVerify ? 'insecure' : 'verify'}:${this.config.caCertPem ?? ''}`;
|
|
188
|
-
const existing = tlsDispatcherCache.get(key);
|
|
189
|
-
if (existing)
|
|
190
|
-
return existing;
|
|
191
|
-
// Variable specifier so bundlers don't statically resolve `undici`.
|
|
192
|
-
const moduleName = 'undici';
|
|
193
|
-
const undici = (await import(moduleName).catch(() => null));
|
|
194
|
-
if (!undici) {
|
|
195
|
-
throw new Error('Kubernetes custom CA / insecure TLS requires the Node runtime (undici is unavailable).');
|
|
196
|
-
}
|
|
197
|
-
const agent = new undici.Agent({
|
|
198
|
-
connect: {
|
|
199
|
-
ca: this.config.caCertPem,
|
|
200
|
-
rejectUnauthorized: !this.config.insecureSkipTlsVerify,
|
|
201
|
-
},
|
|
202
|
-
});
|
|
203
|
-
tlsDispatcherCache.set(key, agent);
|
|
204
|
-
return agent;
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
/** Module-scoped undici Agent cache, keyed by the CA/insecure pair (see tlsDispatcher). */
|
|
208
|
-
const tlsDispatcherCache = new Map();
|
|
209
|
-
async function safeText(res) {
|
|
210
|
-
try {
|
|
211
|
-
return (await res.text()).slice(0, 300);
|
|
212
|
-
}
|
|
213
|
-
catch {
|
|
214
|
-
return '(no body)';
|
|
150
|
+
apiFetch(method, url, body, timeoutMs) {
|
|
151
|
+
return this.client.fetch(method, url, body, timeoutMs);
|
|
215
152
|
}
|
|
216
153
|
}
|
|
217
154
|
function sleep(ms) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KubernetesRunnerTransport.js","sourceRoot":"","sources":["../../../src/modules/kubernetes/KubernetesRunnerTransport.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,gBAAgB,EAChB,OAAO,EACP,gBAAgB,EAChB,oBAAoB,EACpB,
|
|
1
|
+
{"version":3,"file":"KubernetesRunnerTransport.js","sourceRoot":"","sources":["../../../src/modules/kubernetes/KubernetesRunnerTransport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { EnvironmentManifest, KubernetesEnvironmentConfig, KubernetesUrlSource } from '@cat-factory/kernel';
|
|
2
|
+
/** The label key stamped on the namespace + applied resources, carrying the run/block id. */
|
|
3
|
+
export declare const ENV_BLOCK_LABEL = "cat-factory.blockId";
|
|
4
|
+
/** The owning-prefix for the per-PR namespace. */
|
|
5
|
+
export declare const ENV_NAMESPACE_PREFIX = "cf-env-";
|
|
6
|
+
/** A parsed Kubernetes resource (apiVersion + kind + metadata + the rest). */
|
|
7
|
+
export interface KubernetesResource {
|
|
8
|
+
apiVersion: string;
|
|
9
|
+
kind: string;
|
|
10
|
+
metadata: {
|
|
11
|
+
name?: string;
|
|
12
|
+
namespace?: string;
|
|
13
|
+
labels?: Record<string, string>;
|
|
14
|
+
} & Record<string, unknown>;
|
|
15
|
+
[key: string]: unknown;
|
|
16
|
+
}
|
|
17
|
+
/** Whether a manifest kind is supported by the apply loop. `Namespace` is owned by us. */
|
|
18
|
+
export declare function isSupportedKind(kind: string): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Read the per-workspace Kubernetes config off the stored manifest's `providerConfig`.
|
|
21
|
+
* The config was Valibot-validated at the connect controller boundary, so this trusts
|
|
22
|
+
* the stored shape (a cast) rather than re-parsing (which would pull valibot in here).
|
|
23
|
+
*/
|
|
24
|
+
export declare function parseKubernetesEnvConfig(manifest: EnvironmentManifest): KubernetesEnvironmentConfig;
|
|
25
|
+
/** Build the stored manifest that carries a Kubernetes env config in its providerConfig. */
|
|
26
|
+
export declare function kubernetesConfigToManifest(config: KubernetesEnvironmentConfig): EnvironmentManifest;
|
|
27
|
+
/** The `{{var}}` substitution map available to the namespace + manifest templates. */
|
|
28
|
+
export declare function templateVars(inputs: Record<string, string>, namespace: string, image: string | undefined): Record<string, string>;
|
|
29
|
+
/** Replace `{{ key }}` placeholders from `vars`; an unknown key resolves to ''. */
|
|
30
|
+
export declare function renderTemplate(template: string, vars: Record<string, string>): string;
|
|
31
|
+
/**
|
|
32
|
+
* Resolve the per-PR namespace name: render the configured template (or a default
|
|
33
|
+
* derived from the repo + PR number / block id) then sanitize to an RFC1123 label.
|
|
34
|
+
*
|
|
35
|
+
* The default qualifies the PR number with the repo, because a workspace can have many
|
|
36
|
+
* repos and two of them can open a PR with the SAME number. A bare `cf-env-<pr>` would
|
|
37
|
+
* then collide on one namespace — and since `ensureNamespace` treats the resulting 409
|
|
38
|
+
* as idempotent, the second PR's manifests would be applied INTO the first's live
|
|
39
|
+
* environment (and its teardown would delete the wrong namespace). So prefer
|
|
40
|
+
* `<repoName>-<pullNumber>`, falling back to the globally-unique block id, and only to a
|
|
41
|
+
* bare PR number when neither repo nor block context is present (a manual provision).
|
|
42
|
+
*/
|
|
43
|
+
export declare function resolveNamespace(config: KubernetesEnvironmentConfig, inputs: Record<string, string>): string;
|
|
44
|
+
/** The cluster-scoped Namespace collection/object URL. */
|
|
45
|
+
export declare function namespaceUrl(config: KubernetesEnvironmentConfig, name?: string): string;
|
|
46
|
+
/**
|
|
47
|
+
* The apiserver resource URL for server-side apply (`name` required) or a collection
|
|
48
|
+
* GET (`name` omitted). Throws for an unsupported kind. `apiVersion` carries the
|
|
49
|
+
* group/version; the kind's plural comes from the built-in allow-list.
|
|
50
|
+
*/
|
|
51
|
+
export declare function resourceUrl(config: KubernetesEnvironmentConfig, apiVersion: string, kind: string, namespace: string, name?: string): string;
|
|
52
|
+
/** Whether a repo entry path is a manifest file we should read (yaml/yml/json). */
|
|
53
|
+
export declare function isManifestFile(path: string): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Parse one or more YAML/JSON documents into resources, templating `{{var}}` first,
|
|
56
|
+
* then forcing each resource's namespace + stamping the env label. Empty docs are
|
|
57
|
+
* dropped. Throws on a document missing apiVersion/kind/metadata.name.
|
|
58
|
+
*/
|
|
59
|
+
export declare function parseManifests(text: string, vars: Record<string, string>, namespace: string, blockId: string | undefined, extraLabels: Record<string, string> | undefined): KubernetesResource[];
|
|
60
|
+
/** Read the first LoadBalancer address (ip or hostname) off a Service/Ingress status. */
|
|
61
|
+
export declare function extractLoadBalancerAddress(obj: unknown): string | null;
|
|
62
|
+
/**
|
|
63
|
+
* Derive the environment URL from the configured source. For `ingressTemplate` the URL
|
|
64
|
+
* is known immediately (rendered host); the status-backed sources return null until the
|
|
65
|
+
* caller has fetched the live address and passes it in.
|
|
66
|
+
*/
|
|
67
|
+
export declare function deriveUrl(url: KubernetesUrlSource, vars: Record<string, string>, liveAddress: string | null): string | null;
|
|
68
|
+
//# sourceMappingURL=kubernetes-environment.logic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kubernetes-environment.logic.d.ts","sourceRoot":"","sources":["../../../src/modules/kubernetes/kubernetes-environment.logic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,2BAA2B,EAC3B,mBAAmB,EACpB,MAAM,qBAAqB,CAAA;AAS5B,6FAA6F;AAC7F,eAAO,MAAM,eAAe,wBAAwB,CAAA;AACpD,kDAAkD;AAClD,eAAO,MAAM,oBAAoB,YAAY,CAAA;AAE7C,8EAA8E;AAC9E,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GAAG,MAAM,CACvF,MAAM,EACN,OAAO,CACR,CAAA;IACD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AA8BD,0FAA0F;AAC1F,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAErD;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,mBAAmB,GAC5B,2BAA2B,CAI7B;AAED,4FAA4F;AAC5F,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,2BAA2B,GAClC,mBAAmB,CAerB;AAED,sFAAsF;AACtF,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAExB;AAED,mFAAmF;AACnF,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAErF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,2BAA2B,EACnC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,MAAM,CASR;AAED,0DAA0D;AAC1D,wBAAgB,YAAY,CAAC,MAAM,EAAE,2BAA2B,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAGvF;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,2BAA2B,EACnC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,MAAM,GACZ,MAAM,CAgBR;AAED,mFAAmF;AACnF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,GAC9C,kBAAkB,EAAE,CAyBtB;AAED,yFAAyF;AACzF,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAMtE;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,GAAG,EAAE,mBAAmB,EACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,GACzB,MAAM,GAAG,IAAI,CAWf"}
|