@highstate/k8s 0.9.20 → 0.9.22

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-A3XGSDIW.js → chunk-5BNGVYWY.js} +3 -3
  2. package/dist/{chunk-A3XGSDIW.js.map → chunk-5BNGVYWY.js.map} +1 -1
  3. package/dist/{chunk-4JGXGN2L.js → chunk-7CAKYZQ4.js} +5 -5
  4. package/dist/{chunk-4JGXGN2L.js.map → chunk-7CAKYZQ4.js.map} +1 -1
  5. package/dist/{chunk-2EEHJZPD.js → chunk-HH2JJELM.js} +2 -2
  6. package/dist/chunk-HH2JJELM.js.map +1 -0
  7. package/dist/{chunk-IMTXUK2U.js → chunk-KHNUUVL4.js} +2 -2
  8. package/dist/{chunk-IMTXUK2U.js.map → chunk-KHNUUVL4.js.map} +1 -1
  9. package/dist/{chunk-KDD6XUWM.js → chunk-O3ZNJMTN.js} +2 -2
  10. package/dist/{chunk-KDD6XUWM.js.map → chunk-O3ZNJMTN.js.map} +1 -1
  11. package/dist/{chunk-SBC3TUIN.js → chunk-OEGSMSYV.js} +7 -7
  12. package/dist/chunk-OEGSMSYV.js.map +1 -0
  13. package/dist/{chunk-JYNXQ3I3.js → chunk-PODFA5KM.js} +3 -3
  14. package/dist/{chunk-JYNXQ3I3.js.map → chunk-PODFA5KM.js.map} +1 -1
  15. package/dist/{chunk-NXSYCA3V.js → chunk-UF3ADZGM.js} +54 -54
  16. package/dist/chunk-UF3ADZGM.js.map +1 -0
  17. package/dist/{chunk-NOFJC3EM.js → chunk-VI4JGEVG.js} +3 -3
  18. package/dist/{chunk-NOFJC3EM.js.map → chunk-VI4JGEVG.js.map} +1 -1
  19. package/dist/deployment-NTLQBNXM.js +8 -0
  20. package/dist/{deployment-752P6JIT.js.map → deployment-NTLQBNXM.js.map} +1 -1
  21. package/dist/highstate.manifest.json +2 -2
  22. package/dist/impl/gateway-route.js +3 -3
  23. package/dist/impl/tls-certificate.js +2 -2
  24. package/dist/impl/tls-certificate.js.map +1 -1
  25. package/dist/index.js +12 -12
  26. package/dist/index.js.map +1 -1
  27. package/dist/stateful-set-KBJ3EAMW.js +8 -0
  28. package/dist/{stateful-set-N64YVKR7.js.map → stateful-set-KBJ3EAMW.js.map} +1 -1
  29. package/dist/units/cert-manager/index.js +5 -5
  30. package/dist/units/cert-manager/index.js.map +1 -1
  31. package/dist/units/dns01-issuer/index.js +2 -2
  32. package/dist/units/dns01-issuer/index.js.map +1 -1
  33. package/dist/units/existing-cluster/index.js +3 -3
  34. package/dist/units/existing-cluster/index.js.map +1 -1
  35. package/package.json +15 -10
  36. package/src/cluster.ts +1 -1
  37. package/src/dns01-solver.ts +1 -1
  38. package/src/gateway/backend.ts +1 -1
  39. package/src/gateway/http-route.ts +6 -6
  40. package/src/gateway/index.ts +1 -1
  41. package/src/impl/tls-certificate.ts +1 -1
  42. package/src/network-policy.ts +18 -18
  43. package/src/pvc.ts +8 -8
  44. package/src/scripting/bundle.ts +8 -8
  45. package/src/scripting/container.ts +1 -1
  46. package/src/scripting/environment.ts +1 -1
  47. package/src/secret.ts +1 -1
  48. package/src/units/cert-manager/index.ts +1 -1
  49. package/src/units/dns01-issuer/index.ts +2 -2
  50. package/src/units/existing-cluster/index.ts +4 -4
  51. package/dist/chunk-2EEHJZPD.js.map +0 -1
  52. package/dist/chunk-NXSYCA3V.js.map +0 -1
  53. package/dist/chunk-SBC3TUIN.js.map +0 -1
  54. package/dist/deployment-752P6JIT.js +0 -8
  55. package/dist/stateful-set-N64YVKR7.js +0 -8
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config-map.ts","../src/pvc.ts","../src/container.ts","../src/network.ts","../src/network-policy.ts","../src/pod.ts","../src/workload.ts"],"names":["output","getOrCreate","toPromise","core","args","interpolate","omit","normalize","endpoints","rule","containers","rawVolumes","uniqueBy","volumes","podSpec","dependencyHash","service","command","deepmerge"],"mappings":"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","file":"chunk-OEGSMSYV.js","sourcesContent":["import type { k8s } from \"@highstate/library\"\nimport { getOrCreate } from \"@highstate/contract\"\nimport { toPromise } from \"@highstate/pulumi\"\nimport { core, type types } from \"@pulumi/kubernetes\"\nimport {\n type ComponentResourceOptions,\n type Input,\n type Inputs,\n interpolate,\n type Output,\n output,\n} from \"@pulumi/pulumi\"\nimport { Namespace } from \"./namespace\"\nimport { getProvider, mapMetadata, ScopedResource, type ScopedResourceArgs } from \"./shared\"\n\nexport type ConfigMapArgs = ScopedResourceArgs &\n Omit<types.input.core.v1.ConfigMap, \"kind\" | \"metadata\" | \"apiVersion\">\n\nexport type CreateOrGetConfigMapArgs = ConfigMapArgs & {\n /**\n * The config map entity to patch/retrieve.\n */\n existing: Input<k8s.ScopedResource> | undefined\n}\n\n/**\n * Represents a Kubernetes ConfigMap resource with metadata and data.\n */\nexport abstract class ConfigMap extends ScopedResource {\n protected constructor(\n type: string,\n name: string,\n args: Inputs,\n opts: ComponentResourceOptions | undefined,\n\n apiVersion: Output<string>,\n kind: Output<string>,\n namespace: Output<Namespace>,\n metadata: Output<types.output.meta.v1.ObjectMeta>,\n\n /**\n * The data of the underlying Kubernetes config map.\n */\n readonly data: Output<Record<string, string>>,\n ) {\n super(type, name, args, opts, apiVersion, kind, namespace, metadata)\n }\n\n /**\n * The Highstate config map entity.\n */\n get entity(): Output<k8s.ScopedResource> {\n return output({\n type: \"config-map\",\n clusterId: this.cluster.id,\n clusterName: this.cluster.name,\n metadata: this.metadata,\n })\n }\n\n /**\n * Creates a new config map.\n */\n static create(name: string, args: ConfigMapArgs, opts?: ComponentResourceOptions): ConfigMap {\n return new CreatedConfigMap(name, args, opts)\n }\n\n /**\n * Creates a new config map or patches an existing one.\n *\n * @param name The name of the resource. May not be the same as the config map name.\n * @param args The arguments to create or patch the config map with.\n * @param opts Optional resource options.\n */\n static createOrPatch(\n name: string,\n args: CreateOrGetConfigMapArgs,\n opts?: ComponentResourceOptions,\n ): ConfigMap {\n if (args.existing) {\n return new ConfigMapPatch(name, {\n ...args,\n name: output(args.existing).metadata.name,\n })\n }\n\n return new CreatedConfigMap(name, args, opts)\n }\n\n /**\n * Creates a new config map or gets an existing one.\n *\n * @param name The name of the resource. May not be the same as the config map name. Will not be used when existing config map is retrieved.\n * @param args The arguments to create or get the config map with.\n * @param opts Optional resource options.\n */\n static async createOrGet(\n name: string,\n args: CreateOrGetConfigMapArgs,\n opts?: ComponentResourceOptions,\n ): Promise<ConfigMap> {\n if (args.existing) {\n return await ConfigMap.forAsync(args.existing, output(args.namespace).cluster)\n }\n\n return new CreatedConfigMap(name, args, opts)\n }\n\n /**\n * Patches an existing config map.\n *\n * Will throw an error if the config map does not exist.\n *\n * @param name The name of the resource. May not be the same as the config map name.\n * @param args The arguments to patch the config map with.\n * @param opts Optional resource options.\n */\n static patch(name: string, args: ConfigMapArgs, opts?: ComponentResourceOptions): ConfigMap {\n return new ConfigMapPatch(name, args, opts)\n }\n\n /**\n * Wraps an existing Kubernetes config map.\n */\n static wrap(\n name: string,\n args: WrappedConfigMapArgs,\n opts?: ComponentResourceOptions,\n ): ConfigMap {\n return new WrappedConfigMap(name, args, opts)\n }\n\n /**\n * Gets an existing config map.\n *\n * Will throw an error if the config map does not exist.\n */\n static get(\n name: string,\n args: ExternalConfigMapArgs,\n opts?: ComponentResourceOptions,\n ): ConfigMap {\n return new ExternalConfigMap(name, args, opts)\n }\n\n private static readonly configMapCache = new Map<string, ConfigMap>()\n\n /**\n * Gets an existing config map for a given entity.\n * Prefer this method over `get` when possible.\n *\n * It automatically names the resource with the following format: `{clusterName}.{namespace}.{name}.{clusterId}`.\n *\n * This method is idempotent and will return the same instance for the same entity.\n *\n * @param entity The entity to get the config map for.\n * @param cluster The cluster where the config map is located.\n */\n static for(entity: k8s.ScopedResource, cluster: Input<k8s.Cluster>): ConfigMap {\n return getOrCreate(\n ConfigMap.configMapCache,\n `${entity.clusterName}.${entity.metadata.namespace}.${entity.metadata.name}.${entity.clusterId}`,\n name => {\n return ConfigMap.get(name, {\n name: entity.metadata.name,\n namespace: Namespace.forResource(entity, cluster),\n })\n },\n )\n }\n\n /**\n * Gets an existing config map for a given entity.\n * Prefer this method over `get` when possible.\n *\n * It automatically names the resource with the following format: `{clusterName}.{namespace}.{name}.{clusterId}`.\n *\n * This method is idempotent and will return the same instance for the same entity.\n *\n * @param entity The entity to get the config map for.\n * @param cluster The cluster where the config map is located.\n */\n static async forAsync(\n entity: Input<k8s.ScopedResource>,\n cluster: Input<k8s.Cluster>,\n ): Promise<ConfigMap> {\n const resolvedEntity = await toPromise(entity)\n return ConfigMap.for(resolvedEntity, cluster)\n }\n}\n\nclass CreatedConfigMap extends ConfigMap {\n constructor(name: string, args: ConfigMapArgs, opts?: ComponentResourceOptions) {\n const configMap = output(args.namespace).cluster.apply(cluster => {\n return new core.v1.ConfigMap(\n name,\n {\n metadata: mapMetadata(args, name),\n data: args.data,\n },\n {\n ...opts,\n parent: this,\n provider: getProvider(cluster),\n },\n )\n })\n\n super(\n \"highstate:k8s:ConfigMap\",\n name,\n args,\n opts,\n configMap.apiVersion,\n configMap.kind,\n output(args.namespace),\n configMap.metadata,\n configMap.data,\n )\n }\n}\n\nclass ConfigMapPatch extends ConfigMap {\n constructor(name: string, args: ConfigMapArgs, opts?: ComponentResourceOptions) {\n const configMap = output(args.namespace).cluster.apply(cluster => {\n return new core.v1.ConfigMapPatch(\n name,\n {\n metadata: mapMetadata(args, name),\n data: args.data,\n },\n {\n ...opts,\n parent: this,\n provider: getProvider(cluster),\n },\n )\n })\n\n super(\n \"highstate:k8s:ConfigMapPatch\",\n name,\n args,\n opts,\n configMap.apiVersion,\n configMap.kind,\n output(args.namespace),\n configMap.metadata,\n configMap.data,\n )\n }\n}\n\nexport type WrappedConfigMapArgs = {\n /**\n * The underlying Kubernetes config map to wrap.\n */\n configMap: Input<core.v1.ConfigMap>\n\n /**\n * The namespace where the config map is located.\n */\n namespace: Input<Namespace>\n}\n\nclass WrappedConfigMap extends ConfigMap {\n constructor(name: string, args: WrappedConfigMapArgs, opts?: ComponentResourceOptions) {\n super(\n \"highstate:k8s:WrappedConfigMap\",\n name,\n args,\n opts,\n\n output(args.configMap).apiVersion,\n output(args.configMap).kind,\n output(args.namespace),\n output(args.configMap).metadata,\n output(args.configMap).data,\n )\n }\n}\n\nexport type ExternalConfigMapArgs = {\n /**\n * The name of the config map to get.\n */\n name: Input<string>\n\n /**\n * The namespace where the config map is located.\n */\n namespace: Input<Namespace>\n}\n\nclass ExternalConfigMap extends ConfigMap {\n constructor(name: string, args: ExternalConfigMapArgs, opts?: ComponentResourceOptions) {\n const configMap = output(args.namespace).cluster.apply(cluster => {\n return core.v1.ConfigMap.get(\n name,\n interpolate`${output(args.namespace).metadata.name}/${args.name}`,\n { ...opts, parent: this, provider: getProvider(cluster) },\n )\n })\n\n super(\n \"highstate:k8s:ExternalConfigMap\",\n name,\n args,\n opts,\n\n configMap.apiVersion,\n configMap.kind,\n output(args.namespace),\n configMap.metadata,\n configMap.data,\n )\n }\n}\n","import type { k8s } from \"@highstate/library\"\nimport { getOrCreate } from \"@highstate/contract\"\nimport {\n type ComponentResourceOptions,\n type Input,\n type Inputs,\n interpolate,\n type Output,\n output,\n toPromise,\n} from \"@highstate/pulumi\"\nimport { core, type types } from \"@pulumi/kubernetes\"\nimport { deepmerge } from \"deepmerge-ts\"\nimport { omit } from \"remeda\"\nimport { Namespace } from \"./namespace\"\nimport {\n commonExtraArgs,\n getProvider,\n mapMetadata,\n ScopedResource,\n type ScopedResourceArgs,\n} from \"./shared\"\n\nexport type PersistentVolumeClaimArgs = ScopedResourceArgs &\n types.input.core.v1.PersistentVolumeClaimSpec & {\n /**\n * The size of the volume to request.\n *\n * By default, the size is set to \"100Mi\".\n */\n size?: string\n }\n\nexport type CreateOrGetPersistentVolumeClaimArgs = PersistentVolumeClaimArgs & {\n /**\n * The PVC entity to patch/retrieve.\n */\n existing: Input<k8s.PersistentVolumeClaim> | undefined\n}\n\nconst extraPersistentVolumeClaimArgs = [...commonExtraArgs, \"size\"] as const\n\n/**\n * Represents a Kubernetes PersistentVolumeClaim resource with metadata and spec.\n */\nexport abstract class PersistentVolumeClaim extends ScopedResource {\n protected constructor(\n type: string,\n name: string,\n args: Inputs,\n opts: ComponentResourceOptions | undefined,\n\n apiVersion: Output<string>,\n kind: Output<string>,\n namespace: Output<Namespace>,\n metadata: Output<types.output.meta.v1.ObjectMeta>,\n\n /**\n * The spec of the underlying Kubernetes PVC.\n */\n readonly spec: Output<types.output.core.v1.PersistentVolumeClaimSpec>,\n\n /**\n * The status of the underlying Kubernetes PVC.\n */\n readonly status: Output<types.output.core.v1.PersistentVolumeClaimStatus>,\n ) {\n super(type, name, args, opts, apiVersion, kind, namespace, metadata)\n }\n\n /**\n * The Highstate PVC entity.\n */\n get entity(): Output<k8s.PersistentVolumeClaim> {\n return output({\n type: \"persistent-volume-claim\",\n clusterId: this.cluster.id,\n clusterName: this.cluster.name,\n metadata: this.metadata,\n })\n }\n\n /**\n * Creates a new PVC.\n */\n static create(\n name: string,\n args: PersistentVolumeClaimArgs,\n opts?: ComponentResourceOptions,\n ): PersistentVolumeClaim {\n return new CreatedPersistentVolumeClaim(name, args, opts)\n }\n\n /**\n * Creates a new PVC or patches an existing one.\n *\n * @param name The name of the resource. May not be the same as the PVC name.\n * @param args The arguments to create or patch the PVC with.\n * @param opts Optional resource options.\n */\n static createOrPatch(\n name: string,\n args: CreateOrGetPersistentVolumeClaimArgs,\n opts?: ComponentResourceOptions,\n ): PersistentVolumeClaim {\n if (args.existing) {\n return new PersistentVolumeClaimPatch(name, {\n ...args,\n name: output(args.existing).metadata.name,\n })\n }\n\n return new CreatedPersistentVolumeClaim(name, args, opts)\n }\n\n /**\n * Creates a new PVC or gets an existing one.\n *\n * @param name The name of the resource. May not be the same as the PVC name. Will not be used when existing PVC is retrieved.\n * @param args The arguments to create or get the PVC with.\n * @param opts Optional resource options.\n */\n static async createOrGet(\n name: string,\n args: CreateOrGetPersistentVolumeClaimArgs,\n opts?: ComponentResourceOptions,\n ): Promise<PersistentVolumeClaim> {\n if (args.existing) {\n return await PersistentVolumeClaim.forAsync(args.existing, output(args.namespace).cluster)\n }\n\n return new CreatedPersistentVolumeClaim(name, args, opts)\n }\n\n /**\n * Patches an existing PVC.\n *\n * Will throw an error if the PVC does not exist.\n *\n * @param name The name of the resource. May not be the same as the PVC name.\n * @param args The arguments to patch the PVC with.\n * @param opts Optional resource options.\n */\n static patch(\n name: string,\n args: PersistentVolumeClaimArgs,\n opts?: ComponentResourceOptions,\n ): PersistentVolumeClaim {\n return new PersistentVolumeClaimPatch(name, args, opts)\n }\n\n /**\n * Wraps an existing Kubernetes PVC.\n */\n static wrap(\n name: string,\n args: WrappedPersistentVolumeClaimArgs,\n opts?: ComponentResourceOptions,\n ): PersistentVolumeClaim {\n return new WrappedPersistentVolumeClaim(name, args, opts)\n }\n\n /**\n * Gets an existing PVC.\n *\n * Will throw an error if the PVC does not exist.\n */\n static get(\n name: string,\n args: ExternalPersistentVolumeClaimArgs,\n opts?: ComponentResourceOptions,\n ): PersistentVolumeClaim {\n return new ExternalPersistentVolumeClaim(name, args, opts)\n }\n\n private static readonly pvcCache = new Map<string, PersistentVolumeClaim>()\n\n /**\n * Gets an existing PVC for a given entity.\n * Prefer this method over `get` when possible.\n *\n * It automatically names the resource with the following format: `{clusterName}.{namespace}.{name}.{clusterId}`.\n *\n * This method is idempotent and will return the same instance for the same entity.\n *\n * @param entity The entity to get the PVC for.\n * @param cluster The cluster where the PVC is located.\n */\n static for(\n entity: k8s.PersistentVolumeClaim,\n cluster: Input<k8s.Cluster>,\n ): PersistentVolumeClaim {\n return getOrCreate(\n PersistentVolumeClaim.pvcCache,\n `${entity.clusterName}.${entity.metadata.namespace}.${entity.metadata.name}.${entity.clusterId}`,\n name => {\n return PersistentVolumeClaim.get(name, {\n name: entity.metadata.name,\n namespace: Namespace.forResource(entity, cluster),\n })\n },\n )\n }\n\n /**\n * Gets an existing PVC for a given entity.\n * Prefer this method over `get` when possible.\n *\n * It automatically names the resource with the following format: `{clusterName}.{namespace}.{name}.{clusterId}`.\n *\n * This method is idempotent and will return the same instance for the same entity.\n *\n * @param entity The entity to get the PVC for.\n * @param cluster The cluster where the PVC is located.\n */\n static async forAsync(\n entity: Input<k8s.PersistentVolumeClaim>,\n cluster: Input<k8s.Cluster>,\n ): Promise<PersistentVolumeClaim> {\n const resolvedEntity = await toPromise(entity)\n return PersistentVolumeClaim.for(resolvedEntity, cluster)\n }\n}\n\nclass CreatedPersistentVolumeClaim extends PersistentVolumeClaim {\n constructor(name: string, args: PersistentVolumeClaimArgs, opts?: ComponentResourceOptions) {\n const pvc = output(args.namespace).cluster.apply(cluster => {\n return new core.v1.PersistentVolumeClaim(\n name,\n {\n metadata: mapMetadata(args, name),\n spec: output(args).apply(args => {\n return deepmerge(\n {\n accessModes: [\"ReadWriteOnce\"],\n resources: {\n requests: {\n storage: args.size ?? \"100Mi\",\n },\n },\n } satisfies types.input.core.v1.PersistentVolumeClaimSpec,\n omit(args, extraPersistentVolumeClaimArgs),\n )\n }),\n },\n {\n ...opts,\n parent: this,\n provider: getProvider(cluster),\n },\n )\n })\n\n super(\n \"highstate:k8s:PersistentVolumeClaim\",\n name,\n args,\n opts,\n\n pvc.apiVersion,\n pvc.kind,\n output(args.namespace),\n pvc.metadata,\n pvc.spec,\n pvc.status,\n )\n }\n}\n\nclass PersistentVolumeClaimPatch extends PersistentVolumeClaim {\n constructor(name: string, args: PersistentVolumeClaimArgs, opts?: ComponentResourceOptions) {\n const pvc = output(args.namespace).cluster.apply(cluster => {\n return new core.v1.PersistentVolumeClaimPatch(\n name,\n {\n metadata: mapMetadata(args, name),\n spec: output(args).apply(args => {\n return deepmerge(\n {\n accessModes: [\"ReadWriteOnce\"],\n resources: {\n requests: {\n storage: args.size ?? \"100Mi\",\n },\n },\n } satisfies types.input.core.v1.PersistentVolumeClaimSpec,\n omit(args, extraPersistentVolumeClaimArgs),\n )\n }),\n },\n {\n ...opts,\n parent: this,\n provider: getProvider(cluster),\n },\n )\n })\n\n super(\n \"highstate:k8s:PersistentVolumeClaimPatch\",\n name,\n args,\n opts,\n\n pvc.apiVersion,\n pvc.kind,\n output(args.namespace),\n pvc.metadata,\n pvc.spec,\n pvc.status,\n )\n }\n}\n\nexport type WrappedPersistentVolumeClaimArgs = {\n /**\n * The underlying Kubernetes PVC to wrap.\n */\n pvc: Input<core.v1.PersistentVolumeClaim>\n\n /**\n * The namespace where the PVC is located.\n */\n namespace: Input<Namespace>\n}\n\nclass WrappedPersistentVolumeClaim extends PersistentVolumeClaim {\n constructor(\n name: string,\n args: WrappedPersistentVolumeClaimArgs,\n opts?: ComponentResourceOptions,\n ) {\n super(\n \"highstate:k8s:WrappedPersistentVolumeClaim\",\n name,\n args,\n opts,\n\n output(args.pvc).apiVersion,\n output(args.pvc).kind,\n output(args.namespace),\n output(args.pvc).metadata,\n output(args.pvc).spec,\n output(args.pvc).status,\n )\n }\n}\n\nexport type ExternalPersistentVolumeClaimArgs = {\n /**\n * The name of the PVC to get.\n */\n name: Input<string>\n\n /**\n * The namespace where the PVC is located.\n */\n namespace: Input<Namespace>\n}\n\nclass ExternalPersistentVolumeClaim extends PersistentVolumeClaim {\n constructor(\n name: string,\n args: ExternalPersistentVolumeClaimArgs,\n opts?: ComponentResourceOptions,\n ) {\n const pvc = output(args.namespace).cluster.apply(cluster => {\n return core.v1.PersistentVolumeClaim.get(\n name,\n interpolate`${output(args.namespace).metadata.name}/${args.name}`,\n { ...opts, parent: this, provider: getProvider(cluster) },\n )\n })\n\n super(\n \"highstate:k8s:ExternalPersistentVolumeClaim\",\n name,\n args,\n opts,\n\n pvc.apiVersion,\n pvc.kind,\n output(args.namespace),\n pvc.metadata,\n pvc.spec,\n pvc.status,\n )\n }\n}\n\nexport function getAutoVolumeName(workloadName: string, index: number): string {\n if (index === 0) {\n return `${workloadName}-data`\n }\n\n return `${workloadName}-data-${index}`\n}\n","import type { PartialKeys } from \"@highstate/contract\"\nimport type { k8s, network } from \"@highstate/library\"\nimport {\n type Input,\n type InputArray,\n normalize,\n type Output,\n output,\n type Unwrap,\n} from \"@highstate/pulumi\"\nimport { core, type types } from \"@pulumi/kubernetes\"\nimport { concat, map, omit } from \"remeda\"\nimport { ConfigMap } from \"./config-map\"\nimport { PersistentVolumeClaim } from \"./pvc\"\nimport { Secret } from \"./secret\"\n\nexport type Container = Omit<PartialKeys<types.input.core.v1.Container, \"name\">, \"volumeMounts\"> & {\n /**\n * The single port to add to the container.\n */\n port?: Input<types.input.core.v1.ContainerPort>\n\n /**\n * The volume mount to attach to the container.\n */\n volumeMount?: Input<ContainerVolumeMount>\n\n /**\n * The volume mounts to attach to the container.\n */\n volumeMounts?: InputArray<ContainerVolumeMount>\n\n /**\n * The volume to include in the parent workload.\n * It is like the `volumes` property, but defined at the container level.\n * It will be defined as a volume mount in the parent workload automatically.\n */\n volume?: Input<WorkloadVolume>\n\n /**\n * The volumes to include in the parent workload.\n * It is like the `volumes` property, but defined at the container level.\n * It will be defined as a volume mount in the parent workload automatically.\n */\n volumes?: InputArray<WorkloadVolume>\n\n /**\n * The map of environment variables to set in the container.\n * It is like the `env` property, but more convenient to use.\n */\n environment?: Input<ContainerEnvironment>\n\n /**\n * The source of environment variables to set in the container.\n * It is like the `envFrom` property, but more convenient to use.\n */\n environmentSource?: Input<ContainerEnvironmentSource>\n\n /**\n * The sources of environment variables to set in the container.\n * It is like the `envFrom` property, but more convenient to use.\n */\n environmentSources?: InputArray<ContainerEnvironmentSource>\n\n /**\n * The list of endpoints that the container is allowed to access.\n *\n * This is used to generate a network policy.\n */\n allowedEndpoints?: InputArray<network.L34Endpoint>\n\n /**\n * Enable the TUN device in the container.\n *\n * All necessary security context settings will be applied to the container.\n */\n enableTun?: Input<boolean>\n}\n\nconst containerExtraArgs = [\n \"port\",\n \"volumeMount\",\n \"volume\",\n \"environment\",\n \"environmentSource\",\n \"environmentSources\",\n] as const\n\nexport type ContainerEnvironment = Record<\n string,\n Input<string | undefined | null | ContainerEnvironmentVariable>\n>\n\nexport type ContainerEnvironmentVariable =\n | types.input.core.v1.EnvVarSource\n | {\n /**\n * The secret to select from.\n */\n secret: Input<core.v1.Secret | Secret>\n\n /**\n * The key of the secret to select from.\n */\n key: string\n }\n | {\n /**\n * The config map to select from.\n */\n configMap: Input<core.v1.ConfigMap>\n\n /**\n * The key of the config map to select from.\n */\n key: string\n }\n\nexport type ContainerEnvironmentSource =\n | types.input.core.v1.EnvFromSource\n | core.v1.ConfigMap\n | core.v1.Secret\n\nexport type ContainerVolumeMount =\n | types.input.core.v1.VolumeMount\n | (Omit<types.input.core.v1.VolumeMount, \"name\"> & {\n /**\n * The volume to mount.\n */\n volume: Input<WorkloadVolume>\n })\n\nexport type WorkloadVolume =\n | types.input.core.v1.Volume\n | core.v1.PersistentVolumeClaim\n | PersistentVolumeClaim\n | core.v1.ConfigMap\n | ConfigMap\n | core.v1.Secret\n | Secret\n\nexport function mapContainerToRaw(\n container: Unwrap<Container>,\n cluster: k8s.Cluster,\n fallbackName: string,\n): types.input.core.v1.Container {\n const containerName = container.name ?? fallbackName\n\n const spec = {\n ...omit(container, containerExtraArgs),\n\n name: containerName,\n ports: normalize(container.port, container.ports),\n\n volumeMounts: map(normalize(container.volumeMount, container.volumeMounts), mapVolumeMount),\n\n env: concat(\n container.environment ? mapContainerEnvironment(container.environment) : [],\n container.env ?? [],\n ),\n\n envFrom: concat(\n map(\n normalize(container.environmentSource, container.environmentSources),\n mapEnvironmentSource,\n ),\n container.envFrom ?? [],\n ),\n } as Unwrap<types.input.core.v1.Container>\n\n if (container.enableTun) {\n spec.securityContext ??= {}\n spec.securityContext.capabilities ??= {}\n spec.securityContext.capabilities.add = [\"NET_ADMIN\"]\n\n if (cluster.quirks?.tunDevicePolicy?.type === \"plugin\") {\n spec.resources ??= {}\n spec.resources.limits ??= {}\n spec.resources.limits[cluster.quirks.tunDevicePolicy.resourceName] =\n cluster.quirks.tunDevicePolicy.resourceValue\n } else {\n spec.volumeMounts ??= []\n spec.volumeMounts.push({\n name: \"tun-device\",\n mountPath: \"/dev/net/tun\",\n readOnly: false,\n })\n }\n }\n\n return spec\n}\n\nexport function mapContainerEnvironment(\n environment: Unwrap<ContainerEnvironment>,\n): types.input.core.v1.EnvVar[] {\n const envVars: types.input.core.v1.EnvVar[] = []\n\n for (const [name, value] of Object.entries(environment)) {\n if (!value) {\n continue\n }\n\n if (typeof value === \"string\") {\n envVars.push({ name, value })\n continue\n }\n\n if (\"secret\" in value) {\n envVars.push({\n name,\n valueFrom: {\n secretKeyRef: {\n name: value.secret.metadata.name,\n key: value.key,\n },\n },\n })\n continue\n }\n\n if (\"configMap\" in value) {\n envVars.push({\n name,\n valueFrom: {\n configMapKeyRef: {\n name: value.configMap.metadata.name,\n key: value.key,\n },\n },\n })\n continue\n }\n\n envVars.push({ name, valueFrom: value })\n }\n\n return envVars\n}\n\nexport function mapVolumeMount(volumeMount: ContainerVolumeMount): types.input.core.v1.VolumeMount {\n if (\"volume\" in volumeMount) {\n return omit(\n {\n ...volumeMount,\n name: output(volumeMount.volume)\n .apply(mapWorkloadVolume)\n .apply(volume => output(volume.name)),\n },\n [\"volume\"],\n )\n }\n\n return {\n ...volumeMount,\n name: volumeMount.name,\n }\n}\n\nexport function mapEnvironmentSource(\n envFrom: ContainerEnvironmentSource,\n): types.input.core.v1.EnvFromSource {\n if (envFrom instanceof core.v1.ConfigMap) {\n return {\n configMapRef: {\n name: envFrom.metadata.name,\n },\n }\n }\n\n if (envFrom instanceof core.v1.Secret) {\n return {\n secretRef: {\n name: envFrom.metadata.name,\n },\n }\n }\n\n return envFrom\n}\n\nexport function mapWorkloadVolume(volume: WorkloadVolume) {\n if (volume instanceof PersistentVolumeClaim) {\n return {\n name: volume.metadata.name,\n persistentVolumeClaim: {\n claimName: volume.metadata.name,\n },\n }\n }\n\n if (volume instanceof Secret) {\n return {\n name: volume.metadata.name,\n secret: {\n secretName: volume.metadata.name,\n },\n }\n }\n\n if (volume instanceof ConfigMap) {\n return {\n name: volume.metadata.name,\n configMap: {\n name: volume.metadata.name,\n },\n }\n }\n\n if (core.v1.PersistentVolumeClaim.isInstance(volume)) {\n return {\n name: volume.metadata.name,\n persistentVolumeClaim: {\n claimName: volume.metadata.name,\n },\n }\n }\n\n if (core.v1.ConfigMap.isInstance(volume)) {\n return {\n name: volume.metadata.name,\n configMap: {\n name: volume.metadata.name,\n },\n }\n }\n\n if (core.v1.Secret.isInstance(volume)) {\n return {\n name: volume.metadata.name,\n secret: {\n secretName: volume.metadata.name,\n },\n }\n }\n\n return volume\n}\n\nexport function getWorkloadVolumeResourceUuid(volume: WorkloadVolume): Output<string | undefined> {\n if (volume instanceof PersistentVolumeClaim) {\n return volume.metadata.uid\n }\n\n if (volume instanceof Secret) {\n return volume.metadata.uid\n }\n\n if (volume instanceof ConfigMap) {\n return volume.metadata.uid\n }\n\n if (core.v1.PersistentVolumeClaim.isInstance(volume)) {\n return volume.metadata.uid\n }\n\n if (core.v1.ConfigMap.isInstance(volume)) {\n return volume.metadata.uid\n }\n\n if (core.v1.Secret.isInstance(volume)) {\n return volume.metadata.uid\n }\n\n return output(undefined)\n}\n","import type { k8s, network } from \"@highstate/library\"\nimport { filterEndpoints } from \"@highstate/common\"\nimport { isEndpointFromCluster } from \"./service\"\n\nexport function getBestEndpoint<TEndpoint extends network.L34Endpoint>(\n endpoints: TEndpoint[],\n cluster?: k8s.Cluster,\n): TEndpoint | undefined {\n if (!endpoints.length) {\n return undefined\n }\n\n if (endpoints.length === 1) {\n return endpoints[0]\n }\n\n if (!cluster) {\n return filterEndpoints(endpoints)[0]\n }\n\n const clusterEndpoint = endpoints.find(endpoint => isEndpointFromCluster(endpoint, cluster))\n\n if (clusterEndpoint) {\n return clusterEndpoint\n }\n\n return filterEndpoints(endpoints)[0]\n}\n\nexport function requireBestEndpoint<TEndpoint extends network.L34Endpoint>(\n endpoints: TEndpoint[],\n cluster: k8s.Cluster,\n): TEndpoint {\n const endpoint = getBestEndpoint(endpoints, cluster)\n\n if (!endpoint) {\n throw new Error(`No best endpoint found for cluster \"${cluster.name}\" (${cluster.id})`)\n }\n\n return endpoint\n}\n","import type { k8s, network } from \"@highstate/library\"\nimport type { Namespace } from \"./namespace\"\nimport {\n ImplementationMediator,\n type InputL34Endpoint,\n l3EndpointToCidr,\n l34EndpointToString,\n parseL34Endpoint,\n} from \"@highstate/common\"\nimport { z } from \"@highstate/contract\"\nimport {\n ComponentResource,\n type Input,\n type InputArray,\n interpolate,\n normalize,\n type Output,\n output,\n type Resource,\n type ResourceOptions,\n toPromise,\n type Unwrap,\n} from \"@highstate/pulumi\"\nimport { type core, networking, type types } from \"@pulumi/kubernetes\"\nimport { flat, groupBy, merge, mergeDeep, uniqueBy } from \"remeda\"\nimport { requireBestEndpoint } from \"./network\"\nimport { isEndpointFromCluster, mapServiceToLabelSelector } from \"./service\"\nimport {\n getNamespaceName,\n getProviderAsync,\n mapMetadata,\n mapNamespaceNameToSelector,\n mapSelectorLikeToSelector,\n type NamespaceLike,\n type ScopedResourceArgs,\n type SelectorLike,\n} from \"./shared\"\n\nexport type NetworkPolicyPort = {\n /**\n * The protocol to match.\n *\n * If not provided, \"TCP\" will be used.\n */\n protocol?: string\n} & (\n | {\n /**\n * The single port to match.\n */\n port: number | string\n }\n | {\n /**\n * The range of ports to match.\n */\n range: [start: number, end: number]\n }\n)\n\nexport type IngressRuleArgs = {\n /**\n * Whether to allow all incoming traffic.\n *\n * If set to `true`, all other rules will be ignored for matched traffic.\n */\n fromAll?: Input<boolean>\n\n /**\n * The allowed cidr for incoming traffic.\n *\n * Will be ORed with other conditions inside the same rule (except ports).\n */\n fromCidr?: Input<string>\n\n /**\n * The list of allowed cidrs for incoming traffic.\n *\n * Will be ORed with other conditions inside the same rule (except ports).\n */\n fromCidrs?: InputArray<string>\n\n /**\n * The list of allowed L3 or L4 endpoints for outgoing traffic.\n *\n * Just a syntactic sugar for `fromFqdn` and `fromService` for cases when the endpoint can be one of them + optional port/protocol.\n *\n * Will be ORed with other conditions inside the same rule (except ports).\n *\n * If a single endpoint also has a port/protocol/service metadata,\n * it will produce separate rule for it with them and ORed with the rest of the rules.\n */\n fromEndpoint?: Input<InputL34Endpoint>\n\n /**\n * The list of allowed L3 or L4 endpoints for incoming traffic.\n *\n * Just a syntactic sugar for `fromFqdn` and `fromService` for cases when the endpoint can be one of them + optional port/protocol.\n *\n * Will be ORed with other conditions inside the same rule (except ports).\n *\n * If a single endpoint also has a port/protocol/service metadata,\n * it will produce separate rule for it with them and ORed with the rest of the rules.\n */\n fromEndpoints?: InputArray<InputL34Endpoint>\n\n /**\n * The service to allow traffic from.\n *\n * Will be ORed with other conditions inside the same rule (except ports).\n */\n fromService?: Input<core.v1.Service>\n\n /**\n * The list of allowed services for incoming traffic.\n *\n * Will be ORed with other conditions inside the same rule (except ports).\n */\n fromServices?: InputArray<core.v1.Service>\n\n /**\n * The namespace to allow traffic from.\n *\n * If provided with `fromSelector(s)`, it will be ANDed with them.\n * Otherwise, it will match all pods in the namespace.\n *\n * Will be ORed with other conditions inside the same rule (except ports and selectors).\n */\n fromNamespace?: Input<NamespaceLike>\n\n /**\n * The list of allowed namespaces for incoming traffic.\n *\n * If provided with `fromSelector(s)`, it will be ANDed with them.\n * Otherwise, it will match all pods in the namespaces.\n *\n * Will be ORed with other conditions inside the same rule (except ports and selectors).\n */\n fromNamespaces?: InputArray<NamespaceLike>\n\n /**\n * The selector for incoming traffic.\n *\n * If provided with `fromNamespace(s)`, it will be ANDed with them.\n * Otherwise, it will match pods in all namespaces.\n *\n * Will be ORed with other conditions inside the same rule (except ports and namespaces).\n */\n fromSelector?: Input<SelectorLike>\n\n /**\n * The list of selectors for incoming traffic.\n *\n * If provided with `fromNamespace(s)`, it will be ANDed with them.\n * Otherwise, it will match pods in all namespaces.\n *\n * Will be ORed with other conditions inside the same rule (except ports and namespaces).\n */\n fromSelectors?: InputArray<SelectorLike>\n\n /**\n * The port to allow incoming traffic on.\n *\n * Will be ANDed with all conditions inside the same rule.\n */\n toPort?: Input<NetworkPolicyPort>\n\n /**\n * The list of allowed ports for incoming traffic.\n *\n * Will be ANDed with all conditions inside the same rule.\n */\n toPorts?: InputArray<NetworkPolicyPort>\n}\n\nexport type EgressRuleArgs = {\n /**\n * Whether to allow all outgoing traffic.\n *\n * If set to `true`, all other rules will be ignored for matched traffic.\n */\n toAll?: Input<boolean>\n\n /**\n * The allowed cidr for outgoing traffic.\n *\n * Will be ORed with other conditions inside the same rule (except ports).\n */\n toCidr?: Input<string>\n\n /**\n * The list of allowed cidrs for outgoing traffic.\n *\n * Will be ORed with other conditions inside the same rule (except ports).\n */\n toCidrs?: InputArray<string>\n\n /**\n * The FQDN to allow outgoing traffic.\n *\n * Will be ORed with other conditions inside the same rule (except ports).\n */\n toFqdn?: Input<string>\n\n /**\n * The list of allowed FQDNs for outgoing traffic.\n *\n * Will be ORed with other conditions inside the same rule (except ports).\n */\n toFqdns?: InputArray<string>\n\n /**\n * The L3 or L4 endpoint to allow outgoing traffic.\n *\n * Just a syntactic sugar for `toFqdn`, `toCidr` and `toService` for cases when the endpoint can be one of them + optional port/protocol.\n *\n * Will be ORed with other conditions inside the same rule (except ports).\n *\n * If a single endpoint also has a port/protocol/service metadata,\n * it will produce separate rule for it with them and ORed with the rest of the rules.\n */\n toEndpoint?: Input<InputL34Endpoint>\n\n /**\n * The list of allowed L3 or L4 endpoints for outgoing traffic.\n *\n * Just a syntactic sugar for `toFqdn`, `toCidr` and `toService` for cases when the endpoint can be one of them + optional port/protocol.\n *\n * Will be ORed with other conditions inside the same rule (except ports).\n *\n * If a single endpoint also has a port/protocol/service metadata,\n * it will produce separate rule for it with them and ORed with the rest of the rules.\n */\n toEndpoints?: InputArray<InputL34Endpoint>\n\n /**\n * The service to allow traffic to.\n *\n * Will be ORed with other conditions inside the same rule (except ports).\n */\n toService?: Input<core.v1.Service>\n\n /**\n * The list of allowed services for outgoing traffic.\n *\n * Will be ORed with other conditions inside the same rule (except ports).\n */\n toServices?: InputArray<core.v1.Service>\n\n /**\n * The namespace to allow traffic to.\n *\n * If provided with `toSelector(s)`, it will be ANDed with them.\n * Otherwise, it will match all pods in the namespace.\n *\n * Will be ORed with other conditions inside the same rule (except ports and selectors).\n */\n toNamespace?: Input<NamespaceLike>\n\n /**\n * The list of allowed namespaces for outgoing traffic.\n *\n * If provided with `toSelector(s)`, it will be ANDed with them.\n * Otherwise, it will match all pods in the namespaces.\n *\n * Will be ORed with other conditions inside the same rule (except ports and selectors).\n */\n toNamespaces?: InputArray<NamespaceLike>\n\n /**\n * The selector for outgoing traffic.\n *\n * If provided with `toNamespace(s)`, it will be ANDe with them.\n *\n * Otherwise, it will match pods only in all namespaces.\n */\n toSelector?: Input<SelectorLike>\n\n /**\n * The list of selectors for outgoing traffic.\n *\n * If provided with `toNamespace(s)`, it will be ANDed with them.\n * Otherwise, it will match pods only in all namespaces.\n */\n toSelectors?: InputArray<SelectorLike>\n\n /**\n * The port to allow outgoing traffic on.\n *\n * Will be ANDed with all conditions inside the same rule.\n */\n toPort?: Input<NetworkPolicyPort>\n\n /**\n * The list of allowed ports for outgoing traffic.\n *\n * Will be ANDed with all conditions inside the same rule.\n */\n toPorts?: InputArray<NetworkPolicyPort>\n}\n\nexport type NetworkPolicyArgs = ScopedResourceArgs & {\n /**\n * The description of this network policy.\n */\n description?: Input<string>\n\n /**\n * The pod selector for this network policy.\n * If not provided, it will select all pods in the namespace.\n */\n selector?: SelectorLike\n\n /**\n * The rule for incoming traffic.\n */\n ingressRule?: Input<IngressRuleArgs>\n\n /**\n * The rules for incoming traffic.\n */\n ingressRules?: InputArray<IngressRuleArgs>\n\n /**\n * The rule for outgoing traffic.\n */\n egressRule?: Input<EgressRuleArgs>\n\n /**\n * The rules for outgoing traffic.\n */\n egressRules?: InputArray<EgressRuleArgs>\n\n /**\n * Enable the isolation of ingress traffic, so that only matched traffic can ingress.\n */\n isolateIngress?: Input<boolean>\n\n /**\n * Enable the isolation of egress traffic, so that only matched traffic can egress.\n */\n isolateEgress?: Input<boolean>\n\n /**\n * Allow the eggress traffic to the API server of the cluster.\n *\n * By default, `false`.\n */\n allowKubeApiServer?: Input<boolean>\n\n /**\n * Allow the eggress traffic to the DNS server of the cluster.\n *\n * By default, `false`.\n */\n allowKubeDns?: Input<boolean>\n}\n\nexport type NormalizedRuleArgs = {\n all: boolean\n cidrs: string[]\n fqdns: string[]\n services: core.v1.Service[]\n namespaces: NamespaceLike[]\n selectors: SelectorLike[]\n ports: NetworkPolicyPort[]\n}\n\nexport type NormalizedNetworkPolicyArgs = Omit<\n Unwrap<NetworkPolicyArgs>,\n | \"podSelector\"\n | \"ingressRule\"\n | \"ingressRules\"\n | \"egressRule\"\n | \"egressRules\"\n | \"isolateIngress\"\n | \"isolateEgress\"\n | \"allowKubeApiServer\"\n | \"allowKubeDNS\"\n> & {\n cluster: k8s.Cluster\n podSelector: Unwrap<types.input.meta.v1.LabelSelector>\n\n isolateIngress: boolean\n isolateEgress: boolean\n\n allowKubeApiServer: boolean\n\n ingressRules: NormalizedRuleArgs[]\n egressRules: NormalizedRuleArgs[]\n}\n\nexport const networkPolicyMediator = new ImplementationMediator(\n \"network-policy\",\n z.object({ name: z.string(), args: z.custom<NormalizedNetworkPolicyArgs>() }),\n z.instanceof(ComponentResource),\n)\n\n/**\n * The resource for creating network policies.\n * Will use different resources depending on the cluster configuration.\n *\n * Note: In the worst case, it will create native `NetworkPolicy` resources and ignore some features like L7 rules.\n */\nexport class NetworkPolicy extends ComponentResource {\n /**\n * The underlying network policy resource.\n */\n public readonly networkPolicy: Output<Resource>\n\n constructor(name: string, args: NetworkPolicyArgs, opts?: ResourceOptions) {\n super(\"k8s:network-policy\", name, args, opts)\n\n const normalizedArgs = output(args).apply(async args => {\n const ingressRules = normalize(args.ingressRule, args.ingressRules)\n const egressRules = normalize(args.egressRule, args.egressRules)\n const cluster = await toPromise(args.namespace.cluster)\n\n const extraEgressRules: NormalizedRuleArgs[] = []\n\n if (args.allowKubeDns) {\n extraEgressRules.push({\n namespaces: [\"kube-system\"],\n selectors: [{ matchLabels: { \"k8s-app\": \"kube-dns\" } }],\n ports: [{ port: 53, protocol: \"UDP\" }],\n all: false,\n cidrs: [],\n fqdns: [],\n services: [],\n })\n }\n\n return {\n ...args,\n\n podSelector: args.selector ? mapSelectorLikeToSelector(args.selector) : {},\n cluster,\n\n isolateEgress: args.isolateEgress ?? false,\n isolateIngress: args.isolateIngress ?? false,\n\n allowKubeApiServer: args.allowKubeApiServer ?? false,\n\n ingressRules: ingressRules.flatMap(rule => {\n const endpoints = normalize(rule?.fromEndpoint, rule?.fromEndpoints)\n const parsedEndpoints = endpoints.map(parseL34Endpoint)\n\n const endpointsNamespaces = groupBy(parsedEndpoints, endpoint => {\n const namespace = isEndpointFromCluster(endpoint, cluster)\n ? endpoint.metadata[\"k8s.service\"].namespace\n : \"\"\n\n return namespace\n })\n\n const l3OnlyRule = endpointsNamespaces[\"\"]\n ? NetworkPolicy.getRuleFromEndpoint(undefined, endpointsNamespaces[\"\"], cluster)\n : undefined\n\n const otherRules = Object.entries(endpointsNamespaces)\n .filter(([key]) => key !== \"\")\n .map(([, endpoints]) => {\n return NetworkPolicy.getRuleFromEndpoint(undefined, endpoints, cluster)\n })\n\n return [\n {\n all: rule.fromAll ?? false,\n cidrs: normalize(rule.fromCidr, rule.fromCidrs).concat(l3OnlyRule?.cidrs ?? []),\n fqdns: [],\n services: normalize(rule.fromService, rule.fromServices),\n namespaces: normalize(rule.fromNamespace, rule.fromNamespaces),\n selectors: normalize(rule.fromSelector, rule.fromSelectors),\n ports: normalize(rule.toPort, rule.toPorts),\n } as NormalizedRuleArgs,\n\n ...otherRules,\n ].filter(rule => !NetworkPolicy.isEmptyRule(rule))\n }),\n\n egressRules: egressRules\n .flatMap(rule => {\n const endpoints = normalize(rule?.toEndpoint, rule?.toEndpoints)\n const parsedEndpoints = endpoints.map(parseL34Endpoint)\n\n const endpointsByPortsAnsNamespaces = groupBy(parsedEndpoints, endpoint => {\n const namespace = isEndpointFromCluster(endpoint, cluster)\n ? endpoint.metadata[\"k8s.service\"].namespace\n : \"\"\n\n const port = isEndpointFromCluster(endpoint, cluster)\n ? endpoint.metadata[\"k8s.service\"].targetPort\n : endpoint.port\n\n return `${port ?? \"0\"}:${namespace}`\n })\n\n const l3OnlyRule = endpointsByPortsAnsNamespaces[\"0:\"]\n ? NetworkPolicy.getRuleFromEndpoint(\n undefined,\n endpointsByPortsAnsNamespaces[\"0:\"],\n cluster,\n )\n : undefined\n\n const otherRules = Object.entries(endpointsByPortsAnsNamespaces)\n .filter(([key]) => key !== \"0:\")\n .map(([key, endpoints]) => {\n const [port] = key.split(\":\")\n const portNumber = parseInt(port, 10)\n const portValue = Number.isNaN(portNumber) ? port : portNumber\n\n return NetworkPolicy.getRuleFromEndpoint(portValue, endpoints, cluster)\n })\n\n return [\n {\n all: rule.toAll ?? false,\n cidrs: normalize(rule.toCidr, rule.toCidrs).concat(l3OnlyRule?.cidrs ?? []),\n fqdns: normalize(rule.toFqdn, rule.toFqdns).concat(l3OnlyRule?.fqdns ?? []),\n services: normalize(rule.toService, rule.toServices),\n namespaces: normalize(rule.toNamespace, rule.toNamespaces),\n selectors: normalize(rule.toSelector, rule.toSelectors),\n ports: normalize(rule.toPort, rule.toPorts),\n } as NormalizedRuleArgs,\n\n ...otherRules,\n ].filter(rule => !NetworkPolicy.isEmptyRule(rule))\n })\n .concat(extraEgressRules),\n }\n })\n\n this.networkPolicy = output(\n normalizedArgs.apply(async args => {\n const cluster = args.cluster\n\n // Check if cluster has a custom network policy implementation\n if (cluster.networkPolicyImplRef) {\n return networkPolicyMediator.call(cluster.networkPolicyImplRef, {\n name,\n args: args as NormalizedNetworkPolicyArgs,\n })\n }\n\n // Fallback to native network policy\n const nativePolicy = new NativeNetworkPolicy(name, args as NormalizedNetworkPolicyArgs, {\n ...opts,\n parent: this,\n provider: await getProviderAsync(output(args.namespace).cluster),\n })\n return nativePolicy.networkPolicy\n }),\n )\n }\n\n private static mapCidrFromEndpoint(\n this: void,\n result: network.L3Endpoint & { type: \"ipv4\" | \"ipv6\" },\n ): string {\n if (result.type === \"ipv4\") {\n return `${result.address}/32`\n }\n\n return `${result.address}/128`\n }\n\n private static getRuleFromEndpoint(\n port: number | string | undefined,\n endpoints: network.L34Endpoint[],\n cluster: k8s.Cluster,\n ): NormalizedRuleArgs {\n const ports: NetworkPolicyPort[] = port\n ? [{ port, protocol: endpoints[0].protocol?.toUpperCase() }]\n : []\n\n const cidrs = endpoints\n .filter(endpoint => !isEndpointFromCluster(endpoint, cluster))\n .filter(endpoint => endpoint.type === \"ipv4\" || endpoint.type === \"ipv6\")\n .map(NetworkPolicy.mapCidrFromEndpoint)\n\n const fqdns = endpoints\n .filter(endpoint => endpoint.type === \"hostname\")\n .map(endpoint => endpoint.hostname)\n\n const selectors = endpoints\n .filter(endpoint => isEndpointFromCluster(endpoint, cluster))\n .map(endpoint => endpoint.metadata[\"k8s.service\"].selector)\n\n const namespace = endpoints\n .filter(endpoint => isEndpointFromCluster(endpoint, cluster))\n .map(endpoint => endpoint.metadata[\"k8s.service\"].namespace)[0]\n\n return {\n all: false,\n cidrs,\n fqdns,\n services: [],\n namespaces: namespace ? [namespace] : [],\n selectors,\n ports,\n }\n }\n\n private static isEmptyRule(rule: NormalizedRuleArgs): boolean {\n return (\n !rule.all &&\n rule.cidrs.length === 0 &&\n rule.fqdns.length === 0 &&\n rule.services.length === 0 &&\n rule.namespaces.length === 0 &&\n rule.selectors.length === 0 &&\n rule.ports.length === 0\n )\n }\n\n /**\n * Creates network policy to isolate the namespace by denying all traffic to/from it.\n *\n * Automatically names the policy as: `isolate-namespace.{clusterName}.{namespace}.{clusterId}`.\n *\n * @param namespace The namespace to isolate.\n * @param opts Optional resource options.\n */\n static async isolateNamespace(\n namespace: Input<Namespace>,\n opts?: ResourceOptions,\n ): Promise<NetworkPolicy> {\n const name = await toPromise(output(namespace).metadata.name)\n const cluster = await toPromise(output(namespace).cluster)\n\n return new NetworkPolicy(\n `isolate-namespace.${cluster.name}.${name}.${cluster.id}`,\n {\n namespace,\n\n description: \"By default, deny all traffic to/from the namespace.\",\n\n isolateEgress: true,\n isolateIngress: true,\n },\n opts,\n )\n }\n\n /**\n * Creates network policy to allow all traffic inside the namespace (pod to pod within same namespace).\n *\n * Automatically names the policy as: `allow-inside-namespace.{clusterName}.{namespace}.{clusterId}`.\n *\n * @param namespace The namespace to create the policy in.\n * @param opts Optional resource options.\n */\n static async allowInsideNamespace(\n namespace: Input<Namespace>,\n opts?: ResourceOptions,\n ): Promise<NetworkPolicy> {\n const nsName = await toPromise(output(namespace).metadata.name)\n const cluster = await toPromise(output(namespace).cluster)\n\n return new NetworkPolicy(\n `allow-inside-namespace.${cluster.name}.${nsName}.${cluster.id}`,\n {\n namespace,\n description: \"Allow all traffic inside the namespace.\",\n ingressRule: { fromNamespace: namespace },\n egressRule: { toNamespace: namespace },\n },\n opts,\n )\n }\n\n /**\n * Creates network policy to allow traffic from the namespace to the Kubernetes API server.\n *\n * Automatically names the policy as: `allow-kube-api-server.{clusterName}.{namespace}.{clusterId}`.\n *\n * @param namespace The namespace to create the policy in.\n * @param opts Optional resource options.\n */\n static async allowKubeApiServer(\n namespace: Input<Namespace>,\n opts?: ResourceOptions,\n ): Promise<NetworkPolicy> {\n const nsName = await toPromise(output(namespace).metadata.name)\n const cluster = await toPromise(output(namespace).cluster)\n\n return new NetworkPolicy(\n `allow-kube-api-server.${cluster.name}.${nsName}.${cluster.id}`,\n {\n namespace,\n description: \"Allow all traffic to the Kubernetes API server from the namespace.\",\n allowKubeApiServer: true,\n },\n opts,\n )\n }\n\n /**\n * Creates network policy to allow egress DNS traffic (UDP 53) required for name resolution.\n *\n * Automatically names the policy as: `allow-kube-dns.{clusterName}.{namespace}.{clusterId}`.\n *\n * @param namespace The namespace to create the policy in.\n * @param opts Optional resource options.\n */\n static async allowKubeDns(\n namespace: Input<Namespace>,\n opts?: ResourceOptions,\n ): Promise<NetworkPolicy> {\n const nsName = await toPromise(output(namespace).metadata.name)\n const cluster = await toPromise(output(namespace).cluster)\n\n return new NetworkPolicy(\n `allow-kube-dns.${cluster.name}.${nsName}.${cluster.id}`,\n {\n namespace,\n description: \"Allow all traffic to the Kubernetes DNS server from the namespace.\",\n allowKubeDns: true,\n },\n opts,\n )\n }\n\n /**\n * Creates network policy to allow all egress traffic from the namespace.\n *\n * Automatically names the policy as: `allow-all-egress.{clusterName}.{namespace}.{clusterId}`.\n *\n * @param namespace The namespace to create the policy in.\n * @param opts Optional resource options.\n */\n static async allowAllEgress(\n namespace: Input<Namespace>,\n opts?: ResourceOptions,\n ): Promise<NetworkPolicy> {\n const nsName = await toPromise(output(namespace).metadata.name)\n const cluster = await toPromise(output(namespace).cluster)\n\n return new NetworkPolicy(\n `allow-all-egress.${cluster.name}.${nsName}.${cluster.id}`,\n {\n namespace,\n description: \"Allow all egress traffic from the namespace.\",\n egressRule: { toAll: true },\n },\n opts,\n )\n }\n\n /**\n * Creates network policy to allow all ingress traffic to the namespace.\n *\n * Automatically names the policy as: `allow-all-ingress.{clusterName}.{namespace}.{clusterId}`.\n *\n * @param namespace The namespace to create the policy in.\n * @param opts Optional resource options.\n */\n static async allowAllIngress(\n namespace: Input<Namespace>,\n opts?: ResourceOptions,\n ): Promise<NetworkPolicy> {\n const nsName = await toPromise(output(namespace).metadata.name)\n const cluster = await toPromise(output(namespace).cluster)\n return new NetworkPolicy(\n `allow-all-ingress.${cluster.name}.${nsName}.${cluster.id}`,\n {\n namespace,\n description: \"Allow all ingress traffic to the namespace.\",\n ingressRule: { fromAll: true },\n },\n opts,\n )\n }\n\n /**\n * Creates network policy to allow egress traffic to a specific L3/L4 endpoint.\n *\n * Automatically names the policy as: `allow-egress-to-<endpoint>.{clusterName}.{namespace}.{clusterId}`.\n *\n * @param namespace The namespace to create the policy in.\n * @param endpoint The endpoint to allow egress to.\n * @param opts Optional resource options.\n */\n static async allowEgressToEndpoint(\n namespace: Input<Namespace>,\n endpoint: InputL34Endpoint,\n opts?: ResourceOptions,\n ): Promise<NetworkPolicy> {\n const parsedEndpoint = parseL34Endpoint(endpoint)\n const endpointStr = l34EndpointToString(parsedEndpoint).replace(/:/g, \"-\")\n const nsName = await toPromise(output(namespace).metadata.name)\n const cluster = await toPromise(output(namespace).cluster)\n\n return new NetworkPolicy(\n `allow-egress-to-${endpointStr}.${cluster.name}.${nsName}.${cluster.id}`,\n {\n namespace,\n description: `Allow egress traffic to \"${l34EndpointToString(parsedEndpoint)}\" from the namespace.`,\n egressRule: { toEndpoint: endpoint },\n },\n opts,\n )\n }\n\n /**\n * Creates network policy to allow egress traffic to the best endpoint among provided candidates.\n *\n * Automatically names the policy as: `allow-egress-to-<bestEndpoint>.{clusterName}.{namespace}.{clusterId}`.\n *\n * @param namespace The namespace to create the policy in.\n * @param endpoints The candidate endpoints to select from.\n * @param opts Optional resource options.\n */\n static async allowEgressToBestEndpoint(\n namespace: Input<Namespace>,\n endpoints: InputArray<InputL34Endpoint>,\n opts?: ResourceOptions,\n ): Promise<NetworkPolicy> {\n const cluster = await toPromise(output(namespace).cluster)\n const resolvedEndpoints = await toPromise(output(endpoints))\n const bestEndpoint = requireBestEndpoint(resolvedEndpoints.map(parseL34Endpoint), cluster)\n\n return await NetworkPolicy.allowEgressToEndpoint(namespace, bestEndpoint, opts)\n }\n\n /**\n * Creates network policy to allow ingress traffic from a specific L3/L4 endpoint.\n *\n * Automatically names the policy as: `allow-ingress-from-<endpoint>.{clusterName}.{namespace}.{clusterId}`.\n *\n * @param namespace The namespace to create the policy in.\n * @param endpoint The endpoint to allow ingress from.\n * @param opts Optional resource options.\n */\n static async allowIngressFromEndpoint(\n namespace: Input<Namespace>,\n endpoint: InputL34Endpoint,\n opts?: ResourceOptions,\n ): Promise<NetworkPolicy> {\n const parsedEndpoint = parseL34Endpoint(endpoint)\n const endpointStr = l34EndpointToString(parsedEndpoint).replace(/:/g, \"-\")\n const nsName = await toPromise(output(namespace).metadata.name)\n const cluster = await toPromise(output(namespace).cluster)\n\n return new NetworkPolicy(\n `allow-ingress-from-${endpointStr}.${cluster.name}.${nsName}.${cluster.id}`,\n {\n namespace,\n description: interpolate`Allow ingress traffic from \"${l34EndpointToString(parsedEndpoint)}\" to the namespace.`,\n ingressRule: { fromEndpoint: endpoint },\n },\n opts,\n )\n }\n}\n\nexport class NativeNetworkPolicy extends ComponentResource {\n /**\n * The underlying native network policy resource.\n */\n public readonly networkPolicy: Resource\n\n constructor(name: string, args: NormalizedNetworkPolicyArgs, opts?: ResourceOptions) {\n super(\"k8s:native-network-policy\", name, args, opts)\n\n const ingress = NativeNetworkPolicy.createIngressRules(args)\n const egress = NativeNetworkPolicy.createEgressRules(args)\n\n const policyTypes: string[] = []\n\n if (ingress.length > 0 || args.isolateIngress) {\n policyTypes.push(\"Ingress\")\n }\n\n if (egress.length > 0 || args.isolateEgress) {\n policyTypes.push(\"Egress\")\n }\n\n this.networkPolicy = new networking.v1.NetworkPolicy(\n name,\n {\n metadata: mergeDeep(mapMetadata(args, name), {\n annotations: args.description\n ? { \"kubernetes.io/description\": args.description }\n : undefined,\n }),\n spec: {\n podSelector: args.podSelector,\n ingress,\n egress,\n policyTypes,\n },\n },\n { ...opts, parent: this },\n )\n }\n\n private static fallbackIpBlock: types.input.networking.v1.IPBlock = {\n cidr: \"0.0.0.0/0\",\n except: [\"10.0.0.0/8\", \"172.16.0.0/12\", \"192.168.0.0/16\"],\n }\n\n private static fallbackDnsRule: types.input.networking.v1.NetworkPolicyEgressRule = {\n to: [\n {\n namespaceSelector: { matchLabels: { \"kubernetes.io/metadata.name\": \"kube-system\" } },\n podSelector: { matchLabels: { \"k8s-app\": \"kube-dns\" } },\n },\n ],\n ports: [{ port: 53, protocol: \"UDP\" }],\n }\n\n private static createIngressRules(\n args: NormalizedNetworkPolicyArgs,\n ): types.input.networking.v1.NetworkPolicyIngressRule[] {\n return uniqueBy(\n args.ingressRules.map(rule => ({\n from: rule.all ? [] : NativeNetworkPolicy.createRulePeers(rule),\n ports: NativeNetworkPolicy.mapPorts(rule.ports),\n })),\n rule => JSON.stringify(rule),\n )\n }\n\n private static createEgressRules(\n args: NormalizedNetworkPolicyArgs,\n ): types.input.networking.v1.NetworkPolicyEgressRule[] {\n const extraRules: types.input.networking.v1.NetworkPolicyEgressRule[] = []\n\n const needKubeDns = args.egressRules.some(rule => rule.fqdns.length > 0)\n if (needKubeDns) {\n extraRules.push(NativeNetworkPolicy.fallbackDnsRule)\n }\n\n // the native resource does not support FQDNs\n // to provide compatibility, we need to fallback to all except private CIDRs\n const needFallback = args.egressRules.some(rule =>\n rule.fqdns.some(fqdn => !fqdn.endsWith(\".cluster.local\")),\n )\n if (needFallback) {\n extraRules.push({ to: [{ ipBlock: NativeNetworkPolicy.fallbackIpBlock }] })\n }\n\n // apply fallback rules for kube-apiserver\n if (args.allowKubeApiServer) {\n const { quirks, apiEndpoints } = args.cluster\n\n if (quirks?.fallbackKubeApiAccess) {\n extraRules.push({\n to: [{ ipBlock: { cidr: `${quirks?.fallbackKubeApiAccess.serverIp}/32` } }],\n ports: [{ port: quirks?.fallbackKubeApiAccess.serverPort, protocol: \"TCP\" }],\n })\n } else {\n const rules = apiEndpoints\n .filter(endpoint => endpoint.type !== \"hostname\")\n .map(endpoint => ({\n to: [{ ipBlock: { cidr: l3EndpointToCidr(endpoint) } }],\n ports: [{ port: endpoint.port, protocol: \"TCP\" }],\n }))\n\n extraRules.push(...rules)\n }\n }\n\n return uniqueBy(\n args.egressRules\n .map(rule => {\n return {\n to: rule.all ? [] : NativeNetworkPolicy.createRulePeers(rule),\n ports: NativeNetworkPolicy.mapPorts(rule.ports),\n } as types.input.networking.v1.NetworkPolicyEgressRule\n })\n .filter(rule => rule.to !== undefined)\n .concat(extraRules),\n rule => JSON.stringify(rule),\n )\n }\n\n private static createRulePeers(\n this: void,\n args: NormalizedRuleArgs,\n ): types.input.networking.v1.NetworkPolicyPeer[] | undefined {\n const peers = uniqueBy(\n [\n ...NativeNetworkPolicy.createCidrPeers(args),\n ...NativeNetworkPolicy.createServicePeers(args),\n ...NativeNetworkPolicy.createSelectorPeers(args),\n ],\n peer => JSON.stringify(peer),\n )\n\n return peers.length > 0 ? peers : undefined\n }\n\n private static createCidrPeers(\n args: NormalizedRuleArgs,\n ): types.input.networking.v1.NetworkPolicyPeer[] {\n return args.cidrs.map(cidr => ({ ipBlock: { cidr } }))\n }\n\n private static createServicePeers(\n args: NormalizedRuleArgs,\n ): types.input.networking.v1.NetworkPolicyPeer[] {\n return args.services.map(service => {\n const selector = mapServiceToLabelSelector(service)\n\n return {\n namespaceSelector: mapNamespaceNameToSelector(service.metadata.namespace),\n podSelector: selector,\n }\n })\n }\n\n private static createSelectorPeers(\n args: NormalizedRuleArgs,\n ): types.input.networking.v1.NetworkPolicyPeer[] {\n const selectorPeers = args.selectors.map(selector => ({\n podSelector: mapSelectorLikeToSelector(selector),\n }))\n\n const namespacePeers = args.namespaces.map(NativeNetworkPolicy.createNamespacePeer)\n\n if (namespacePeers.length === 0) {\n // if there are no namespaces, we can just return selector peers\n return selectorPeers\n }\n\n if (selectorPeers.length === 0) {\n // if there are no selectors, we can just return namespace peers\n return namespacePeers\n }\n\n // if there are both, we need to create a cartesian product\n return flat(\n selectorPeers.map(selectorPeer => {\n return namespacePeers.map(namespacePeer => merge(selectorPeer, namespacePeer))\n }),\n )\n }\n\n private static createNamespacePeer(\n this: void,\n namespace: NamespaceLike,\n ): types.input.networking.v1.NetworkPolicyPeer {\n const namespaceName = getNamespaceName(namespace)\n const namespaceSelector = mapNamespaceNameToSelector(namespaceName)\n\n return { namespaceSelector }\n }\n\n private static mapPorts(\n ports: NetworkPolicyPort[],\n ): types.input.networking.v1.NetworkPolicyPort[] {\n return ports.map(port => {\n if (\"port\" in port) {\n return {\n port: port.port,\n protocol: port.protocol ?? \"TCP\",\n }\n }\n\n return {\n port: port.range[0],\n endPort: port.range[1],\n protocol: port.protocol ?? \"TCP\",\n }\n })\n }\n}\n","import type { types } from \"@pulumi/kubernetes\"\n\nexport const podSpecDefaults: Partial<types.input.core.v1.PodSpec> = {\n automountServiceAccountToken: false,\n}\n","import type { k8s } from \"@highstate/library\"\nimport type { types } from \"@pulumi/kubernetes\"\nimport type { DeploymentArgs } from \"./deployment\"\nimport type { StatefulSetArgs } from \"./stateful-set\"\nimport { AccessPointRoute, type AccessPointRouteArgs } from \"@highstate/common\"\nimport { type TerminalSpec, trimIndentation, type UnitTerminal } from \"@highstate/contract\"\nimport {\n type ComponentResourceOptions,\n type DeepInput,\n fileFromString,\n type InputArray,\n normalize,\n normalizeInputs,\n} from \"@highstate/pulumi\"\nimport {\n type ComponentResource,\n type CustomResourceOptions,\n type Input,\n type Inputs,\n interpolate,\n type Output,\n output,\n type Unwrap,\n} from \"@pulumi/pulumi\"\nimport { sha256 } from \"crypto-hash\"\nimport { deepmerge } from \"deepmerge-ts\"\nimport { filter, isNonNullish, unique, uniqueBy } from \"remeda\"\nimport {\n type Container,\n getWorkloadVolumeResourceUuid,\n mapContainerToRaw,\n mapWorkloadVolume,\n type WorkloadVolume,\n} from \"./container\"\nimport { Namespace } from \"./namespace\"\nimport { NetworkPolicy, type NetworkPolicyArgs } from \"./network-policy\"\nimport { podSpecDefaults } from \"./pod\"\nimport { mapContainerPortToServicePort, Service, type ServiceArgs } from \"./service\"\nimport { commonExtraArgs, images, ScopedResource, type ScopedResourceArgs } from \"./shared\"\n\nexport type WorkloadTerminalArgs = {\n /**\n * The shell to use in the terminal.\n *\n * By default, `bash` is used.\n */\n shell?: string\n}\n\nexport type WorkloadArgs = ScopedResourceArgs & {\n container?: Input<Container>\n containers?: InputArray<Container>\n\n /**\n * The args for the terminal to use.\n */\n terminal?: Input<WorkloadTerminalArgs>\n\n /**\n * The network policy to apply to the deployment.\n */\n networkPolicy?: Omit<NetworkPolicyArgs, \"selector\" | \"cluster\" | \"namespace\">\n}\n\nexport const workloadExtraArgs = [...commonExtraArgs, \"container\", \"containers\"] as const\n\nexport type ExposableWorkloadArgs = WorkloadArgs & {\n service?: Input<Omit<ServiceArgs, \"cluster\" | \"namespace\">>\n\n /**\n * The configuration for the access point route to create.\n */\n route?: Input<Omit<AccessPointRouteArgs, \"endpoints\" | \"customData\">>\n\n /**\n * The configuration for the access point routes to create.\n */\n routes?: InputArray<Omit<AccessPointRouteArgs, \"endpoints\" | \"customData\">>\n\n /**\n * The existing workload to patch.\n */\n existing?: Input<k8s.ExposableWorkload>\n}\n\nexport const exposableWorkloadExtraArgs = [\n ...workloadExtraArgs,\n \"service\",\n \"route\",\n \"routes\",\n] as const\n\nexport type ExposableWorkloadType = \"Deployment\" | \"StatefulSet\"\n\nexport type GenericExposableWorkloadArgs = Omit<ExposableWorkloadArgs, \"existing\"> & {\n /**\n * The type of workload to create.\n *\n * Will be ignored if the `existing` argument is provided.\n */\n type: ExposableWorkloadType\n\n /**\n * The existing workload to patch.\n */\n existing: Input<k8s.ExposableWorkload | undefined>\n\n /**\n * The args specific to the \"Deployment\" workload type.\n *\n * Will be ignored for other workload types.\n */\n deployment?: Input<DeploymentArgs>\n\n /**\n * The args specific to the \"StatefulSet\" workload type.\n *\n * Will be ignored for other workload types.\n */\n statefulSet?: Input<StatefulSetArgs>\n}\n\nexport function getWorkloadComponents(\n name: string,\n args: WorkloadArgs,\n parent: () => ComponentResource,\n opts: ComponentResourceOptions | undefined,\n) {\n const labels = {\n \"app.kubernetes.io/name\": name,\n }\n\n const containers = output(args).apply(args => normalize(args.container, args.containers))\n\n const rawVolumes = containers.apply(containers => {\n const containerVolumes = containers.flatMap(container =>\n normalize(container.volume, container.volumes),\n )\n\n const containerVolumeMounts = containers.flatMap(container => {\n return normalize(container.volumeMount, container.volumeMounts)\n .map(volumeMount => {\n return \"volume\" in volumeMount ? volumeMount.volume : undefined\n })\n .filter(Boolean) as WorkloadVolume[]\n })\n\n return output([...containerVolumes, ...containerVolumeMounts])\n })\n\n const volumes = rawVolumes.apply(rawVolumes => {\n return output(rawVolumes.map(mapWorkloadVolume)).apply(uniqueBy(volume => volume.name))\n })\n\n const podSpec = output({\n cluster: output(args.namespace).cluster,\n containers,\n volumes,\n }).apply(({ cluster, containers, volumes }) => {\n const spec = {\n volumes,\n containers: containers.map(container => mapContainerToRaw(container, cluster, name)),\n ...podSpecDefaults,\n } satisfies types.input.core.v1.PodSpec\n\n if (\n containers.some(container => container.enableTun) &&\n cluster.quirks?.tunDevicePolicy?.type !== \"plugin\"\n ) {\n spec.volumes = output(spec.volumes).apply(volumes => [\n ...(volumes ?? []),\n {\n name: \"tun-device\",\n hostPath: {\n path: \"/dev/net/tun\",\n },\n },\n ])\n }\n\n return spec\n })\n\n const dependencyHash = rawVolumes.apply(rawVolumes => {\n return output(rawVolumes.map(getWorkloadVolumeResourceUuid))\n .apply(filter(isNonNullish))\n .apply(unique())\n .apply(ids => sha256(ids.join(\",\")))\n })\n\n const podTemplate = output({ podSpec, dependencyHash }).apply(({ podSpec, dependencyHash }) => {\n return {\n metadata: {\n labels,\n annotations: {\n // to trigger a redeployment when the volumes change\n \"highstate.io/dependency-hash\": dependencyHash,\n },\n },\n spec: podSpec,\n } satisfies types.input.core.v1.PodTemplateSpec\n })\n\n const networkPolicy = output({ containers }).apply(({ containers }) => {\n const allowedEndpoints = containers.flatMap(container => container.allowedEndpoints ?? [])\n\n if (allowedEndpoints.length === 0 && !args.networkPolicy) {\n return output(undefined)\n }\n\n return output(\n new NetworkPolicy(\n name,\n {\n namespace: args.namespace,\n selector: labels,\n description: `Network policy for \"${name}\"`,\n\n ...args.networkPolicy,\n\n egressRules: output(args.networkPolicy?.egressRules).apply(egressRules => [\n ...(egressRules ?? []),\n ...(allowedEndpoints.length > 0 ? [{ toEndpoints: allowedEndpoints }] : []),\n ]),\n },\n { ...opts, parent: parent() },\n ),\n )\n })\n\n return { labels, containers, volumes, podSpec, podTemplate, networkPolicy }\n}\n\nexport function getExposableWorkloadComponents(\n name: string,\n args: ExposableWorkloadArgs,\n parent: () => ComponentResource,\n opts: ComponentResourceOptions | undefined,\n) {\n const { labels, containers, volumes, podSpec, podTemplate, networkPolicy } =\n getWorkloadComponents(name, args, parent, opts)\n\n const service = output({\n existing: args.existing,\n serviceArgs: args.service,\n containers,\n }).apply(({ existing, serviceArgs, containers }) => {\n if (!args.service && !args.route) {\n return undefined\n }\n\n if (existing?.service) {\n return Service.for(existing.service, output(args.namespace).cluster)\n }\n\n if (existing) {\n return undefined\n }\n\n const ports = containers.flatMap(container => normalize(container.port, container.ports))\n\n return Service.create(name, {\n ...serviceArgs,\n selector: labels,\n namespace: args.namespace,\n\n ports:\n // allow to completely override the ports\n !serviceArgs?.port && !serviceArgs?.ports\n ? ports.map(mapContainerPortToServicePort)\n : serviceArgs?.ports,\n })\n })\n\n const routes = output({\n routesArgs: normalizeInputs(args.route, args.routes),\n service,\n namespace: output(args.namespace),\n }).apply(({ routesArgs, service, namespace }) => {\n if (!routesArgs.length || !service) {\n return []\n }\n\n if (args.existing) {\n return []\n }\n\n return routesArgs.map(routeArgs => {\n return new AccessPointRoute(name, {\n ...routeArgs,\n endpoints: service.endpoints,\n\n // pass the native data to the route to allow implementation to use it\n gatewayNativeData: service,\n tlsCertificateNativeData: namespace,\n })\n })\n })\n\n return { labels, containers, volumes, podSpec, podTemplate, networkPolicy, service, routes }\n}\n\nexport abstract class Workload extends ScopedResource {\n protected constructor(\n type: string,\n protected readonly name: string,\n args: Inputs,\n opts: ComponentResourceOptions | undefined,\n\n apiVersion: Output<string>,\n kind: Output<string>,\n protected readonly terminalArgs: Output<Unwrap<WorkloadTerminalArgs>>,\n protected readonly containers: Output<Container[]>,\n namespace: Output<Namespace>,\n metadata: Output<types.output.meta.v1.ObjectMeta>,\n\n /**\n * The network policy associated with the workload.\n *\n * Will be created if one or more containers have `allowedEndpoints` defined.\n */\n readonly networkPolicy: Output<NetworkPolicy | undefined>,\n ) {\n super(type, name, args, opts, apiVersion, kind, namespace, metadata)\n }\n\n protected abstract getTerminalMeta(): Output<UnitTerminal[\"meta\"]>\n\n /**\n * The instance terminal to interact with the deployment.\n */\n get terminal(): Output<UnitTerminal> {\n const containerName = output(this.containers).apply(containers => {\n return containers[0]?.name ?? this.name\n })\n\n const shell = this.terminalArgs.apply(args => args.shell ?? \"bash\")\n\n const workloadLabelQuery = output(this.metadata)\n .apply(meta => meta.labels ?? {})\n .apply(labels =>\n Object.entries(labels)\n .map(([key, value]) => `${key}=${value}`)\n .join(\",\"),\n )\n\n return output({\n name: this.metadata.name,\n meta: this.getTerminalMeta(),\n\n spec: {\n image: images[\"terminal-kubectl\"].image,\n command: [\"bash\", \"/welcome.sh\"],\n\n files: {\n \"/kubeconfig\": fileFromString(\"kubeconfig\", this.cluster.kubeconfig, { isSecret: true }),\n\n \"/welcome.sh\": fileFromString(\n \"welcome.sh\",\n interpolate`\n #!/bin/bash\n set -euo pipefail\n\n NAMESPACE=\"${this.metadata.namespace}\"\n RESOURCE_TYPE=\"${this.kind.apply(k => k.toLowerCase())}\"\n RESOURCE_NAME=\"${this.metadata.name}\"\n CONTAINER_NAME=\"${containerName}\"\n SHELL=\"${shell}\"\n\n echo \"Connecting to $RESOURCE_TYPE \\\\\"$RESOURCE_NAME\\\\\" in namespace \\\\\"$NAMESPACE\\\\\"\"\n\n # get all pods for this workload\n PODS=$(kubectl get pods -n \"$NAMESPACE\" -l \"${workloadLabelQuery}\" -o jsonpath='{.items[*].metadata.name}' 2>/dev/null || echo \"\")\n\n if [ -z \"$PODS\" ]; then\n echo \"No pods found\"\n exit 1\n fi\n\n # convert space-separated string to array\n read -ra POD_ARRAY <<< \"$PODS\"\n\n if [ \\${#POD_ARRAY[@]} -eq 1 ]; then\n # single pod found, connect directly\n SELECTED_POD=\"\\${POD_ARRAY[0]}\"\n echo \"Found single pod: $SELECTED_POD\"\n else\n # multiple pods found, use fzf for selection\n echo \"Found \\${#POD_ARRAY[@]} pods. Please select one.\"\n \n SELECTED_POD=$(printf '%s\\n' \"\\${POD_ARRAY[@]}\" | fzf --prompt=\"Select pod: \" --height 10 --border --info=inline)\n \n if [ -z \"$SELECTED_POD\" ]; then\n echo \"No pod selected\"\n exit 1\n fi\n \n echo \"Selected pod: $SELECTED_POD\"\n fi\n\n # execute into the selected pod\n exec kubectl exec -it -n \"$NAMESPACE\" \"$SELECTED_POD\" -c \"$CONTAINER_NAME\" -- \"$SHELL\"\n `.apply(trimIndentation),\n ),\n },\n\n env: {\n KUBECONFIG: \"/kubeconfig\",\n },\n },\n })\n }\n\n /**\n * Creates a terminal with a custom command.\n *\n * @param meta The metadata for the terminal.\n * @param command The command to run in the terminal.\n * @param spec Additional spec options for the terminal.\n */\n createTerminal(\n name: string,\n meta: UnitTerminal[\"meta\"],\n command: InputArray<string>,\n spec?: { env?: DeepInput<TerminalSpec[\"env\"]>; files?: DeepInput<TerminalSpec[\"files\"]> },\n ): Output<UnitTerminal> {\n const containerName = output(this.containers).apply(containers => {\n return containers[0]?.name ?? this.name\n })\n\n return output({\n name,\n\n meta: output(this.getTerminalMeta()).apply(currentMeta => ({\n ...currentMeta,\n ...meta,\n })),\n\n spec: {\n image: images[\"terminal-kubectl\"].image,\n\n command: output(command).apply(command => [\n \"exec\",\n \"kubectl\",\n \"exec\",\n \"-it\",\n \"-n\",\n this.metadata.namespace,\n interpolate`${this.kind.apply(k => k.toLowerCase())}/${this.metadata.name}`,\n \"-c\",\n containerName,\n \"--\",\n ...command,\n ]),\n\n files: {\n \"/kubeconfig\": fileFromString(\"kubeconfig\", this.cluster.kubeconfig, { isSecret: true }),\n ...spec?.files,\n },\n\n env: {\n KUBECONFIG: \"/kubeconfig\",\n ...spec?.env,\n },\n },\n })\n }\n}\n\nexport abstract class ExposableWorkload extends Workload {\n protected constructor(\n type: string,\n name: string,\n args: Inputs,\n opts: ComponentResourceOptions | undefined,\n\n apiVersion: Output<string>,\n kind: Output<string>,\n terminalArgs: Output<Unwrap<WorkloadTerminalArgs>>,\n containers: Output<Container[]>,\n namespace: Output<Namespace>,\n metadata: Output<types.output.meta.v1.ObjectMeta>,\n networkPolicy: Output<NetworkPolicy | undefined>,\n\n protected readonly _service: Output<Service | undefined>,\n\n /**\n * The access point routes associated with the workload.\n */\n readonly routes: Output<AccessPointRoute[]>,\n ) {\n super(\n type,\n name,\n args,\n opts,\n apiVersion,\n kind,\n terminalArgs,\n containers,\n namespace,\n metadata,\n networkPolicy,\n )\n }\n\n /**\n * The service associated with the workload.\n */\n get optionalService(): Output<Service | undefined> {\n return this._service\n }\n\n /**\n * The service associated with the workload.\n *\n * Will throw an error if the service is not available.\n */\n get service(): Output<Service> {\n return this._service.apply(service => {\n if (!service) {\n throw new Error(`The service of the workload \"${this.name}\" is not available.`)\n }\n\n return service\n })\n }\n\n /**\n * The entity of the workload.\n */\n abstract get entity(): Output<k8s.ExposableWorkload>\n\n /**\n * The sped of the underlying Kubernetes workload.\n */\n abstract get spec(): Output<\n types.output.apps.v1.DeploymentSpec | types.output.apps.v1.StatefulSetSpec\n >\n\n /**\n * Creates a generic workload or patches the existing one.\n */\n static createOrPatchGeneric(\n name: string,\n args: GenericExposableWorkloadArgs,\n opts?: CustomResourceOptions,\n ): Output<ExposableWorkload> {\n return output(args).apply(async args => {\n if (args.existing?.type === \"deployment\") {\n const { Deployment } = await import(\"./deployment\")\n\n return Deployment.patch(\n name,\n {\n ...deepmerge(args, args.deployment),\n name: args.existing.metadata.name,\n namespace: Namespace.forResourceAsync(args.existing, output(args.namespace).cluster),\n },\n opts,\n )\n }\n\n if (args.existing?.type === \"stateful-set\") {\n const { StatefulSet } = await import(\"./stateful-set\")\n\n return StatefulSet.patch(\n name,\n {\n ...deepmerge(args, args.statefulSet),\n name: args.existing.metadata.name,\n namespace: Namespace.forResourceAsync(args.existing, output(args.namespace).cluster),\n },\n opts,\n )\n }\n\n if (args.type === \"Deployment\") {\n const { Deployment } = await import(\"./deployment\")\n\n return Deployment.create(name, deepmerge(args, args.deployment), opts)\n }\n\n if (args.type === \"StatefulSet\") {\n const { StatefulSet } = await import(\"./stateful-set\")\n\n return StatefulSet.create(name, deepmerge(args, args.statefulSet), opts)\n }\n\n throw new Error(`Unknown workload type: ${args.type as string}`)\n })\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { ExposableWorkload, getExposableWorkloadComponents, exposableWorkloadExtraArgs } from './chunk-SBC3TUIN.js';
1
+ import { ExposableWorkload, getExposableWorkloadComponents, exposableWorkloadExtraArgs } from './chunk-OEGSMSYV.js';
2
2
  import { Namespace, mapMetadata, getProvider } from './chunk-WGMJCZSK.js';
