From 1ab16b85296937fc573785f32adb55f8b8c9b843 Mon Sep 17 00:00:00 2001
From: Michael Jerger <michael.jerger@meissa-gmbh.de>
Date: Wed, 8 Jan 2025 10:32:22 +0100
Subject: [PATCH] c4k now works

---
 deps.edn                             |  3 +-
 src/dda/build/c4k.clj                | 63 +++++++++++++++-------------
 src/dda/build/c4k/domain.clj         | 11 ++---
 src/dda/build/config.clj             | 14 +++----
 src/dda/build/devops.clj             | 24 +++--------
 src/dda/build/devops/domain.clj      |  2 +-
 src/dda/build/gopass.clj             | 59 --------------------------
 src/dda/build/provs.clj              | 24 ++++-------
 test/dda/build/c4k/domain_test.clj   |  9 ++++
 test/dda/build/provs/domain_test.clj |  1 +
 10 files changed, 74 insertions(+), 136 deletions(-)
 delete mode 100644 src/dda/build/gopass.clj

diff --git a/deps.edn b/deps.edn
index 3f6c33c..0bbfe3a 100644
--- a/deps.edn
+++ b/deps.edn
@@ -5,7 +5,8 @@
  ["src" "resources"]
 
  :deps
- {org.clojure/spec.alpha {:mvn/version "0.5.238"}
+ {org.clojure/clojure {:mvn/version "1.12.0"}
+  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"}
diff --git a/src/dda/build/c4k.clj b/src/dda/build/c4k.clj
index a61b584..4c0822b 100644
--- a/src/dda/build/c4k.clj
+++ b/src/dda/build/c4k.clj
@@ -1,56 +1,59 @@
 (ns dda.build.c4k
-  (:require [orchestra.core :refer [defn-spec]]
-            [clojure.spec.test.alpha :as st]
-            [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.infrastructure :as i]))
-
-(st/instrument `clean-build-dir!)
+  (:require
+   [clojure.spec.alpha :as s]
+   [clojure.spec.test.alpha :as st]
+   [orchestra.core :refer [defn-spec]]
+   [dda.build.devops :as devops]
+   [dda.build.terragrunt :as tg]
+   [dda.build.config :as cfg]
+   [dda.build.c4k.domain :as domain]
+   [dda.build.infrastructure :as i]))
 
 (def default
   (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 
+(s/def ::c4k (s/merge
               ::devops/devops
-              ::tg/tg
-              (s/keys :opt-un [::domain/c4k-output ::domain/c4k-config-input ::domain/c4k-auth-input])))
+              (s/keys :opt-un [::domain/c4k-output ::domain/c4k-config-input ::domain/c4k-auth-input ::domain/c4k-app-name])))
+
+(defn- default-cfg
+  [input]
+  (merge default
+         (when (and (not (contains? input :c4k-app-name))
+                    (contains? input :module))
+           {:c4k-app-name (:module input)})
+         input))
 
 (defn-spec clean-build-dir! nil?
-  [devops ::c4kg]
-  (let [config (merge default devops)]
+  [devops ::c4k]
+  (let [config (default-cfg devops)]
     (i/execute! (domain/clean-build-dir-command config) config)))
 
 (defn-spec run-c4k-jar! nil?
-  [devops ::c4kg]
-  (let [config (merge default devops)]
-    (doseq [c (domain/c4k-uberjar-command config)]
-      (i/execute! c config))))
+  [devops ::c4k]
+  (let [config (default-cfg devops)]
+    (i/execute! (domain/c4k-uberjar-command config) config)))
 
 (defn-spec run-c4k-bin! nil?
-  [devops ::c4kg]
-  (let [config (merge default devops)]
+  [devops ::c4k]
+  (let [config (default-cfg devops)]
     (doseq [c (domain/c4k-graalvm-command config)]
       (i/execute! c config))))
 
 (defn-spec write-c4k-objects! nil?
-  [devops ::c4kg
-   tf-out ::tg-domain/tf-out]
-  (let [config (merge default devops)
-        {:keys [module c4k-auth-input c4k-config-input c4k-output]} config]
+  [devops ::c4k
+   tf-out ::tg/tf-out]
+  (let [config (default-cfg devops)]
     (->> (cfg/read-config (domain/config-path config))
          (merge {:fqdn (:fqdn (:value (:out tf-out)))})
-         (cs/generate-string)
+         (pr-str)
          (spit (domain/config-path config)))
-    (->> (cfg/read-config (domain/config-auth config))
-         (cs/generate-string)
-         (spit (domain/config-auth config))
+    (->> (cfg/read-config (domain/auth-path config))
+         (pr-str)
+         (spit (domain/auth-path config)))
     (run-c4k-jar! config)))
 
 (st/instrument `clean-build-dir!)
diff --git a/src/dda/build/c4k/domain.clj b/src/dda/build/c4k/domain.clj
index b7f69ca..67aeebd 100644
--- a/src/dda/build/c4k/domain.clj
+++ b/src/dda/build/c4k/domain.clj
@@ -3,13 +3,14 @@
             [orchestra.core :refer [defn-spec]]
             [dda.build.devops.domain :as d]))
 
