@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.
Files changed (118) hide show
  1. package/README.md +166 -107
  2. package/dist/bundle-store.d.ts +6 -13
  3. package/dist/bundle-store.d.ts.map +1 -1
  4. package/dist/bundle-store.js +6 -18
  5. package/dist/bundle-store.js.map +1 -1
  6. package/dist/capabilities.d.ts +3 -3
  7. package/dist/capabilities.js +4 -4
  8. package/dist/capabilities.js.map +1 -1
  9. package/dist/config.d.ts +47 -37
  10. package/dist/config.d.ts.map +1 -1
  11. package/dist/config.js +64 -25
  12. package/dist/config.js.map +1 -1
  13. package/dist/k8s/api-error.d.ts +34 -0
  14. package/dist/k8s/api-error.d.ts.map +1 -0
  15. package/dist/k8s/api-error.js +118 -0
  16. package/dist/k8s/api-error.js.map +1 -0
  17. package/dist/k8s/backend.d.ts +4 -0
  18. package/dist/k8s/backend.d.ts.map +1 -1
  19. package/dist/k8s/backend.js +77 -51
  20. package/dist/k8s/backend.js.map +1 -1
  21. package/dist/k8s/client.d.ts +7 -2
  22. package/dist/k8s/client.d.ts.map +1 -1
  23. package/dist/k8s/client.js +3 -2
  24. package/dist/k8s/client.js.map +1 -1
  25. package/dist/k8s/pod-spec.d.ts +8 -9
  26. package/dist/k8s/pod-spec.d.ts.map +1 -1
  27. package/dist/k8s/pod-spec.js +19 -29
  28. package/dist/k8s/pod-spec.js.map +1 -1
  29. package/dist/k8s/pod-status.d.ts +5 -0
  30. package/dist/k8s/pod-status.d.ts.map +1 -1
  31. package/dist/k8s/pod-status.js +9 -2
  32. package/dist/k8s/pod-status.js.map +1 -1
  33. package/dist/k8s/routing/create-or-replace.d.ts +5 -0
  34. package/dist/k8s/routing/create-or-replace.d.ts.map +1 -0
  35. package/dist/k8s/routing/create-or-replace.js +15 -0
  36. package/dist/k8s/routing/create-or-replace.js.map +1 -0
  37. package/dist/k8s/routing/gateway-router.d.ts +5 -0
  38. package/dist/k8s/routing/gateway-router.d.ts.map +1 -0
  39. package/dist/k8s/routing/gateway-router.js +178 -0
  40. package/dist/k8s/routing/gateway-router.js.map +1 -0
  41. package/dist/k8s/routing/index.d.ts +24 -0
  42. package/dist/k8s/routing/index.d.ts.map +1 -0
  43. package/dist/k8s/routing/index.js +27 -0
  44. package/dist/k8s/routing/index.js.map +1 -0
  45. package/dist/k8s/routing/ingress-router.d.ts +13 -0
  46. package/dist/k8s/routing/ingress-router.d.ts.map +1 -0
  47. package/dist/k8s/routing/ingress-router.js +125 -0
  48. package/dist/k8s/routing/ingress-router.js.map +1 -0
  49. package/dist/k8s/routing/route-health.d.ts +34 -0
  50. package/dist/k8s/routing/route-health.d.ts.map +1 -0
  51. package/dist/k8s/routing/route-health.js +77 -0
  52. package/dist/k8s/routing/route-health.js.map +1 -0
  53. package/dist/k8s/routing/routing-mode.d.ts +45 -0
  54. package/dist/k8s/routing/routing-mode.d.ts.map +1 -0
  55. package/dist/k8s/routing/routing-mode.js +141 -0
  56. package/dist/k8s/routing/routing-mode.js.map +1 -0
  57. package/dist/k8s/routing/session-endpoints.d.ts +25 -0
  58. package/dist/k8s/routing/session-endpoints.d.ts.map +1 -0
  59. package/dist/k8s/routing/session-endpoints.js +36 -0
  60. package/dist/k8s/routing/session-endpoints.js.map +1 -0
  61. package/dist/k8s/routing/session-router.d.ts +57 -0
  62. package/dist/k8s/routing/session-router.d.ts.map +1 -0
  63. package/dist/k8s/routing/session-router.js +2 -0
  64. package/dist/k8s/routing/session-router.js.map +1 -0
  65. package/dist/k8s/routing/session-service.d.ts +14 -0
  66. package/dist/k8s/routing/session-service.d.ts.map +1 -0
  67. package/dist/k8s/routing/session-service.js +42 -0
  68. package/dist/k8s/routing/session-service.js.map +1 -0
  69. package/dist/k8s/watch-session.d.ts +7 -5
  70. package/dist/k8s/watch-session.d.ts.map +1 -1
  71. package/dist/k8s/watch-session.js +90 -83
  72. package/dist/k8s/watch-session.js.map +1 -1
  73. package/dist/k8s/workspace-configmap.d.ts.map +1 -1
  74. package/dist/k8s/workspace-configmap.js +3 -12
  75. package/dist/k8s/workspace-configmap.js.map +1 -1
  76. package/dist/server.d.ts.map +1 -1
  77. package/dist/server.js +37 -4
  78. package/dist/server.js.map +1 -1
  79. package/package.json +2 -2
  80. package/src/bundle-store.ts +6 -19
  81. package/src/capabilities.ts +4 -4
  82. package/src/config.ts +130 -68
  83. package/src/k8s/api-error.test.ts +89 -0
  84. package/src/k8s/api-error.ts +128 -0
  85. package/src/k8s/backend.ts +103 -58
  86. package/src/k8s/client.ts +10 -3
  87. package/src/k8s/pod-spec.test.ts +57 -2
  88. package/src/k8s/pod-spec.ts +25 -36
  89. package/src/k8s/pod-status.ts +10 -2
  90. package/src/k8s/routing/create-or-replace.ts +16 -0
  91. package/src/k8s/routing/gateway-router.test.ts +236 -0
  92. package/src/k8s/routing/gateway-router.ts +219 -0
  93. package/src/k8s/routing/index.ts +44 -0
  94. package/src/k8s/routing/ingress-router.test.ts +236 -0
  95. package/src/k8s/routing/ingress-router.ts +157 -0
  96. package/src/k8s/routing/route-health.test.ts +215 -0
  97. package/src/k8s/routing/route-health.ts +95 -0
  98. package/src/k8s/routing/routing-mode.test.ts +218 -0
  99. package/src/k8s/routing/routing-mode.ts +191 -0
  100. package/src/k8s/routing/session-endpoints.ts +45 -0
  101. package/src/k8s/routing/session-router.ts +59 -0
  102. package/src/k8s/routing/session-service.ts +55 -0
  103. package/src/k8s/watch-pod-spec.test.ts +0 -1
  104. package/src/k8s/watch-session.ts +90 -77
  105. package/src/k8s/workspace-configmap.ts +3 -15
  106. package/src/server.ts +41 -4
  107. package/dist/k8s/image-build.d.ts +0 -103
  108. package/dist/k8s/image-build.d.ts.map +0 -1
  109. package/dist/k8s/image-build.js +0 -427
  110. package/dist/k8s/image-build.js.map +0 -1
  111. package/dist/k8s/ingress.d.ts +0 -15
  112. package/dist/k8s/ingress.d.ts.map +0 -1
  113. package/dist/k8s/ingress.js +0 -102
  114. package/dist/k8s/ingress.js.map +0 -1
  115. package/src/k8s/image-build.test.ts +0 -238
  116. package/src/k8s/image-build.ts +0 -540
  117. package/src/k8s/ingress.test.ts +0 -146
  118. package/src/k8s/ingress.ts +0 -127
@@ -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
- }