3
3
  import { getOrCreate } from '@highstate/contract';
4
4
  import { output, interpolate, toPromise } from '@highstate/pulumi';
@@ -283,5 +283,5 @@ var ExternalDeployment = class extends Deployment {
283
283
  };
284
284
 
285
285
  export { Deployment };
286
- //# sourceMappingURL=chunk-JYNXQ3I3.js.map
287
- //# sourceMappingURL=chunk-JYNXQ3I3.js.map
286
+ //# sourceMappingURL=chunk-PODFA5KM.js.map
287
+ //# sourceMappingURL=chunk-PODFA5KM.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/deployment.ts"],"names":["args","podTemplate","labels"],"mappings":"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","file":"chunk-JYNXQ3I3.js","sourcesContent":["import type { AccessPointRoute } from \"@highstate/common\"\nimport type { k8s } from \"@highstate/library\"\nimport type { Container } from \"./container\"\nimport type { NetworkPolicy } from \"./network-policy\"\nimport type { Service } from \"./service\"\nimport { getOrCreate, type UnitTerminal } from \"@highstate/contract\"\nimport {\n type ComponentResourceOptions,\n type Input,\n type Inputs,\n interpolate,\n type Output,\n output,\n toPromise,\n type Unwrap,\n} from \"@highstate/pulumi\"\nimport { apps, type types } from \"@pulumi/kubernetes\"\nimport { deepmerge } from \"deepmerge-ts\"\nimport { omit } from \"remeda\"\nimport { Namespace } from \"./namespace\"\nimport { getProvider, mapMetadata } from \"./shared\"\nimport {\n ExposableWorkload,\n type ExposableWorkloadArgs,\n exposableWorkloadExtraArgs,\n getExposableWorkloadComponents,\n type WorkloadTerminalArgs,\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: Inputs,\n opts: ComponentResourceOptions | undefined,\n\n apiVersion: Output<string>,\n kind: Output<string>,\n terminalArgs: Output<Unwrap<WorkloadTerminalArgs>>,\n containers: Output<Container[]>,\n namespace: Output<Namespace>,\n metadata: Output<types.output.meta.v1.ObjectMeta>,\n networkPolicy: Output<NetworkPolicy | undefined>,\n\n service: Output<Service | undefined>,\n routes: Output<AccessPointRoute[]>,\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 super(\n type,\n name,\n args,\n opts,\n apiVersion,\n kind,\n terminalArgs,\n containers,\n namespace,\n metadata,\n networkPolicy,\n service,\n routes,\n )\n }\n\n protected override getTerminalMeta(): Output<UnitTerminal[\"meta\"]> {\n return output({\n title: \"Deployment\",\n globalTitle: interpolate`Deployment | ${this.metadata.name}`,\n description: \"The shell inside the deployment.\",\n icon: \"devicon:kubernetes\",\n })\n }\n\n /**\n * The Highstate deployment entity.\n */\n get entity(): Output<k8s.Deployment> {\n return output({\n type: \"deployment\",\n clusterId: this.cluster.id,\n clusterName: this.cluster.name,\n metadata: this.metadata,\n service: this._service.apply(service => service?.entity),\n })\n }\n\n /**\n * Creates a new deployment.\n */\n static create(name: string, args: DeploymentArgs, opts?: ComponentResourceOptions): Deployment {\n return new CreatedDeployment(name, args, opts)\n }\n\n /**\n * Creates a new deployment or patches an existing one.\n *\n * @param name The name of the resource. May not be the same as the deployment name.\n * @param args The arguments to create or patch the deployment with.\n * @param opts Optional resource options.\n */\n static createOrPatch(\n name: string,\n args: CreateOrGetDeploymentArgs,\n opts?: ComponentResourceOptions,\n ): Deployment {\n if (args.existing) {\n return new DeploymentPatch(name, {\n ...args,\n name: output(args.existing).metadata.name,\n namespace: Namespace.forResourceAsync(args.existing, output(args.namespace).cluster),\n })\n }\n\n return new CreatedDeployment(name, args, opts)\n }\n\n /**\n * Creates a new deployment or gets an existing one.\n *\n * @param name The name of the resource. May not be the same as the deployment name. Will not be used when existing deployment is retrieved.\n * @param args The arguments to create or get the deployment with.\n * @param opts Optional resource options.\n */\n static async createOrGet(\n name: string,\n args: CreateOrGetDeploymentArgs,\n opts?: ComponentResourceOptions,\n ): Promise<Deployment> {\n if (args.existing) {\n return await Deployment.forAsync(args.existing, output(args.namespace).cluster)\n }\n\n return new CreatedDeployment(name, args, opts)\n }\n\n /**\n * Patches an existing deployment.\n *\n * Will throw an error if the deployment does not exist.\n *\n * @param name The name of the resource. May not be the same as the deployment name.\n * @param args The arguments to patch the deployment with.\n * @param opts Optional resource options.\n */\n static patch(name: string, args: DeploymentArgs, opts?: ComponentResourceOptions): Deployment {\n return new DeploymentPatch(name, args, opts)\n }\n\n /**\n * Wraps an existing Kubernetes deployment.\n */\n static wrap(\n name: string,\n args: WrappedDeploymentArgs,\n opts?: ComponentResourceOptions,\n ): Deployment {\n return new WrappedDeployment(name, args, opts)\n }\n\n /**\n * Gets an existing deployment.\n *\n * Will throw an error if the deployment does not exist.\n */\n static get(\n name: string,\n args: ExternalDeploymentArgs,\n opts?: ComponentResourceOptions,\n ): Deployment {\n return new ExternalDeployment(name, args, opts)\n }\n\n private static readonly deploymentCache = new Map<string, Deployment>()\n\n /**\n * Gets an existing deployment for a given entity.\n * Prefer this method over `get` when possible.\n *\n * It automatically names the resource with the following format: `{clusterName}.{namespace}.{name}.{clusterId}`.\n *\n * This method is idempotent and will return the same instance for the same entity.\n *\n * @param entity The entity to get the deployment for.\n * @param cluster The cluster where the deployment is located.\n */\n static for(entity: k8s.Deployment, cluster: Input<k8s.Cluster>): Deployment {\n return getOrCreate(\n Deployment.deploymentCache,\n `${entity.clusterName}.${entity.metadata.namespace}.${entity.metadata.name}.${entity.clusterId}`,\n name => {\n return Deployment.get(name, {\n name: entity.metadata.name,\n namespace: Namespace.forResource(entity, cluster),\n })\n },\n )\n }\n\n /**\n * Gets an existing deployment for a given entity.\n * Prefer this method over `get` when possible.\n *\n * It automatically names the resource with the following format: `{clusterName}.{namespace}.{name}.{clusterId}`.\n *\n * This method is idempotent and will return the same instance for the same entity.\n *\n * @param entity The entity to get the deployment for.\n * @param cluster The cluster where the deployment is located.\n */\n static async forAsync(\n entity: Input<k8s.Deployment>,\n cluster: Input<k8s.Cluster>,\n ): Promise<Deployment> {\n const resolvedEntity = await toPromise(entity)\n return Deployment.for(resolvedEntity, cluster)\n }\n}\n\nclass CreatedDeployment extends Deployment {\n constructor(name: string, args: DeploymentArgs, opts?: ComponentResourceOptions) {\n const { labels, podTemplate, networkPolicy, containers, service, routes } =\n getExposableWorkloadComponents(name, args, () => this, opts)\n\n const deployment = output(args.namespace).cluster.apply(cluster => {\n return new apps.v1.Deployment(\n name,\n {\n metadata: mapMetadata(args, name),\n spec: output({ args, podTemplate, labels }).apply(({ args, podTemplate, labels }) => {\n return 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, parent: this, provider: getProvider(cluster) },\n )\n })\n\n super(\n \"highstate:k8s:Deployment\",\n name,\n args,\n opts,\n\n deployment.apiVersion,\n deployment.kind,\n output(args.terminal ?? {}),\n containers,\n output(args.namespace),\n deployment.metadata,\n networkPolicy,\n\n service,\n routes,\n\n deployment.spec,\n deployment.status,\n )\n }\n}\n\nclass DeploymentPatch extends Deployment {\n constructor(name: string, args: DeploymentArgs, opts?: ComponentResourceOptions) {\n const { labels, podTemplate, networkPolicy, containers, service, routes } =\n getExposableWorkloadComponents(name, args, () => this, opts)\n\n const deployment = output(args.namespace).cluster.apply(cluster => {\n return new apps.v1.DeploymentPatch(\n name,\n {\n metadata: mapMetadata(args, name),\n spec: output({ args, podTemplate, labels }).apply(({ args, podTemplate, labels }) => {\n return deepmerge(\n {\n template: podTemplate,\n selector: { matchLabels: labels },\n },\n omit(args, exposableWorkloadExtraArgs),\n ) as types.input.apps.v1.DeploymentSpec\n }),\n },\n {\n ...opts,\n parent: this,\n provider: getProvider(cluster),\n },\n )\n })\n\n super(\n \"highstate:k8s:DeploymentPatch\",\n name,\n args,\n opts,\n\n deployment.apiVersion,\n deployment.kind,\n output(args.terminal ?? {}),\n containers,\n output(args.namespace),\n deployment.metadata,\n networkPolicy,\n\n service,\n routes,\n\n deployment.spec,\n deployment.status,\n )\n }\n}\n\nexport type WrappedDeploymentArgs = {\n /**\n * The underlying Kubernetes deployment to wrap.\n */\n deployment: Input<apps.v1.Deployment>\n\n /**\n * The namespace where the deployment is located.\n */\n namespace: Input<Namespace>\n\n /**\n * The args for the terminal to use.\n */\n terminal?: Input<WorkloadTerminalArgs>\n}\n\nclass WrappedDeployment extends Deployment {\n constructor(name: string, args: WrappedDeploymentArgs, opts?: ComponentResourceOptions) {\n super(\n \"highstate:k8s:WrappedDeployment\",\n name,\n args,\n opts,\n\n output(args.deployment).apiVersion,\n output(args.deployment).kind,\n output(args.terminal ?? {}),\n output([]),\n output(args.namespace),\n output(args.deployment).metadata,\n\n output(undefined),\n output(undefined),\n output([]),\n\n output(args.deployment).spec,\n output(args.deployment).status,\n )\n }\n}\n\nexport type ExternalDeploymentArgs = {\n /**\n * The name of the deployment to get.\n */\n name: Input<string>\n\n /**\n * The namespace where the deployment is located.\n */\n namespace: Input<Namespace>\n}\n\nclass ExternalDeployment extends Deployment {\n constructor(name: string, args: ExternalDeploymentArgs, opts?: ComponentResourceOptions) {\n const deployment = output(args.namespace).cluster.apply(cluster => {\n return apps.v1.Deployment.get(\n name,\n interpolate`${output(args.namespace).metadata.name}/${args.name}`,\n { ...opts, parent: this, provider: getProvider(cluster) },\n )\n })\n\n super(\n \"highstate:k8s:ExternalDeployment\",\n name,\n args,\n opts,\n\n deployment.apiVersion,\n deployment.kind,\n output({}),\n output([]),\n output(args.namespace),\n deployment.metadata,\n\n output(undefined),\n output(undefined),\n output([]),\n\n deployment.spec,\n deployment.status,\n )\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/deployment.ts"],"names":["args","podTemplate","labels"],"mappings":"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","file":"chunk-PODFA5KM.js","sourcesContent":["import type { AccessPointRoute } from \"@highstate/common\"\nimport type { k8s } from \"@highstate/library\"\nimport type { Container } from \"./container\"\nimport type { NetworkPolicy } from \"./network-policy\"\nimport type { Service } from \"./service\"\nimport { getOrCreate, type UnitTerminal } from \"@highstate/contract\"\nimport {\n type ComponentResourceOptions,\n type Input,\n type Inputs,\n interpolate,\n type Output,\n output,\n toPromise,\n type Unwrap,\n} from \"@highstate/pulumi\"\nimport { apps, type types } from \"@pulumi/kubernetes\"\nimport { deepmerge } from \"deepmerge-ts\"\nimport { omit } from \"remeda\"\nimport { Namespace } from \"./namespace\"\nimport { getProvider, mapMetadata } from \"./shared\"\nimport {\n ExposableWorkload,\n type ExposableWorkloadArgs,\n exposableWorkloadExtraArgs,\n getExposableWorkloadComponents,\n type WorkloadTerminalArgs,\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: Inputs,\n opts: ComponentResourceOptions | undefined,\n\n apiVersion: Output<string>,\n kind: Output<string>,\n terminalArgs: Output<Unwrap<WorkloadTerminalArgs>>,\n containers: Output<Container[]>,\n namespace: Output<Namespace>,\n metadata: Output<types.output.meta.v1.ObjectMeta>,\n networkPolicy: Output<NetworkPolicy | undefined>,\n\n service: Output<Service | undefined>,\n routes: Output<AccessPointRoute[]>,\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 super(\n type,\n name,\n args,\n opts,\n apiVersion,\n kind,\n terminalArgs,\n containers,\n namespace,\n metadata,\n networkPolicy,\n service,\n routes,\n )\n }\n\n protected override getTerminalMeta(): Output<UnitTerminal[\"meta\"]> {\n return output({\n title: \"Deployment\",\n globalTitle: interpolate`Deployment | ${this.metadata.name}`,\n description: \"The shell inside the deployment.\",\n icon: \"devicon:kubernetes\",\n })\n }\n\n /**\n * The Highstate deployment entity.\n */\n get entity(): Output<k8s.Deployment> {\n return output({\n type: \"deployment\",\n clusterId: this.cluster.id,\n clusterName: this.cluster.name,\n metadata: this.metadata,\n service: this._service.apply(service => service?.entity),\n })\n }\n\n /**\n * Creates a new deployment.\n */\n static create(name: string, args: DeploymentArgs, opts?: ComponentResourceOptions): Deployment {\n return new CreatedDeployment(name, args, opts)\n }\n\n /**\n * Creates a new deployment or patches an existing one.\n *\n * @param name The name of the resource. May not be the same as the deployment name.\n * @param args The arguments to create or patch the deployment with.\n * @param opts Optional resource options.\n */\n static createOrPatch(\n name: string,\n args: CreateOrGetDeploymentArgs,\n opts?: ComponentResourceOptions,\n ): Deployment {\n if (args.existing) {\n return new DeploymentPatch(name, {\n ...args,\n name: output(args.existing).metadata.name,\n namespace: Namespace.forResourceAsync(args.existing, output(args.namespace).cluster),\n })\n }\n\n return new CreatedDeployment(name, args, opts)\n }\n\n /**\n * Creates a new deployment or gets an existing one.\n *\n * @param name The name of the resource. May not be the same as the deployment name. Will not be used when existing deployment is retrieved.\n * @param args The arguments to create or get the deployment with.\n * @param opts Optional resource options.\n */\n static async createOrGet(\n name: string,\n args: CreateOrGetDeploymentArgs,\n opts?: ComponentResourceOptions,\n ): Promise<Deployment> {\n if (args.existing) {\n return await Deployment.forAsync(args.existing, output(args.namespace).cluster)\n }\n\n return new CreatedDeployment(name, args, opts)\n }\n\n /**\n * Patches an existing deployment.\n *\n * Will throw an error if the deployment does not exist.\n *\n * @param name The name of the resource. May not be the same as the deployment name.\n * @param args The arguments to patch the deployment with.\n * @param opts Optional resource options.\n */\n static patch(name: string, args: DeploymentArgs, opts?: ComponentResourceOptions): Deployment {\n return new DeploymentPatch(name, args, opts)\n }\n\n /**\n * Wraps an existing Kubernetes deployment.\n */\n static wrap(\n name: string,\n args: WrappedDeploymentArgs,\n opts?: ComponentResourceOptions,\n ): Deployment {\n return new WrappedDeployment(name, args, opts)\n }\n\n /**\n * Gets an existing deployment.\n *\n * Will throw an error if the deployment does not exist.\n */\n static get(\n name: string,\n args: ExternalDeploymentArgs,\n opts?: ComponentResourceOptions,\n ): Deployment {\n return new ExternalDeployment(name, args, opts)\n }\n\n private static readonly deploymentCache = new Map<string, Deployment>()\n\n /**\n * Gets an existing deployment for a given entity.\n * Prefer this method over `get` when possible.\n *\n * It automatically names the resource with the following format: `{clusterName}.{namespace}.{name}.{clusterId}`.\n *\n * This method is idempotent and will return the same instance for the same entity.\n *\n * @param entity The entity to get the deployment for.\n * @param cluster The cluster where the deployment is located.\n */\n static for(entity: k8s.Deployment, cluster: Input<k8s.Cluster>): Deployment {\n return getOrCreate(\n Deployment.deploymentCache,\n `${entity.clusterName}.${entity.metadata.namespace}.${entity.metadata.name}.${entity.clusterId}`,\n name => {\n return Deployment.get(name, {\n name: entity.metadata.name,\n namespace: Namespace.forResource(entity, cluster),\n })\n },\n )\n }\n\n /**\n * Gets an existing deployment for a given entity.\n * Prefer this method over `get` when possible.\n *\n * It automatically names the resource with the following format: `{clusterName}.{namespace}.{name}.{clusterId}`.\n *\n * This method is idempotent and will return the same instance for the same entity.\n *\n * @param entity The entity to get the deployment for.\n * @param cluster The cluster where the deployment is located.\n */\n static async forAsync(\n entity: Input<k8s.Deployment>,\n cluster: Input<k8s.Cluster>,\n ): Promise<Deployment> {\n const resolvedEntity = await toPromise(entity)\n return Deployment.for(resolvedEntity, cluster)\n }\n}\n\nclass CreatedDeployment extends Deployment {\n constructor(name: string, args: DeploymentArgs, opts?: ComponentResourceOptions) {\n const { labels, podTemplate, networkPolicy, containers, service, routes } =\n getExposableWorkloadComponents(name, args, () => this, opts)\n\n const deployment = output(args.namespace).cluster.apply(cluster => {\n return new apps.v1.Deployment(\n name,\n {\n metadata: mapMetadata(args, name),\n spec: output({ args, podTemplate, labels }).apply(({ args, podTemplate, labels }) => {\n return 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, parent: this, provider: getProvider(cluster) },\n )\n })\n\n super(\n \"highstate:k8s:Deployment\",\n name,\n args,\n opts,\n\n deployment.apiVersion,\n deployment.kind,\n output(args.terminal ?? {}),\n containers,\n output(args.namespace),\n deployment.metadata,\n networkPolicy,\n\n service,\n routes,\n\n deployment.spec,\n deployment.status,\n )\n }\n}\n\nclass DeploymentPatch extends Deployment {\n constructor(name: string, args: DeploymentArgs, opts?: ComponentResourceOptions) {\n const { labels, podTemplate, networkPolicy, containers, service, routes } =\n getExposableWorkloadComponents(name, args, () => this, opts)\n\n const deployment = output(args.namespace).cluster.apply(cluster => {\n return new apps.v1.DeploymentPatch(\n name,\n {\n metadata: mapMetadata(args, name),\n spec: output({ args, podTemplate, labels }).apply(({ args, podTemplate, labels }) => {\n return deepmerge(\n {\n template: podTemplate,\n selector: { matchLabels: labels },\n },\n omit(args, exposableWorkloadExtraArgs),\n ) as types.input.apps.v1.DeploymentSpec\n }),\n },\n {\n ...opts,\n parent: this,\n provider: getProvider(cluster),\n },\n )\n })\n\n super(\n \"highstate:k8s:DeploymentPatch\",\n name,\n args,\n opts,\n\n deployment.apiVersion,\n deployment.kind,\n output(args.terminal ?? {}),\n containers,\n output(args.namespace),\n deployment.metadata,\n networkPolicy,\n\n service,\n routes,\n\n deployment.spec,\n deployment.status,\n )\n }\n}\n\nexport type WrappedDeploymentArgs = {\n /**\n * The underlying Kubernetes deployment to wrap.\n */\n deployment: Input<apps.v1.Deployment>\n\n /**\n * The namespace where the deployment is located.\n */\n namespace: Input<Namespace>\n\n /**\n * The args for the terminal to use.\n */\n terminal?: Input<WorkloadTerminalArgs>\n}\n\nclass WrappedDeployment extends Deployment {\n constructor(name: string, args: WrappedDeploymentArgs, opts?: ComponentResourceOptions) {\n super(\n \"highstate:k8s:WrappedDeployment\",\n name,\n args,\n opts,\n\n output(args.deployment).apiVersion,\n output(args.deployment).kind,\n output(args.terminal ?? {}),\n output([]),\n output(args.namespace),\n output(args.deployment).metadata,\n\n output(undefined),\n output(undefined),\n output([]),\n\n output(args.deployment).spec,\n output(args.deployment).status,\n )\n }\n}\n\nexport type ExternalDeploymentArgs = {\n /**\n * The name of the deployment to get.\n */\n name: Input<string>\n\n /**\n * The namespace where the deployment is located.\n */\n namespace: Input<Namespace>\n}\n\nclass ExternalDeployment extends Deployment {\n constructor(name: string, args: ExternalDeploymentArgs, opts?: ComponentResourceOptions) {\n const deployment = output(args.namespace).cluster.apply(cluster => {\n return apps.v1.Deployment.get(\n name,\n interpolate`${output(args.namespace).metadata.name}/${args.name}`,\n { ...opts, parent: this, provider: getProvider(cluster) },\n )\n })\n\n super(\n \"highstate:k8s:ExternalDeployment\",\n name,\n args,\n opts,\n\n deployment.apiVersion,\n deployment.kind,\n output({}),\n output([]),\n output(args.namespace),\n deployment.metadata,\n\n output(undefined),\n output(undefined),\n output([]),\n\n deployment.spec,\n deployment.status,\n )\n }\n}\n"]}
@@ -1,11 +1,11 @@
1
1
  import { Service } from './chunk-SI7X6N46.js';
