@highstate/k8s 0.9.4 → 0.9.5
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/chunk-DQSCJM5S.js +183 -0
- package/dist/chunk-DQSCJM5S.js.map +1 -0
- package/dist/chunk-FKNHHKOL.js +260 -0
- package/dist/chunk-FKNHHKOL.js.map +1 -0
- package/dist/chunk-HW3NS3MC.js +347 -0
- package/dist/chunk-HW3NS3MC.js.map +1 -0
- package/dist/chunk-OQ7UXASD.js +193 -0
- package/dist/chunk-OQ7UXASD.js.map +1 -0
- package/dist/chunk-QGHMLKTW.js +1123 -0
- package/dist/chunk-QGHMLKTW.js.map +1 -0
- package/dist/chunk-UNVSWG6D.js +214 -0
- package/dist/chunk-UNVSWG6D.js.map +1 -0
- package/dist/deployment-ZP3ASKPT.js +10 -0
- package/dist/deployment-ZP3ASKPT.js.map +1 -0
- package/dist/highstate.manifest.json +8 -6
- package/dist/index.js +291 -954
- package/dist/index.js.map +1 -1
- package/dist/stateful-set-2AH7RAF7.js +10 -0
- package/dist/stateful-set-2AH7RAF7.js.map +1 -0
- package/dist/units/access-point/index.js +6 -1
- package/dist/units/access-point/index.js.map +1 -1
- package/dist/units/cert-manager/index.js +19 -24
- package/dist/units/cert-manager/index.js.map +1 -1
- package/dist/units/cluster-dns/index.js +36 -0
- package/dist/units/cluster-dns/index.js.map +1 -0
- package/dist/units/cluster-patch/index.js +34 -0
- package/dist/units/cluster-patch/index.js.map +1 -0
- package/dist/units/dns01-issuer/index.js +2 -2
- package/dist/units/dns01-issuer/index.js.map +1 -1
- package/dist/units/existing-cluster/index.js +22 -14
- package/dist/units/existing-cluster/index.js.map +1 -1
- package/dist/units/gateway-api/index.js +1 -1
- package/package.json +12 -10
- package/src/access-point.ts +44 -39
- package/src/container.ts +54 -5
- package/src/cron-job.ts +14 -30
- package/src/deployment.ts +170 -127
- package/src/gateway/http-route.ts +7 -5
- package/src/helm.ts +57 -8
- package/src/index.ts +11 -4
- package/src/job.ts +14 -32
- package/src/namespace.ts +241 -0
- package/src/network-policy.ts +371 -87
- package/src/network.ts +41 -0
- package/src/pvc.ts +43 -25
- package/src/scripting/bundle.ts +125 -22
- package/src/scripting/container.ts +16 -11
- package/src/scripting/environment.ts +56 -6
- package/src/secret.ts +195 -0
- package/src/service.ts +209 -89
- package/src/shared.ts +42 -51
- package/src/stateful-set.ts +193 -88
- package/src/units/access-point/index.ts +8 -1
- package/src/units/cert-manager/index.ts +15 -20
- package/src/units/cluster-dns/index.ts +37 -0
- package/src/units/cluster-patch/index.ts +35 -0
- package/src/units/dns01-issuer/index.ts +1 -1
- package/src/units/existing-cluster/index.ts +24 -14
- package/src/workload.ts +342 -44
- package/dist/chunk-K4WKJ4L5.js +0 -455
- package/dist/chunk-K4WKJ4L5.js.map +0 -1
- package/dist/chunk-T5Z2M4JE.js +0 -103
- package/dist/chunk-T5Z2M4JE.js.map +0 -1
package/dist/chunk-K4WKJ4L5.js
DELETED
@@ -1,455 +0,0 @@
|
|
1
|
-
import {
|
2
|
-
commonExtraArgs,
|
3
|
-
mapMetadata,
|
4
|
-
mapNamespaceLikeToNamespaceName,
|
5
|
-
resourceIdToString,
|
6
|
-
verifyProvider
|
7
|
-
} from "./chunk-T5Z2M4JE.js";
|
8
|
-
|
9
|
-
// src/service.ts
|
10
|
-
import { core } from "@pulumi/kubernetes";
|
11
|
-
import {
|
12
|
-
ComponentResource,
|
13
|
-
interpolate,
|
14
|
-
normalize,
|
15
|
-
output
|
16
|
-
} from "@highstate/pulumi";
|
17
|
-
import { omit } from "remeda";
|
18
|
-
import { deepmerge } from "deepmerge-ts";
|
19
|
-
var serviceExtraArgs = [...commonExtraArgs, "port", "ports", "patch"];
|
20
|
-
var Service = class extends ComponentResource {
|
21
|
-
constructor(type, name, args, opts, clusterInfo, metadata, spec, status, resources) {
|
22
|
-
super(type, name, args, opts);
|
23
|
-
this.clusterInfo = clusterInfo;
|
24
|
-
this.metadata = metadata;
|
25
|
-
this.spec = spec;
|
26
|
-
this.status = status;
|
27
|
-
this.resources = resources;
|
28
|
-
}
|
29
|
-
/**
|
30
|
-
* The Highstate service entity.
|
31
|
-
*/
|
32
|
-
get entity() {
|
33
|
-
return output({
|
34
|
-
type: "k8s.service",
|
35
|
-
clusterInfo: this.clusterInfo,
|
36
|
-
metadata: this.metadata,
|
37
|
-
spec: this.spec
|
38
|
-
});
|
39
|
-
}
|
40
|
-
static create(name, args, opts) {
|
41
|
-
return new CreatedService(name, args, opts);
|
42
|
-
}
|
43
|
-
static wrap(name, service, clusterInfo, opts) {
|
44
|
-
return new WrappedService(name, service, clusterInfo, opts);
|
45
|
-
}
|
46
|
-
static external(name, id, clusterInfo, opts) {
|
47
|
-
return new ExternalService(name, id, clusterInfo, opts);
|
48
|
-
}
|
49
|
-
static of(name, entity, opts) {
|
50
|
-
return new ExternalService(name, output(entity).metadata, output(entity).clusterInfo, opts);
|
51
|
-
}
|
52
|
-
/**
|
53
|
-
* Returns the host of the service accessible from the cluster.
|
54
|
-
*
|
55
|
-
* The format is `name.namespace.svc`.
|
56
|
-
*/
|
57
|
-
get clusterHost() {
|
58
|
-
return interpolate`${this.metadata.name}.${this.metadata.namespace}.svc`;
|
59
|
-
}
|
60
|
-
/**
|
61
|
-
* Returns the external IP of the service.
|
62
|
-
*
|
63
|
-
* If the load balancer is available, the external IP is returned, otherwise the IP of the node.
|
64
|
-
*
|
65
|
-
* If the service has no external IP, `undefined` is returned.
|
66
|
-
*/
|
67
|
-
get externalIp() {
|
68
|
-
return output({ spec: this.spec, status: this.status }).apply(({ spec, status }) => {
|
69
|
-
const loadBalancerIp = status.loadBalancer?.ingress?.[0]?.ip;
|
70
|
-
if (loadBalancerIp) {
|
71
|
-
return loadBalancerIp;
|
72
|
-
}
|
73
|
-
const nodeIp = spec.externalIPs?.[0];
|
74
|
-
if (nodeIp) {
|
75
|
-
return nodeIp;
|
76
|
-
}
|
77
|
-
return void 0;
|
78
|
-
});
|
79
|
-
}
|
80
|
-
/**
|
81
|
-
* The "most public" IP of the service.
|
82
|
-
*
|
83
|
-
* Resolves to the external IP if available, otherwise the cluster IP.
|
84
|
-
*
|
85
|
-
* If the service is headless, an error is thrown.
|
86
|
-
*/
|
87
|
-
get ip() {
|
88
|
-
return output({ spec: this.spec, externalIp: this.externalIp }).apply(
|
89
|
-
({ spec, externalIp }) => {
|
90
|
-
if (externalIp) {
|
91
|
-
return externalIp;
|
92
|
-
}
|
93
|
-
const clusterIp = spec.clusterIP;
|
94
|
-
if (clusterIp && clusterIp !== "None") {
|
95
|
-
return clusterIp;
|
96
|
-
}
|
97
|
-
throw new Error("The service does not have neither an external IP nor a cluster IP.");
|
98
|
-
}
|
99
|
-
);
|
100
|
-
}
|
101
|
-
};
|
102
|
-
var CreatedService = class extends Service {
|
103
|
-
constructor(name, args, opts) {
|
104
|
-
const service = output(args).apply(async (args2) => {
|
105
|
-
await verifyProvider(opts.provider, args2.cluster.info);
|
106
|
-
return new (args2.patch ? core.v1.ServicePatch : core.v1.Service)(
|
107
|
-
name,
|
108
|
-
{
|
109
|
-
metadata: mapMetadata(args2.patch?.metadata ?? args2, name),
|
110
|
-
spec: deepmerge(
|
111
|
-
{
|
112
|
-
ports: normalize(args2.port, args2.ports)
|
113
|
-
},
|
114
|
-
omit(args2, serviceExtraArgs)
|
115
|
-
)
|
116
|
-
},
|
117
|
-
{ parent: this, ...opts }
|
118
|
-
);
|
119
|
-
});
|
120
|
-
super(
|
121
|
-
"highstate:k8s:Service",
|
122
|
-
name,
|
123
|
-
args,
|
124
|
-
opts,
|
125
|
-
output(args.cluster).info,
|
126
|
-
service.metadata,
|
127
|
-
service.spec,
|
128
|
-
service.status,
|
129
|
-
[service]
|
130
|
-
);
|
131
|
-
}
|
132
|
-
};
|
133
|
-
var WrappedService = class extends Service {
|
134
|
-
constructor(name, service, clusterInfo, opts) {
|
135
|
-
super(
|
136
|
-
"highstate:k8s:WrappedService",
|
137
|
-
name,
|
138
|
-
{ service, clusterInfo },
|
139
|
-
opts,
|
140
|
-
output(clusterInfo),
|
141
|
-
output(service).metadata,
|
142
|
-
output(service).spec,
|
143
|
-
output(service).status,
|
144
|
-
[service]
|
145
|
-
);
|
146
|
-
}
|
147
|
-
};
|
148
|
-
var ExternalService = class extends Service {
|
149
|
-
constructor(name, id, clusterInfo, opts) {
|
150
|
-
const service = output(id).apply(async (id2) => {
|
151
|
-
await verifyProvider(opts.provider, this.clusterInfo);
|
152
|
-
return core.v1.Service.get(
|
153
|
-
//
|
154
|
-
name,
|
155
|
-
resourceIdToString(id2),
|
156
|
-
{ parent: this, provider: opts.provider }
|
157
|
-
);
|
158
|
-
});
|
159
|
-
super(
|
160
|
-
"highstate:k8s:ExternalService",
|
161
|
-
name,
|
162
|
-
{ id, clusterInfo },
|
163
|
-
opts,
|
164
|
-
output(clusterInfo),
|
165
|
-
service.metadata,
|
166
|
-
service.spec,
|
167
|
-
service.status,
|
168
|
-
[service]
|
169
|
-
);
|
170
|
-
}
|
171
|
-
};
|
172
|
-
function mapContainerPortToServicePort(port) {
|
173
|
-
return {
|
174
|
-
name: port.name,
|
175
|
-
port: port.containerPort,
|
176
|
-
targetPort: port.containerPort,
|
177
|
-
protocol: port.protocol
|
178
|
-
};
|
179
|
-
}
|
180
|
-
function mapServiceToLabelSelector(service) {
|
181
|
-
return {
|
182
|
-
matchLabels: service.spec.selector
|
183
|
-
};
|
184
|
-
}
|
185
|
-
|
186
|
-
// src/gateway/http-route.ts
|
187
|
-
import {
|
188
|
-
ComponentResource as ComponentResource2,
|
189
|
-
normalize as normalize2,
|
190
|
-
output as output3
|
191
|
-
} from "@highstate/pulumi";
|
192
|
-
import { gateway } from "@highstate/gateway-api";
|
193
|
-
import { map, pipe } from "remeda";
|
194
|
-
|
195
|
-
// src/gateway/backend.ts
|
196
|
-
import "@pulumi/kubernetes";
|
197
|
-
import { output as output2 } from "@highstate/pulumi";
|
198
|
-
function resolveBackendRef(ref) {
|
199
|
-
if (Service.isInstance(ref)) {
|
200
|
-
return output2({
|
201
|
-
name: ref.metadata.name,
|
202
|
-
namespace: ref.metadata.namespace,
|
203
|
-
port: ref.spec.ports[0].port
|
204
|
-
});
|
205
|
-
}
|
206
|
-
if ("service" in ref) {
|
207
|
-
const service = output2(ref.service);
|
208
|
-
return output2({
|
209
|
-
name: service.metadata.name,
|
210
|
-
namespace: service.metadata.namespace,
|
211
|
-
port: ref.port
|
212
|
-
});
|
213
|
-
}
|
214
|
-
return output2({
|
215
|
-
name: ref.name,
|
216
|
-
namespace: ref.namespace,
|
217
|
-
port: ref.port
|
218
|
-
});
|
219
|
-
}
|
220
|
-
|
221
|
-
// src/gateway/http-route.ts
|
222
|
-
var HttpRoute = class extends ComponentResource2 {
|
223
|
-
/**
|
224
|
-
* The underlying Kubernetes resource.
|
225
|
-
*/
|
226
|
-
route;
|
227
|
-
constructor(name, args, opts) {
|
228
|
-
super("highstate:k8s:HttpRoute", name, args, opts);
|
229
|
-
this.route = output3({
|
230
|
-
args,
|
231
|
-
gatewayNamespace: output3(args.gateway).metadata.namespace
|
232
|
-
}).apply(({ args: args2, gatewayNamespace }) => {
|
233
|
-
return new gateway.v1.HTTPRoute(
|
234
|
-
name,
|
235
|
-
{
|
236
|
-
metadata: mapMetadata(
|
237
|
-
{
|
238
|
-
...args2,
|
239
|
-
namespace: gatewayNamespace
|
240
|
-
},
|
241
|
-
name
|
242
|
-
),
|
243
|
-
spec: {
|
244
|
-
hostnames: normalize2(args2.hostname, args2.hostnames),
|
245
|
-
parentRefs: [
|
246
|
-
{
|
247
|
-
name: args2.gateway.metadata.name
|
248
|
-
}
|
249
|
-
],
|
250
|
-
rules: normalize2(args2.rule, args2.rules).map((rule) => ({
|
251
|
-
timeouts: rule.timeouts,
|
252
|
-
matches: pipe(
|
253
|
-
normalize2(rule.match, rule.matches),
|
254
|
-
map(mapHttpRouteRuleMatch),
|
255
|
-
addDefaultPathMatch
|
256
|
-
),
|
257
|
-
filters: normalize2(rule.filter, rule.filters),
|
258
|
-
backendRefs: rule.backend ? [resolveBackendRef(rule.backend)] : void 0
|
259
|
-
}))
|
260
|
-
}
|
261
|
-
},
|
262
|
-
{ parent: this, ...opts }
|
263
|
-
);
|
264
|
-
});
|
265
|
-
this.registerOutputs({ route: this.route });
|
266
|
-
}
|
267
|
-
};
|
268
|
-
function addDefaultPathMatch(matches) {
|
269
|
-
return matches.length ? matches : [{ path: { type: "PathPrefix", value: "/" } }];
|
270
|
-
}
|
271
|
-
function mapHttpRouteRuleMatch(match) {
|
272
|
-
if (typeof match === "string") {
|
273
|
-
return { path: { type: "PathPrefix", value: match } };
|
274
|
-
}
|
275
|
-
return match;
|
276
|
-
}
|
277
|
-
|
278
|
-
// src/helm.ts
|
279
|
-
import { resolve } from "node:path";
|
280
|
-
import { mkdir, readFile, unlink } from "node:fs/promises";
|
281
|
-
import { toPromise } from "@highstate/pulumi";
|
282
|
-
import { core as core3, helm } from "@pulumi/kubernetes";
|
283
|
-
import {
|
284
|
-
ComponentResource as ComponentResource3,
|
285
|
-
output as output4
|
286
|
-
} from "@pulumi/pulumi";
|
287
|
-
import spawn from "nano-spawn";
|
288
|
-
import { sha256 } from "crypto-hash";
|
289
|
-
import { omit as omit2 } from "remeda";
|
290
|
-
import { local } from "@pulumi/command";
|
291
|
-
import { glob } from "glob";
|
292
|
-
var Chart = class extends ComponentResource3 {
|
293
|
-
constructor(name, args, opts) {
|
294
|
-
super("highstate:k8s:Chart", name, args, opts);
|
295
|
-
this.name = name;
|
296
|
-
this.args = args;
|
297
|
-
this.opts = opts;
|
298
|
-
this.chart = output4(args).apply((args2) => {
|
299
|
-
return new helm.v4.Chart(
|
300
|
-
name,
|
301
|
-
omit2(
|
302
|
-
{
|
303
|
-
...args2,
|
304
|
-
chart: resolveHelmChart(args2.chart),
|
305
|
-
namespace: args2.namespace ? mapNamespaceLikeToNamespaceName(args2.namespace) : void 0
|
306
|
-
},
|
307
|
-
["httpRoute"]
|
308
|
-
),
|
309
|
-
{ parent: this, ...opts }
|
310
|
-
);
|
311
|
-
});
|
312
|
-
this.httpRoute = output4(args.httpRoute).apply((httpRoute) => {
|
313
|
-
if (!httpRoute) {
|
314
|
-
return void 0;
|
315
|
-
}
|
316
|
-
return new HttpRoute(
|
317
|
-
name,
|
318
|
-
{
|
319
|
-
...httpRoute,
|
320
|
-
rule: {
|
321
|
-
backend: this.service
|
322
|
-
}
|
323
|
-
},
|
324
|
-
{ ...opts, parent: this }
|
325
|
-
);
|
326
|
-
});
|
327
|
-
this.registerOutputs({ chart: this.chart });
|
328
|
-
}
|
329
|
-
/**
|
330
|
-
* The underlying Helm chart.
|
331
|
-
*/
|
332
|
-
chart;
|
333
|
-
/**
|
334
|
-
* The HTTP route associated with the deployment.
|
335
|
-
*/
|
336
|
-
httpRoute;
|
337
|
-
get service() {
|
338
|
-
return this.getServiceOutput(void 0);
|
339
|
-
}
|
340
|
-
services = /* @__PURE__ */ new Map();
|
341
|
-
getServiceOutput(name) {
|
342
|
-
return output4({ args: this.args, chart: this.chart }).apply(({ args, chart }) => {
|
343
|
-
const resolvedName = name ?? args.serviceName ?? this.name;
|
344
|
-
const existingService = this.services.get(resolvedName);
|
345
|
-
if (existingService) {
|
346
|
-
return existingService;
|
347
|
-
}
|
348
|
-
const service = getChartServiceOutput(chart, resolvedName);
|
349
|
-
const wrappedService = Service.wrap(
|
350
|
-
//
|
351
|
-
resolvedName,
|
352
|
-
service,
|
353
|
-
args.cluster.info,
|
354
|
-
{ parent: this, ...this.opts }
|
355
|
-
);
|
356
|
-
this.services.set(resolvedName, wrappedService);
|
357
|
-
return wrappedService;
|
358
|
-
});
|
359
|
-
}
|
360
|
-
getService(name) {
|
361
|
-
return toPromise(this.getServiceOutput(name));
|
362
|
-
}
|
363
|
-
};
|
364
|
-
var RenderedChart = class extends ComponentResource3 {
|
365
|
-
/**
|
366
|
-
* The rendered manifest of the Helm chart.
|
367
|
-
*/
|
368
|
-
manifest;
|
369
|
-
/**
|
370
|
-
* The underlying command used to render the chart.
|
371
|
-
*/
|
372
|
-
command;
|
373
|
-
constructor(name, args, opts) {
|
374
|
-
super("highstate:k8s:RenderedChart", name, args, opts);
|
375
|
-
this.command = output4(args).apply((args2) => {
|
376
|
-
const values = args2.values ? Object.entries(args2.values).flatMap(([key, value]) => ["--set", `${key}="${value}"`]) : [];
|
377
|
-
return new local.Command(
|
378
|
-
name,
|
379
|
-
{
|
380
|
-
create: output4([
|
381
|
-
"helm",
|
382
|
-
"template",
|
383
|
-
resolveHelmChart(args2.chart),
|
384
|
-
...args2.namespace ? ["--namespace", mapNamespaceLikeToNamespaceName(args2.namespace)] : [],
|
385
|
-
...values
|
386
|
-
]).apply((command) => command.join(" ")),
|
387
|
-
logging: "stderr"
|
388
|
-
},
|
389
|
-
{ parent: this, ...opts }
|
390
|
-
);
|
391
|
-
});
|
392
|
-
this.manifest = this.command.stdout;
|
393
|
-
this.registerOutputs({ manifest: this.manifest, command: this.command });
|
394
|
-
}
|
395
|
-
};
|
396
|
-
async function resolveHelmChart(manifest) {
|
397
|
-
if (!process.env.HIGHSTATE_CACHE_DIR) {
|
398
|
-
throw new Error("Environment variable HIGHSTATE_CACHE_DIR is not set");
|
399
|
-
}
|
400
|
-
const chartsDir = resolve(process.env.HIGHSTATE_CACHE_DIR, "charts");
|
401
|
-
await mkdir(chartsDir, { recursive: true });
|
402
|
-
const globPattern = `${manifest.name}-*.tgz`;
|
403
|
-
const targetFileName = `${manifest.name}-${manifest.version}.tgz`;
|
404
|
-
const files = await glob(globPattern, { cwd: chartsDir });
|
405
|
-
if (files.includes(targetFileName)) {
|
406
|
-
return resolve(chartsDir, targetFileName);
|
407
|
-
}
|
408
|
-
for (const file of files) {
|
409
|
-
await unlink(resolve(chartsDir, file));
|
410
|
-
}
|
411
|
-
await spawn("helm", [
|
412
|
-
"pull",
|
413
|
-
manifest.name,
|
414
|
-
"--version",
|
415
|
-
manifest.version,
|
416
|
-
"--repo",
|
417
|
-
manifest.repo,
|
418
|
-
"--destination",
|
419
|
-
chartsDir
|
420
|
-
]);
|
421
|
-
const content = await readFile(resolve(chartsDir, targetFileName));
|
422
|
-
const actualSha256 = await sha256(content);
|
423
|
-
if (actualSha256 !== manifest.sha256) {
|
424
|
-
throw new Error(`SHA256 mismatch for chart '${manifest.name}'`);
|
425
|
-
}
|
426
|
-
return resolve(chartsDir, targetFileName);
|
427
|
-
}
|
428
|
-
function getChartServiceOutput(chart, name) {
|
429
|
-
const services = chart.resources.apply((resources) => {
|
430
|
-
return resources.filter((r) => core3.v1.Service.isInstance(r)).map((service) => ({ name: service.metadata.name, service }));
|
431
|
-
});
|
432
|
-
return output4(services).apply((services2) => {
|
433
|
-
const service = services2.find((s) => s.name === name)?.service;
|
434
|
-
if (!service) {
|
435
|
-
throw new Error(`Service with name '${name}' not found in the chart resources`);
|
436
|
-
}
|
437
|
-
return service;
|
438
|
-
});
|
439
|
-
}
|
440
|
-
function getChartService(chart, name) {
|
441
|
-
return toPromise(getChartServiceOutput(chart, name));
|
442
|
-
}
|
443
|
-
|
444
|
-
export {
|
445
|
-
Service,
|
446
|
-
mapContainerPortToServicePort,
|
447
|
-
mapServiceToLabelSelector,
|
448
|
-
HttpRoute,
|
449
|
-
Chart,
|
450
|
-
RenderedChart,
|
451
|
-
resolveHelmChart,
|
452
|
-
getChartServiceOutput,
|
453
|
-
getChartService
|
454
|
-
};
|
455
|
-
//# sourceMappingURL=chunk-K4WKJ4L5.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"sources":["../src/service.ts","../src/gateway/http-route.ts","../src/gateway/backend.ts","../src/helm.ts"],"sourcesContent":["import type { k8s } from \"@highstate/library\"\nimport { core, types } from \"@pulumi/kubernetes\"\nimport {\n ComponentResource,\n interpolate,\n normalize,\n output,\n Output,\n Resource,\n type ComponentResourceOptions,\n type Input,\n type InputArray,\n type Inputs,\n} from \"@highstate/pulumi\"\nimport { omit } from \"remeda\"\nimport { deepmerge } from \"deepmerge-ts\"\nimport {\n commonExtraArgs,\n mapMetadata,\n resourceIdToString,\n verifyProvider,\n type CommonArgs,\n type ResourceId,\n} from \"./shared\"\n\nexport type ServiceArgs = CommonArgs & {\n port?: Input<types.input.core.v1.ServicePort>\n\n /**\n * The service to patch instead of creating a new one.\n */\n patch?: Input<k8s.Service>\n\n /**\n * The cluster to create the resource in.\n */\n cluster: Input<k8s.Cluster>\n} & types.input.core.v1.ServiceSpec\n\nconst serviceExtraArgs = [...commonExtraArgs, \"port\", \"ports\", \"patch\"] as const\n\nexport abstract class Service extends ComponentResource {\n protected constructor(\n type: string,\n name: string,\n args: Inputs,\n opts: ComponentResourceOptions,\n\n /**\n * The cluster info associated with the service.\n */\n readonly clusterInfo: Output<k8s.ClusterInfo>,\n\n /**\n * The metadata of the underlying Kubernetes service.\n */\n readonly metadata: Output<types.output.meta.v1.ObjectMeta>,\n\n /**\n * The spec of the underlying Kubernetes service.\n */\n readonly spec: Output<types.output.core.v1.ServiceSpec>,\n\n /**\n * The status of the underlying Kubernetes service.\n */\n readonly status: Output<types.output.core.v1.ServiceStatus>,\n\n /**\n * The resources associated with the service.\n */\n readonly resources: InputArray<Resource>,\n ) {\n super(type, name, args, opts)\n }\n\n /**\n * The Highstate service entity.\n */\n get entity(): Output<k8s.Service> {\n return output({\n type: \"k8s.service\",\n clusterInfo: this.clusterInfo,\n metadata: this.metadata,\n spec: this.spec,\n })\n }\n\n static create(name: string, args: ServiceArgs, opts: ComponentResourceOptions): Service {\n return new CreatedService(name, args, opts)\n }\n\n static wrap(\n name: string,\n service: Input<core.v1.Service>,\n clusterInfo: Input<k8s.ClusterInfo>,\n opts: ComponentResourceOptions,\n ): Service {\n return new WrappedService(name, service, clusterInfo, opts)\n }\n\n static external(\n name: string,\n id: ResourceId,\n clusterInfo: Input<k8s.ClusterInfo>,\n opts: ComponentResourceOptions,\n ): Service {\n return new ExternalService(name, id, clusterInfo, opts)\n }\n\n static of(name: string, entity: Input<k8s.Service>, opts: ComponentResourceOptions): Service {\n return new ExternalService(name, output(entity).metadata, output(entity).clusterInfo, opts)\n }\n\n /**\n * Returns the host of the service accessible from the cluster.\n *\n * The format is `name.namespace.svc`.\n */\n get clusterHost(): Output<string> {\n return interpolate`${this.metadata.name}.${this.metadata.namespace}.svc`\n }\n\n /**\n * Returns the external IP of the service.\n *\n * If the load balancer is available, the external IP is returned, otherwise the IP of the node.\n *\n * If the service has no external IP, `undefined` is returned.\n */\n get externalIp(): Output<string | undefined> {\n return output({ spec: this.spec, status: this.status }).apply(({ spec, status }) => {\n const loadBalancerIp = status.loadBalancer?.ingress?.[0]?.ip\n if (loadBalancerIp) {\n return loadBalancerIp\n }\n\n const nodeIp = spec.externalIPs?.[0]\n if (nodeIp) {\n return nodeIp\n }\n\n return undefined\n })\n }\n\n /**\n * The \"most public\" IP of the service.\n *\n * Resolves to the external IP if available, otherwise the cluster IP.\n *\n * If the service is headless, an error is thrown.\n */\n get ip(): Output<string> {\n return output({ spec: this.spec, externalIp: this.externalIp }).apply(\n ({ spec, externalIp }) => {\n if (externalIp) {\n return externalIp\n }\n\n const clusterIp = spec.clusterIP\n if (clusterIp && clusterIp !== \"None\") {\n return clusterIp\n }\n\n throw new Error(\"The service does not have neither an external IP nor a cluster IP.\")\n },\n )\n }\n}\n\nclass CreatedService extends Service {\n constructor(name: string, args: ServiceArgs, opts: ComponentResourceOptions) {\n const service = output(args).apply(async args => {\n await verifyProvider(opts.provider, args.cluster.info)\n\n return new (args.patch ? core.v1.ServicePatch : core.v1.Service)(\n name,\n {\n metadata: mapMetadata(args.patch?.metadata ?? args, name),\n spec: deepmerge(\n {\n ports: normalize(args.port, args.ports),\n },\n omit(args, serviceExtraArgs),\n ),\n },\n { parent: this, ...opts },\n )\n })\n\n super(\n \"highstate:k8s:Service\",\n name,\n args,\n opts,\n\n output(args.cluster).info,\n service.metadata,\n service.spec,\n service.status,\n [service],\n )\n }\n}\n\nclass WrappedService extends Service {\n constructor(\n name: string,\n service: Input<core.v1.Service>,\n clusterInfo: Input<k8s.ClusterInfo>,\n opts: ComponentResourceOptions,\n ) {\n super(\n \"highstate:k8s:WrappedService\",\n name,\n { service, clusterInfo },\n opts,\n\n output(clusterInfo),\n output(service).metadata,\n output(service).spec,\n output(service).status,\n [service],\n )\n }\n}\n\nclass ExternalService extends Service {\n constructor(\n name: string,\n id: ResourceId,\n clusterInfo: Input<k8s.ClusterInfo>,\n opts: ComponentResourceOptions,\n ) {\n const service = output(id).apply(async id => {\n await verifyProvider(opts.provider, this.clusterInfo)\n\n return core.v1.Service.get(\n //\n name,\n resourceIdToString(id),\n { parent: this, provider: opts.provider },\n )\n })\n\n super(\n \"highstate:k8s:ExternalService\",\n name,\n { id, clusterInfo },\n opts,\n\n output(clusterInfo),\n service.metadata,\n service.spec,\n service.status,\n [service],\n )\n }\n}\n\nexport function mapContainerPortToServicePort(\n port: types.input.core.v1.ContainerPort,\n): types.input.core.v1.ServicePort {\n return {\n name: port.name,\n port: port.containerPort,\n targetPort: port.containerPort,\n protocol: port.protocol,\n }\n}\n\nexport function mapServiceToLabelSelector(\n service: core.v1.Service,\n): types.input.meta.v1.LabelSelector {\n return {\n matchLabels: service.spec.selector,\n }\n}\n","import {\n ComponentResource,\n normalize,\n output,\n Output,\n type ComponentResourceOptions,\n type Input,\n type InputArray,\n} from \"@highstate/pulumi\"\nimport { gateway, types } from \"@highstate/gateway-api\"\nimport { map, pipe } from \"remeda\"\nimport { mapMetadata, type CommonArgs } from \"../shared\"\nimport { resolveBackendRef, type BackendRef } from \"./backend\"\n\nexport type HttpRouteArgs = Omit<CommonArgs, \"namespace\"> & {\n /**\n * The gateway to associate with the route.\n */\n gateway: Input<gateway.v1.Gateway>\n\n /**\n * The alias for `hostnames: [hostname]`.\n */\n hostname?: Input<string>\n\n /**\n * The rule of the route.\n */\n rule?: Input<HttpRouteRuleArgs>\n\n /**\n * The rules of the route.\n */\n rules?: InputArray<HttpRouteRuleArgs>\n} & Omit<Partial<types.input.gateway.v1.HTTPRouteSpec>, \"rules\">\n\nexport type HttpRouteRuleArgs = Omit<\n types.input.gateway.v1.HTTPRouteSpecRules,\n \"matches\" | \"filters\" | \"backendRefs\"\n> & {\n /**\n * The conditions of the rule.\n * Can be specified as string to match on the path.\n */\n matches?: InputArray<HttpRouteRuleMatchOptions>\n\n /**\n * The condition of the rule.\n * Can be specified as string to match on the path.\n */\n match?: Input<HttpRouteRuleMatchOptions>\n\n /**\n * The filters of the rule.\n */\n filters?: InputArray<types.input.gateway.v1.HTTPRouteSpecRulesFilters>\n\n /**\n * The filter of the rule.\n */\n filter?: Input<types.input.gateway.v1.HTTPRouteSpecRulesFilters>\n\n /**\n * The service to route to.\n */\n backend?: Input<BackendRef>\n}\n\nexport type HttpRouteRuleMatchOptions = types.input.gateway.v1.HTTPRouteSpecRulesMatches | string\n\nexport class HttpRoute extends ComponentResource {\n /**\n * The underlying Kubernetes resource.\n */\n public readonly route: Output<gateway.v1.HTTPRoute>\n\n constructor(name: string, args: HttpRouteArgs, opts?: ComponentResourceOptions) {\n super(\"highstate:k8s:HttpRoute\", name, args, opts)\n\n this.route = output({\n args,\n gatewayNamespace: output(args.gateway).metadata.namespace,\n }).apply(({ args, gatewayNamespace }) => {\n return new gateway.v1.HTTPRoute(\n name,\n {\n metadata: mapMetadata(\n {\n ...args,\n namespace: gatewayNamespace as string,\n },\n name,\n ),\n spec: {\n hostnames: normalize(args.hostname, args.hostnames),\n\n parentRefs: [\n {\n name: args.gateway.metadata.name as Output<string>,\n },\n ],\n\n rules: normalize(args.rule, args.rules).map(rule => ({\n timeouts: rule.timeouts,\n\n matches: pipe(\n normalize(rule.match, rule.matches),\n map(mapHttpRouteRuleMatch),\n addDefaultPathMatch,\n ),\n\n filters: normalize(rule.filter, rule.filters),\n backendRefs: rule.backend ? [resolveBackendRef(rule.backend)] : undefined,\n })),\n } satisfies types.input.gateway.v1.HTTPRouteSpec,\n },\n { parent: this, ...opts },\n )\n })\n\n this.registerOutputs({ route: this.route })\n }\n}\n\nfunction addDefaultPathMatch(\n matches: types.input.gateway.v1.HTTPRouteSpecRulesMatches[],\n): types.input.gateway.v1.HTTPRouteSpecRulesMatches[] {\n return matches.length ? matches : [{ path: { type: \"PathPrefix\", value: \"/\" } }]\n}\n\nexport function mapHttpRouteRuleMatch(\n match: HttpRouteRuleMatchOptions,\n): types.input.gateway.v1.HTTPRouteSpecRulesMatches {\n if (typeof match === \"string\") {\n return { path: { type: \"PathPrefix\", value: match } }\n }\n\n return match\n}\n","import { core } from \"@pulumi/kubernetes\"\nimport { type Input, output, Output, type Unwrap } from \"@highstate/pulumi\"\nimport { Service } from \"../service\"\n\nexport interface FullBackendRef {\n /**\n * The name of the resource being referenced.\n */\n name: Input<string>\n\n /**\n * The namespace of the resource being referenced.\n * May be undefined if the resource is not in a namespace.\n */\n namespace?: Input<string | undefined>\n\n /**\n * The port of the resource being referenced.\n */\n port: Input<number>\n}\n\nexport interface ServiceBackendRef {\n /**\n * The name of the service being referenced.\n */\n service: Input<core.v1.Service>\n\n /**\n * The port of the service being referenced.\n */\n port: Input<number>\n}\n\nexport type BackendRef = FullBackendRef | ServiceBackendRef | Service\n\nexport function resolveBackendRef(ref: BackendRef): Output<Unwrap<FullBackendRef>> {\n if (Service.isInstance(ref)) {\n return output({\n name: ref.metadata.name,\n namespace: ref.metadata.namespace,\n port: ref.spec.ports[0].port,\n })\n }\n\n if (\"service\" in ref) {\n const service = output(ref.service)\n\n return output({\n name: service.metadata.name,\n namespace: service.metadata.namespace,\n port: ref.port,\n })\n }\n\n return output({\n name: ref.name,\n namespace: ref.namespace,\n port: ref.port,\n })\n}\n","import type { k8s } from \"@highstate/library\"\nimport { resolve } from \"node:path\"\nimport { mkdir, readFile, unlink } from \"node:fs/promises\"\nimport { toPromise, type InputMap } from \"@highstate/pulumi\"\nimport { core, helm } from \"@pulumi/kubernetes\"\nimport {\n ComponentResource,\n output,\n type ComponentResourceOptions,\n type Input,\n type Output,\n} from \"@pulumi/pulumi\"\nimport spawn from \"nano-spawn\"\nimport { sha256 } from \"crypto-hash\"\nimport { omit } from \"remeda\"\nimport { local } from \"@pulumi/command\"\nimport { glob } from \"glob\"\nimport { HttpRoute, type HttpRouteArgs } from \"./gateway\"\nimport { mapNamespaceLikeToNamespaceName, type NamespaceLike } from \"./shared\"\nimport { Service } from \"./service\"\n\nexport type ChartArgs = Omit<\n helm.v4.ChartArgs,\n \"chart\" | \"version\" | \"repositoryOpts\" | \"namespace\"\n> & {\n /**\n * The namespace to deploy the chart into.\n */\n namespace?: Input<NamespaceLike>\n\n /**\n * The custom name of the primary service exposed by the chart.\n *\n * By default, it is the same as the chart name.\n */\n serviceName?: string\n\n /**\n * The manifest of the chart to resolve.\n */\n chart: ChartManifest\n\n /**\n * The cluster to create the resource in.\n */\n cluster: Input<k8s.Cluster>\n\n /**\n * The http route args to bind the service to.\n */\n httpRoute?: Input<HttpRouteArgs>\n}\n\nexport class Chart extends ComponentResource {\n /**\n * The underlying Helm chart.\n */\n public readonly chart: Output<helm.v4.Chart>\n\n /**\n * The HTTP route associated with the deployment.\n */\n public readonly httpRoute: Output<HttpRoute | undefined>\n\n constructor(\n private readonly name: string,\n private readonly args: ChartArgs,\n private readonly opts?: ComponentResourceOptions,\n ) {\n super(\"highstate:k8s:Chart\", name, args, opts)\n\n this.chart = output(args).apply(args => {\n return new helm.v4.Chart(\n name,\n omit(\n {\n ...args,\n chart: resolveHelmChart(args.chart),\n namespace: args.namespace ? mapNamespaceLikeToNamespaceName(args.namespace) : undefined,\n },\n [\"httpRoute\"],\n ),\n { parent: this, ...opts },\n )\n })\n\n this.httpRoute = output(args.httpRoute).apply(httpRoute => {\n if (!httpRoute) {\n return undefined\n }\n\n return new HttpRoute(\n name,\n {\n ...httpRoute,\n rule: {\n backend: this.service,\n },\n },\n { ...opts, parent: this },\n )\n })\n\n this.registerOutputs({ chart: this.chart })\n }\n\n get service(): Output<Service> {\n return this.getServiceOutput(undefined)\n }\n\n private readonly services = new Map<string, Service>()\n\n getServiceOutput(name: string | undefined): Output<Service> {\n return output({ args: this.args, chart: this.chart }).apply(({ args, chart }) => {\n const resolvedName = name ?? args.serviceName ?? this.name\n const existingService = this.services.get(resolvedName)\n\n if (existingService) {\n return existingService\n }\n\n const service = getChartServiceOutput(chart, resolvedName)\n\n const wrappedService = Service.wrap(\n //\n resolvedName,\n service,\n args.cluster.info,\n { parent: this, ...this.opts },\n )\n\n this.services.set(resolvedName, wrappedService)\n return wrappedService\n })\n }\n\n getService(name?: string): Promise<Service> {\n return toPromise(this.getServiceOutput(name))\n }\n}\n\nexport type RenderedChartArgs = {\n /**\n * The namespace to deploy the chart into.\n */\n namespace?: Input<NamespaceLike>\n\n /**\n * The manifest of the chart to resolve.\n */\n chart: ChartManifest\n\n /**\n * The values to pass to the chart.\n */\n values?: InputMap<string>\n}\n\nexport class RenderedChart extends ComponentResource {\n /**\n * The rendered manifest of the Helm chart.\n */\n public readonly manifest: Output<string>\n\n /**\n * The underlying command used to render the chart.\n */\n public readonly command: Output<local.Command>\n\n constructor(name: string, args: RenderedChartArgs, opts?: ComponentResourceOptions) {\n super(\"highstate:k8s:RenderedChart\", name, args, opts)\n\n this.command = output(args).apply(args => {\n const values = args.values\n ? Object.entries(args.values).flatMap(([key, value]) => [\"--set\", `${key}=\"${value}\"`])\n : []\n\n return new local.Command(\n name,\n {\n create: output([\n \"helm\",\n \"template\",\n resolveHelmChart(args.chart),\n\n ...(args.namespace\n ? [\"--namespace\", mapNamespaceLikeToNamespaceName(args.namespace)]\n : []),\n\n ...values,\n ]).apply(command => command.join(\" \")),\n\n logging: \"stderr\",\n },\n { parent: this, ...opts },\n )\n })\n\n this.manifest = this.command.stdout\n\n this.registerOutputs({ manifest: this.manifest, command: this.command })\n }\n}\n\nexport type ChartManifest = {\n repo: string\n name: string\n version: string\n sha256: string\n}\n\n/**\n * Downloads or reuses the Helm chart according to the charts.json file.\n * Returns the full path to the chart's .tgz file.\n *\n * @param manifest The manifest of the Helm chart.\n */\nexport async function resolveHelmChart(manifest: ChartManifest): Promise<string> {\n if (!process.env.HIGHSTATE_CACHE_DIR) {\n throw new Error(\"Environment variable HIGHSTATE_CACHE_DIR is not set\")\n }\n\n const chartsDir = resolve(process.env.HIGHSTATE_CACHE_DIR, \"charts\")\n await mkdir(chartsDir, { recursive: true })\n\n const globPattern = `${manifest.name}-*.tgz`\n const targetFileName = `${manifest.name}-${manifest.version}.tgz`\n\n // find all matching files\n const files = await glob(globPattern, { cwd: chartsDir })\n\n if (files.includes(targetFileName)) {\n return resolve(chartsDir, targetFileName)\n }\n\n // delete old versions\n for (const file of files) {\n await unlink(resolve(chartsDir, file))\n }\n\n // download the chart\n await spawn(\"helm\", [\n \"pull\",\n manifest.name,\n \"--version\",\n manifest.version,\n \"--repo\",\n manifest.repo,\n \"--destination\",\n chartsDir,\n ])\n\n // check the SHA256\n const content = await readFile(resolve(chartsDir, targetFileName))\n const actualSha256 = await sha256(content)\n\n if (actualSha256 !== manifest.sha256) {\n throw new Error(`SHA256 mismatch for chart '${manifest.name}'`)\n }\n\n return resolve(chartsDir, targetFileName)\n}\n\n/**\n * Extracts the service with the given name from the chart resources.\n * Throws an error if the service is not found.\n *\n * @param chart The Helm chart.\n * @param name The name of the service.\n */\nexport function getChartServiceOutput(chart: helm.v4.Chart, name: string): Output<core.v1.Service> {\n const services = chart.resources.apply(resources => {\n return resources\n .filter(r => core.v1.Service.isInstance(r))\n .map(service => ({ name: service.metadata.name, service }))\n })\n\n return output(services).apply(services => {\n const service = services.find(s => s.name === name)?.service\n\n if (!service) {\n throw new Error(`Service with name '${name}' not found in the chart resources`)\n }\n\n return service\n })\n}\n\n/**\n * Extracts the service with the given name from the chart resources.\n * Throws an error if the service is not found.\n *\n * @param chart The Helm chart.\n * @param name The name of the service.\n */\nexport function getChartService(chart: helm.v4.Chart, name: string): Promise<core.v1.Service> {\n return toPromise(getChartServiceOutput(chart, name))\n}\n"],"mappings":"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","names":["args","id","ComponentResource","normalize","output","output","output","ComponentResource","output","args","normalize","core","ComponentResource","output","omit","ComponentResource","output","args","omit","core","services"]}
|
package/dist/chunk-T5Z2M4JE.js
DELETED
@@ -1,103 +0,0 @@
|
|
1
|
-
// src/shared.ts
|
2
|
-
import { output, toPromise } from "@highstate/pulumi";
|
3
|
-
import { core, Provider } from "@pulumi/kubernetes";
|
4
|
-
import { mergeDeep } from "remeda";
|
5
|
-
var providers = /* @__PURE__ */ new Map();
|
6
|
-
function getProvider(cluster) {
|
7
|
-
const provider = output(cluster).apply((cluster2) => {
|
8
|
-
const existingProvider = providers.get(cluster2.info.id);
|
9
|
-
if (existingProvider) {
|
10
|
-
return existingProvider;
|
11
|
-
}
|
12
|
-
const provider2 = new Provider(cluster2.info.id, { kubeconfig: cluster2.kubeconfig });
|
13
|
-
providers.set(cluster2.info.id, provider2);
|
14
|
-
return provider2;
|
15
|
-
});
|
16
|
-
return toPromise(provider);
|
17
|
-
}
|
18
|
-
async function verifyProvider(provider, clusterInfo) {
|
19
|
-
if (!provider) {
|
20
|
-
throw new Error("The provider must be passed to the resource.");
|
21
|
-
}
|
22
|
-
const urn = await toPromise(provider.urn);
|
23
|
-
const [, , , resouceName] = urn.split("::");
|
24
|
-
const expectedId = await toPromise(output(clusterInfo).id);
|
25
|
-
if (resouceName !== expectedId) {
|
26
|
-
throw new Error(
|
27
|
-
"The Kubernetes cluster of the provider is different from the one where the resource is deployed."
|
28
|
-
);
|
29
|
-
}
|
30
|
-
}
|
31
|
-
function createNamespace(name, provider, args = {}) {
|
32
|
-
return new core.v1.Namespace(
|
33
|
-
name,
|
34
|
-
mergeDeep(args, {
|
35
|
-
metadata: {
|
36
|
-
name
|
37
|
-
}
|
38
|
-
}),
|
39
|
-
{ provider }
|
40
|
-
);
|
41
|
-
}
|
42
|
-
function getNamespace(name = "default", provider) {
|
43
|
-
return core.v1.Namespace.get(name, name, { provider });
|
44
|
-
}
|
45
|
-
var commonExtraArgs = ["name", "namespace", "metadata"];
|
46
|
-
function mapMetadata(args, fallbackName) {
|
47
|
-
return {
|
48
|
-
...args.metadata,
|
49
|
-
name: args.name ?? args.metadata?.name ?? fallbackName,
|
50
|
-
namespace: args.namespace ? mapNamespaceLikeToNamespaceName(args.namespace) : void 0
|
51
|
-
};
|
52
|
-
}
|
53
|
-
function mapSelectorLikeToSelector(selector) {
|
54
|
-
if ("matchLabels" in selector || "matchExpressions" in selector) {
|
55
|
-
return selector;
|
56
|
-
}
|
57
|
-
return {
|
58
|
-
matchLabels: selector
|
59
|
-
};
|
60
|
-
}
|
61
|
-
function mapNamespaceLikeToNamespaceName(namespace) {
|
62
|
-
return core.v1.Namespace.isInstance(namespace) ? namespace.metadata.name : output(namespace);
|
63
|
-
}
|
64
|
-
function mapNamespaceNameToSelector(namespace) {
|
65
|
-
return {
|
66
|
-
matchLabels: {
|
67
|
-
"kubernetes.io/metadata.name": namespace
|
68
|
-
}
|
69
|
-
};
|
70
|
-
}
|
71
|
-
function resourceIdToString(metadata) {
|
72
|
-
return output(metadata).apply((metadata2) => {
|
73
|
-
return metadata2.namespace ? `${metadata2.namespace}/${metadata2.name}` : metadata2.name;
|
74
|
-
});
|
75
|
-
}
|
76
|
-
function getAppName(resourceId) {
|
77
|
-
if (resourceId.namespace !== resourceId.name) {
|
78
|
-
return `${resourceId.namespace ?? "default"}-${resourceId.name}`;
|
79
|
-
}
|
80
|
-
return resourceId.name;
|
81
|
-
}
|
82
|
-
function getAppDisplayName(resourceId) {
|
83
|
-
if (resourceId.namespace !== resourceId.name) {
|
84
|
-
return `${resourceId.namespace ?? "default"}/${resourceId.name}`;
|
85
|
-
}
|
86
|
-
return resourceId.name;
|
87
|
-
}
|
88
|
-
|
89
|
-
export {
|
90
|
-
getProvider,
|
91
|
-
verifyProvider,
|
92
|
-
createNamespace,
|
93
|
-
getNamespace,
|
94
|
-
commonExtraArgs,
|
95
|
-
mapMetadata,
|
96
|
-
mapSelectorLikeToSelector,
|
97
|
-
mapNamespaceLikeToNamespaceName,
|
98
|
-
mapNamespaceNameToSelector,
|
99
|
-
resourceIdToString,
|
100
|
-
getAppName,
|
101
|
-
getAppDisplayName
|
102
|
-
};
|
103
|
-
//# sourceMappingURL=chunk-T5Z2M4JE.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"sources":["../src/shared.ts"],"sourcesContent":["import type { PartialKeys } from \"@highstate/contract\"\nimport type { k8s } from \"@highstate/library\"\nimport { Output, output, toPromise, type Input, type Unwrap } from \"@highstate/pulumi\"\nimport { core, Provider, types } from \"@pulumi/kubernetes\"\nimport { mergeDeep } from \"remeda\"\n\nconst providers = new Map<string, Provider>()\n\nexport function getProvider(cluster: Input<k8s.Cluster>): Promise<Provider> {\n const provider = output(cluster).apply(cluster => {\n const existingProvider = providers.get(cluster.info.id)\n if (existingProvider) {\n return existingProvider\n }\n\n const provider = new Provider(cluster.info.id, { kubeconfig: cluster.kubeconfig })\n providers.set(cluster.info.id, provider)\n\n return provider\n })\n\n return toPromise(provider)\n}\n\nexport async function verifyProvider(\n provider: Provider | undefined,\n clusterInfo: Input<k8s.ClusterInfo>,\n): Promise<void> {\n if (!provider) {\n throw new Error(\"The provider must be passed to the resource.\")\n }\n\n const urn = await toPromise(provider.urn)\n const [, , , resouceName] = urn.split(\"::\")\n\n const expectedId = await toPromise(output(clusterInfo).id)\n\n if (resouceName !== expectedId) {\n throw new Error(\n \"The Kubernetes cluster of the provider is different from the one where the resource is deployed.\",\n )\n }\n}\n\nexport function createNamespace(\n name: string,\n provider: Provider,\n args: core.v1.NamespaceArgs = {},\n): core.v1.Namespace {\n return new core.v1.Namespace(\n name,\n mergeDeep(args, {\n metadata: {\n name,\n },\n }),\n { provider },\n )\n}\n\nexport function getNamespace(name = \"default\", provider: Provider): core.v1.Namespace {\n return core.v1.Namespace.get(name, name, { provider })\n}\n\nexport type NamespaceLike = core.v1.Namespace | string\n\nexport type CommonArgs = {\n /**\n * The name of the resource.\n */\n name?: string\n\n /**\n * The namespace to create the resource in.\n */\n namespace: Input<NamespaceLike | undefined>\n\n /**\n * The metadata to apply to the resource.\n */\n metadata?: Input<types.input.meta.v1.ObjectMeta>\n}\n\nexport const commonExtraArgs = [\"name\", \"namespace\", \"metadata\"] as const\n\nexport function mapMetadata(\n args: PartialKeys<Unwrap<CommonArgs>, \"namespace\">,\n fallbackName?: string,\n): types.input.meta.v1.ObjectMeta {\n return {\n ...args.metadata,\n name: args.name ?? args.metadata?.name ?? fallbackName,\n namespace: args.namespace ? mapNamespaceLikeToNamespaceName(args.namespace) : undefined,\n }\n}\n\nexport type SelectorLike = types.input.meta.v1.LabelSelector | Record<string, Input<string>>\n\nexport function mapSelectorLikeToSelector(\n selector: SelectorLike,\n): types.input.meta.v1.LabelSelector {\n if (\"matchLabels\" in selector || \"matchExpressions\" in selector) {\n return selector\n }\n\n return {\n matchLabels: selector as Record<string, Input<string>>,\n }\n}\n\nexport function mapNamespaceLikeToNamespaceName(namespace: NamespaceLike): Output<string> {\n return core.v1.Namespace.isInstance(namespace) ? namespace.metadata.name : output(namespace)\n}\n\nexport function mapNamespaceNameToSelector(\n namespace: Input<string>,\n): types.input.meta.v1.LabelSelector {\n return {\n matchLabels: {\n \"kubernetes.io/metadata.name\": namespace,\n },\n }\n}\n\nexport type ResourceId = {\n name: Input<string>\n namespace?: Input<string | undefined>\n}\n\nexport function resourceIdToString(metadata: Input<ResourceId>): Output<string> {\n return output(metadata).apply(metadata => {\n return metadata.namespace ? `${metadata.namespace}/${metadata.name}` : metadata.name\n })\n}\n\nexport function getAppName(resourceId: Unwrap<ResourceId>): string {\n if (resourceId.namespace !== resourceId.name) {\n return `${resourceId.namespace ?? \"default\"}-${resourceId.name}`\n }\n\n return resourceId.name\n}\n\nexport function getAppDisplayName(resourceId: Unwrap<ResourceId>): string {\n if (resourceId.namespace !== resourceId.name) {\n return `${resourceId.namespace ?? \"default\"}/${resourceId.name}`\n }\n\n return resourceId.name\n}\n"],"mappings":";AAEA,SAAiB,QAAQ,iBAA0C;AACnE,SAAS,MAAM,gBAAuB;AACtC,SAAS,iBAAiB;AAE1B,IAAM,YAAY,oBAAI,IAAsB;AAErC,SAAS,YAAY,SAAgD;AAC1E,QAAM,WAAW,OAAO,OAAO,EAAE,MAAM,CAAAA,aAAW;AAChD,UAAM,mBAAmB,UAAU,IAAIA,SAAQ,KAAK,EAAE;AACtD,QAAI,kBAAkB;AACpB,aAAO;AAAA,IACT;AAEA,UAAMC,YAAW,IAAI,SAASD,SAAQ,KAAK,IAAI,EAAE,YAAYA,SAAQ,WAAW,CAAC;AACjF,cAAU,IAAIA,SAAQ,KAAK,IAAIC,SAAQ;AAEvC,WAAOA;AAAA,EACT,CAAC;AAED,SAAO,UAAU,QAAQ;AAC3B;AAEA,eAAsB,eACpB,UACA,aACe;AACf,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AAEA,QAAM,MAAM,MAAM,UAAU,SAAS,GAAG;AACxC,QAAM,CAAC,EAAE,EAAE,EAAE,WAAW,IAAI,IAAI,MAAM,IAAI;AAE1C,QAAM,aAAa,MAAM,UAAU,OAAO,WAAW,EAAE,EAAE;AAEzD,MAAI,gBAAgB,YAAY;AAC9B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,gBACd,MACA,UACA,OAA8B,CAAC,GACZ;AACnB,SAAO,IAAI,KAAK,GAAG;AAAA,IACjB;AAAA,IACA,UAAU,MAAM;AAAA,MACd,UAAU;AAAA,QACR;AAAA,MACF;AAAA,IACF,CAAC;AAAA,IACD,EAAE,SAAS;AAAA,EACb;AACF;AAEO,SAAS,aAAa,OAAO,WAAW,UAAuC;AACpF,SAAO,KAAK,GAAG,UAAU,IAAI,MAAM,MAAM,EAAE,SAAS,CAAC;AACvD;AAqBO,IAAM,kBAAkB,CAAC,QAAQ,aAAa,UAAU;AAExD,SAAS,YACd,MACA,cACgC;AAChC,SAAO;AAAA,IACL,GAAG,KAAK;AAAA,IACR,MAAM,KAAK,QAAQ,KAAK,UAAU,QAAQ;AAAA,IAC1C,WAAW,KAAK,YAAY,gCAAgC,KAAK,SAAS,IAAI;AAAA,EAChF;AACF;AAIO,SAAS,0BACd,UACmC;AACnC,MAAI,iBAAiB,YAAY,sBAAsB,UAAU;AAC/D,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,aAAa;AAAA,EACf;AACF;AAEO,SAAS,gCAAgC,WAA0C;AACxF,SAAO,KAAK,GAAG,UAAU,WAAW,SAAS,IAAI,UAAU,SAAS,OAAO,OAAO,SAAS;AAC7F;AAEO,SAAS,2BACd,WACmC;AACnC,SAAO;AAAA,IACL,aAAa;AAAA,MACX,+BAA+B;AAAA,IACjC;AAAA,EACF;AACF;AAOO,SAAS,mBAAmB,UAA6C;AAC9E,SAAO,OAAO,QAAQ,EAAE,MAAM,CAAAC,cAAY;AACxC,WAAOA,UAAS,YAAY,GAAGA,UAAS,SAAS,IAAIA,UAAS,IAAI,KAAKA,UAAS;AAAA,EAClF,CAAC;AACH;AAEO,SAAS,WAAW,YAAwC;AACjE,MAAI,WAAW,cAAc,WAAW,MAAM;AAC5C,WAAO,GAAG,WAAW,aAAa,SAAS,IAAI,WAAW,IAAI;AAAA,EAChE;AAEA,SAAO,WAAW;AACpB;AAEO,SAAS,kBAAkB,YAAwC;AACxE,MAAI,WAAW,cAAc,WAAW,MAAM;AAC5C,WAAO,GAAG,WAAW,aAAa,SAAS,IAAI,WAAW,IAAI;AAAA,EAChE;AAEA,SAAO,WAAW;AACpB;","names":["cluster","provider","metadata"]}
|