From 7897feafa4f7e3eaa3c96bbcf0484b022e5f8f86 Mon Sep 17 00:00:00 2001 From: Ahmed Hesham Abdelkader <23265119+ahmedhesham6@users.noreply.github.com> Date: Sun, 2 Jun 2024 13:12:39 +0300 Subject: [PATCH] Feat: Local Volume (#94) * Feat: Local Volume * or string --- v1/traits/traits.cue | 18 ++++- v1/transformers/kubernetes/transformers.cue | 89 ++++++++++++++++++++- 2 files changed, 104 insertions(+), 3 deletions(-) diff --git a/v1/traits/traits.cue b/v1/traits/traits.cue index 8da2c28..2543bf1 100644 --- a/v1/traits/traits.cue +++ b/v1/traits/traits.cue @@ -199,7 +199,14 @@ import ( // work around ambiguous disjunctions by disallowing fields #VolumeSpec: { - local: string + local: { + name: string + storage: string + volumeMode: string | *"Filesystem" + accessModes: [string] | *["ReadWriteOnce"] + path: string + node: string + } | string secret?: _|_ ephemeral?: _|_ persistent?: _|_ @@ -225,7 +232,14 @@ import ( $metadata: traits: Volume: null volumes: [string]: #VolumeSpec & { - local: string + local: { + name: string + storage: string + volumeMode: string | *"Filesystem" + accessModes: [string] | *["ReadWriteOnce"] + path: string + node: string + } | string secret?: _|_ ephemeral?: _|_ persistent?: _|_ diff --git a/v1/transformers/kubernetes/transformers.cue b/v1/transformers/kubernetes/transformers.cue index 347dc56..4710fc1 100644 --- a/v1/transformers/kubernetes/transformers.cue +++ b/v1/transformers/kubernetes/transformers.cue @@ -388,6 +388,14 @@ _CreateContainers: { } } } + if volume.local != _|_ { + { + name: volume.local.name + persistentVolumeClaim: { + claimName: "pvc-\(volume.local.name)" + } + } + } }, ] "containers": [ @@ -398,6 +406,9 @@ _CreateContainers: { if mount.volume.ephemeral != _|_ { name: mount.volume.ephemeral } + if mount.volume.local != _|_ { + name: mount.volume.local + } if mount.volume.secret != _|_ { name: mount.volume.secret.name } @@ -414,6 +425,82 @@ _CreateContainers: { } } +#AddWorkloadLocalVolumes: v1.#Transformer & { + v1.#Component + traits.#Volume + + volumes: _ + + $resources: { + for _, volume in volumes { + if volume.local != _|_ { + "local-pv-\(volume.local.name)": { + _#KubernetesMeta + $metadata: labels: { + driver: "kubernetes" + type: "k8s.io/api/v1/PersistentVolume" + } + apiVersion: "v1" + kind: "PersistentVolume" + metadata: { + name: "local-pv-\(volume.local.name)" + } + spec: { + capacity: { + storage: volume.local.storage + } + accessModes: volume.local.accessModes + persistentVolumeReclaimPolicy: "Retain" + storageClassName: "local-storage" + local: { + path: volume.local.path + } + nodeAffinity: { + required: { + nodeSelectorTerms: [ + { + matchExpressions: [ + { + key: "kubernetes.io/hostname" + operator: "In" + values: [ + volume.local.node, + ] + }, + ] + }, + ] + } + } + } + } + "pvc-\(volume.local.name)": { + _#KubernetesMeta + $metadata: labels: { + driver: "kubernetes" + type: "k8s.io/api/v1/PersistentVolumeClaim" + } + apiVersion: "v1" + kind: "PersistentVolumeClaim" + metadata: { + name: "pvc-\(volume.local.name)" + } + spec: { + accessModes: volume.local.accessModes + storageClassName: "local-storage" + resources: { + requests: { + storage: volume.local.storage + } + } + volumeName: "local-pv-\(volume.local.name)" + } + } + } + } + } +} + #AddWorkloadProbes: v1.#Transformer & { v1.#Component traits.#Workload @@ -466,7 +553,7 @@ _#IngressResource: { } spec: { "ingressClassName": ingressClassName - let routeRules = [ for rule in http.rules { + let routeRules = [for rule in http.rules { http: { paths: [{ if strings.HasSuffix(rule.match.path, "*") {