+(s/def ::c4k-app-name string?)
 (s/def ::c4k-output string?)
 (s/def ::c4k-config-input string?)
 (s/def ::c4k-auth-input string?)
 
 (s/def ::config
   (s/merge ::d/devops
-           (s/keys :req-un [::c4k-output ::c4k-config-input ::c4k-auth-input])))
+           (s/keys :req-un [::c4k-output ::c4k-config-input ::c4k-auth-input ::c4k-app-name])))
 
 (defn-spec config-path string?
   [config ::config]
@@ -32,12 +33,12 @@
 
 (defn-spec c4k-uberjar-command seq?
   [config ::config]
-  (let [{:keys [module]} config
-        executable-name (str "c4k-" module "-standalone.jar")]
+  (let [{:keys [c4k-app-name]} config
+        executable-name (str "c4k-" c4k-app-name "-standalone.jar")]
     [["bash" "-c" (str executable-name " " (config-path config) " " (auth-path config) " > " (output-path config))]]))
 
 (defn-spec c4k-graalvm-command seq?
   [config ::config]
-  (let [{:keys [module]} config
-        executable-name (str "c4k-" module)]
+  (let [{:keys [c4k-app-name]} config
+        executable-name (str "c4k-" c4k-app-name)]
     [["bash" "-c" (str executable-name " " (config-path config) " " (auth-path config) " > " (output-path config))]]))
diff --git a/src/dda/build/config.clj b/src/dda/build/config.clj
index b99a507..7d616e8 100644
--- a/src/dda/build/config.clj
+++ b/src/dda/build/config.clj
@@ -1,10 +1,5 @@
 (ns dda.build.config
-  "
-   {:test huhu
- :long-name #env LOGNAME
- :gopass-pw #gopass [sopra/test.de]
- :gopass-field-url #gopass [sopra/test.de url]}
-   "
+  "{:test huhu :long-name #env LOGNAME :gopass-pw #gopass [sopra/test.de] :gopass-field-url #gopass [sopra/test.de url]}"
   (:require [aero.core :as aero]
             [dda.build.infrastructure :as i]))
 
@@ -14,4 +9,9 @@
 
 (defn read-config 
   [file]
-  (aero/read-config file))
+  (try 
+    (aero/read-config file)
+    (catch Exception e 
+      (do (println (str "Warn: " e))
+          {}))
+    ))
diff --git a/src/dda/build/devops.clj b/src/dda/build/devops.clj
index 4352e9a..3936bbb 100644
--- a/src/dda/build/devops.clj
+++ b/src/dda/build/devops.clj
@@ -1,20 +1,12 @@
 (ns dda.build.devops
-  (:require
-   [orchestra.core :refer [defn-spec]]
-   [clojure.spec.test.alpha :as st]
-   [clojure.spec.alpha :as s]
-   [dda.build.devops.domain :as domain]
-   [dda.build.infrastructure :as i]))
-
-(s/def ::name ::domain/name)
-(s/def ::module ::domain/module)
-(s/def ::stage ::domain/stage)
-(s/def ::project-root-path ::domain/project-root-path)
-(s/def ::build-dir-name ::domain/build-dir-name)
+  (:require [clojure.spec.alpha :as s]
+            [orchestra.core :refer [defn-spec]]
+            [dda.build.devops.domain :as domain]
+            [dda.build.infrastructure :as i]))
 
 (s/def ::devops
-  (s/keys :req-un [::name]
-          :opt-un [::module ::stage ::project-root-path ::build-dir-name ::debug ::dry-run]))
+  (s/keys :req-un [::domain/name]
+          :opt-un [::domain/module ::domain/stage ::domain/project-root-path ::domain/build-dir-name ::domain/debug ::domain/dry-run]))
 
 (def default {:name "dda-backup"
               :project-root-path "."
@@ -42,7 +34,3 @@
   [devops ::devops]
   (let [final (merge default devops)]
     (i/execute! (domain/create-build-dir-command final) final)))
-
-(st/instrument `clean-build-dir!)
-(st/instrument `create-build-dir!)
-(st/instrument `env-or-file)#
diff --git a/src/dda/build/devops/domain.clj b/src/dda/build/devops/domain.clj
index f8664d5..5d1c652 100644
--- a/src/dda/build/devops/domain.clj
+++ b/src/dda/build/devops/domain.clj
@@ -1,7 +1,7 @@
 (ns dda.build.devops.domain
   (:require
-   [clojure.string :as str]
    [clojure.spec.alpha :as s]
+   [clojure.string :as str]
    [orchestra.core :refer [defn-spec]]))
 
 (s/def ::name string?)
diff --git a/src/dda/build/gopass.clj b/src/dda/build/gopass.clj
deleted file mode 100644
index e05a4f4..0000000
--- a/src/dda/build/gopass.clj
+++ /dev/null
@@ -1,59 +0,0 @@
-(ns dda.build.gopass
-  (: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]
-            [dda.build.infrastructure :as i]))
-
-(def default
-  (merge d/default {:c4k-auth-filename "c4k-auth.yaml"}))
-
-(defn-spec run-gopass-command! string?
-  [devops ::d/devops
-   entry ::domain/gopass-entry]
-  (let [config (merge default devops)
-        c (domain/gopass-show-command entry)]
-    (i/execute-output! c config)))
-
-(defn-spec resolve-gopass! ::domain/resolved-config
-  "Resolves gopass values inside a map of key names and entries
-   
-   entries may either contain only a path 
-     {:path \"test/path\"} 
-   or a path and a field
-     {:path \"test/path\" :field \"field\"}
-   "
-  [devops ::d/devops
-   config ::domain/config]
-  (apply merge (for [[k v] config] {(name k) (run-gopass-command! devops v)})))
-
-(defn-spec insert-gopass! nil?
-  "Inserts values from the resolved auth config into the c4k auth
-   
-   Default: c4k-auth.yaml
-   can be changed by adding another value for ':c4k-auth-filename'
-   "
-  [devops ::d/devops
-   resolved-config ::domain/resolved-config]
-  (let [config (merge default devops)
-        default-c4k-auth (parse-string (slurp (c4k-d/auth-path config))
-                                       (fn [k] (keyword (.toLowerCase k))))]
-    (->> default-c4k-auth
-         (merge resolved-config)
-         (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!)
-(st/instrument `insert-gopass!)
diff --git a/src/dda/build/provs.clj b/src/dda/build/provs.clj
index 2935faf..eb1007e 100644
--- a/src/dda/build/provs.clj
+++ b/src/dda/build/provs.clj
@@ -1,12 +1,12 @@
 (ns dda.build.provs
-  (:require    [clojure.spec.alpha :as s]
-               [orchestra.core :refer [defn-spec]]
-               [clojure.spec.test.alpha :as st]
-               [cheshire.core :refer [generate-string]]
-               [dda.build.c4k :as c4k]
-               [dda.build.terragrunt :as tg]
-               [dda.build.provs.domain :as domain]
-               [dda.build.infrastructure :as i]))
+  (:require [clojure.spec.alpha :as s]
+            [clojure.spec.test.alpha :as st]
+            [orchestra.core :refer [defn-spec]]
+            [cheshire.core :refer [generate-string]]
+            [dda.build.c4k :as c4k]
+            [dda.build.terragrunt :as tg]
+            [dda.build.provs.domain :as domain]
+            [dda.build.infrastructure :as i]))
 
 (def default
   (merge c4k/default
@@ -14,7 +14,7 @@
           :k3s-provision-user "root"
           :echo false}))
 (s/def ::provs (s/merge ::c4k/c4k
-                        (s/keys 
+                        (s/keys
                          :req-un [::domain/email ::domain/fqdn ::domain/ipv4 ::domain/ipv6]
                          :opt-un [::domain/echo ::domain/k3s-output-filename ::domain/k3s-provision-user])))
 
@@ -26,12 +26,6 @@
       (i/execute! c config))))
 
 (defn-spec write-k3s-config! nil?
-  "Create a server config for provs using tf-out and write it to a file
-   
-   Requires ':email' to be set, otherwise certs will not work
-   Default: out_k3sServerConfig.yaml
-   can be changed by adding another value for ':k3s-output-filename'
-   "
   [devops ::provs
    tf-out ::tg/tf-out]
   (let [config (merge default devops)
diff --git a/test/dda/build/c4k/domain_test.clj b/test/dda/build/c4k/domain_test.clj
index 53fc632..88301ac 100644
--- a/test/dda/build/c4k/domain_test.clj
+++ b/test/dda/build/c4k/domain_test.clj
@@ -21,6 +21,7 @@
                            :stage "dev"
                            :debug false
                            :dry-run false
+                           :c4k-app-name "backup"
                            :c4k-config-input "config.yaml"
                            :c4k-auth-input "auth.yaml"
                            :c4k-output "out.yaml"})))