2
- import { commonExtraArgs, mapMetadata, getProvider, Namespace } from './chunk-WGMJCZSK.js';
3
- import { output, ComponentResource, normalizeInputsAndMap, normalizeInputs, normalize, toPromise, interpolate } from '@highstate/pulumi';
4
- import { gateway } from '@highstate/gateway-api';
5
- import { pipe, map, omit } from 'remeda';
2
+ import { commonExtraArgs, Namespace, mapMetadata, getProvider } from './chunk-WGMJCZSK.js';
3
+ import { output, ComponentResource, toPromise, interpolate, normalizeInputsAndMap, normalizeInputs, normalize } from '@highstate/pulumi';
6
4
  import { parseL3Endpoint } from '@highstate/common';
7
5
  import { getOrCreate } from '@highstate/contract';
6
+ import { gateway } from '@highstate/gateway-api';
8
7
  import { deepmerge } from 'deepmerge-ts';
8
+ import { omit, pipe, map } from 'remeda';
9
9
 
10
10
  function resolveBackendRef(ref) {
11
11
  if (Service.isInstance(ref)) {
@@ -29,54 +29,6 @@ function resolveBackendRef(ref) {
29
29
  port: ref.port
30
30
  });
31
31
  }
32
- var HttpRoute = class extends ComponentResource {
33
- /**
34
- * The underlying Kubernetes resource.
35
- */
36
- route;
37
- constructor(name, args, opts) {
38
- super("highstate:k8s:HttpRoute", name, args, opts);
39
- this.route = output(args.gateway).cluster.apply((cluster) => {
40
- return new gateway.v1.HTTPRoute(
41
- name,
42
- {
43
- metadata: mapMetadata(args, name).apply((metadata) => ({
44
- ...metadata,
45
- namespace: output(args.gateway).namespace.metadata.name
46
- })),
47
- spec: {
48
- hostnames: normalizeInputs(args.hostname, args.hostnames),
49
- parentRefs: [
50
- {
51
- name: output(args.gateway).metadata.name
52
- }
53
- ],
54
- rules: normalizeInputsAndMap(args.rule, args.rules, (rule) => ({
55
- timeouts: rule.timeouts,
56
- matches: pipe(
57
- normalize(rule.match, rule.matches),
58
- map(mapHttpRouteRuleMatch),
59
- addDefaultPathMatch
60
- ),
61
- filters: normalize(rule.filter, rule.filters),
62
- backendRefs: rule.backend ? [resolveBackendRef(rule.backend)] : void 0
63
- }))
64
- }
65
- },
66
- { ...opts, parent: this, provider: getProvider(cluster) }
67
- );
68
- });
69
- }
70
- };
71
- function addDefaultPathMatch(matches) {
72
- return matches.length ? matches : [{ path: { type: "PathPrefix", value: "/" } }];
73
- }
74
- function mapHttpRouteRuleMatch(match) {
75
- if (typeof match === "string") {
76
- return { path: { type: "PathPrefix", value: match } };
77
- }
78
- return match;
79
- }
80
32
  var gatewayExtraArgs = [...commonExtraArgs, "fqdn", "fqdns"];
