@highstate/k8s 0.9.13 → 0.9.15

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 (55) hide show
  1. package/dist/{chunk-QLQ3QVGT.js → chunk-KBWGED2C.js} +15 -10
  2. package/dist/chunk-KBWGED2C.js.map +1 -0
  3. package/dist/{chunk-5S4JPM4M.js → chunk-MKFBWTVZ.js} +36 -4
  4. package/dist/chunk-MKFBWTVZ.js.map +1 -0
  5. package/dist/chunk-P2UABKGA.js +1664 -0
  6. package/dist/chunk-P2UABKGA.js.map +1 -0
  7. package/dist/chunk-PZ5AY32C.js +10 -0
  8. package/dist/{chunk-VL7Z5FJQ.js → chunk-QMWFPJQB.js} +23 -3
  9. package/dist/chunk-QMWFPJQB.js.map +1 -0
  10. package/dist/{chunk-6L67WIZW.js → chunk-YRC7EI6X.js} +23 -3
  11. package/dist/chunk-YRC7EI6X.js.map +1 -0
  12. package/dist/{chunk-Y3LZSX7I.js → chunk-YUMBUWA4.js} +23 -1
  13. package/dist/chunk-YUMBUWA4.js.map +1 -0
  14. package/dist/deployment-KOZNZXJA.js +10 -0
  15. package/dist/highstate.manifest.json +8 -8
  16. package/dist/index.js +17 -18
  17. package/dist/index.js.map +1 -1
  18. package/dist/stateful-set-H5BR3H5D.js +10 -0
  19. package/dist/stateful-set-H5BR3H5D.js.map +1 -0
  20. package/dist/units/access-point/index.js +2 -0
  21. package/dist/units/access-point/index.js.map +1 -1
  22. package/dist/units/cert-manager/index.js +6 -3
  23. package/dist/units/cert-manager/index.js.map +1 -1
  24. package/dist/units/cluster-dns/index.js +2 -0
  25. package/dist/units/cluster-dns/index.js.map +1 -1
  26. package/dist/units/cluster-patch/index.js +2 -0
  27. package/dist/units/cluster-patch/index.js.map +1 -1
  28. package/dist/units/dns01-issuer/index.js +2 -1
  29. package/dist/units/dns01-issuer/index.js.map +1 -1
  30. package/dist/units/existing-cluster/index.js +3 -1
  31. package/dist/units/existing-cluster/index.js.map +1 -1
  32. package/dist/units/gateway-api/index.js +2 -1
  33. package/dist/units/gateway-api/index.js.map +1 -1
  34. package/package.json +10 -9
  35. package/src/cluster.ts +14 -9
  36. package/src/deployment.ts +34 -0
  37. package/src/helm.ts +38 -2
  38. package/src/network-policy.ts +2 -5
  39. package/src/shared.ts +3 -0
  40. package/src/stateful-set.ts +34 -0
  41. package/src/workload.ts +22 -3
  42. package/dist/chunk-5S4JPM4M.js.map +0 -1
  43. package/dist/chunk-6L67WIZW.js.map +0 -1
  44. package/dist/chunk-QLQ3QVGT.js.map +0 -1
  45. package/dist/chunk-SARVLQZY.js +0 -876
  46. package/dist/chunk-SARVLQZY.js.map +0 -1
  47. package/dist/chunk-VL7Z5FJQ.js.map +0 -1
  48. package/dist/chunk-WEKIQRCZ.js +0 -792
  49. package/dist/chunk-WEKIQRCZ.js.map +0 -1
  50. package/dist/chunk-Y3LZSX7I.js.map +0 -1
  51. package/dist/deployment-QTPBNKO5.js +0 -10
  52. package/dist/stateful-set-K4GV7ZTK.js +0 -10
  53. package/src/custom.ts +0 -104
  54. /package/dist/{deployment-QTPBNKO5.js.map → chunk-PZ5AY32C.js.map} +0 -0
  55. /package/dist/{stateful-set-K4GV7ZTK.js.map → deployment-KOZNZXJA.js.map} +0 -0
