
---
imports: (( &temporary ))
landscape: (( &temporary ))
env: (( &temporary ))

plugins:
  - kubectl
  - shoot-check

shoot-check:
  kubeconfig: (( imports.kube_apiserver.export.kubeconfig ))

# list of extensions taken from component.yaml (deployment.extensions)
extensions: (( &temporary ))

# instantiated manifest templates
rendered_extension_manifests: (( &temporary( sum[extensions|{}|s,n|-> s { n = *.spec_template }] ) ))

# auxiliary functions
extension_controllers_func:
  <<: (( &temporary ))
  ignore:
    - .git
  _joinPath: (( |p,c|-> p == "" ? c :(p "/" c) ))
  files: (( |d,p|->map[list_files(_._joinPath(d,p))|v|->contains(_.ignore, v) ? ~ :_._joinPath( p, v )] sum[map[list_dirs(d "/" p)|d|-> contains(_.ignore,d) ? ~ :d]|[]|s,v|->s _.files(d,_._joinPath(p, v))] ))
  chartConfig: (( |path,dir|-> archive( sum[extension_controllers_func.files( path, dir )|{}|s,e|->s { e = { "data" = read( path "/" e, "text" ) } }], "targz" ) ))

kubectl:
  kubeconfig: (( imports.kube_apiserver.export.kubeconfig ))
  manifests: (( rendered_extension_manifests.[*].manifest ))

# this template gets evaluated for each entry in extension_manifests
spec_template:
  <<: (( &temporary &template ))
  version: (( &temporary( .landscape.versions.gardener.extensions[n] ) ))
  manifest: (( *.extension_manifests[n] ))
  encoded_chart: (( &temporary( .extension_controllers_func.chartConfig( paths.prefix, paths.suffix ) ) ))
  paths:
    <<: (( &temporary ))
    raw: (( env.GENDIR "/extensions." n "/repo/" version.chart_path ))
    pos: (( lastindex( raw, "/" ) ))
    prefix: (( substr( raw, 0, pos ) ))
    suffix: (( substr( raw, pos + 1 ) ))

extension_manifests:
  <<: (( &temporary ))

########################################
  os-ubuntu:
########################################
    <<: (( &template ))
    apiVersion: core.gardener.cloud/v1beta1
    kind: ControllerRegistration
    metadata:
      name: os-ubuntu
    spec:
      deployment:
        providerConfig:
          chart: (( encoded_chart ))
          values:
            concurrentSyncs: 25
            image:
              repo: (( version.image_repo || ~~ ))
              tag: (( version.image_tag || ~~ ))
            resources:
              limits:
                cpu: 200m
                memory: 256Mi
              requests:
                cpu: 200m
                memory: 256Mi
        type: helm
      resources:
      - kind: OperatingSystemConfig
        type: ubuntu

########################################
  dns-external:
########################################
    <<: (( &template ))
    apiVersion: core.gardener.cloud/v1beta1
    kind: ControllerRegistration
    metadata:
      name: dns-external
    spec:
      resources:
      - kind: DNSProvider
        type: aws-route53
      - kind: DNSProvider
        type: alicloud-dns
      - kind: DNSProvider
        type: azure-dns
      - kind: DNSProvider
        type: google-clouddns
      - kind: DNSProvider
        type: openstack-designate
      - kind: DNSProvider
        type: cloudflare-dns
      deployment:
        type: helm
        providerConfig:
          chart: (( encoded_chart ))
          values:
            createCRDs: false
            fullnameOverride: seed-dns-controller-manager
            resources:
              requests:
                cpu: 200m
                memory: 512Mi
              limits:
                cpu: 200m
                memory: 512Mi
            image:
              repository: (( version.image_repo || ~~ ))
              tag: (( version.image_tag || ~~ ))
            configuration:
              kubeconfigDisableDeployCrds: true
              poolSize: 5
              controllers: dnscontrollers
              identifier: ""
              serverPortHttp: 8080

########################################
  provider-aws:
