XClusterlivewyer-ops/configuration-piraeus@v0.0.2
TypeComposition
Referenced XRDXCluster
YAML
Composition
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