From 907332c15b87d9fd429ed169fa204e84f82c4b66 Mon Sep 17 00:00:00 2001 From: Michael Jerger <michael.jerger@meissa-gmbh.de> Date: Wed, 8 Jan 2025 16:51:58 +0100 Subject: [PATCH] provs now is working --- src/dda/build/provs.clj | 11 ++-- src/dda/build/provs/domain.clj | 47 +++++++++++---- src/dda/build/terragrunt/domain.clj | 3 - test/dda/build/provs/domain_test.clj | 71 ++++++++++++++++++++++- test/dda/build/terragrunt/domain_test.clj | 12 ++++ 5 files changed, 125 insertions(+), 19 deletions(-) diff --git a/src/dda/build/provs.clj b/src/dda/build/provs.clj index 0864bf2..5374d8e 100644 --- a/src/dda/build/provs.clj +++ b/src/dda/build/provs.clj @@ -5,12 +5,14 @@ [cheshire.core :refer [generate-string]] [dda.build.c4k :as c4k] [dda.build.terragrunt :as tg] + [dda.build.config :as cfg] [dda.build.provs.domain :as domain] [dda.build.infrastructure :as i])) (def default (merge c4k/default - {:k3s-output-filename "out_k3sServerConfig.yaml" + {:k3s-output-filename "out_k3sServerConfig.json" + :k3s-auth-input "k3s-auth.edn" :k3s-provision-user "root" :echo false})) (s/def ::provs (s/merge ::c4k/c4k @@ -28,9 +30,10 @@ (defn-spec write-k3s-config! nil? [devops ::provs tf-out ::tg/tf-out] - (let [config (merge default devops) - tf-out-k3s-config (domain/create-k3s-config config tf-out)] - (->> tf-out-k3s-config + (let [config (merge default devops)] + (->> (domain/create-k3s-config + (merge (cfg/read-config (domain/auth-path config)) config) + tf-out) (generate-string) (spit (domain/output-path config))))) diff --git a/src/dda/build/provs/domain.clj b/src/dda/build/provs/domain.clj index f2c6d2e..876fdc5 100644 --- a/src/dda/build/provs/domain.clj +++ b/src/dda/build/provs/domain.clj @@ -13,18 +13,35 @@ (s/def ::ipv4 pred/ipv4-string?) (s/def ::ipv6 pred/ipv6-string?) (s/def ::echo boolean?) +(s/def ::k3s-auth-input string?) (s/def ::k3s-output-filename string?) (s/def ::k3s-provision-user pred/bash-env-string?) +(s/def ::k3s-hcloudApiToken string?) +(s/def ::k3s-encryptionPassphrase string?) (s/def ::config - (s/merge ::c4k-d/config - (s/keys :req-un [::email ::echo ::k3s-output-filename ::k3s-provision-user ::fqdn ::ipv4 ::ipv6]))) + (s/merge ::c4k-d/config + (s/keys :req-un [::email ::echo ::k3s-output-filename ::k3s-auth-input ::k3s-provision-user ::fqdn ::ipv4 ::ipv6] + :opt-un [::k3s-hcloudApiToken ::k3s-encryptionPassphrase]))) + (s/def ::node (s/keys :req-un [::ipv4 ::ipv6])) (s/def ::letsencryptEndpoint pred/letsencrypt-issuer?) (s/def ::certmanager (s/keys :req-un [::email ::letsencryptEndpoint])) +(s/def ::parameter string?) +(s/def ::source string?) +(defn k3s-credential? [input] (s/valid? (s/keys :req-un [::source ::parameter]) input)) +(s/def ::hcloudApiToken k3s-credential?) +(s/def ::encryptionPassphrase k3s-credential?) +(s/def ::hetzner (s/keys :req-un [::hcloudApiToken ::encryptionPassphrase])) (s/def ::server-config - (s/keys :req-un [::fqdn ::node ::certmanager ::echo])) + (s/keys :req-un [::fqdn ::node ::certmanager ::echo] + :opt-un [::hetzner])) + +(defn-spec auth-path string? + [config ::config] + (let [{:keys [k3s-auth-input]} config] + (str (d/build-path config) "/" k3s-auth-input))) (defn-spec output-path string? [config ::config] @@ -35,19 +52,27 @@ [config ::config tf-out ::td/tf-out] (let [{:keys [k3s-output-filename k3s-provision-user]} config - fqdn (get-in tf-out [:out :value :fqdn])] + fqdn (get-in tf-out [:out :value :fqdn])] [["provs-server.jar" "k3s" (str k3s-provision-user "@" fqdn) "-c" (output-path config) "-a" (c4k-d/output-path config)]])) -(defn-spec create-k3s-config map? +(defn-spec create-k3s-config ::server-config [config ::config tf-out ::td/tf-out] (let [{:keys [stage email echo]} config letsencrypt-endpoint (if (= stage "prod") "prod" "staging") values (:value (:out tf-out)) {:keys [fqdn ipv4 ipv6]} values] - {:fqdn fqdn - :node {:ipv4 ipv4 - :ipv6 ipv6} - :certmanager {:email email - :letsencryptEndpoint letsencrypt-endpoint} - :echo echo})) + (merge + {:fqdn fqdn + :node {:ipv4 ipv4 + :ipv6 ipv6} + :certmanager {:email email + :letsencryptEndpoint letsencrypt-endpoint} + :echo echo} + (when (and (contains? config :k3s-encryptionPassphrase) + (contains? config :k3s-hcloudApiToken)) + {:hetzner + {:hcloudApiToken {:source "PLAIN" + :parameter (:k3s-hcloudApiToken config)} + :encryptionPassphrase {:source "PLAIN" + :parameter (:k3s-encryptionPassphrase config)}}})))) diff --git a/src/dda/build/terragrunt/domain.clj b/src/dda/build/terragrunt/domain.clj index a157a97..09b8373 100644 --- a/src/dda/build/terragrunt/domain.clj +++ b/src/dda/build/terragrunt/domain.clj @@ -13,15 +13,12 @@ (s/def ::ipv6 pred/ipv6-string?) (s/def ::value (s/keys :req-un [::fqdn ::ipv4 ::ipv6])) - (s/def ::out (s/keys :req-un [::sensitive ::type ::value])) - (s/def ::tf-out (s/keys :req-un [::out])) (s/def ::tg-output-filenname string?) - (s/def ::config (s/merge ::d/devops (s/keys :req-un [::tg-output-filenname] diff --git a/test/dda/build/provs/domain_test.clj b/test/dda/build/provs/domain_test.clj index 79680f9..7592256 100644 --- a/test/dda/build/provs/domain_test.clj +++ b/test/dda/build/provs/domain_test.clj @@ -19,9 +19,10 @@ :dry-run false :c4k-app-name "backup" :k3s-output-filename "k3s-out.yaml" + :k3s-auth-input "k3s-auth.edn" :k3s-provision-user "root" :c4k-config-input "config.yaml" - :c4k-auth-input"auth.yaml" + :c4k-auth-input "auth.yaml" :c4k-output "out.yaml" :email "test@test.t" :echo false @@ -30,3 +31,71 @@ :ipv6 "2a01:4f8:c012:cb41::1"} {:out {:sensitive false :type [] :value {:fqdn "test.test.de" :ipv4 "127.0.0.1" :ipv6 "::"}}})))) +(deftest should-create-k3s-config + (is (= {:fqdn "cloud.test.meissa.de", + :node {:ipv4 "91.107.220.172", :ipv6 "2a01:4f8:c17:86c6::1"}, + :certmanager {:email "test@test.t", :letsencryptEndpoint "staging"}, + :echo false, + :hetzner + {:hcloudApiToken {:source "PLAIN", :parameter "hcloud-token"}, + :encryptionPassphrase {:source "PLAIN", :parameter "passphrase"}}} + (cut/create-k3s-config + {:name "dda-backup" + :project-root-path "../.." + :build-dir-name "target" + :version "4.11.8-dev" + :stage "dev" + :debug false + :dry-run false + :c4k-app-name "backup" + :k3s-output-filename "k3s-out.yaml" + :k3s-auth-input "k3s-auth.edn" + :k3s-provision-user "root" + :k3s-hcloudApiToken "hcloud-token" + :k3s-encryptionPassphrase "passphrase" + :c4k-config-input "config.yaml" + :c4k-auth-input "auth.yaml" + :c4k-output "out.yaml" + :email "test@test.t" + :echo false + :fqdn "fq.dn" + :ipv4 "1.2.3.4" + :ipv6 "2a01:4f8:c012:cb41::1"} + {:out + {:sensitive false, + :type [], + :value {:fqdn "cloud.test.meissa.de", + :ipv4 "91.107.220.172", + :ipv6 "2a01:4f8:c17:86c6::1"}}}))) + (is (= {:fqdn "cloud.test.meissa.de", + :node {:ipv4 "91.107.220.172", :ipv6 "2a01:4f8:c17:86c6::1"}, + :certmanager {:email "test@test.t", :letsencryptEndpoint "staging"}, + :echo false,} + (cut/create-k3s-config + {:name "dda-backup" + :project-root-path "../.." + :build-dir-name "target" + :version "4.11.8-dev" + :stage "dev" + :debug false + :dry-run false + :c4k-app-name "backup" + :k3s-output-filename "k3s-out.yaml" + :k3s-auth-input "k3s-auth.edn" + :k3s-provision-user "root" + :k3s-encryptionPassphrase "passphrase" + :c4k-config-input "config.yaml" + :c4k-auth-input "auth.yaml" + :c4k-output "out.yaml" + :email "test@test.t" + :echo false + :fqdn "fq.dn" + :ipv4 "1.2.3.4" + :ipv6 "2a01:4f8:c012:cb41::1"} + {:out + {:sensitive false, + :type [], + :value {:fqdn "cloud.test.meissa.de", + :ipv4 "91.107.220.172", + :ipv6 "2a01:4f8:c17:86c6::1"}}})))) + diff --git a/test/dda/build/terragrunt/domain_test.clj b/test/dda/build/terragrunt/domain_test.clj index 5acc88f..32f3e12 100644 --- a/test/dda/build/terragrunt/domain_test.clj +++ b/test/dda/build/terragrunt/domain_test.clj @@ -1,6 +1,7 @@ (ns dda.build.terragrunt.domain-test (:require [clojure.test :refer [deftest is are testing run-tests]] + [clojure.spec.alpha :as s] [clojure.spec.test.alpha :as st] [dda.build.terragrunt.domain :as cut])) @@ -94,3 +95,14 @@ :autoapply false :tg-output-filenname "tg-out.json"})))) +(deftest should-validate-tf-out + (is (s/valid? + ::cut/tf-out + {:out + {:sensitive false, + :type [], + :value {:fqdn "cloud.test.meissa.de", + :ipv4 "91.107.220.172", + :ipv6 "2a01:4f8:c17:86c6::1"}}} +))) +