########################################
    <<: (( &template ))
    apiVersion: core.gardener.cloud/v1beta1
    kind: ControllerRegistration
    metadata:
      name: provider-aws
    spec:
      deployment:
        providerConfig:
          chart: (( encoded_chart ))
          values:
            image:
              repository: (( version.image_repo || ~~ ))
              tag: (( version.image_tag || ~~ ))
            imageVectorOverwrite: (( version.imageVectorOverwrite || ~ ))
            resources:
              <<: (( version.resources || ~ ))
            config:
              overrideHelmValues:
                <<: (( version.overrideHelmValues || ~ ))
            vpa:
              enabled: false
        type: helm
      resources:
      - kind: Infrastructure
        type: aws
      - kind: ControlPlane
        type: aws
      - kind: Worker
        type: aws
      - kind: BackupBucket
        type: aws
      - kind: BackupEntry
        type: aws

########################################
#  provider-azure:
#########################################
#    <<: (( &template ))
#    apiVersion: core.gardener.cloud/v1beta1
#    kind: ControllerRegistration
#    metadata:
#      name: provider-azure
#    spec:
#      # TODO: configure resources and imageVectorOverwrite for azure if we are going to integrate it
#      deployment:
#        providerConfig:
#          chart: (( encoded_chart ))
#          values:
#            image:
#              repository: (( version.image_repo || ~~ ))
#              tag: (( version.image_tag || ~~ ))
#            resources:
#              limits:
#                memory: 1Gi
#            vpa:
#              enabled: false
#              # updatePolicy:
#              #  updateMode: "Off"
#        type: helm
#      resources:
#      - kind: Infrastructure
#        type: azure
#      - kind: ControlPlane
#        type: azure
#      - kind: Worker
#        type: azure
#      - kind: BackupBucket
#        type: azure
#      - kind: BackupEntry
#        type: azure

########################################
  provider-gcp:
########################################
    <<: (( &template ))
    apiVersion: core.gardener.cloud/v1beta1
    kind: ControllerRegistration
    metadata:
      name: provider-gcp
    spec:
      deployment:
        providerConfig:
          chart: (( encoded_chart ))
          values:
            vpa:
              enabled: false
              # updatePolicy:
              #  updateMode: "Off"
            image:
              repository: (( version.image_repo || ~~ ))
              tag: (( version.image_tag || ~~ ))
            imageVectorOverwrite: (( version.imageVectorOverwrite || ~ ))
            resources:
              <<: (( version.resources || ~ ))
            config:
              overrideHelmValues:
                <<: (( version.overrideHelmValues || ~ ))
        type: helm
      resources:
      - kind: Infrastructure
        type: gcp
      - kind: ControlPlane
        type: gcp
      - kind: Worker
        type: gcp
      - kind: BackupBucket
        type: gcp
      - kind: BackupEntry
        type: gcp

########################################
  provider-openstack:
########################################
    <<: (( &template ))
    apiVersion: core.gardener.cloud/v1beta1
    kind: ControllerRegistration
    metadata:
      name: provider-openstack
    spec:
      deployment:
        providerConfig:
          chart: (( encoded_chart ))
          values:
            controllers:
              infrastructure:
                concurrentSyncs: 50
                ignoreOperationAnnotation: false
              worker:
                concurrentSyncs: 50
            image:
              repository: (( version.image_repo || ~~ ))
              tag: (( version.image_tag || ~~ ))
            resources:
              limits:
                memory: 1Gi
        type: helm
      resources:
      - kind: Infrastructure
        type: openstack
      - kind: ControlPlane
        type: openstack
      - kind: Worker
        type: openstack
      - kind: BackupBucket
        type: openstack
      - kind: BackupEntry
        type: openstack

########################################
  networking-calico:
########################################
    <<: (( &template ))
    apiVersion: core.gardener.cloud/v1beta1
    kind: ControllerRegistration
    metadata:
      name: networking-calico
    spec:
      deployment:
        providerConfig:
          chart: (( encoded_chart ))
          values:
            image:
              repository: (( version.image_repo || ~~ ))
              tag: (( version.image_tag || ~~ ))
            imageVectorOverwrite: (( version.imageVectorOverwrite || ~ ))
            resources:
              <<: (( version.resources || ~ ))
        type: helm
      resources:
      - kind: Network
        type: calico