@@ -33,6 +34,7 @@
                            :stage "dev"
                            :debug false
                            :dry-run false
+                           :c4k-app-name "backup"
                            :c4k-config-input "config.yaml"
                            :c4k-auth-input "auth.yaml"
                            :c4k-output "out.yaml"}))))
@@ -46,6 +48,7 @@
                          :stage "dev"
                          :debug false
                          :dry-run false
+                         :c4k-app-name "backup"
                          :c4k-config-input "config.yaml"
                          :c4k-auth-input "auth.yaml"
                          :c4k-output "out.yaml"})))
@@ -58,6 +61,7 @@
                          :stage "dev"
                          :debug false
                          :dry-run false
+                         :c4k-app-name "backup"
                          :c4k-config-input "config.yaml"
                          :c4k-auth-input "auth.yaml"
                          :c4k-output "out.yaml"}))))
@@ -72,6 +76,7 @@
                            :stage "dev"
                            :debug false
                            :dry-run false
+                           :c4k-app-name "backup"
                            :c4k-config-input "config.yaml"
                            :c4k-auth-input "auth.yaml"
                            :c4k-output "out.yaml"})))
@@ -84,6 +89,7 @@
                            :stage "dev"
                            :debug false
                            :dry-run false
+                           :c4k-app-name "backup"
                            :c4k-config-input "config.yaml"
                            :c4k-auth-input "auth.yaml"
                            :c4k-output "out.yaml"}))))