81
33
  var Gateway = class _Gateway extends ComponentResource {
82
34
  constructor(type, name, args, opts, namespace, metadata, spec, status) {
@@ -331,7 +283,55 @@ var ExternalGateway = class extends Gateway {
331
283
  );
332
284
  }
333
285
  };
286
+ var HttpRoute = class extends ComponentResource {
287
+ /**
288
+ * The underlying Kubernetes resource.
289
+ */
290
+ route;
291
+ constructor(name, args, opts) {
292
+ super("highstate:k8s:HttpRoute", name, args, opts);
293
+ this.route = output(args.gateway).cluster.apply((cluster) => {
294
+ return new gateway.v1.HTTPRoute(
295
+ name,
296
+ {
297
+ metadata: mapMetadata(args, name).apply((metadata) => ({
298
+ ...metadata,
299
+ namespace: output(args.gateway).namespace.metadata.name
300
+ })),
301
+ spec: {
302
+ hostnames: normalizeInputs(args.hostname, args.hostnames),
303
+ parentRefs: [
304
+ {
305
+ name: output(args.gateway).metadata.name
306
+ }
307
+ ],
308
+ rules: normalizeInputsAndMap(args.rule, args.rules, (rule) => ({
309
+ timeouts: rule.timeouts,
310
+ matches: pipe(
311
+ normalize(rule.match, rule.matches),
312
+ map(mapHttpRouteRuleMatch),
313
+ addDefaultPathMatch
314
+ ),
315
+ filters: normalize(rule.filter, rule.filters),
316
+ backendRefs: rule.backend ? [resolveBackendRef(rule.backend)] : void 0
317
+ }))
318
+ }
319
+ },
320
+ { ...opts, parent: this, provider: getProvider(cluster) }
321
+ );
322
+ });
323
+ }
324
+ };
325
+ function addDefaultPathMatch(matches) {
326
+ return matches.length ? matches : [{ path: { type: "PathPrefix", value: "/" } }];
327
+ }
328
+ function mapHttpRouteRuleMatch(match) {
329
+ if (typeof match === "string") {
330
+ return { path: { type: "PathPrefix", value: match } };
331
+ }
332
+ return match;
333
+ }
334
334
 