########################################
#  shoot-cert-service:
#########################################
#    <<: (( &template ))
#    apiVersion: core.gardener.cloud/v1beta1
#    kind: ControllerRegistration
#    metadata:
#      name: shoot-cert-service
#    spec:
#      deployment:
#        type: helm
#        providerConfig:
#          chart: (( encoded_chart ))
#          values:
#            certificateConfig:
#              defaultIssuer:
#                name: garden
#                acme:
#                  email: (( valid( landscape.dashboard.terminals.cert.email ) ? landscape.dashboard.terminals.cert.email :( landscape.cert-manager.email || landscape.identity.users[0].email ) ))
#                  server: (( valid( landscape.dashboard.terminals.cert.server ) ? landscape.dashboard.terminals.cert.server :( landscape.cert-manager.server.url == "live" ? "https://acme-v02.api.letsencrypt.org/directory" :landscape.cert-manager.server.url ) ))
#                  privateKey: (( ( valid( landscape.dashboard.terminals.cert.privateKey ) ? landscape.dashboard.terminals.cert.privateKey :( ! valid( landscape.dashboard.terminals.cert.server ) ? landscape.cert-manager.privateKey :~~ ) ) || ~~ ))
#            image:
#              repository: (( version.image_repo || ~~ ))
#              tag: (( version.image_tag || ~~ ))
#      resources:
#      - kind: Extension
#        type: shoot-cert-service
#        globallyEnabled: true

########################################
  os-centos:
########################################
    <<: (( &template ))
    apiVersion: core.gardener.cloud/v1beta1
    kind: ControllerRegistration
    metadata:
      name: os-centos
    spec:
      deployment:
        providerConfig:
          chart: (( encoded_chart ))
          values:
            concurrentSyncs: 25
            image:
              repository: (( version.image_repo || ~~ ))
              tag: (( version.image_tag || ~~ ))
            resources:
              <<: (( version.resources || ~ ))
        type: helm
      resources:
      - kind: OperatingSystemConfig
        type: centos

########################################
  os-centos-tidb:
########################################
    <<: (( &template ))
    apiVersion: core.gardener.cloud/v1beta1
    kind: ControllerRegistration
    metadata:
      name: os-centos-tidb
    spec:
      deployment:
        providerConfig:
          chart: (( encoded_chart ))
          values:
            concurrentSyncs: 25
            image:
              repository: (( version.image_repo || ~~ ))
              tag: (( version.image_tag || ~~ ))

        type: helm
      resources:
      - kind: OperatingSystemConfig
        type: centos-tidb

########################################
  os-centos-v20210420:
########################################
    <<: (( &template ))
    apiVersion: core.gardener.cloud/v1beta1
    kind: ControllerRegistration
    metadata:
      name: os-centos-v20210420
    spec:
      deployment:
        providerConfig:
          chart: (( encoded_chart ))
          values:
            concurrentSyncs: 25
            image:
              repository: (( version.image_repo || ~~ ))
              tag: (( version.image_tag || ~~ ))
            resources:
              <<: (( version.resources || ~ ))
        type: helm
      resources:
      - kind: OperatingSystemConfig
        type: centos-v20210420

########################################
  os-centos-tidb-v20210420:
########################################
    <<: (( &template ))
    apiVersion: core.gardener.cloud/v1beta1
    kind: ControllerRegistration
    metadata:
      name: os-centos-tidb-v20210420
    spec:
      deployment:
        providerConfig:
          chart: (( encoded_chart ))
          values:
            concurrentSyncs: 25
            image:
              repository: (( version.image_repo || ~~ ))
              tag: (( version.image_tag || ~~ ))

        type: helm
      resources:
      - kind: OperatingSystemConfig
        type: centos-tidb-v20210420