@@ -97,6 +103,7 @@
                                        :stage "dev"
                                        :debug false
                                        :dry-run false
+                                       :c4k-app-name "backup"
                                        :c4k-config-input "config.yaml"
                                        :c4k-auth-input "auth.yaml"
                                        :c4k-output "out.yaml"}))))
@@ -111,6 +118,7 @@
                                    :stage "dev"
                                    :debug false
                                    :dry-run false
+                                   :c4k-app-name "backup"
                                    :c4k-config-input "config.yaml"
                                    :c4k-auth-input "auth.yaml"
                                    :c4k-output "out.yaml"}))))
@@ -125,6 +133,7 @@
                                    :stage "dev"
                                    :debug false
                                    :dry-run false
+                                   :c4k-app-name "backup"
                                    :c4k-config-input "config.yaml"
                                    :c4k-auth-input "auth.yaml"
                                    :c4k-output "out.yaml"}))))
diff --git a/test/dda/build/provs/domain_test.clj b/test/dda/build/provs/domain_test.clj
index a12fc48..79680f9 100644
--- a/test/dda/build/provs/domain_test.clj
+++ b/test/dda/build/provs/domain_test.clj
@@ -17,6 +17,7 @@
                                     :stage "dev"
                                     :debug false
                                     :dry-run false
+                                    :c4k-app-name "backup"
                                     :k3s-output-filename "k3s-out.yaml"
                                     :k3s-provision-user "root"
                                     :c4k-config-input "config.yaml"