apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
name: cluster.piraeus.livewyer.io
creationTimestamp: null
spec:
compositeTypeRef:
apiVersion: piraeus.livewyer.io/v1alpha1
kind: XCluster
mode: Pipeline
pipeline:
- step: go-templating
functionRef:
name: upbound-function-go-templating
input:
apiVersion: gotemplating.fn.crossplane.io/v1beta1
inline:
template: >
{{ $id := .observed.composite.resource.metadata.name -}}
{{ $spec := .observed.composite.resource.spec -}}
apiVersion: piraeus.io/v1
kind: LinstorCluster
metadata:
name: {{ $id }}
annotations:
{{ setResourceNameAnnotation (printf "linstorcluster.piraeus.io/%s" $id) }}
labels:
piraeus.livewyer.io/cluster: {{ $id }}
spec:
{{- if $spec.cluster }}
{{ toYaml $spec.cluster | indent 2 }}
{{- else }}
{{ printf "{}" | indent 2}}
{{- end }}
---
{{- if $spec.nodeConnection }}
apiVersion: piraeus.io/v1
kind: LinstorNodeConnection
metadata:
name: {{ $id }}
annotations:
{{ setResourceNameAnnotation (printf "linstornodeconnections.piraeus.io/%s" $id) }}
labels:
piraeus.livewyer.io/cluster: {{ $id }}
spec:
{{ toYaml $spec.nodeConnection | indent 2 }}
---
{{- end }}
apiVersion: piraeus.io/v1
kind: LinstorSatelliteConfiguration
metadata:
name: {{ $id }}
annotations:
{{ setResourceNameAnnotation (printf "linstorsatelliteconfigurations.piraeus.io/%s" $id) }}
labels:
piraeus.livewyer.io/cluster: {{ $id }}
spec:
{{- if $spec.satelliteConfiguration }}
{{ toYaml $spec.satelliteConfiguration | indent 2 }}
{{- end }}
storagePools:
{{- range $index, $pool := $spec.storagePools }}
- name: {{ $pool.name }}
{{ $pool.type }}:
{{ toYaml $pool.spec | indent 8 }}
{{- end }}
---
{{- range $index, $pool := $spec.storagePools }}
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: {{ $id }}-{{ $pool.name }}
annotations:
{{ setResourceNameAnnotation (printf "storageclass.storage.k8s.io/%s-%s" $id $pool.name) }}
labels:
piraeus.livewyer.io/cluster: {{ $id }}
provisioner: linstor.csi.linbit.com
{{- if $pool.storageClass }}
allowVolumeExpansion: {{ default true
$pool.storageClass.allowVolumeExpansion }}
reclaimPolicy: {{ default "Delete" $pool.storageClass.reclaimPolicy
}}
parameters:
{{ deepCopy (default dict $pool.storageClass.parameters) | merge
(dict "linstor.csi.linbit.com/storagePool" $pool.name) | toYaml |
indent 2 }}
{{- if $pool.storageClass.allowedTopologies }}
allowedTopologies:
{{ toYaml $pool.storageClass.allowedTopologies | indent 2 }}
{{- end }}
{{- if $pool.storageClass.mountOptions }}
mountOptions:
{{ toYaml $pool.storageClass.mountOptions | indent 2 }}
{{- end }}
{{- if $pool.storageClass.volumeBindingMode }}
volumeBindingMode:
{{ toYaml $pool.storageClass.volumeBindingMode | indent 2 }}
{{- end }}
{{- end }}
---
{{- if default false $pool.snapshotClass.enabled }}
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
name: {{ $id }}-{{ $pool.name }}
annotations:
{{ setResourceNameAnnotation (printf "volumesnapshotclass.snapshot.storage.k8s.io/%s-%s" $id $pool.name) }}
labels:
piraeus.livewyer.io/cluster: {{ $id }}
driver: linstor.csi.linbit.com
deletionPolicy: {{ default "Delete"
$pool.snapshotClass.deletionPolicy }}
---
{{- end }}
{{- end }}
apiVersion: {{ .observed.composite.resource.apiVersion }}
kind: {{ .observed.composite.resource.kind }}
status:
{{- $linstorClusterId := dig "resources" (printf "linstorcluster.piraeus.io/%s" $id) "resource" "metadata" "name" "" $.observed }}
{{- if $linstorClusterId }}
linstorClusterId: {{ $linstorClusterId }}
{{- end }}
{{- $linstorStoragePools := list dict }}
{{- $linstorStoragePools := dig "resources" (printf "linstorsatelliteconfigurations.piraeus.io/%s" $id) "resource" "spec" "storagePools" (list dict) $.observed }}
linstorStoragePools:
{{ toYaml $linstorStoragePools | indent 4 }}
storageClasses:
{{- range $index, $pool := $spec.storagePools }}
- {{ $id }}-{{ $pool.name }}
{{- end }}
snapshotClasses:
{{- range $index, $pool := $spec.storagePools }}
{{- if default false $pool.snapshotClass.enabled }}
- {{ $id }}-{{ $pool.name }}
{{- else }}
- "WARN: Snapshot not enabled for {{ $id }}-{{ $pool.name }}"
{{- end }}
{{- end }}
kind: GoTemplate
source: Inline