335
335
  export { Gateway, HttpRoute, mapHttpRouteRuleMatch, resolveBackendRef };
336
- //# sourceMappingURL=chunk-NXSYCA3V.js.map
337
- //# sourceMappingURL=chunk-NXSYCA3V.js.map
336
+ //# sourceMappingURL=chunk-UF3ADZGM.js.map
337
+ //# sourceMappingURL=chunk-UF3ADZGM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/gateway/backend.ts","../src/gateway/gateway.ts","../src/gateway/http-route.ts"],"names":["output","ComponentResource","gateway"],"mappings":"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","file":"chunk-UF3ADZGM.js","sourcesContent":["import type { core } from \"@pulumi/kubernetes\"\nimport { type Input, type 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, network } from \"@highstate/library\"\nimport type { types } from \"@pulumi/kubernetes\"\nimport type { SetRequired } from \"type-fest\"\nimport { parseL3Endpoint } from \"@highstate/common\"\nimport { getOrCreate } from \"@highstate/contract\"\nimport { gateway, type types as gwTypes } from \"@highstate/gateway-api\"\nimport {\n ComponentResource,\n type ComponentResourceOptions,\n type Input,\n type InputArray,\n type Inputs,\n interpolate,\n type Output,\n output,\n toPromise,\n} from \"@highstate/pulumi\"\nimport { deepmerge } from \"deepmerge-ts\"\nimport { omit } from \"remeda\"\nimport { Namespace } from \"../namespace\"\nimport { commonExtraArgs, getProvider, mapMetadata, type ScopedResourceArgs } from \"../shared\"\n\nexport type GatewayArgs = ScopedResourceArgs & {\n /**\n * The FQDN to configure the listeners for.\n */\n fqdn?: Input<string>\n\n /**\n * The FQDNs to configure the listeners for.\n */\n fqdns?: InputArray<string>\n} & gwTypes.input.gateway.v1.GatewaySpec\n\nexport type CreateOrGetGatewayArgs = GatewayArgs & {\n /**\n * The gateway entity to patch/retrieve.\n */\n existing: Input<k8s.Gateway> | undefined\n}\n\nconst gatewayExtraArgs = [...commonExtraArgs, \"fqdn\", \"fqdns\"] as const\n\n/**\n * Represents a Kubernetes Gateway resource.\n */\nexport abstract class Gateway extends ComponentResource {\n protected constructor(\n type: string,\n name: string,\n args: Inputs,\n opts: ComponentResourceOptions | undefined,\n\n /**\n * The namespace where the gateway is located.\n */\n readonly namespace: Output<Namespace>,\n\n /**\n * The metadata of the underlying Kubernetes gateway.\n */\n readonly metadata: Output<types.output.meta.v1.ObjectMeta>,\n\n /**\n * The spec of the underlying Gateway resource.\n */\n readonly spec: Output<gwTypes.output.gateway.v1.GatewaySpec>,\n\n /**\n * The status of the underlying Gateway resource.\n */\n readonly status: Output<gwTypes.output.gateway.v1.GatewayStatus>,\n ) {\n super(type, name, args, opts)\n }\n\n /**\n * The cluster where the gateway is located.\n */\n get cluster(): Output<k8s.Cluster> {\n return this.namespace.cluster\n }\n\n /**\n * The Highstate gateway entity.\n */\n get entity(): Output<k8s.Gateway> {\n return output({\n type: \"gateway\",\n clusterId: this.cluster.id,\n clusterName: this.cluster.name,\n metadata: this.metadata,\n })\n }\n\n /**\n * Returns the endpoints L3 endpoints on which the gateway is exposed.\n */\n get endpoints(): Output<network.L3Endpoint[]> {\n return this.status.addresses.apply(addresses => {\n if (!addresses) {\n return []\n }\n\n return addresses.map(address => parseL3Endpoint(address.value))\n })\n }\n\n /**\n * Creates a new gateway.\n */\n static create(name: string, args: GatewayArgs, opts?: ComponentResourceOptions): Gateway {\n return new CreatedGateway(name, args, opts)\n }\n\n /**\n * Creates a new gateway or patches an existing one.\n *\n * @param name The name of the resource. May not be the same as the gateway name.\n * @param args The arguments to create or patch the gateway with.\n * @param opts Optional resource options.\n */\n static createOrPatch(\n name: string,\n args: CreateOrGetGatewayArgs,\n opts?: ComponentResourceOptions,\n ): Gateway {\n if (args.existing) {\n return new GatewayPatch(name, {\n ...args,\n name: output(args.existing).metadata.name,\n namespace: Namespace.forResourceAsync(args.existing, output(args.namespace).cluster),\n })\n }\n\n return new CreatedGateway(name, args, opts)\n }\n\n /**\n * Creates a new gateway or gets an existing one.\n *\n * @param name The name of the resource. May not be the same as the gateway name. Will not be used when existing gateway is retrieved.\n * @param args The arguments to create or get the gateway with.\n * @param opts Optional resource options.\n */\n static async createOrGet(\n name: string,\n args: CreateOrGetGatewayArgs,\n opts?: ComponentResourceOptions,\n ): Promise<Gateway> {\n if (args.existing) {\n return await Gateway.forAsync(args.existing, output(args.namespace).cluster)\n }\n\n return new CreatedGateway(name, args, opts)\n }\n\n /**\n * Patches an existing gateway.\n *\n * Will throw an error if the gateway does not exist.\n *\n * @param name The name of the resource. May not be the same as the gateway name.\n * @param args The arguments to patch the gateway with.\n * @param opts Optional resource options.\n */\n static patch(name: string, args: GatewayArgs, opts?: ComponentResourceOptions): Gateway {\n return new GatewayPatch(name, args, opts)\n }\n\n /**\n * Wraps an existing Kubernetes gateway.\n */\n static wrap(name: string, args: WrappedGatewayArgs, opts?: ComponentResourceOptions): Gateway {\n return new WrappedGateway(name, args, opts)\n }\n\n /**\n * Gets an existing gateway.\n *\n * Will throw an error if the gateway does not exist.\n */\n static get(name: string, args: ExternalGatewayArgs, opts?: ComponentResourceOptions): Gateway {\n return new ExternalGateway(name, args, opts)\n }\n\n private static readonly gatewayCache = new Map<string, Gateway>()\n\n /**\n * Gets an existing gateway for a given entity.\n * Prefer this method over `get` when possible.\n *\n * It automatically names the resource with the following format: `{clusterName}.{namespace}.{gatewayName}.{clusterId}`.\n *\n * This method is idempotent and will return the same instance for the same entity.\n *\n * @param entity The entity to get the gateway for.\n * @param cluster The cluster where the gateway is located.\n */\n static for(entity: k8s.Gateway, cluster: Input<k8s.Cluster>): Gateway {\n return getOrCreate(\n Gateway.gatewayCache,\n `${entity.clusterName}.${entity.metadata.namespace}.${entity.metadata.name}.${entity.clusterId}`,\n name => {\n return Gateway.get(name, {\n name: entity.metadata.name,\n namespace: Namespace.forResourceAsync(entity, cluster),\n })\n },\n )\n }\n\n /**\n * Gets an existing gateway for a given entity.\n * Prefer this method over `get` when possible.\n *\n * It automatically names the resource with the following format: `{clusterName}.{namespace}.{gatewayName}.{clusterId}`.\n *\n * This method is idempotent and will return the same instance for the same entity.\n *\n * @param entity The entity to get the gateway for.\n * @param cluster The cluster where the gateway is located.\n */\n static async forAsync(entity: Input<k8s.Gateway>, cluster: Input<k8s.Cluster>): Promise<Gateway> {\n const resolvedEntity = await toPromise(entity)\n\n return Gateway.for(resolvedEntity, output(cluster))\n }\n\n /**\n * Creates a gateway with the provided name/namespace/cluster only once.\n *\n * It automatically names the resource with the following format: `{name}.{namespace}.{clusterName}.{clusterId}`.\n *\n * This method is idempotent and will return the same instance for the same name/namespace/cluster.\n *\n * @param name The name of the gateway to create.\n * @param args The arguments to create the gateway with.\n * @param opts Optional resource options.\n */\n static async createOnce(\n args: SetRequired<GatewayArgs, \"name\">,\n opts?: ComponentResourceOptions,\n ): Promise<Gateway> {\n const { name, namespace, cluster } = await toPromise({\n name: args.name,\n namespace: output(args.namespace).metadata.name,\n cluster: output(args.namespace).cluster,\n })\n\n const fullName = `${name}.${namespace}.${cluster.name}.${cluster.id}`\n\n return getOrCreate(Gateway.gatewayCache, name, () =>\n Gateway.create(\n fullName,\n {\n ...args,\n name,\n namespace: args.namespace,\n },\n opts,\n ),\n )\n }\n}\n\nclass CreatedGateway extends Gateway {\n constructor(name: string, args: GatewayArgs, opts?: ComponentResourceOptions) {\n const gatewayResource = output(args.namespace).cluster.apply(cluster => {\n return new gateway.v1.Gateway(\n name,\n {\n metadata: mapMetadata(args, name),\n spec: deepmerge({}, omit(args, gatewayExtraArgs)),\n },\n { ...opts, parent: this, provider: getProvider(cluster) },\n )\n })\n\n super(\n \"highstate:k8s:Gateway\",\n name,\n args,\n opts,\n\n output(args.namespace),\n gatewayResource.metadata as Output<types.output.meta.v1.ObjectMeta>,\n gatewayResource.spec,\n gatewayResource.status,\n )\n }\n}\n\nclass GatewayPatch extends Gateway {\n constructor(name: string, args: GatewayArgs, opts?: ComponentResourceOptions) {\n const gatewayResource = output(args.namespace).cluster.apply(cluster => {\n return new gateway.v1.GatewayPatch(\n name,\n {\n metadata: mapMetadata(args, name),\n spec: deepmerge({}, omit(args, gatewayExtraArgs)),\n },\n { ...opts, parent: this, provider: getProvider(cluster) },\n )\n })\n\n super(\n \"highstate:k8s:GatewayPatch\",\n name,\n args,\n opts,\n\n output(args.namespace),\n gatewayResource.metadata as Output<types.output.meta.v1.ObjectMeta>,\n gatewayResource.spec,\n gatewayResource.status,\n )\n }\n}\n\nexport type WrappedGatewayArgs = {\n /**\n * The underlying Kubernetes gateway to wrap.\n */\n gateway: Input<gateway.v1.Gateway>\n\n /**\n * The namespace where the gateway is located.\n */\n namespace: Input<Namespace>\n}\n\nclass WrappedGateway extends Gateway {\n constructor(name: string, args: WrappedGatewayArgs, opts?: ComponentResourceOptions) {\n super(\n \"highstate:k8s:WrappedGateway\",\n name,\n args,\n opts,\n\n output(args.namespace),\n output(args.gateway).metadata as Output<types.output.meta.v1.ObjectMeta>,\n output(args.gateway).spec,\n output(args.gateway).status,\n )\n }\n}\n\nexport type ExternalGatewayArgs = {\n /**\n * The name of the gateway to get.\n */\n name: Input<string>\n\n /**\n * The namespace of the gateway to get.\n */\n namespace: Input<Namespace>\n}\n\nclass ExternalGateway extends Gateway {\n constructor(name: string, args: ExternalGatewayArgs, opts?: ComponentResourceOptions) {\n const gatewayResource = output(args.namespace).cluster.apply(cluster => {\n return gateway.v1.Gateway.get(\n name,\n interpolate`${output(args.namespace).metadata.name}/${args.name}`,\n { ...opts, parent: this, provider: getProvider(cluster) },\n )\n })\n\n super(\n \"highstate:k8s:ExternalGateway\",\n name,\n args,\n opts,\n\n output(args.namespace),\n gatewayResource.metadata as Output<types.output.meta.v1.ObjectMeta>,\n gatewayResource.spec,\n gatewayResource.status,\n )\n }\n}\n","import type { Gateway } from \"./gateway\"\nimport { gateway, type types } from \"@highstate/gateway-api\"\nimport {\n ComponentResource,\n type ComponentResourceOptions,\n type Input,\n type InputArray,\n normalize,\n normalizeInputs,\n normalizeInputsAndMap,\n type Output,\n output,\n} from \"@highstate/pulumi\"\nimport { map, pipe } from \"remeda\"\nimport { getProvider, mapMetadata, type ScopedResourceArgs } from \"../shared\"\nimport { type BackendRef, resolveBackendRef } from \"./backend\"\n\nexport type HttpRouteArgs = Omit<ScopedResourceArgs, \"namespace\"> & {\n /**\n * The gateway to associate with the route.\n */\n gateway: Input<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(args.gateway).cluster.apply(cluster => {\n return new gateway.v1.HTTPRoute(\n name,\n {\n metadata: mapMetadata(args, name).apply(metadata => ({\n ...metadata,\n namespace: output(args.gateway).namespace.metadata.name,\n })),\n spec: {\n hostnames: normalizeInputs(args.hostname, args.hostnames),\n\n parentRefs: [\n {\n name: output(args.gateway).metadata.name,\n },\n ],\n\n rules: normalizeInputsAndMap(args.rule, args.rules, 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 { ...opts, parent: this, provider: getProvider(cluster) },\n )\n })\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"]}