package/src/helm.ts CHANGED
@@ -1,8 +1,9 @@
1
1
  import type { k8s } from "@highstate/library"
2
+ import type { Workload } from "./workload"
2
3
  import { resolve } from "node:path"
3
4
  import { mkdir, readFile, unlink } from "node:fs/promises"
4
- import { normalize, toPromise, type InputMap } from "@highstate/pulumi"
5
- import { core, helm, types } from "@pulumi/kubernetes"
5
+ import { normalize, toPromise, type InputMap, type InstanceTerminal } from "@highstate/pulumi"
6
+ import { apps, core, helm, types } from "@pulumi/kubernetes"
6
7
  import {
7
8
  ComponentResource,
8
9
  output,
@@ -19,6 +20,8 @@ import { NetworkPolicy, type NetworkPolicyArgs } from "./network-policy"
19
20
  import { HttpRoute, type HttpRouteArgs } from "./gateway"
20
21
  import { getProvider, mapNamespaceLikeToNamespaceName, type NamespaceLike } from "./shared"
21
22
  import { getServiceType, Service, type ServiceArgs } from "./service"
23
+ import { Deployment } from "./deployment"
24
+ import { StatefulSet } from "./stateful-set"
22
25
 
23
26
  export type ChartArgs = Omit<
24
27
  helm.v4.ChartArgs,
@@ -85,6 +88,11 @@ export class Chart extends ComponentResource {
85
88
  */
86
89
  public readonly networkPolicies: Output<NetworkPolicy[]>
87
90
 
91
+ /**
92
+ * All workloads created by the chart.
93
+ */
94
+ public readonly workloads: Output<Workload[]>
95
+
88
96
  constructor(
89
97
  private readonly name: string,
90
98
  private readonly args: ChartArgs,
@@ -185,12 +193,40 @@ export class Chart extends ComponentResource {
185
193
  }),
186
194
  )
187
195
  })
196
+
197
+ this.workloads = output(this.chart).apply(chart => {
198
+ return output(
199
+ chart.resources.apply(resources => {
200
+ return resources
201
+ .map(resource => {
202
+ if (apps.v1.Deployment.isInstance(resource)) {
203
+ return resource.metadata.name.apply(name => {
204
+ return Deployment.wrap(name, resource, this.args.cluster, this.opts)
205
+ })
206
+ }
207
+
208
+ if (apps.v1.StatefulSet.isInstance(resource)) {
209
+ return resource.metadata.name.apply(name => {
210
+ return StatefulSet.wrap(name, resource, this.args.cluster, this.opts)
211
+ })
212
+ }
213
+
214
+ return undefined
215
+ })
216
+ .filter(workload => workload !== undefined) as Output<Workload>[]
217
+ }),
218
+ )
219
+ })
188
220
  }
189
221
 
190
222
  get service(): Output<Service> {
191
223
  return this.getServiceOutput(undefined)
192
224
  }
193
225
 
226
+ get terminals(): Output<InstanceTerminal[]> {
227
+ return this.workloads.apply(workloads => output(workloads.map(workload => workload.terminal)))
228
+ }
229
+
194
230
  private readonly services = new Map<string, Service>()
195
231
 
