UNPKG

k8ts

Version:

Powerful framework for building Kubernetes manifests in TypeScript.

67 lines (62 loc) 2.24 kB
import { Resource_Top, ResourcesSpec, Unit, type Resource_Ref_Full } from "@k8ts/instruments" import { CDK } from "@k8ts/sample-interfaces" import { Prefix$ } from "../../../_type/prefix$" import { MakeError } from "../../../error" import { v1 } from "../../../kinds/default" import { storage } from "../../../kinds/storage" import { Access } from "../access-mode" import type { Pv_VolumeMode } from "../block-mode" import type { Pv, Pv_Ref } from "../volume" const StorageClassKind = storage.v1.StorageClass._ const pvc_ResourcesSpec = ResourcesSpec.make({ storage: Unit.Data }) type Pvc_Resources = Prefix$<(typeof pvc_ResourcesSpec)["__INPUT__"]> export interface Pvc_Props<Mode extends Pv_VolumeMode> extends Pvc_Resources { $accessModes: Access $mode?: Mode $storageClass?: Resource_Ref_Full<typeof StorageClassKind> $bind?: Pv_Ref<Mode> } export class Pvc<Mode extends Pv_VolumeMode, Name extends string = string> extends Resource_Top< Name, Pvc_Props<Mode> > { declare name: Name get kind() { return v1.PersistentVolumeClaim._ } protected __needs__() { const self = this return { bind: self.bound, storageClass: self.props.$storageClass } } protected body(): CDK.KubePersistentVolumeClaimProps { const self = this const { $storage, $accessModes, $mode, $storageClass, $bind } = self.props const nAccessModes = Access.pv_parseAccessMode($accessModes) if (!$bind && !$storageClass) { throw new MakeError( `While manifesting ${self.node.format("source")}, PVC that doesn't have a $bind must have a $storageClass.` ) } return { spec: { accessModes: nAccessModes, volumeName: self.props.$bind?.name, volumeMode: $mode, resources: pvc_ResourcesSpec .parse({ storage: $storage }) .toObject(), storageClassName: self.props.$storageClass?.name ?? "standard" } } } get bound() { return this.props.$bind as Pv<Mode> | undefined } }