fix browser setup & merging in defaults
This commit is contained in:
parent
9c1fe2dc98
commit
a43a93a875
4 changed files with 82 additions and 108 deletions
src
main
test/cljc/dda/c4k_forgejo
|
@ -20,10 +20,9 @@
|
||||||
:pv-storage-size-gb 5
|
:pv-storage-size-gb 5
|
||||||
:pvc-storage-class-name ""
|
:pvc-storage-class-name ""
|
||||||
:postgres-image "postgres:14"
|
:postgres-image "postgres:14"
|
||||||
:postgres-size :2gb})
|
:postgres-size :2gb
|
||||||
|
:max-rate 10,
|
||||||
(def rate-limit-defaults {:max-rate 10, :max-concurrent-requests 5})
|
:max-concurrent-requests 5})
|
||||||
|
|
||||||
|
|
||||||
(def config? (s/keys :req-un [::forgejo/fqdn
|
(def config? (s/keys :req-un [::forgejo/fqdn
|
||||||
::forgejo/mailer-from
|
::forgejo/mailer-from
|
||||||
|
@ -48,40 +47,42 @@
|
||||||
|
|
||||||
(defn-spec config-objects p/map-or-seq?
|
(defn-spec config-objects p/map-or-seq?
|
||||||
[config config?]
|
[config config?]
|
||||||
(let [storage-class (if (contains? config :postgres-data-volume-path) :manual :local-path)]
|
(let [resolved-config (merge config-defaults config)
|
||||||
|
storage-class (if (contains? resolved-config :postgres-data-volume-path) :manual :local-path)]
|
||||||
(map yaml/to-string
|
(map yaml/to-string
|
||||||
(filter #(not (nil? %))
|
(filter #(not (nil? %))
|
||||||
(cm/concat-vec
|
(cm/concat-vec
|
||||||
(ns/generate config)
|
(ns/generate resolved-config)
|
||||||
[(postgres/generate-configmap config)
|
[(postgres/generate-configmap resolved-config)
|
||||||
(when (contains? config :postgres-data-volume-path)
|
(when (contains? resolved-config :postgres-data-volume-path)
|
||||||
(postgres/generate-persistent-volume (select-keys config [:postgres-data-volume-path :pv-storage-size-gb])))
|
(postgres/generate-persistent-volume (select-keys resolved-config [:postgres-data-volume-path :pv-storage-size-gb])))
|
||||||
(postgres/generate-pvc (merge config {:pvc-storage-class-name storage-class}))
|
(postgres/generate-pvc (merge resolved-config {:pvc-storage-class-name storage-class}))
|
||||||
(postgres/generate-deployment config)
|
(postgres/generate-deployment resolved-config)
|
||||||
(postgres/generate-service config)
|
(postgres/generate-service resolved-config)
|
||||||
(forgejo/generate-deployment config)
|
(forgejo/generate-deployment resolved-config)
|
||||||
(forgejo/generate-service)
|
(forgejo/generate-service)
|
||||||
(forgejo/generate-service-ssh)
|
(forgejo/generate-service-ssh)
|
||||||
(forgejo/generate-data-volume config)
|
(forgejo/generate-data-volume resolved-config)
|
||||||
(forgejo/generate-appini-env config)]
|
(forgejo/generate-appini-env resolved-config)]
|
||||||
(forgejo/generate-ratelimit-ingress-and-cert config) ; this function has a vector as output
|
(forgejo/generate-ratelimit-ingress-and-cert resolved-config) ; this function has a vector as output
|
||||||
(when (contains? config :restic-repository)
|
(when (contains? resolved-config :restic-repository)
|
||||||
[(backup/generate-config config)
|
[(backup/generate-config resolved-config)
|
||||||
(backup/generate-cron)
|
(backup/generate-cron)
|
||||||
(backup/generate-backup-restore-deployment config)])
|
(backup/generate-backup-restore-deployment resolved-config)])
|
||||||
(when (contains? config :mon-cfg)
|
(when (contains? resolved-config :mon-cfg)
|
||||||
(mon/generate-config)))))))
|
(mon/generate-config)))))))
|
||||||
|
|
||||||
(defn-spec auth-objects p/map-or-seq?
|
(defn-spec auth-objects p/map-or-seq?
|
||||||
[config config?
|
[config config?
|
||||||
auth auth?]
|
auth auth?]
|
||||||
(map yaml/to-string
|
(let [resolved-config (merge config-defaults config)]
|
||||||
(filter #(not (nil? %))
|
(map yaml/to-string
|
||||||
(cm/concat-vec
|
(filter #(not (nil? %))
|
||||||
(ns/generate config)
|
(cm/concat-vec
|
||||||
[(postgres/generate-secret config auth)
|
(ns/generate resolved-config)
|
||||||
(forgejo/generate-secrets auth)]
|
[(postgres/generate-secret resolved-config auth)
|
||||||
(when (contains? config :restic-repository)
|
(forgejo/generate-secrets auth)]
|
||||||
[(backup/generate-secret auth)])
|
(when (contains? resolved-config :restic-repository)
|
||||||
(when (contains? config :mon-cfg)
|
[(backup/generate-secret auth)])
|
||||||
(mon/generate-auth (:mon-cfg config) (:mon-auth auth)))))))
|
(when (contains? resolved-config :mon-cfg)
|
||||||
|
(mon/generate-auth (:mon-cfg resolved-config) (:mon-auth auth))))))))
|
||||||
|
|
|
@ -100,18 +100,18 @@
|
||||||
federation-enabled-bool (boolean-from-string federation-enabled)]
|
federation-enabled-bool (boolean-from-string federation-enabled)]
|
||||||
(->
|
(->
|
||||||
(yaml/load-as-edn "forgejo/appini-env-configmap.yaml")
|
(yaml/load-as-edn "forgejo/appini-env-configmap.yaml")
|
||||||
(cm/replace-all-matching-values-by-new-value "APPNAME" default-app-name)
|
(cm/replace-all-matching "APPNAME" default-app-name)
|
||||||
(cm/replace-all-matching-values-by-new-value "FQDN" fqdn)
|
(cm/replace-all-matching "FQDN" fqdn)
|
||||||
(cm/replace-all-matching-values-by-new-value "URL" (str "https://" fqdn))
|
(cm/replace-all-matching "URL" (str "https://" fqdn))
|
||||||
(cm/replace-all-matching-values-by-new-value "FROM" mailer-from)
|
(cm/replace-all-matching "FROM" mailer-from)
|
||||||
(cm/replace-all-matching-values-by-new-value "MAILERHOST" mailer-host)
|
(cm/replace-all-matching "MAILERHOST" mailer-host)
|
||||||
(cm/replace-all-matching-values-by-new-value "MAILERPORT" mailer-port)
|
(cm/replace-all-matching "MAILERPORT" mailer-port)
|
||||||
(cm/replace-all-matching-values-by-new-value "WHITELISTDOMAINS" service-domain-whitelist)
|
(cm/replace-all-matching "WHITELISTDOMAINS" service-domain-whitelist)
|
||||||
(cm/replace-all-matching-values-by-new-value "NOREPLY" service-noreply-address)
|
(cm/replace-all-matching "NOREPLY" service-noreply-address)
|
||||||
(cm/replace-all-matching-values-by-new-value "IS_FEDERATED"
|
(cm/replace-all-matching "IS_FEDERATED"
|
||||||
(if federation-enabled-bool
|
(if federation-enabled-bool
|
||||||
"true"
|
"true"
|
||||||
"false")))))
|
"false")))))
|
||||||
|
|
||||||
(defn-spec generate-secrets pred/map-or-seq?
|
(defn-spec generate-secrets pred/map-or-seq?
|
||||||
[auth ::auth]
|
[auth ::auth]
|
||||||
|
|
|
@ -1,9 +1,7 @@
|
||||||
(ns dda.c4k-forgejo.browser
|
(ns dda.c4k-forgejo.browser
|
||||||
(:require
|
(:require
|
||||||
[clojure.string :as st]
|
|
||||||
[clojure.tools.reader.edn :as edn]
|
[clojure.tools.reader.edn :as edn]
|
||||||
[dda.c4k-forgejo.core :as core]
|
[dda.c4k-forgejo.core :as core]
|
||||||
[dda.c4k-forgejo.forgejo :as forgejo]
|
|
||||||
[dda.c4k-common.browser :as br]
|
[dda.c4k-common.browser :as br]
|
||||||
[dda.c4k-common.common :as cm]))
|
[dda.c4k-common.common :as cm]))
|
||||||
|
|
||||||
|
@ -26,31 +24,33 @@
|
||||||
[(assoc
|
[(assoc
|
||||||
(br/generate-needs-validation) :content
|
(br/generate-needs-validation) :content
|
||||||
(cm/concat-vec
|
(cm/concat-vec
|
||||||
|
(br/generate-group
|
||||||
|
"config"
|
||||||
|
(br/generate-text-area
|
||||||
|
"config" "Your config.edn:"
|
||||||
|
"{:fqdn \"forgejo.your.domain\"
|
||||||
|
:mailer-from \"test@test.de\"
|
||||||
|
:mailer-host \"test.de\"
|
||||||
|
:mailer-port \"25\"
|
||||||
|
:deploy-federated \"false\"
|
||||||
|
:service-noreply-address \"no-reply@test.de\"
|
||||||
|
:volume-total-storage-size \"20\"
|
||||||
|
:restic-repository \"s3://yourbucket/your-repo\"
|
||||||
|
:mon-cfg {:cluster-name \"forgejo\"
|
||||||
|
:cluster-stage \"test\"
|
||||||
|
:grafana-cloud-url \"https://prometheus-prod-01-eu-west-0.grafana.net/api/prom/push\"}}"
|
||||||
|
"11"))
|
||||||
(generate-group
|
(generate-group
|
||||||
"domain"
|
"auth"
|
||||||
(cm/concat-vec
|
|
||||||
(br/generate-input-field "fqdn" "Your fqdn:" "repo.test.de")
|
|
||||||
(br/generate-input-field "mailer-from" "Your mailer email address:" "test@test.de")
|
|
||||||
(br/generate-input-field "mailer-host" "Your mailer host:" "test.de")
|
|
||||||
(br/generate-input-field "mailer-port" "Your mailer port:" "123")
|
|
||||||
(br/generate-input-field "service-noreply-address" "Your noreply domain:" "test.de")
|
|
||||||
(br/generate-input-field "deploy-federated" "(Optional) Deploy a federated version of forgejo:" "")
|
|
||||||
(br/generate-input-field "issuer" "(Optional) Your issuer prod/staging:" "")
|
|
||||||
(br/generate-input-field "app-name" "(Optional) Your app name:" "")
|
|
||||||
(br/generate-input-field "domain-whitelist" "(Optional) Domain whitelist for registration email-addresses:" "")))
|
|
||||||
(generate-group
|
|
||||||
"provider"
|
|
||||||
(cm/concat-vec
|
|
||||||
(br/generate-input-field "volume-total-storage-size" "Your forgejo volume-total-storage-size:" "20")))
|
|
||||||
(generate-group
|
|
||||||
"credentials"
|
|
||||||
(br/generate-text-area
|
(br/generate-text-area
|
||||||
"auth" "Your auth.edn:"
|
"auth" "Your auth.edn:"
|
||||||
"{:postgres-db-user \"forgejo\"
|
"{:postgres-db-user \"forgejo\"
|
||||||
:postgres-db-password \"forgejo-db-password\"
|
:postgres-db-password \"forgejo-db-password\"
|
||||||
:mailer-user \"test@test.de\"
|
:mailer-user \"test@test.de\"
|
||||||
:mailer-pw \"mail-test-password\"}"
|
:mailer-pw \"mail-test-password\"
|
||||||
"5"))
|
:mon-auth {:grafana-cloud-user \"your-user-id\"
|
||||||
|
:grafana-cloud-password \"your-cloud-password\"}}"
|
||||||
|
"6"))
|
||||||
[(br/generate-br)]
|
[(br/generate-br)]
|
||||||
(br/generate-button "generate-button" "Generate c4k yaml")))]
|
(br/generate-button "generate-button" "Generate c4k yaml")))]
|
||||||
(br/generate-output "c4k-forgejo-output" "Your c4k deployment.yaml:" "25")))
|
(br/generate-output "c4k-forgejo-output" "Your c4k deployment.yaml:" "25")))
|
||||||
|
@ -62,44 +62,15 @@
|
||||||
:content
|
:content
|
||||||
(generate-content)})
|
(generate-content)})
|
||||||
|
|
||||||
(defn config-from-document []
|
|
||||||
(let [issuer (br/get-content-from-element "issuer" :optional true)
|
|
||||||
app-name (br/get-content-from-element "app-name" :optional true)
|
|
||||||
domain-whitelist (br/get-content-from-element "domain-whitelist" :optional true)]
|
|
||||||
(merge
|
|
||||||
{:fqdn (br/get-content-from-element "fqdn")
|
|
||||||
:deploy-federated (br/get-content-from-element "deploy-federated")
|
|
||||||
:mailer-from (br/get-content-from-element "mailer-from")
|
|
||||||
:mailer-host (br/get-content-from-element "mailer-host")
|
|
||||||
:mailer-port (br/get-content-from-element "mailer-port")
|
|
||||||
:service-noreply-address (br/get-content-from-element "service-noreply-address")
|
|
||||||
:volume-total-storage-size (br/get-content-from-element "volume-total-storage-size" :deserializer js/parseInt)}
|
|
||||||
(when (not (st/blank? issuer))
|
|
||||||
{:issuer issuer})
|
|
||||||
(when (not (st/blank? app-name))
|
|
||||||
{:default-app-name app-name})
|
|
||||||
(when (not (st/blank? domain-whitelist))
|
|
||||||
{:service-domain-whitelist domain-whitelist}))))
|
|
||||||
|
|
||||||
(defn validate-all! []
|
(defn validate-all! []
|
||||||
(br/validate! "fqdn" ::forgejo/fqdn)
|
(br/validate! "config" core/config? :deserializer edn/read-string)
|
||||||
(br/validate! "mailer-from" ::forgejo/mailer-from)
|
(br/validate! "auth" core/auth? :deserializer edn/read-string)
|
||||||
(br/validate! "mailer-host" ::forgejo/mailer-host)
|
|
||||||
(br/validate! "mailer-port" ::forgejo/mailer-port)
|
|
||||||
(br/validate! "service-noreply-address" ::forgejo/service-noreply-address)
|
|
||||||
(br/validate! "deploy-federated" ::forgejo/deploy-federated :optional true)
|
|
||||||
(br/validate! "issuer" ::forgejo/issuer :optional true)
|
|
||||||
(br/validate! "app-name" ::forgejo/default-app-name :optional true)
|
|
||||||
(br/validate! "domain-whitelist" ::forgejo/service-domain-whitelist :optional true)
|
|
||||||
(br/validate! "volume-total-storage-size" ::forgejo/volume-total-storage-size :deserializer js/parseInt)
|
|
||||||
(br/validate! "auth" forgejo/auth? :deserializer edn/read-string)
|
|
||||||
(br/set-form-validated!))
|
(br/set-form-validated!))
|
||||||
|
|
||||||
(defn add-validate-listener [name]
|
(defn add-validate-listener [name]
|
||||||
(-> (br/get-element-by-id name)
|
(-> (br/get-element-by-id name)
|
||||||
(.addEventListener "blur" #(do (validate-all!)))))
|
(.addEventListener "blur" #(do (validate-all!)))))
|
||||||
|
|
||||||
|
|
||||||
(defn init []
|
(defn init []
|
||||||
(br/append-hickory (generate-content-div))
|
(br/append-hickory (generate-content-div))
|
||||||
(let [config-only false
|
(let [config-only false
|
||||||
|
@ -109,7 +80,7 @@
|
||||||
(.addEventListener "click"
|
(.addEventListener "click"
|
||||||
#(do (validate-all!)
|
#(do (validate-all!)
|
||||||
(-> (cm/generate-cm
|
(-> (cm/generate-cm
|
||||||
(config-from-document)
|
(br/get-content-from-element "config" :deserializer edn/read-string)
|
||||||
(br/get-content-from-element "auth" :deserializer edn/read-string)
|
(br/get-content-from-element "auth" :deserializer edn/read-string)
|
||||||
core/config-defaults
|
core/config-defaults
|
||||||
core/config-objects
|
core/config-objects
|
||||||
|
@ -117,14 +88,5 @@
|
||||||
config-only
|
config-only
|
||||||
auth-only)
|
auth-only)
|
||||||
(br/set-output!))))))
|
(br/set-output!))))))
|
||||||
(add-validate-listener "fqdn")
|
(add-validate-listener "config")
|
||||||
(add-validate-listener "deploy-federated")
|
|
||||||
(add-validate-listener "mailer-from")
|
|
||||||
(add-validate-listener "mailer-host")
|
|
||||||
(add-validate-listener "mailer-port")
|
|
||||||
(add-validate-listener "service-noreply-address")
|
|
||||||
(add-validate-listener "app-name")
|
|
||||||
(add-validate-listener "domain-whitelist")
|
|
||||||
(add-validate-listener "volume-total-storage-size")
|
|
||||||
(add-validate-listener "issuer")
|
|
||||||
(add-validate-listener "auth"))
|
(add-validate-listener "auth"))
|
|
@ -16,4 +16,15 @@
|
||||||
|
|
||||||
(deftest validate-valid-resources
|
(deftest validate-valid-resources
|
||||||
(is (s/valid? cut/config? (yaml/load-as-edn "forgejo-test/valid-config.yaml")))
|
(is (s/valid? cut/config? (yaml/load-as-edn "forgejo-test/valid-config.yaml")))
|
||||||
(is (s/valid? cut/auth? (yaml/load-as-edn "forgejo-test/valid-auth.yaml"))))
|
(is (s/valid? cut/auth? (yaml/load-as-edn "forgejo-test/valid-auth.yaml"))))
|
||||||
|
|
||||||
|
(deftest test-whole-generation
|
||||||
|
(is (= 32
|
||||||
|
(count
|
||||||
|
(cut/config-objects
|
||||||
|
(yaml/load-as-edn "forgejo-test/valid-config.yaml")))))
|
||||||
|
(is (= 5
|
||||||
|
(count
|
||||||
|
(cut/auth-objects
|
||||||
|
(yaml/load-as-edn "forgejo-test/valid-config.yaml")
|
||||||
|
(yaml/load-as-edn "forgejo-test/valid-auth.yaml"))))))
|
||||||
|
|
Loading…
Reference in a new issue