Files
iac-cljs-configs/iac/src/main/base.cljs

91 lines
3.8 KiB
Clojure

(ns base
(:require
["@pulumi/pulumi" :as pulumi]
["@pulumi/vault" :as vault]
["@pulumi/kubernetes" :as k8s]
[infra.init :as infra]
[service-registries :refer [base-service-registry shared-service-registry deployment-service-registry]]
[utils.k8s :refer [create-namespace deploy-stack]]))
(defn deploy! [{:keys [provider vault-provider pulumi-cfg service-registry namespaces?]}]
(let [namespaces (->> service-registry (map :app-namespace) (set))
_ (when namespaces? (doseq [namespace namespaces] (create-namespace provider namespace nil nil)))
deployment-results
(into
{}
(for [config service-registry]
(let [{:keys [stack app-name]} config]
[app-name (apply deploy-stack (conj (vec stack) (merge config {:provider provider
:vault-provider vault-provider
:pulumi-cfg pulumi-cfg})))])))]
(clj->js deployment-results)))
(defn apps [stack-ref pulumi-cfg provider service-registry]
(let [vault-output (pulumi/output
(clj->js {:address (.getOutput stack-ref "vaultAddress")
:token (.getOutput stack-ref "vaultToken")}))
vault-provider (new vault/Provider
"vault-provider"
(clj->js vault-output))]
(deploy! {:provider provider
:vault-provider vault-provider
:pulumi-cfg pulumi-cfg
:service-registry service-registry
:namespaces? true})))
(defn if-no-configs [configs then-fn & [else-fn]]
(if (nil? configs)
(then-fn)
(if else-fn (else-fn) nil)))
(defn initialize [configs]
(let [pulumi-cfg (pulumi/Config.)
stack-ref (new pulumi/StackReference "init")
kubeconfig (if-no-configs configs #(infra/create-cluster pulumi-cfg) #(.getOutput stack-ref "kubeconfig"))
setup (.apply kubeconfig
(fn [kc]
(js/Promise.
(fn [resolve _reject]
(let [provider (new k8s/Provider
"k8s-dynamic-provider"
(clj->js {:kubeconfig kc}))]
(resolve
(if-no-configs
configs
#(deploy! {:provider provider
:vault-provider nil
:pulumi-cfg pulumi-cfg
:service-registry base-service-registry
:namespaces? false})
#(apps stack-ref pulumi-cfg provider configs)
)))))))]
{:kubeconfig kubeconfig :setup setup}))
(defn build-exports [init]
(let [kubeconfig (get init :kubeconfig)
app-outputs (get init :setup)]
{:kubeconfig (get kubeconfig :kubeconfig)
:vaultAddress (.apply app-outputs #(-> % .-openbao .-execute .-address))
:vaultToken (.apply app-outputs #(aget (-> % .-openbao .-execute) "root-token"))}))
(defn extended-exports [init]
(let [;;exports (base.build-exports init)
app-outputs (get init :setup)]
#_(assoc exports :nextcloudUrl (.apply app-outputs #(get-in % [:nextcloud :nextcloud-url])))))
(defn quick-deploy [configs exports]
(->
(initialize configs)
(exports)
(clj->js)))
(defn quick-deploy-base []
(quick-deploy nil build-exports))
(defn quick-deploy-shared []
(base/quick-deploy shared-service-registry extended-exports))
(defn quick-deploy-services []
(base/quick-deploy deployment-service-registry extended-exports))