# Copyright 2019 Copyright (c) 2019 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

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

temp:
  <<: (( &temporary ))
  config: (( landscape.etcd.backup ))
  addon: (( read(dir "/provider.yaml") ))
  dir: (( __ctx.DIR "/provider/" config.type ))

plugins:
  - pinned:
    - helm:
      - etcd.main
      - template
    - kubectl: etcd.main
  - pinned:
    - helm:
      - etcd.events
      - template
    - kubectl: etcd.events

spec:
  <<: (( &temporary ))

  providertypes:
    gcs: GCS
    s3: S3
    swift: Swift

  server:
    commonName: garden:etcd-server:etcd
    validity: 87600
    usage:
      - ServerAuth
      - ClientAuth
      - KeyEncipherment
    hosts:
      - garden-etcd-main-0
      - <<: (( utilities.svcHosts("garden-etcd-main", landscape.namespace) ))
      - garden-etcd-events-0
      - <<: (( utilities.svcHosts("garden-etcd-events", landscape.namespace) ))
      - localhost

  client:
    commonName: garden:etcd-client:etcd
    validity: 87600
    usage:
      - ServerAuth
      - ClientAuth
      - KeyEncipherment

state:
  <<: (( &state(merge none) ))
  ca:      (( utilities.certs.selfSignedCA("garden:ca:etcd", false) ))
  server:  (( utilities.certs.keyCertForCA(spec.server, ca, false) ))
  client:  (( utilities.certs.keyCertForCA(spec.client, ca, false) ))

etcd:
  main:
    kubeconfig: (( landscape.clusters.[0].kubeconfig ))
    files:
      - "etcd.main/rendered_charts.yaml"
    source: chart
    name: garden-etcd-main
    namespace: (( .landscape.namespace ))
    values:
      name: (( main.name ))
      serviceAccount: (( .landscape.etcd.serviceAccount ))
      replicas: 1
      resources:
        <<: (( .landscape.versions.etcd.etcd.resources || ~ ))
      images:
        etcd: (( .landscape.versions.etcd.etcd.image_repo ":" .landscape.versions.etcd.etcd.image_tag ))
        etcd-backup-restore: (( .landscape.versions.etcd.backup_restore.image_repo ":" .landscape.versions.etcd.backup_restore.image_tag ))

      backup:
        schedule: "0 */24 * * *" # cron standard schedule
        maxBackups: 3 # Maximum number of backups to keep (may change in future)
        garbageCollectionPolicy: LimitBased
        storageProvider: (( spec.providertypes.[landscape.etcd.backup.type] ))  # Abs,Gcs,S3,Swift empty means no backup,
        secretData: (( sum[temp.config.credentials|{}|c,k,v|->c {k=base64(v)}] ))
        storageContainer: (( .landscape.etcd.backupBucket ))
        env: (( temp.addon.env ))
        volumeMounts: (( temp.addon.volumeMounts ))
        resources:
          <<: (( .landscape.versions.etcd.backup_restore.resources || ~ ))
      tls:
        ca:
          crt: (( state.ca.value.cert ))
          key: (( state.ca.value.key ))
        server:
          crt: (( state.server.value.cert ))
          key: (( state.server.value.key ))
        client:
          crt: (( state.client.value.cert ))
          key: (( state.client.value.key ))

  events:
    kubeconfig: (( landscape.clusters.[0].kubeconfig ))
    files:
      - "etcd.events/rendered_charts.yaml"
    source: chart
    name: garden-etcd-events
    namespace: (( .landscape.namespace ))
    values:
      name: (( events.name ))
      replicas: 1
      resources:
        limits:
          cpu: 1000m
          memory: 1024Mi
        requests:
          cpu: 1000m
          memory: 1024Mi
      images:
        etcd: (( .landscape.versions.etcd.etcd.image_repo ":" .landscape.versions.etcd.etcd.image_tag ))
        etcd-backup-restore: (( .landscape.versions.etcd.backup_restore.image_repo ":" .landscape.versions.etcd.backup_restore.image_tag ))

      tls:
        ca:
          crt: (( state.ca.value.cert ))
          key: (( state.ca.value.key ))
        server:
          crt: (( state.server.value.cert ))
          key: (( state.server.value.key ))
        client:
          crt: (( state.client.value.cert ))
          key: (( state.client.value.key ))

