From 79ba8b75ff7a9e7d58d1c7966c4fb2e37c11a7f2 Mon Sep 17 00:00:00 2001
From: Michael Jerger <michael.jerger@meissa-gmbh.de>
Date: Tue, 7 Jan 2025 17:51:46 +0100
Subject: [PATCH] fix c4k

---
 Makefile                           |  2 +-
 deps.edn                           |  4 +-
 src/dda/build/c4k.clj              | 86 +++++++++++-------------------
 src/dda/build/c4k/domain.clj       | 34 +++++-------
 src/dda/build/gopass.clj           |  8 +++
 src/dda/build/infrastructure.clj   |  2 +-
 test/dda/build/c4k/domain_test.clj | 60 +++++++++++----------
 7 files changed, 86 insertions(+), 110 deletions(-)

diff --git a/Makefile b/Makefile
index 1adaaf1..eef929f 100644
--- a/Makefile
+++ b/Makefile
@@ -62,7 +62,7 @@ install: build-jar
 	clojure -T:build install
 
 deploy: build-jar
-	$(info --------- install library jar ---------)
+	$(info --------- deploy library jar ---------)
 	clojure -T:build deploy
 
 publish: build-jar
diff --git a/deps.edn b/deps.edn
index f8eba13..3f6c33c 100644
--- a/deps.edn
+++ b/deps.edn
@@ -5,9 +5,9 @@
  ["src" "resources"]
 
  :deps
