Trait: Add TraitDefinition for PVC (#2158)

* Feat(trait): add trait definition for persistent volume claim

* Feat(trait): add trait definition for persistent volume claim
This commit is contained in:
Reeta Singh
2021-08-27 18:45:22 +08:00
committed by GitHub
parent 5fcc2ad9f7
commit 950411dbe8
3 changed files with 263 additions and 0 deletions
@@ -0,0 +1,120 @@
# Code generated by KubeVela templates. DO NOT EDIT. Please edit the original cue file.
# Definition source cue file: vela-templates/definitions/internal/pvc.cue
apiVersion: core.oam.dev/v1beta1
kind: TraitDefinition
metadata:
annotations:
definition.oam.dev/description: Create a Persistent Volume Claim and mount the PVC as volume to the first container in the pod
name: pvc
namespace: {{.Values.systemDefinitionNamespace}}
spec:
appliesToWorkloads:
- deployments.apps
podDisruptive: true
schematic:
cue:
template: |
patch: spec: template: spec: {
containers: [{
if parameter.volumeMode == "Block" {
// +patchKey=name
volumeDevices: [
for v in parameter.volumesToMount {
{
name: v.name
devicePath: v.devicePath
}
},
]
}
if parameter.volumeMode == "Filesystem" {
// +patchKey=name
volumeMounts: [
for v in parameter.volumesToMount {
{
name: v.name
mountPath: v.mountPath
}
},
]
}
}]
// +patchKey=name
volumes: [
for v in parameter.volumesToMount {
{
name: v.name
persistentVolumeClaim: claimName: parameter.claimName
}
},
]
}
outputs: pvc: {
apiVersion: "v1"
kind: "PersistentVolumeClaim"
metadata: name: parameter.claimName
spec: {
accessModes: parameter.accessModes
volumeMode: parameter.volumeMode
if parameter.volumeName != _|_ {
volumeName: parameter.volumeName
}
if parameter.storageClassName != _|_ {
storageClassName: parameter.storageClassName
}
resources: requests: storage: parameter.resources.requests.storage
if parameter.resources.limits.storage != _|_ {
resources: limits: storage: parameter.resources.limits.storage
}
if parameter.dataSourceRef != _|_ {
dataSourceRef: parameter.dataSourceRef
}
if parameter.dataSource != _|_ {
dataSource: parameter.dataSource
}
if parameter.selector != _|_ {
dataSource: parameter.selector
}
}
}
parameter: {
claimName: string
volumeMode: *"Filesystem" | string
volumeName?: string
accessModes: [...string]
storageClassName?: string
resources: {
requests: storage: =~"^([1-9][0-9]{0,63})(E|P|T|G|M|K|Ei|Pi|Ti|Gi|Mi|Ki)$"
limits?: storage: =~"^([1-9][0-9]{0,63})(E|P|T|G|M|K|Ei|Pi|Ti|Gi|Mi|Ki)$"
}
dataSourceRef?: {
name: string
kind: string
apiGroup: string
}
dataSource?: {
name: string
kind: string
apiGroup: string
}
selector?: {
matchLabels?: [string]: string
matchExpressions?: {
key: string
values: [...string]
operator: string
}
}
volumesToMount: [...{
name: string
if volumeMode == "Block" {
devicePath: string
}
if volumeMode == "Filesystem" {
mountPath: string
}
}]
}
+117
View File
@@ -0,0 +1,117 @@
pvc: {
type: "trait"
annotations: {}
labels: {}
description: "Create a Persistent Volume Claim and mount the PVC as volume to the first container in the pod"
attributes: {
appliesToWorkloads: ["deployments.apps"]
podDisruptive: true
}
}
template: {
patch: spec: template: spec: {
containers: [{
if parameter.volumeMode == "Block" {
// +patchKey=name
volumeDevices: [
for v in parameter.volumesToMount {
{
name: v.name
devicePath: v.devicePath
}
},
]
}
if parameter.volumeMode == "Filesystem" {
// +patchKey=name
volumeMounts: [
for v in parameter.volumesToMount {
{
name: v.name
mountPath: v.mountPath
}
},
]
}
}]
// +patchKey=name
volumes: [
for v in parameter.volumesToMount {
{
name: v.name
persistentVolumeClaim: claimName: parameter.claimName
}
},
]
}
outputs: pvc: {
apiVersion: "v1"
kind: "PersistentVolumeClaim"
metadata: {
name: parameter.claimName
}
spec: {
accessModes: parameter.accessModes
volumeMode: parameter.volumeMode
if parameter.volumeName != _|_ {
volumeName: parameter.volumeName
}
if parameter.storageClassName != _|_ {
storageClassName: parameter.storageClassName
}
resources: requests: storage: parameter.resources.requests.storage
if parameter.resources.limits.storage != _|_ {
resources: limits: storage: parameter.resources.limits.storage
}
if parameter.dataSourceRef != _|_ {
dataSourceRef: parameter.dataSourceRef
}
if parameter.dataSource != _|_ {
dataSource: parameter.dataSource
}
if parameter.selector != _|_ {
dataSource: parameter.selector
}
}
}
parameter: {
claimName: string
volumeMode: *"Filesystem" | string
volumeName?: string
accessModes: [...string]
storageClassName?: string
resources: {
requests: storage: =~"^([1-9][0-9]{0,63})(E|P|T|G|M|K|Ei|Pi|Ti|Gi|Mi|Ki)$"
limits?: storage: =~"^([1-9][0-9]{0,63})(E|P|T|G|M|K|Ei|Pi|Ti|Gi|Mi|Ki)$"
}
dataSourceRef?: {
name: string
kind: string
apiGroup: string
}
dataSource?: {
name: string
kind: string
apiGroup: string
}
selector?: {
matchLabels?: [string]: string
matchExpressions?: {
key: string
values: [...string]
operator: string
}
}
volumesToMount: [...{
name: string
if volumeMode == "Block" {
devicePath: string
}
if volumeMode == "Filesystem" {
mountPath: string
}
}]
}
}
@@ -0,0 +1,26 @@
apiVersion: core.oam.dev/v1beta1
kind: Application
metadata:
name: application-with-pvc
spec:
components:
- name: busybox-runner
type: worker
properties:
image: busybox
cmd:
- sleep
- '1000'
traits:
- type: pvc
properties:
claimName: "busybox-pvc"
accessModes:
- "ReadWriteOnce"
volumeMode: "Block"
resources:
requests:
storage: "2Gi"
volumesToMount:
- name: "volume-with-pvc"
devicePath: "/tmp"