@telorun/k8s-runner 0.13.0 → 0.15.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 +166 -107
- package/dist/bundle-store.d.ts +6 -13
- package/dist/bundle-store.d.ts.map +1 -1
- package/dist/bundle-store.js +6 -18
- package/dist/bundle-store.js.map +1 -1
- package/dist/capabilities.d.ts +3 -3
- package/dist/capabilities.js +4 -4
- package/dist/capabilities.js.map +1 -1
- package/dist/config.d.ts +47 -37
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +64 -25
- package/dist/config.js.map +1 -1
- package/dist/k8s/api-error.d.ts +34 -0
- package/dist/k8s/api-error.d.ts.map +1 -0
- package/dist/k8s/api-error.js +118 -0
- package/dist/k8s/api-error.js.map +1 -0
- package/dist/k8s/backend.d.ts +4 -0
- package/dist/k8s/backend.d.ts.map +1 -1
- package/dist/k8s/backend.js +77 -51
- package/dist/k8s/backend.js.map +1 -1
- package/dist/k8s/client.d.ts +7 -2
- package/dist/k8s/client.d.ts.map +1 -1
- package/dist/k8s/client.js +3 -2
- package/dist/k8s/client.js.map +1 -1
- package/dist/k8s/pod-spec.d.ts +8 -9
- package/dist/k8s/pod-spec.d.ts.map +1 -1
- package/dist/k8s/pod-spec.js +19 -29
- package/dist/k8s/pod-spec.js.map +1 -1
- package/dist/k8s/pod-status.d.ts +5 -0
- package/dist/k8s/pod-status.d.ts.map +1 -1
- package/dist/k8s/pod-status.js +9 -2
- package/dist/k8s/pod-status.js.map +1 -1
- package/dist/k8s/routing/create-or-replace.d.ts +5 -0
- package/dist/k8s/routing/create-or-replace.d.ts.map +1 -0
- package/dist/k8s/routing/create-or-replace.js +15 -0
- package/dist/k8s/routing/create-or-replace.js.map +1 -0
- package/dist/k8s/routing/gateway-router.d.ts +5 -0
- package/dist/k8s/routing/gateway-router.d.ts.map +1 -0
- package/dist/k8s/routing/gateway-router.js +178 -0
- package/dist/k8s/routing/gateway-router.js.map +1 -0
- package/dist/k8s/routing/index.d.ts +24 -0
- package/dist/k8s/routing/index.d.ts.map +1 -0
- package/dist/k8s/routing/index.js +27 -0
- package/dist/k8s/routing/index.js.map +1 -0
- package/dist/k8s/routing/ingress-router.d.ts +13 -0
- package/dist/k8s/routing/ingress-router.d.ts.map +1 -0
- package/dist/k8s/routing/ingress-router.js +125 -0
- package/dist/k8s/routing/ingress-router.js.map +1 -0
- package/dist/k8s/routing/route-health.d.ts +34 -0
- package/dist/k8s/routing/route-health.d.ts.map +1 -0
- package/dist/k8s/routing/route-health.js +77 -0
- package/dist/k8s/routing/route-health.js.map +1 -0
- package/dist/k8s/routing/routing-mode.d.ts +45 -0
- package/dist/k8s/routing/routing-mode.d.ts.map +1 -0
- package/dist/k8s/routing/routing-mode.js +141 -0
- package/dist/k8s/routing/routing-mode.js.map +1 -0
- package/dist/k8s/routing/session-endpoints.d.ts +25 -0
- package/dist/k8s/routing/session-endpoints.d.ts.map +1 -0
- package/dist/k8s/routing/session-endpoints.js +36 -0
- package/dist/k8s/routing/session-endpoints.js.map +1 -0
- package/dist/k8s/routing/session-router.d.ts +57 -0
- package/dist/k8s/routing/session-router.d.ts.map +1 -0
- package/dist/k8s/routing/session-router.js +2 -0
- package/dist/k8s/routing/session-router.js.map +1 -0
- package/dist/k8s/routing/session-service.d.ts +14 -0
- package/dist/k8s/routing/session-service.d.ts.map +1 -0
- package/dist/k8s/routing/session-service.js +42 -0
- package/dist/k8s/routing/session-service.js.map +1 -0
- package/dist/k8s/watch-session.d.ts +7 -5
- package/dist/k8s/watch-session.d.ts.map +1 -1
- package/dist/k8s/watch-session.js +90 -83
- package/dist/k8s/watch-session.js.map +1 -1
- package/dist/k8s/workspace-configmap.d.ts.map +1 -1
- package/dist/k8s/workspace-configmap.js +3 -12
- package/dist/k8s/workspace-configmap.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +37 -4
- package/dist/server.js.map +1 -1
- package/package.json +2 -2
- package/src/bundle-store.ts +6 -19
- package/src/capabilities.ts +4 -4
- package/src/config.ts +130 -68
- package/src/k8s/api-error.test.ts +89 -0
- package/src/k8s/api-error.ts +128 -0
- package/src/k8s/backend.ts +103 -58
- package/src/k8s/client.ts +10 -3
- package/src/k8s/pod-spec.test.ts +57 -2
- package/src/k8s/pod-spec.ts +25 -36
- package/src/k8s/pod-status.ts +10 -2
- package/src/k8s/routing/create-or-replace.ts +16 -0
- package/src/k8s/routing/gateway-router.test.ts +236 -0
- package/src/k8s/routing/gateway-router.ts +219 -0
- package/src/k8s/routing/index.ts +44 -0
- package/src/k8s/routing/ingress-router.test.ts +236 -0
- package/src/k8s/routing/ingress-router.ts +157 -0
- package/src/k8s/routing/route-health.test.ts +215 -0
- package/src/k8s/routing/route-health.ts +95 -0
- package/src/k8s/routing/routing-mode.test.ts +218 -0
- package/src/k8s/routing/routing-mode.ts +191 -0
- package/src/k8s/routing/session-endpoints.ts +45 -0
- package/src/k8s/routing/session-router.ts +59 -0
- package/src/k8s/routing/session-service.ts +55 -0
- package/src/k8s/watch-pod-spec.test.ts +0 -1
- package/src/k8s/watch-session.ts +90 -77
- package/src/k8s/workspace-configmap.ts +3 -15
- package/src/server.ts +41 -4
- package/dist/k8s/image-build.d.ts +0 -103
- package/dist/k8s/image-build.d.ts.map +0 -1
- package/dist/k8s/image-build.js +0 -427
- package/dist/k8s/image-build.js.map +0 -1
- package/dist/k8s/ingress.d.ts +0 -15
- package/dist/k8s/ingress.d.ts.map +0 -1
- package/dist/k8s/ingress.js +0 -102
- package/dist/k8s/ingress.js.map +0 -1
- package/src/k8s/image-build.test.ts +0 -238
- package/src/k8s/image-build.ts +0 -540
- package/src/k8s/ingress.test.ts +0 -146
- package/src/k8s/ingress.ts +0 -127
package/src/k8s/ingress.ts
DELETED
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
import type { V1Ingress, V1OwnerReference, V1Service } from "@kubernetes/client-node";
|
|
2
|
-
|
|
3
|
-
import type { K8sRunnerConfig } from "../config.js";
|
|
4
|
-
import type { PortMapping, RunnerEndpoint } from "@telorun/runner-core";
|
|
5
|
-
|
|
6
|
-
/** OwnerReference to the session Pod so the Service + Ingress are garbage
|
|
7
|
-
* collected automatically when the Pod dies — essential for sub-minute
|
|
8
|
-
* sessions that would otherwise leak ingress objects. */
|
|
9
|
-
function podOwnerRef(podName: string, podUid: string): V1OwnerReference {
|
|
10
|
-
return {
|
|
11
|
-
apiVersion: "v1",
|
|
12
|
-
kind: "Pod",
|
|
13
|
-
name: podName,
|
|
14
|
-
uid: podUid,
|
|
15
|
-
controller: true,
|
|
16
|
-
blockOwnerDeletion: true,
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export function buildSessionService(
|
|
21
|
-
config: K8sRunnerConfig,
|
|
22
|
-
sessionId: string,
|
|
23
|
-
podName: string,
|
|
24
|
-
podUid: string,
|
|
25
|
-
ports: PortMapping[],
|
|
26
|
-
): V1Service {
|
|
27
|
-
return {
|
|
28
|
-
apiVersion: "v1",
|
|
29
|
-
kind: "Service",
|
|
30
|
-
metadata: {
|
|
31
|
-
name: `telo-run-${sessionId}`,
|
|
32
|
-
namespace: config.sessionNamespace,
|
|
33
|
-
labels: { "app.kubernetes.io/managed-by": config.managedByLabel },
|
|
34
|
-
ownerReferences: [podOwnerRef(podName, podUid)],
|
|
35
|
-
},
|
|
36
|
-
spec: {
|
|
37
|
-
selector: { "telo.run/session-id": sessionId },
|
|
38
|
-
ports: ports.map((p) => ({
|
|
39
|
-
name: `p${p.port}`,
|
|
40
|
-
port: p.port,
|
|
41
|
-
targetPort: p.port,
|
|
42
|
-
protocol: p.protocol.toUpperCase(),
|
|
43
|
-
})),
|
|
44
|
-
},
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/** Host fronting a single tcp port: `<port>-<sessionId>.<domain>`. The port
|
|
49
|
-
* rides as a leading label (no dots), so it stays a single label under the base
|
|
50
|
-
* domain — matching the docker runner's proxy scheme and compatible with a
|
|
51
|
-
* single-label wildcard cert (`*.<domain>`). */
|
|
52
|
-
function hostForPort(config: K8sRunnerConfig, sessionId: string, port: number): string {
|
|
53
|
-
return `${port}-${sessionId}.${config.sessionIngressBaseDomain}`;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export function buildSessionIngress(
|
|
57
|
-
config: K8sRunnerConfig,
|
|
58
|
-
sessionId: string,
|
|
59
|
-
serviceName: string,
|
|
60
|
-
podName: string,
|
|
61
|
-
podUid: string,
|
|
62
|
-
ports: PortMapping[],
|
|
63
|
-
): { ingress: V1Ingress; hosts: string[] } {
|
|
64
|
-
// Only tcp ports are HTTP-routable; one host rule per port to the matching
|
|
65
|
-
// service port, mirroring the docker runner's per-port URLs.
|
|
66
|
-
const rules = ports
|
|
67
|
-
.filter((p) => p.protocol === "tcp")
|
|
68
|
-
.map((p) => ({
|
|
69
|
-
host: hostForPort(config, sessionId, p.port),
|
|
70
|
-
http: {
|
|
71
|
-
paths: [
|
|
72
|
-
{
|
|
73
|
-
path: "/",
|
|
74
|
-
pathType: "Prefix" as const,
|
|
75
|
-
backend: { service: { name: serviceName, port: { number: p.port } } },
|
|
76
|
-
},
|
|
77
|
-
],
|
|
78
|
-
},
|
|
79
|
-
}));
|
|
80
|
-
const ingress: V1Ingress = {
|
|
81
|
-
apiVersion: "networking.k8s.io/v1",
|
|
82
|
-
kind: "Ingress",
|
|
83
|
-
metadata: {
|
|
84
|
-
name: `telo-run-${sessionId}`,
|
|
85
|
-
namespace: config.sessionNamespace,
|
|
86
|
-
labels: { "app.kubernetes.io/managed-by": config.managedByLabel },
|
|
87
|
-
ownerReferences: [podOwnerRef(podName, podUid)],
|
|
88
|
-
},
|
|
89
|
-
spec: {
|
|
90
|
-
...(config.sessionIngressClassName
|
|
91
|
-
? { ingressClassName: config.sessionIngressClassName }
|
|
92
|
-
: {}),
|
|
93
|
-
// Present the predefined cert (e.g. a Cloudflare Origin cert) so an upstream
|
|
94
|
-
// in Full (Strict) mode can validate the origin. Only meaningful with routable
|
|
95
|
-
// hosts; a single wildcard `*.<domain>` Secret covers every session host.
|
|
96
|
-
...(config.sessionIngressTlsSecretName && rules.length > 0
|
|
97
|
-
? {
|
|
98
|
-
tls: [{ hosts: rules.map((r) => r.host), secretName: config.sessionIngressTlsSecretName }],
|
|
99
|
-
}
|
|
100
|
-
: {}),
|
|
101
|
-
rules,
|
|
102
|
-
},
|
|
103
|
-
};
|
|
104
|
-
return { ingress, hosts: rules.map((r) => r.host) };
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/** Endpoints announced on the `running` status. Every tcp port is fronted by its
|
|
108
|
-
* own per-session Ingress host (`<port>-<sessionId>.<domain>`, served on 443) and
|
|
109
|
-
* carries an external `url`. udp ports aren't HTTP-routable, so they keep the
|
|
110
|
-
* host-less form. Without an ingress base domain, host is left blank for the
|
|
111
|
-
* client adapter to fill (parity with docker). */
|
|
112
|
-
export function endpointsFor(
|
|
113
|
-
config: K8sRunnerConfig,
|
|
114
|
-
sessionId: string,
|
|
115
|
-
ports: PortMapping[],
|
|
116
|
-
): RunnerEndpoint[] {
|
|
117
|
-
if (!config.sessionIngressBaseDomain || ports.length === 0) {
|
|
118
|
-
return ports.map((p) => ({ host: "", port: p.port, protocol: p.protocol }));
|
|
119
|
-
}
|
|
120
|
-
return ports.map((p) => {
|
|
121
|
-
if (p.protocol !== "tcp") {
|
|
122
|
-
return { host: "", port: p.port, protocol: p.protocol };
|
|
123
|
-
}
|
|
124
|
-
const host = hostForPort(config, sessionId, p.port);
|
|
125
|
-
return { host, port: p.port, protocol: p.protocol, url: `https://${host}` };
|
|
126
|
-
});
|
|
127
|
-
}
|