- {org.clojure/clojure {:mvn/version "1.11.4"}
-  org.clojure/spec.alpha {:mvn/version "0.5.238"}
+ {org.clojure/spec.alpha {:mvn/version "0.5.238"}
   orchestra/orchestra {:mvn/version "2021.01.01-1"}
+  aero/aero {:mvn/version "1.1.6"}
   org.domaindrivenarchitecture/c4k-common-clj {:mvn/version "8.0.1-SNAPSHOT"}
   cheshire/cheshire {:mvn/version "5.13.0"}}
 
diff --git a/src/dda/build/c4k.clj b/src/dda/build/c4k.clj
index 4506341..a61b584 100644
--- a/src/dda/build/c4k.clj
+++ b/src/dda/build/c4k.clj
@@ -1,83 +1,59 @@
 (ns dda.build.c4k
   (:require [orchestra.core :refer [defn-spec]]
             [clojure.spec.test.alpha :as st]
-            [cheshire.core :refer [parse-string generate-string]]
-            [dda.build.devops :as d]
+            [cheshire.core :as cs]
+            [dda.build.devops :as devops]
+            [dda.build.terragrunt :as tg]
+            [dda.build.config :as cfg]
             [dda.build.c4k.domain :as domain]
-            [dda.build.terragrunt.domain :as tg-domain]
             [dda.build.infrastructure :as i]))
 
 (st/instrument `clean-build-dir!)
 
 (def default
-  (merge d/default {:autoapply false
-                    :c4k-output-filename "c4k-app.yaml"
-                    :c4k-config-filename "c4k-config.yaml"
-                    :c4k-auth-filename "c4k-auth.yaml"}))
+  (merge devops/default
+         tf/default
+         {:c4k-output "c4k-app.yaml"
+          :c4k-config-input "c4k-config.edn"
+          :c4k-auth-input "c4k-auth.edn"}))
+
+(s/def ::c4k (s/merge 
+              ::devops/devops
+              ::tg/tg
+              (s/keys :opt-un [::domain/c4k-output ::domain/c4k-config-input ::domain/c4k-auth-input])))
 
 (defn-spec clean-build-dir! nil?
-  [devops ::d/devops]
+  [devops ::c4kg]
   (let [config (merge default devops)]
     (i/execute! (domain/clean-build-dir-command config) config)))
 
 (defn-spec run-c4k-jar! nil?
-  [devops ::d/devops]
+  [devops ::c4kg]
   (let [config (merge default devops)]
     (doseq [c (domain/c4k-uberjar-command config)]
       (i/execute! c config))))
 
-(defn-spec run-c4k-executable! nil?
-  [devops ::d/devops]
+(defn-spec run-c4k-bin! nil?
+  [devops ::c4kg]
   (let [config (merge default devops)]
     (doseq [c (domain/c4k-graalvm-command config)]
       (i/execute! c config))))
 
-; TODO: Generate functions assume that files have already been copied,
-;       which will happen if this is run after terragrunt
-;       but it is not guaranteed
-(defn-spec generate-jar! nil?
-  "Generates c4k app yaml using 'c4k-{module}-standalone.jar'
-   Stores the result in 'c4k-app.yaml'
-   
-   Defaults: c4k-config.yaml c4k-auth.yaml c4k-app.yaml
-   can be changed by adding another value for ':c4k-config-filename', ':c4k-auth-filename', ':c4k-output-filename'
-  "
-  [devops ::d/devops]
-  (let [config (merge default devops)]
-    (run-c4k-jar! config)))
-
-(defn-spec generate! nil?
-  "Generates c4k app yaml using 'c4k-{module}' (graalvm executable)
-   Stores the result in 'c4k-app.yaml'
-   
-   Defaults: c4k-config.yaml c4k-auth.yaml c4k-app.yaml
-   can be changed by adding another value for ':c4k-config-filename', ':c4k-auth-filename', ':c4k-output-filename'
-  "
-  [devops ::d/devops]
-  (let [config (merge default devops)]
-    (run-c4k-executable! config)))
-
-(defn-spec insert-tf-out! nil?
-  "Inserts relevant values from the tf output into the c4k config
-   
-   Default: c4k-config.yaml
-   can be changed by adding another value for ':c4k-config-filename'
-   "
-  [devops ::d/devops
+(defn-spec write-c4k-objects! nil?
+  [devops ::c4kg
    tf-out ::tg-domain/tf-out]
   (let [config (merge default devops)
-        default-c4k-config (parse-string (slurp (domain/config-path config))
-                                         (fn [k] (keyword (.toLowerCase k))))
-        tf-out-c4k-config (domain/create-c4k-config config tf-out)]
-    (->> default-c4k-config
-         (merge tf-out-c4k-config)
-         (generate-string)
-         (spit (domain/config-path config)))))
-
+        {:keys [module c4k-auth-input c4k-config-input c4k-output]} config]
+    (->> (cfg/read-config (domain/config-path config))
+         (merge {:fqdn (:fqdn (:value (:out tf-out)))})
+         (cs/generate-string)
+         (spit (domain/config-path config)))
+    (->> (cfg/read-config (domain/config-auth config))
+         (cs/generate-string)
+         (spit (domain/config-auth config))
+    (run-c4k-jar! config)))
 
 (st/instrument `clean-build-dir!)
 (st/instrument `run-c4k-jar!)
-(st/instrument `run-c4k-executable!)
-(st/instrument `generate-jar!)
-(st/instrument `generate!)
-(st/instrument `insert-tf-out!)
+(st/instrument `run-c4k-bin!)
+(st/instrument `write-c4k-objects!)
diff --git a/src/dda/build/c4k/domain.clj b/src/dda/build/c4k/domain.clj
index 190a1d3..b7f69ca 100644
--- a/src/dda/build/c4k/domain.clj
+++ b/src/dda/build/c4k/domain.clj
@@ -1,32 +1,30 @@
 (ns dda.build.c4k.domain
   (:require [clojure.spec.alpha :as s]
             [orchestra.core :refer [defn-spec]]
-            [dda.build.devops.domain :as d]
-            [dda.build.terragrunt.domain :as td]))
+            [dda.build.devops.domain :as d]))
 
-(s/def ::c4k-output-filename string?)
-(s/def ::c4k-config-filename string?)
-(s/def ::c4k-auth-filename string?)
+(s/def ::c4k-output string?)
+(s/def ::c4k-config-input string?)
+(s/def ::c4k-auth-input string?)
 
 (s/def ::config
-  (s/keys :req-un [::d/name ::d/stage ::d/project-root-path ::d/build-dir-name ::d/debug
-                   ::d/dry-run ::c4k-output-filename ::c4k-config-filename ::c4k-auth-filename]
-          :opt-un [::d/module]))
+  (s/merge ::d/devops
+           (s/keys :req-un [::c4k-output ::c4k-config-input ::c4k-auth-input])))
 
 (defn-spec config-path string?
   [config ::config]
-  (let [{:keys [c4k-config-filename]} config]
-    (str (d/build-path config) "/" c4k-config-filename)))
+  (let [{:keys [c4k-config-input]} config]
+    (str (d/build-path config) "/" c4k-config-input)))
 
 (defn-spec auth-path string?
   [config ::config]
-  (let [{:keys [c4k-auth-filename]} config]
-    (str (d/build-path config) "/" c4k-auth-filename)))
+  (let [{:keys [c4k-auth-input]} config]
+    (str (d/build-path config) "/" c4k-auth-input)))
 
 (defn-spec output-path string?
   [config ::config]
-  (let [{:keys [c4k-output-filename]} config]
-    (str (d/build-path config) "/" c4k-output-filename)))
+  (let [{:keys [c4k-output]} config]
+    (str (d/build-path config) "/" c4k-output)))
 
 (defn-spec clean-build-dir-command seq?
   [config ::config]
@@ -43,11 +41,3 @@
   (let [{:keys [module]} config
         executable-name (str "c4k-" module)]
     [["bash" "-c" (str executable-name " " (config-path config) " " (auth-path config) " > " (output-path config))]]))
-
-(defn-spec create-c4k-config map?
-  [config ::config
-   tf-out ::td/tf-out]
-  (let [{:keys [stage]} config
-         issuer (if (= stage "prod") "prod" "staging")
-         fqdn (:fqdn (:value (:out tf-out)))]
-    {:issuer issuer :fqdn fqdn}))
diff --git a/src/dda/build/gopass.clj b/src/dda/build/gopass.clj
index daf2030..e05a4f4 100644
--- a/src/dda/build/gopass.clj
+++ b/src/dda/build/gopass.clj
@@ -2,6 +2,7 @@
   (:require [orchestra.core :refer [defn-spec]]
             [clojure.spec.test.alpha :as st]
             [cheshire.core :refer [parse-string generate-string]]
+            [aero.core :refer :as aero]
             [dda.build.devops :as d]
             [dda.build.gopass.domain :as domain]
             [dda.build.c4k.domain :as c4k-d]
@@ -45,6 +46,13 @@
          (generate-string)
          (spit (c4k-d/auth-path config)))))
 
+(defmethod aero/reader 'gopass
+  [{:keys [profile] :as opts} tag value]
+  (i/execute-output! (into ["gopass" "show" "-y" "-o"] value) {}))
+
+(defn read-config []
+  (aero/read-config "config.edn"))
+
 
 (st/instrument `run-gopass-command!)
 (st/instrument `resolve-gopass!)
diff --git a/src/dda/build/infrastructure.clj b/src/dda/build/infrastructure.clj
index e684fb2..53b067b 100644
--- a/src/dda/build/infrastructure.clj
+++ b/src/dda/build/infrastructure.clj
@@ -21,4 +21,4 @@
     (when-not dry-run
       (->> (t/shell command {:out :string})
            :out
-           clojure.string/trim))))
\ No newline at end of file
+           clojure.string/trim))))
diff --git a/test/dda/build/c4k/domain_test.clj b/test/dda/build/c4k/domain_test.clj
index 646a001..53fc632 100644
--- a/test/dda/build/c4k/domain_test.clj
+++ b/test/dda/build/c4k/domain_test.clj
@@ -21,9 +21,9 @@
                            :stage "dev"
                            :debug false
                            :dry-run false
-                           :c4k-config-filename "config.yaml"
-                           :c4k-auth-filename "auth.yaml"
-                           :c4k-output-filename "out.yaml"})))
+                           :c4k-config-input "config.yaml"
+                           :c4k-auth-input "auth.yaml"
+                           :c4k-output "out.yaml"})))
   (is (= "../../target/dda/backup/config.yaml"
          (cut/config-path {:name "dda"
                            :module "backup"
@@ -33,9 +33,9 @@
                            :stage "dev"
                            :debug false
                            :dry-run false
-                           :c4k-config-filename "config.yaml"
-                           :c4k-auth-filename "auth.yaml"
-                           :c4k-output-filename "out.yaml"}))))
+                           :c4k-config-input "config.yaml"
+                           :c4k-auth-input "auth.yaml"
+                           :c4k-output "out.yaml"}))))
 
 (deftest should-calculate-auth-path
   (is (= "../../target/dda-backup/auth.yaml"
@@ -46,9 +46,9 @@
                          :stage "dev"
                          :debug false
                          :dry-run false
-                         :c4k-config-filename "config.yaml"
-                         :c4k-auth-filename "auth.yaml"
-                         :c4k-output-filename "out.yaml"})))
+                         :c4k-config-input "config.yaml"
+                         :c4k-auth-input "auth.yaml"
+                         :c4k-output "out.yaml"})))
   (is (= "../../target/dda/backup/auth.yaml"
          (cut/auth-path {:name "dda"
                          :module "backup"
@@ -58,9 +58,9 @@
                          :stage "dev"
                          :debug false
                          :dry-run false
-                         :c4k-config-filename "config.yaml"
-                         :c4k-auth-filename "auth.yaml"
-                         :c4k-output-filename "out.yaml"}))))
+                         :c4k-config-input "config.yaml"
+                         :c4k-auth-input "auth.yaml"
+                         :c4k-output "out.yaml"}))))
 
 
 (deftest should-calculate-output-path
@@ -72,9 +72,9 @@
                            :stage "dev"
                            :debug false
                            :dry-run false
-                           :c4k-config-filename "config.yaml"
-                           :c4k-auth-filename "auth.yaml"
-                           :c4k-output-filename "out.yaml"})))
+                           :c4k-config-input "config.yaml"
+                           :c4k-auth-input "auth.yaml"
+                           :c4k-output "out.yaml"})))
   (is (= "../../target/dda/backup/out.yaml"
          (cut/output-path {:name "dda"
                            :module "backup"
@@ -84,9 +84,9 @@
                            :stage "dev"
                            :debug false
                            :dry-run false
-                           :c4k-config-filename "config.yaml"
-                           :c4k-auth-filename "auth.yaml"
-                           :c4k-output-filename "out.yaml"}))))
+                           :c4k-config-input "config.yaml"
+                           :c4k-auth-input "auth.yaml"
+                           :c4k-output "out.yaml"}))))
 
 (deftest should-calculate-clean-build-dir-command
   (is (= ["rm" "-rf" "../../target/dda-backup"]
@@ -97,33 +97,35 @@
                                        :stage "dev"
                                        :debug false
                                        :dry-run false
-                                       :c4k-config-filename "config.yaml"
-                                       :c4k-auth-filename "auth.yaml"
-                                       :c4k-output-filename "out.yaml"}))))
+                                       :c4k-config-input "config.yaml"
+                                       :c4k-auth-input "auth.yaml"
+                                       :c4k-output "out.yaml"}))))
 
 (deftest should-calculate-c4k-uberjar-command
-  (is (= ["bash" "-c" "c4k-dda-backup-standalone.jar ../../target/dda-backup/config.yaml ../../target/dda-backup/auth.yaml > ../../target/dda-backup/out.yaml"]
+  (is (= [["bash" "-c" "c4k-backup-standalone.jar ../../target/dda-backup/backup/config.yaml ../../target/dda-backup/backup/auth.yaml > ../../target/dda-backup/backup/out.yaml"]]
          (cut/c4k-uberjar-command {:name "dda-backup"
+                                   :module "backup"
                                    :project-root-path "../.."
                                    :build-dir-name "target"
                                    :version "4.11.8-dev"
                                    :stage "dev"
                                    :debug false
                                    :dry-run false
-                                   :c4k-config-filename "config.yaml"
-                                   :c4k-auth-filename "auth.yaml"
-                                   :c4k-output-filename "out.yaml"}))))
+                                   :c4k-config-input "config.yaml"
+                                   :c4k-auth-input "auth.yaml"
+                                   :c4k-output "out.yaml"}))))
 
 (deftest should-calculate-c4k-graalvm-command
-  (is (= ["bash" "-c" "c4k-dda-backup ../../target/dda-backup/config.yaml ../../target/dda-backup/auth.yaml > ../../target/dda-backup/out.yaml"]
+  (is (= [["bash" "-c" "c4k-backup ../../target/dda-backup/backup/config.yaml ../../target/dda-backup/backup/auth.yaml > ../../target/dda-backup/backup/out.yaml"]]
          (cut/c4k-graalvm-command {:name "dda-backup"
+                                   :module "backup"
                                    :project-root-path "../.."
                                    :build-dir-name "target"
                                    :version "4.11.8-dev"
                                    :stage "dev"
                                    :debug false
                                    :dry-run false
-                                   :c4k-config-filename "config.yaml"
-                                   :c4k-auth-filename "auth.yaml"
-                                   :c4k-output-filename "out.yaml"}))))
+                                   :c4k-config-input "config.yaml"
+                                   :c4k-auth-input "auth.yaml"
+                                   :c4k-output "out.yaml"}))))