196
232
  getServiceOutput(name: string | undefined): Output<Service> {
@@ -434,10 +434,7 @@ export abstract class NetworkPolicy extends ComponentResource {
434
434
  allowKubeApiServer: args.allowKubeApiServer ?? false,
435
435
 
436
436
  ingressRules: ingressRules.flatMap(rule => {
437
- const endpoints = normalize(
438
- args.ingressRule?.fromEndpoint,
439
- args.ingressRule?.fromEndpoints,
440
- )
437
+ const endpoints = normalize(rule?.fromEndpoint, rule?.fromEndpoints)
441
438
  const parsedEndpoints = endpoints.map(parseL34Endpoint)
442
439
 
443
440
  const endpointsNamespaces = groupBy(parsedEndpoints, endpoint => {
@@ -475,7 +472,7 @@ export abstract class NetworkPolicy extends ComponentResource {
475
472
 
476
473
  egressRules: egressRules
477
474
  .flatMap(rule => {
478
- const endpoints = normalize(args.egressRule?.toEndpoint, args.egressRule?.toEndpoints)
475
+ const endpoints = normalize(rule?.toEndpoint, rule?.toEndpoints)
479
476
  const parsedEndpoints = endpoints.map(parseL34Endpoint)
480
477
 
481
478
  const endpointsByPortsAnsNamespaces = groupBy(parsedEndpoints, endpoint => {
package/src/shared.ts CHANGED
@@ -2,6 +2,7 @@ import type { PartialKeys } from "@highstate/contract"
2
2
  import type { k8s } from "@highstate/library"
3
3
  import { interpolate, Output, output, toPromise, type Input, type Unwrap } from "@highstate/pulumi"
4
4
  import { core, Provider, types } from "@pulumi/kubernetes"
5
+ import * as images from "../assets/images.json"
5
6
  import { Namespace } from "./namespace"
6
7
 
7
8
  const providers = new Map<string, Provider>()
@@ -127,3 +128,5 @@ export function withPatchName(
127
128
  return resource.metadata.name
128
129
  })
129
130
  }
131
+
132
+ export { images }
@@ -125,6 +125,15 @@ export abstract class StatefulSet extends ExposableWorkload {
125
125
 
126
126
  return new ExternalStatefulSet(name, output(args.existing).metadata, args.cluster, opts)
127
127
  }
128
+
129
+ static wrap(
130
+ name: string,
131
+ statefulSet: Input<apps.v1.StatefulSet>,
132
+ cluster: Input<k8s.Cluster>,
133
+ opts?: ComponentResourceOptions,
134
+ ): StatefulSet {
135
+ return new WrappedStatefulSet(name, statefulSet, cluster, opts)
136
+ }
128
137
  }
129
138
 
130
139
  class CreatedStatefulSet extends StatefulSet {
@@ -262,3 +271,28 @@ class ExternalStatefulSet extends StatefulSet {
262
271
  )
263
272
  }
264
273
  }
274
+
275
+ class WrappedStatefulSet extends StatefulSet {
276
+ constructor(
277
+ name: string,
278
+ statefulSet: Input<apps.v1.StatefulSet>,
279
+ cluster: Input<k8s.Cluster>,
280
+ opts?: ComponentResourceOptions,
281
+ ) {
282
+ super(
283
+ "highstate:k8s:WrappedStatefulSet",
284
+ name,
285
+ { namespace: output(statefulSet).metadata.namespace, cluster },
286
+ opts,
287
+
288
+ output(cluster),
289
+ output(statefulSet).metadata,
290
+ output(statefulSet).spec,
291
+ output(statefulSet).status,
292
+
293
+ output(undefined),
294
+ output(undefined),
295
+ output(undefined),
296
+ )
297
+ }
298
+ }
package/src/workload.ts CHANGED
@@ -19,7 +19,7 @@ import {
19
19
  import { filter, isNonNullish, unique, uniqueBy } from "remeda"
20
20
  import { deepmerge } from "deepmerge-ts"
21
21
  import { sha256 } from "crypto-hash"
22
- import { commonExtraArgs, getProvider, type CommonArgs } from "./shared"
22
+ import { commonExtraArgs, getProvider, images, type CommonArgs } from "./shared"
23
23
  import { mapContainerPortToServicePort, Service, type ServiceArgs } from "./service"
24
24
  import { HttpRoute, type HttpRouteArgs } from "./gateway"
25
25
  import {
@@ -316,8 +316,12 @@ export abstract class Workload extends ComponentResource {
316
316
 
317
317
  return output({
318
318
  name: this.metadata.name,
319
- title: this.metadata.name,
320
- image: "ghcr.io/exeteres/highstate/terminal-kubectl",
319
+ title: interpolate`${Workload.getResourceDisplayType(this.resourceType)} (${this.metadata.name})`,
320
+ description: "Connect to the container of the workload",
321
+ icon: "devicon:kubernetes",
322
+
323
+ image: images["terminal-kubectl"].image,
324
+
321
325
  command: [
322
326
  "exec",
323
327
  "kubectl",
@@ -331,14 +335,29 @@ export abstract class Workload extends ComponentResource {
331
335
  "--",
332
336
  this.args.terminalShell ?? "bash",
333
337
  ],
338
+
334
339
  files: {
335
340
  "/kubeconfig": this.cluster.kubeconfig,
336
341
  },
342
+
337
343
  env: {
338
344
  KUBECONFIG: "/kubeconfig",
339
345
  },
340
346
  })
341
347
  }
348
+
349
+ private static getResourceDisplayType(resourceType: string): string {
350
+ switch (resourceType) {
351
+ case "deployment":
352
+ return "Deployment"
353
+ case "statefulset":
354
+ return "StatefulSet"
355
+ case "daemonset":
356
+ return "DaemonSet"
357
+ default:
358
+ return resourceType.charAt(0).toUpperCase() + resourceType.slice(1)
359
+ }
360
+ }
342
361
  }
343
362
 
344
363
  export abstract class ExposableWorkload extends Workload {
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/helm.ts"],"sourcesContent":["import type { k8s } from \"@highstate/library\"\nimport { resolve } from \"node:path\"\nimport { mkdir, readFile, unlink } from \"node:fs/promises\"\nimport { normalize, toPromise, type InputMap } from \"@highstate/pulumi\"\nimport { core, helm, types } 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 { NetworkPolicy, type NetworkPolicyArgs } from \"./network-policy\"\nimport { HttpRoute, type HttpRouteArgs } from \"./gateway\"\nimport { getProvider, mapNamespaceLikeToNamespaceName, type NamespaceLike } from \"./shared\"\nimport { getServiceType, Service, type ServiceArgs } 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 extra args to pass to the main service of the chart.\n *\n * Will be patched via transformations.\n */\n service?: Partial<ServiceArgs>\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<Omit<HttpRouteArgs, \"cluster\">>\n\n /**\n * The network policy to apply to the chart.\n */\n networkPolicy?: Input<Omit<NetworkPolicyArgs, \"selector\" | \"cluster\" | \"namespace\">>\n\n /**\n * The network policies to apply to the chart.\n */\n networkPolicies?: Input<NetworkPolicyArgs[]>\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 /**\n * The network policies applied to the chart.\n */\n public readonly networkPolicies: Output<NetworkPolicy[]>\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 const namespace = output(args.namespace).apply(namespace =>\n output(namespace ? mapNamespaceLikeToNamespaceName(namespace) : \"default\"),\n )\n\n this.chart = output({ args, namespace }).apply(async ({ args, namespace }) => {\n return new helm.v4.Chart(\n name,\n omit(\n {\n ...args,\n chart: resolveHelmChart(args.chart),\n namespace,\n },\n [\"httpRoute\"],\n ),\n {\n ...opts,\n parent: this,\n provider: await getProvider(args.cluster),\n\n transforms: [\n ...(opts?.transforms ?? []),\n\n resourceArgs => {\n const serviceName = args.serviceName ?? name\n const expectedName = `${name}:${namespace}/${serviceName}`\n\n if (\n resourceArgs.type === \"kubernetes:core/v1:Service\" &&\n resourceArgs.name === expectedName\n ) {\n const spec = resourceArgs.props.spec as types.input.core.v1.ServiceSpec\n\n return {\n props: {\n ...resourceArgs.props,\n spec: {\n ...spec,\n ...(args.service ?? {}),\n\n type: getServiceType(args.service, args.cluster),\n\n externalIPs:\n args.service?.externalIPs ?? args.cluster.externalIps ?? spec.externalIPs,\n },\n },\n opts: resourceArgs.opts,\n }\n }\n\n return undefined\n },\n ],\n },\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 cluster: args.cluster,\n rule: {\n backend: this.service,\n },\n },\n { ...opts, parent: this },\n )\n })\n\n this.networkPolicies = output(args).apply(args => {\n const policies = normalize(args.networkPolicy, args.networkPolicies)\n\n return output(\n policies.map(policy => {\n return NetworkPolicy.create(\n name,\n {\n ...policy,\n\n cluster: args.cluster,\n namespace: args.namespace,\n },\n { ...opts, parent: this },\n )\n }),\n )\n })\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,\n { ...this.opts, parent: this },\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":["namespace","args","services"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/deployment.ts"],"sourcesContent":["import type { k8s } from \"@highstate/library\"\nimport type { HttpRoute } from \"./gateway\"\nimport type { Service } from \"./service\"\nimport type { NetworkPolicy } from \"./network-policy\"\nimport { output, type ComponentResourceOptions, Output, type Input } from \"@highstate/pulumi\"\nimport { apps, types } from \"@pulumi/kubernetes\"\nimport { omit } from \"remeda\"\nimport { deepmerge } from \"deepmerge-ts\"\nimport {\n getProvider,\n mapMetadata,\n resourceIdToString,\n withPatchName,\n type ResourceId,\n} from \"./shared\"\nimport {\n exposableWorkloadExtraArgs,\n ExposableWorkload,\n type ExposableWorkloadArgs,\n getExposableWorkloadComponents,\n} from \"./workload\"\n\nexport type DeploymentArgs = Omit<ExposableWorkloadArgs, \"existing\"> &\n Omit<Partial<types.input.apps.v1.DeploymentSpec>, \"template\"> & {\n template?: {\n metadata?: types.input.meta.v1.ObjectMeta\n spec?: Partial<types.input.core.v1.PodSpec>\n }\n }\n\nexport type CreateOrGetDeploymentArgs = DeploymentArgs & {\n /**\n * The entity to use to determine the deployment to patch.\n */\n existing: Input<k8s.Deployment> | undefined\n}\n\nexport abstract class Deployment extends ExposableWorkload {\n protected constructor(\n type: string,\n name: string,\n args: ExposableWorkloadArgs,\n opts: ComponentResourceOptions | undefined,\n\n cluster: Output<k8s.Cluster>,\n metadata: Output<types.output.meta.v1.ObjectMeta>,\n\n /**\n * The spec of the underlying Kubernetes deployment.\n */\n readonly spec: Output<types.output.apps.v1.DeploymentSpec>,\n\n /**\n * The status of the underlying Kubernetes deployment.\n */\n readonly status: Output<types.output.apps.v1.DeploymentStatus>,\n\n networkPolicy: Output<NetworkPolicy | undefined>,\n\n service: Output<Service | undefined>,\n httpRoute: Output<HttpRoute | undefined>,\n ) {\n super(\n type,\n name,\n args,\n opts,\n \"deployment\",\n cluster,\n metadata,\n networkPolicy,\n service,\n httpRoute,\n )\n }\n\n /**\n * The Highstate deployment entity.\n */\n get entity(): Output<k8s.Deployment> {\n return output({\n type: \"k8s.deployment\",\n clusterId: this.cluster.id,\n metadata: this.metadata,\n service: this._service.apply(service => service?.entity),\n })\n }\n\n static create(name: string, args: DeploymentArgs, opts?: ComponentResourceOptions): Deployment {\n return new CreatedDeployment(name, args, opts)\n }\n\n static createOrPatch(\n name: string,\n args: CreateOrGetDeploymentArgs,\n opts?: ComponentResourceOptions,\n ): Deployment {\n if (!args.existing) {\n return new CreatedDeployment(name, args, opts)\n }\n\n return new DeploymentPatch(\n name,\n {\n ...args,\n name: withPatchName(\"deployment\", args.existing, args.cluster),\n namespace: output(args.existing).metadata.namespace,\n },\n opts,\n )\n }\n\n static patch(name: string, args: DeploymentArgs, opts?: ComponentResourceOptions): Deployment {\n return new DeploymentPatch(name, args, opts)\n }\n\n static createOrGet(\n name: string,\n args: CreateOrGetDeploymentArgs,\n opts?: ComponentResourceOptions,\n ): Deployment {\n if (!args.existing) {\n return new CreatedDeployment(name, args, opts)\n }\n\n return new ExternalDeployment(name, output(args.existing).metadata, args.cluster, opts)\n }\n}\n\nclass CreatedDeployment extends Deployment {\n constructor(name: string, args: DeploymentArgs, opts?: ComponentResourceOptions) {\n const { labels, podTemplate, networkPolicy, service, httpRoute } =\n getExposableWorkloadComponents(name, args, () => this, opts)\n\n const deployment = output({ args, podTemplate }).apply(async ({ args, podTemplate }) => {\n return new apps.v1.Deployment(\n name,\n {\n metadata: mapMetadata(args, name),\n spec: deepmerge(\n {\n template: podTemplate,\n selector: { matchLabels: labels },\n },\n omit(args, exposableWorkloadExtraArgs),\n ) as types.input.apps.v1.DeploymentSpec,\n },\n {\n ...opts,\n parent: this,\n provider: await getProvider(args.cluster),\n },\n )\n })\n\n super(\n \"highstate:k8s:Deployment\",\n name,\n args,\n opts,\n\n output(args.cluster),\n deployment.metadata,\n deployment.spec,\n deployment.status,\n\n networkPolicy,\n service,\n httpRoute,\n )\n }\n}\n\nclass DeploymentPatch extends Deployment {\n constructor(name: string, args: DeploymentArgs, opts?: ComponentResourceOptions) {\n const { podSpec, networkPolicy, service, httpRoute } = getExposableWorkloadComponents(\n name,\n args,\n () => this,\n opts,\n )\n\n const deployment = output({ args, podSpec }).apply(async ({ args, podSpec }) => {\n return new apps.v1.DeploymentPatch(\n name,\n {\n metadata: mapMetadata(args, name),\n spec: deepmerge(\n {\n template: {\n spec: podSpec,\n },\n },\n omit(args, exposableWorkloadExtraArgs),\n ) as types.input.apps.v1.DeploymentSpec,\n },\n {\n ...opts,\n parent: this,\n provider: await getProvider(args.cluster),\n },\n )\n })\n\n super(\n \"highstate:k8s:DeploymentPatch\",\n name,\n args,\n opts,\n\n output(args.cluster),\n deployment.metadata,\n deployment.spec,\n deployment.status,\n\n networkPolicy,\n service,\n httpRoute,\n )\n }\n}\n\nclass ExternalDeployment extends Deployment {\n constructor(\n name: string,\n id: Input<ResourceId>,\n cluster: Input<k8s.Cluster>,\n opts?: ComponentResourceOptions,\n ) {\n const deployment = output(id).apply(async id => {\n return apps.v1.Deployment.get(name, resourceIdToString(id), {\n ...opts,\n parent: this,\n provider: await getProvider(cluster),\n })\n })\n\n super(\n \"highstate:k8s:ExternalDeployment\",\n name,\n { namespace: output(id).namespace, cluster },\n opts,\n output(cluster),\n deployment.metadata,\n deployment.spec,\n deployment.status,\n\n output(undefined),\n output(undefined),\n output(undefined),\n )\n }\n}\n"],"mappings":"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","names":["args","podTemplate","podSpec","id"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cluster.ts"],"sourcesContent":["import type { k8s } from \"@highstate/library\"\nimport { text } from \"@highstate/contract\"\nimport { getUnitInstanceName, secret, type Input, type InstanceTerminal } from \"@highstate/pulumi\"\nimport { CoreV1Api, type KubeConfig } from \"@kubernetes/client-node\"\n\nfunction isPrivateIp(ip: string) {\n const privateIpRegex = /^(10|172\\.16|192\\.168)\\./\n return privateIpRegex.test(ip)\n}\n\nexport async function detectExternalIps(\n kubeConfig: KubeConfig,\n internalIpsPolicy: k8s.InternalIpsPolicy,\n): Promise<string[]> {\n const nodeApi = kubeConfig.makeApiClient(CoreV1Api)\n const nodes = await nodeApi.listNode()\n\n return nodes.items.flatMap(node => {\n const addresses = node.status?.addresses ?? []\n const externalIp = addresses.find(address => address.type === \"ExternalIP\")\n const internalIp = addresses.find(address => address.type === \"InternalIP\")\n\n const result: string[] = []\n\n if (externalIp?.address) {\n result.push(externalIp.address)\n }\n\n if (internalIp?.address && internalIpsPolicy === \"always\") {\n result.push(internalIp.address)\n }\n\n if (internalIp?.address && internalIpsPolicy === \"public\" && !isPrivateIp(internalIp.address)) {\n result.push(internalIp.address)\n }\n\n return result\n })\n}\n\nexport function createK8sTerminal(kubeconfig: Input<string>): InstanceTerminal {\n return {\n name: \"management\",\n title: `K8S: ${getUnitInstanceName()}`,\n description: \"Manage the cluster using kubectl and helm\",\n image: \"ghcr.io/exeteres/highstate/terminal-kubectl\",\n command: [\"bash\", \"/welcome.sh\"],\n files: {\n \"/kubeconfig\": secret(kubeconfig),\n\n \"/welcome.sh\": text`\n echo \"Connecting to the cluster...\"\n kubectl cluster-info\n\n echo \"Use 'kubectl' and 'helm' to manage the cluster.\"\n echo\n\n exec bash\n `,\n },\n env: {\n KUBECONFIG: \"/kubeconfig\",\n },\n }\n}\n"],"mappings":";AACA,SAAS,YAAY;AACrB,SAAS,qBAAqB,cAAiD;AAC/E,SAAS,iBAAkC;AAE3C,SAAS,YAAY,IAAY;AAC/B,QAAM,iBAAiB;AACvB,SAAO,eAAe,KAAK,EAAE;AAC/B;AAEA,eAAsB,kBACpB,YACA,mBACmB;AACnB,QAAM,UAAU,WAAW,cAAc,SAAS;AAClD,QAAM,QAAQ,MAAM,QAAQ,SAAS;AAErC,SAAO,MAAM,MAAM,QAAQ,UAAQ;AACjC,UAAM,YAAY,KAAK,QAAQ,aAAa,CAAC;AAC7C,UAAM,aAAa,UAAU,KAAK,aAAW,QAAQ,SAAS,YAAY;AAC1E,UAAM,aAAa,UAAU,KAAK,aAAW,QAAQ,SAAS,YAAY;AAE1E,UAAM,SAAmB,CAAC;AAE1B,QAAI,YAAY,SAAS;AACvB,aAAO,KAAK,WAAW,OAAO;AAAA,IAChC;AAEA,QAAI,YAAY,WAAW,sBAAsB,UAAU;AACzD,aAAO,KAAK,WAAW,OAAO;AAAA,IAChC;AAEA,QAAI,YAAY,WAAW,sBAAsB,YAAY,CAAC,YAAY,WAAW,OAAO,GAAG;AAC7F,aAAO,KAAK,WAAW,OAAO;AAAA,IAChC;AAEA,WAAO;AAAA,EACT,CAAC;AACH;AAEO,SAAS,kBAAkB,YAA6C;AAC7E,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO,QAAQ,oBAAoB,CAAC;AAAA,IACpC,aAAa;AAAA,IACb,OAAO;AAAA,IACP,SAAS,CAAC,QAAQ,aAAa;AAAA,IAC/B,OAAO;AAAA,MACL,eAAe,OAAO,UAAU;AAAA,MAEhC,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASjB;AAAA,IACA,KAAK;AAAA,MACH,YAAY;AAAA,IACd;AAAA,EACF;AACF;","names":[]}