From a15b7b0d6f100220d79ccdd92496f8100f4a7b7e Mon Sep 17 00:00:00 2001 From: erik Date: Thu, 13 Oct 2022 16:39:55 +0200 Subject: [PATCH] Adjusted Tests Also fixed smaller issues in website.cljc. Better division of generate-common-*, now these functions may reside in c4k-common and generate standing ingresses/certs with only service and fqdn inputs (which need to be set anyways). Also moved predicates and specs to website.cljc. --- doc/tryItOut.png | Bin 62816 -> 71556 bytes src/main/cljc/dda/c4k_website/core.cljc | 39 +-- src/main/cljc/dda/c4k_website/website.cljc | 152 ++++----- src/main/cljs/dda/c4k_website/browser.cljs | 52 ++-- src/main/resources/website/certificate.yaml | 4 +- src/main/resources/website/http-ingress.yaml | 2 +- src/main/resources/website/https-ingress.yaml | 4 +- .../cljc/dda/c4k_website/website_test.cljc | 293 +++++++++--------- 8 files changed, 268 insertions(+), 278 deletions(-) diff --git a/doc/tryItOut.png b/doc/tryItOut.png index 6f0bda8b50edb97f0ae1877a84ffff3f48987b72..1833910e464b1375cf4527847a4c72f111623ffe 100644 GIT binary patch literal 71556 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 OMowB;s!G!M+y4Q54-v2c literal 62816 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 config :websites first) (-> config :auth first) {:issuer (config :issuer)})) -(defn find-needle [needle haystack] - ;loop binds initial values once, - ;then binds values from each recursion call - (loop [needle needle - maybe-here haystack - not-here '()] - - (let [needle? (first maybe-here)] - - ;test for return or recur - (if (or (= (str needle?) (str needle)) - (empty? maybe-here)) - - ;return results - [needle? maybe-here not-here] - - ;recur calls loop with new values - (recur needle - (rest maybe-here) - (concat not-here (list (first maybe-here)))))))) - (defn generate-configs [config] (loop [config config result []] diff --git a/src/main/cljc/dda/c4k_website/website.cljc b/src/main/cljc/dda/c4k_website/website.cljc index 489283b..4c121a9 100644 --- a/src/main/cljc/dda/c4k_website/website.cljc +++ b/src/main/cljc/dda/c4k_website/website.cljc @@ -12,40 +12,54 @@ [dda.c4k-common.predicate :as pred] [clojure.string :as str])) -(defn keyword-string? +(defn fqdn-list? [input] - (str/starts-with? input "fqdn")) + (every? true? (map pred/fqdn-string? input))) -(defn keyword-string-list? - [input] - (every? true? (map keyword-string? input))) +(s/def ::uname pred/fqdn-string?) +(s/def ::issuer pred/letsencrypt-issuer?) +(s/def ::authtoken pred/bash-env-string?) +(s/def ::fqdns fqdn-list?) +(s/def ::gitea-host pred/fqdn-string?) +(s/def ::gitea-repo string?) +(s/def ::branchname string?) +(s/def ::username string?) -(defn fqdn-list? +(def websitedata? (s/keys :req-un [::uname ::fqdns ::gitea-host ::gitea-repo ::branchname] + :opt-un [::issuer])) + +(def websiteauth? (s/keys :req-un [::authtoken ::username])) + +(defn auth-data-list? [input] - (every? true? (map pred/fqdn-string? input))) + (every? #(and + (map? %) + (and (s/valid? ::uname (% :uname)) (contains? % :uname)) + (and (s/valid? ::username (% :username)) (contains? % :username)) + (and (s/valid? ::authtoken (% :authtoken)) (contains? % :authtoken))) input)) -;(s/def ::uname pred/fqdn-string?) -;(s/def ::issuer pred/letsencrypt-issuer?) -;(s/def ::authtoken pred/bash-env-string?) -;(s/def ::fqdns fqdn-list?) -;(s/def ::gitea-host pred/fqdn-string?) -;(s/def ::gitea-repo string?) -;(s/def ::branchname string?) -;(s/def ::username string?) +(s/def ::auth auth-data-list?) -;(def config? (s/keys :req-un [::uname ::fqdns ::gitea-host ::gitea-repo ::branchname] -; :opt-un [::issuer])) +(def auth? (s/keys :req-un [::auth])) + +(defn website-data-list? + [input] + (every? #(and + (map? %) + (and (s/valid? ::uname (% :uname)) (contains? % :uname)) + (and (s/valid? ::fqdns (% :fqdns)) (contains? % :fqdns)) + (and (s/valid? ::gitea-host (% :gitea-host)) (contains? % :gitea-host)) + (and (s/valid? ::gitea-repo (% :gitea-repo)) (contains? % :gitea-repo)) + (and (s/valid? ::branchname (% :branchname)) (contains? % :branchname))) input)) -;(def auth? (s/keys :req-un [::authtoken ::username])) +(defn websites? [input] + (and (contains? input :websites) (website-data-list? (input :websites))) ) -(s/def ::websites vector?) -(s/def ::auth vector?) +(s/def ::websites website-data-list?) (def config? (s/keys :req-un [::websites] :opt-un [::issuer])) -(def auth? (s/keys :req-un [::auth])) - (def volume-size 3) (defn unique-name-from-fqdn @@ -60,6 +74,14 @@ [uname] (str (unique-name-from-fqdn uname) "-cert")) +(defn generate-http-ingress-name + [uname] + (str (unique-name-from-fqdn uname) "-http-ingress")) + +(defn generate-https-ingress-name + [uname] + (str (unique-name-from-fqdn uname) "-https-ingress")) + ; https://your.gitea.host/api/v1/repos///archive/main.zip (defn make-gitrepourl [host repo user branch] @@ -101,8 +123,8 @@ (mapv #(assoc-in rule [:host] %) fqdns)) ;create working ingress -(defn-spec generate-common-http-ingress pred/map-or-seq? - [config config?] +(defn generate-common-http-ingress + [config] (let [{:keys [fqdn service-name]} config] (-> (yaml/load-as-edn "website/http-ingress.yaml") @@ -110,17 +132,13 @@ (cm/replace-all-matching-values-by-new-value "FQDN" fqdn)))) (defn-spec generate-website-http-ingress pred/map-or-seq? - [config config?] + [config websitedata?] (let [{:keys [uname fqdns]} config - fqdn (first fqdns) - spec-rules [:spec :rules] - service-name (generate-service-name uname)] + spec-rules [:spec :rules]] (-> (generate-common-http-ingress - {:fqdn fqdn :service-name service-name}) - (assoc-in - [:metadata :name] - (str (unique-name-from-fqdn uname) "-http-ingress")) + {:fqdn (first fqdns) :service-name (generate-service-name uname)}) + (cm/replace-all-matching-values-by-new-value "c4k-common-http-ingress" (generate-http-ingress-name uname)) (#(assoc-in % spec-rules (make-host-rules-from-fqdns @@ -128,61 +146,49 @@ fqdns)))))) ;create working ingress -(defn-spec generate-common-https-ingress pred/map-or-seq? - [config config?] - (let [{:keys [fqdn service-name cert-name]} config] +(defn generate-common-https-ingress + [config] + (let [{:keys [fqdn service-name]} config] (-> (yaml/load-as-edn "website/https-ingress.yaml") - (cm/replace-all-matching-values-by-new-value "SERVICENAME" service-name) - (cm/replace-all-matching-values-by-new-value "CERTNAME" cert-name) + (cm/replace-all-matching-values-by-new-value "SERVICENAME" service-name) (cm/replace-all-matching-values-by-new-value "FQDN" fqdn)))) (defn-spec generate-website-https-ingress pred/map-or-seq? - [config config?] + [config websitedata?] (let [{:keys [uname fqdns]} config - fqdn (first fqdns) spec-rules [:spec :rules] - spec-tls-hosts [:spec :tls 0 :hosts] - service-name (generate-service-name uname) - cert-name (generate-cert-name uname)] + spec-tls-hosts [:spec :tls 0 :hosts]] (-> (generate-common-https-ingress - {:fqdn fqdn :service-name service-name :cert-name cert-name}) - (assoc-in - [:metadata :name] - (str (unique-name-from-fqdn uname) "-https-ingress")) - (#(assoc-in % - spec-tls-hosts - fqdns)) - (#(assoc-in % - spec-rules - (make-host-rules-from-fqdns - (-> % :spec :rules first) ;get first ingress rule - fqdns)))))) - -(defn-spec generate-common-certificate pred/map-or-seq? - [config config?] - (let [{:keys [uname fqdns issuer] + {:fqdn (first fqdns) :service-name (generate-service-name uname)}) + (cm/replace-all-matching-values-by-new-value "c4k-common-https-ingress" (generate-https-ingress-name uname)) + (cm/replace-all-matching-values-by-new-value "c4k-common-cert" (generate-cert-name uname)) + (#(assoc-in % spec-tls-hosts fqdns)) + (#(assoc-in % spec-rules (make-host-rules-from-fqdns (-> % :spec :rules first) fqdns)))))) + +(defn generate-common-certificate + [config] + (let [{:keys [fqdn issuer] :or {issuer "staging"}} config - fqdn (first fqdns) - letsencrypt-issuer (name issuer) - cert-name (generate-cert-name uname)] + letsencrypt-issuer (name issuer)] (-> (yaml/load-as-edn "website/certificate.yaml") - (assoc-in [:spec :issuerRef :name] letsencrypt-issuer) - (cm/replace-all-matching-values-by-new-value "CERTNAME" cert-name) + (assoc-in [:spec :issuerRef :name] letsencrypt-issuer) (cm/replace-all-matching-values-by-new-value "FQDN" fqdn)))) (defn-spec generate-website-certificate pred/map-or-seq? - [config config?] - (let [{:keys [fqdns]} config + [config websitedata?] + (let [{:keys [uname issuer fqdns]} config spec-dnsNames [:spec :dnsNames]] (-> - (generate-common-certificate config) + (generate-common-certificate + {:issuer issuer, :fqdn (first fqdns)}) + (cm/replace-all-matching-values-by-new-value "c4k-common-cert" (generate-cert-name uname)) (assoc-in spec-dnsNames fqdns)))) (defn-spec generate-nginx-configmap pred/map-or-seq? - [config config?] + [config websitedata?] (let [{:keys [uname fqdns]} config] (-> (yaml/load-as-edn "website/nginx-configmap.yaml") @@ -193,21 +199,21 @@ (-> % :data :website.conf) #"FQDN" (str (str/join " " fqdns) ";"))))))) (defn-spec generate-nginx-deployment pred/map-or-seq? - [config config?] + [config websitedata?] (let [{:keys [uname]} config] (-> (yaml/load-as-edn "website/nginx-deployment.yaml") (replace-all-matching-subvalues-in-string-start "NAME" (unique-name-from-fqdn uname))))) (defn-spec generate-nginx-service pred/map-or-seq? - [config config?] + [config websitedata?] (let [{:keys [uname]} config] (-> (yaml/load-as-edn "website/nginx-service.yaml") (replace-all-matching-subvalues-in-string-start "NAME" (unique-name-from-fqdn uname))))) (defn-spec generate-website-content-volume pred/map-or-seq? - [config config?] + [config websitedata?] (let [{:keys [uname]} config] (-> (yaml/load-as-edn "website/website-content-volume.yaml") @@ -215,21 +221,21 @@ (cm/replace-all-matching-values-by-new-value "WEBSITESTORAGESIZE" (str (str volume-size) "Gi"))))) (defn-spec generate-website-build-cron pred/map-or-seq? - [config config?] + [config websitedata?] (let [{:keys [uname]} config] (-> (yaml/load-as-edn "website/website-build-cron.yaml") (replace-all-matching-subvalues-in-string-start "NAME" (unique-name-from-fqdn uname))))) (defn-spec generate-website-build-deployment pred/map-or-seq? - [config config?] + [config websitedata?] (let [{:keys [uname]} config] (-> (yaml/load-as-edn "website/website-build-deployment.yaml") (replace-all-matching-subvalues-in-string-start "NAME" (unique-name-from-fqdn uname))))) (defn-spec generate-website-build-secret pred/map-or-seq? - [auth auth?] + [auth websiteauth?] (let [{:keys [uname authtoken gitea-host diff --git a/src/main/cljs/dda/c4k_website/browser.cljs b/src/main/cljs/dda/c4k_website/browser.cljs index ef168dc..af82de6 100644 --- a/src/main/cljs/dda/c4k_website/browser.cljs +++ b/src/main/cljs/dda/c4k_website/browser.cljs @@ -29,21 +29,32 @@ (generate-group "domain" (cm/concat-vec - (br/generate-input-field "fqdn" "Your first fqdn:" "deineWebsite.de") - (br/generate-input-field "fqdn1" "Your second fqdn:" "deineWebsite.com") - (br/generate-input-field "fqdn2" "Your third fqdn:" "meineWebsite.org") - (br/generate-input-field "multi" "Holds fqdns pointing to same ingress" "[\"fqdn\", \"fqdn1\"]") - (br/generate-input-field "single" "Holds fqdn pointing to another ingress" "fqdn") - (br/generate-input-field "issuer" "(Optional) Your issuer prod/staging:" ""))) + (br/generate-input-field "issuer" "(Optional) Your issuer prod/staging:" "") + (br/generate-text-area + "websites" "A map containing fqdns and repo infos for each website:" + "[{:uname \"test.io \", + :fqdns [\"test.de \" \"www.test.de \"], + :gitea-host \"githost.de \", + :gitea-repo \"repo \", + :branchname \"main \"} + {:uname \"example.io \", + :fqdns [\"example.org \" \"www.example.org \"], + :gitea-host \"githost.org \", + :gitea-repo \"repo \", + :branchname \"main \"}]" + "10"))) (generate-group "credentials" (br/generate-text-area - "auth" "Your auth.edn:" - "{:authtoken \"yourgiteaauthtoken\" - :gitrepourl \"https://your.gitea.host/api/v1/repos///archive/.zip\" - :singlegitrepourl \"https://your.gitea.host/api/v1/repos///archive/.zip\" - }" - "3")) + "auth" "Your authentication data for each website/ git repo:" + "{:auth + [{:uname \"test.io\", + :username \"someuser\", + :authtoken \"abedjgbasdodj\"} + {:uname \"example.io\", + :username \"someuser\", + :authtoken \"abedjgbasdodj\"}]}" + "7")) [(br/generate-br)] (br/generate-button "generate-button" "Generate c4k yaml")))] (br/generate-output "c4k-website-output" "Your c4k deployment.yaml:" "15"))) @@ -58,25 +69,20 @@ (defn config-from-document [] (let [issuer (br/get-content-from-element "issuer" :optional true)] (merge - {:fqdn (br/get-content-from-element "fqdn")} + {:websites (br/get-content-from-element "websites" :deserializer edn/read-string)} (when (not (st/blank? issuer)) {:issuer issuer})))) (defn validate-all! [] - (br/validate! "fqdn" ::website/fqdn) - (br/validate! "fqdn1" ::website/fqdn1) - (br/validate! "fqdn2" ::website/fqdn2) - (br/validate! "single" ::website/single) - (br/validate! "multi" ::website/multi) + (br/validate! "websites" ::website/websites) (br/validate! "issuer" ::website/issuer :optional true) - (br/validate! "auth" core/auth? :deserializer edn/read-string) + (br/validate! "auth" website/auth? :deserializer edn/read-string) (br/set-form-validated!)) (defn add-validate-listener [name] (-> (br/get-element-by-id name) (.addEventListener "blur" #(do (validate-all!))))) - (defn init [] (br/append-hickory (generate-content-div)) (-> js/document @@ -89,10 +95,6 @@ core/config-defaults core/k8s-objects) (br/set-output!))))) - (add-validate-listener "fqdn") - (add-validate-listener "fqdn1") - (add-validate-listener "fqdn2") - (add-validate-listener "single") - (add-validate-listener "multi") + (add-validate-listener "websites") (add-validate-listener "issuer") (add-validate-listener "auth")) diff --git a/src/main/resources/website/certificate.yaml b/src/main/resources/website/certificate.yaml index 5f60906..72bf6cd 100644 --- a/src/main/resources/website/certificate.yaml +++ b/src/main/resources/website/certificate.yaml @@ -1,10 +1,10 @@ apiVersion: cert-manager.io/v1 kind: Certificate metadata: - name: CERTNAME + name: c4k-common-cert namespace: default spec: - secretName: CERTNAME + secretName: c4k-common-cert commonName: FQDN duration: 2160h # 90d renewBefore: 360h # 15d diff --git a/src/main/resources/website/http-ingress.yaml b/src/main/resources/website/http-ingress.yaml index be0b862..3b274a4 100644 --- a/src/main/resources/website/http-ingress.yaml +++ b/src/main/resources/website/http-ingress.yaml @@ -1,7 +1,7 @@ apiVersion: networking.k8s.io/v1 kind: Ingress metadata: - name: http-ingress + name: c4k-common-http-ingress namespace: default annotations: traefik.ingress.kubernetes.io/router.entrypoints: web diff --git a/src/main/resources/website/https-ingress.yaml b/src/main/resources/website/https-ingress.yaml index 4daf1e3..4d7fbe2 100644 --- a/src/main/resources/website/https-ingress.yaml +++ b/src/main/resources/website/https-ingress.yaml @@ -1,7 +1,7 @@ apiVersion: networking.k8s.io/v1 kind: Ingress metadata: - name: https-ingress-gitea + name: c4k-common-https-ingress namespace: default annotations: traefik.ingress.kubernetes.io/router.entrypoints: websecure @@ -10,7 +10,7 @@ spec: tls: - hosts: - FQDN - secretName: CERTNAME + secretName: c4k-common-cert rules: - host: FQDN http: diff --git a/src/test/cljc/dda/c4k_website/website_test.cljc b/src/test/cljc/dda/c4k_website/website_test.cljc index ceff551..bb05c3d 100644 --- a/src/test/cljc/dda/c4k_website/website_test.cljc +++ b/src/test/cljc/dda/c4k_website/website_test.cljc @@ -8,96 +8,111 @@ [dda.c4k-website.website :as cut] [dda.c4k-website.core :as cutc])) -(st/instrument `cut/generate-single-certificate) -(st/instrument `cut/generate-single-ingress) -(st/instrument `cut/generate-single-nginx-configmap) -(st/instrument `cut/generate-multi-certificate) -(st/instrument `cut/generate-multi-ingress) -(st/instrument `cut/generate-multi-nginx-configmap) +(st/instrument `cut/generate-http-ingress) +(st/instrument `cut/generate-https-ingress) +(st/instrument `cut/generate-nginx-configmap) +(st/instrument `cut/generate-nginx-deployment) +(st/instrument `cut/generate-nginx-service) (st/instrument `cut/generate-website-content-volume) +(st/instrument `cut/generate-website-certificate) +(st/instrument `cut/generate-website-build-cron) +(st/instrument `cut/generate-website-build-deployment) +(st/instrument `cut/generate-website-build-secret) -(deftest should-generate-certificate - (is (= {:name-c2 "prod", :name-c1 "staging"} - (th/map-diff (cut/generate-single-certificate {:fqdn "test.de" - :fqdn1 "test.org" - :single "fqdn1" - :fqdn2 "bla.com" - :multi ["fqdn1", "fqdn"]}) - (cut/generate-single-certificate {:fqdn "test.com" - :fqdn1 "test.org" - :issuer "prod" - :single "fqdn1" - :fqdn2 "bla.com" - :multi ["fqdn1", "fqdn"]}))))) - -(deftest should-generate-ingress +(deftest should-generate-http-ingress (is (= {:apiVersion "networking.k8s.io/v1", :kind "Ingress", :metadata - {:name "test-de-ingress", + {:name "test-io-http-ingress", :namespace "default", :annotations - {:ingress.kubernetes.io/ssl-redirect "true", - :traefik.ingress.kubernetes.io/router.middlewares "default-redirect-https@kubernetescrd"}}, + #:traefik.ingress.kubernetes.io{:router.entrypoints "web", + :router.middlewares "default-redirect-https@kubernetescrd"}}, :spec - {:tls [{:hosts ["test.de"], :secretName "test-de-cert"}], - :rules + {:rules [{:host "test.de", - :http {:paths [{:pathType "Prefix", :path "/", :backend {:service {:name "test-de-service", :port {:number 80}}}}]}}]}} - (cut/generate-single-ingress {:fqdn "test.de" - :fqdn1 "test.org" - :fqdn2 "bla.com" - :multi ["fqdn1", "fqdn"] - :single "fqdn"})))) + :http + {:paths [{:pathType "Prefix", :path "/", :backend {:service {:name "test-io-service", :port {:number 80}}}}]}} + {:host "www.test.de", + :http + {:paths [{:pathType "Prefix", :path "/", :backend {:service {:name "test-io-service", :port {:number 80}}}}]}} + {:host "test-it.de", + :http + {:paths [{:pathType "Prefix", :path "/", :backend {:service {:name "test-io-service", :port {:number 80}}}}]}} + {:host "www.test-it.de", + :http + {:paths [{:pathType "Prefix", :path "/", :backend {:service {:name "test-io-service", :port {:number 80}}}}]}}]}} + (cut/generate-website-http-ingress {:uname "test.io" + :fqdns ["test.de" "www.test.de" "test-it.de" "www.test-it.de"]})))) -(deftest should-generate-ingress +(deftest should-generate-https-ingress (is (= {:apiVersion "networking.k8s.io/v1", :kind "Ingress", :metadata - {:name "test-de-ingress", + {:name "test-io-https-ingress", :namespace "default", - :annotations - {:ingress.kubernetes.io/ssl-redirect "true", - :traefik.ingress.kubernetes.io/router.middlewares "default-redirect-https@kubernetescrd"}}, + :annotations #:traefik.ingress.kubernetes.io{:router.entrypoints "websecure", :router.tls "true"}}, :spec - {:tls [{:hosts ["test.de"], :secretName "test-de-cert"}], + {:tls [{:hosts ["test.de" "www.test.de" "test-it.de" "www.test-it.de"], :secretName "test-io-cert"}], :rules [{:host "test.de", - :http {:paths [{:pathType "Prefix", :path "/", :backend {:service {:name "test-de-service", :port {:number 80}}}}]}}]}} - (cut/generate-single-ingress {:fqdn "test.de" - :fqdn1 "test.org" - :fqdn2 "bla.com" - :multi ["fqdn1", "fqdn"] - :single "fqdn"})))) + :http + {:paths [{:pathType "Prefix", :path "/", :backend {:service {:name "test-io-service", :port {:number 80}}}}]}} + {:host "www.test.de", + :http + {:paths [{:pathType "Prefix", :path "/", :backend {:service {:name "test-io-service", :port {:number 80}}}}]}} + {:host "test-it.de", + :http + {:paths [{:pathType "Prefix", :path "/", :backend {:service {:name "test-io-service", :port {:number 80}}}}]}} + {:host "www.test-it.de", + :http + {:paths [{:pathType "Prefix", :path "/", :backend {:service {:name "test-io-service", :port {:number 80}}}}]}}]}} + (cut/generate-website-https-ingress {:uname "test.io" + :fqdns ["test.de" "www.test.de" "test-it.de" "www.test-it.de"]})))) + +(deftest should-generate-website-certificate + (is (= {:name-c1 "prod", :name-c2 "staging"} + (th/map-diff (cut/generate-website-certificate {:uname "test.io" + :gitea-host "gitea.evilorg" + :gitea-repo "none" + :branchname "mablain" + :issuer "prod" + :fqdns ["test.org" "test.de"]}) + (cut/generate-website-certificate {:uname "test.io" + :gitea-host "gitea.evilorg" + :gitea-repo "none" + :branchname "mablain" + :issuer "staging" + :fqdns ["test.org" "test.de"]}))))) (deftest should-generate-nginx-configmap - (is (= {:website.conf-c1 "server {\n listen 80 default_server;\n listen [::]:80 default_server;\n listen 443 ssl;\n ssl_certificate /etc/certs/tls.crt;\n ssl_certificate_key /etc/certs/tls.key;\n server_name test.de; \n add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload';\n add_header Content-Security-Policy \"default-src 'self'; font-src *;img-src * data:; script-src *; style-src *\";\n add_header X-XSS-Protection \"1; mode=block\";\n add_header X-Frame-Options \"SAMEORIGIN\";\n add_header X-Content-Type-Options nosniff;\n add_header Referrer-Policy \"strict-origin\";\n # add_header Permissions-Policy \"permissions here\";\n root /var/www/html/website/;\n index index.html;\n location / {\n try_files $uri $uri/ /index.html =404;\n }\n}\n", - :website.conf-c2 "server {\n listen 80 default_server;\n listen [::]:80 default_server;\n listen 443 ssl;\n ssl_certificate /etc/certs/tls.crt;\n ssl_certificate_key /etc/certs/tls.key;\n server_name test.com; \n add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload';\n add_header Content-Security-Policy \"default-src 'self'; font-src *;img-src * data:; script-src *; style-src *\";\n add_header X-XSS-Protection \"1; mode=block\";\n add_header X-Frame-Options \"SAMEORIGIN\";\n add_header X-Content-Type-Options nosniff;\n add_header Referrer-Policy \"strict-origin\";\n # add_header Permissions-Policy \"permissions here\";\n root /var/www/html/website/;\n index index.html;\n location / {\n try_files $uri $uri/ /index.html =404;\n }\n}\n", - :name-c1 "test-de-configmap", - :name-c2 "test-com-configmap"} - (th/map-diff (cut/generate-single-nginx-configmap {:fqdn "test.de" - :fqdn1 "test.org" - :single "fqdn" - :fqdn2 "bla.com" - :multi ["fqdn1", "fqdn"]}) - (cut/generate-single-nginx-configmap {:fqdn "test.org" - :fqdn1 "test.com" - :single "fqdn1" - :fqdn2 "bla.com" - :multi ["fqdn1", "fqdn"]}))))) + (is (= {:website.conf-c1 "server {\n listen 80 default_server;\n listen [::]:80 default_server;\n listen 443 ssl;\n ssl_certificate /etc/certs/tls.crt;\n ssl_certificate_key /etc/certs/tls.key;\n server_name test.de www.test.de test-it.de www.test-it.de; \n add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload';\n add_header Content-Security-Policy \"default-src 'self'; font-src *;img-src * data:; script-src *; style-src *\";\n add_header X-XSS-Protection \"1; mode=block\";\n add_header X-Frame-Options \"SAMEORIGIN\";\n add_header X-Content-Type-Options nosniff;\n add_header Referrer-Policy \"strict-origin\";\n # add_header Permissions-Policy \"permissions here\";\n root /var/www/html/website/;\n index index.html;\n location / {\n try_files $uri $uri/ /index.html =404;\n }\n}\n", + :website.conf-c2 "server {\n listen 80 default_server;\n listen [::]:80 default_server;\n listen 443 ssl;\n ssl_certificate /etc/certs/tls.crt;\n ssl_certificate_key /etc/certs/tls.key;\n server_name example.de www.example.de example-by.de www.example-by.de; \n add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload';\n add_header Content-Security-Policy \"default-src 'self'; font-src *;img-src * data:; script-src *; style-src *\";\n add_header X-XSS-Protection \"1; mode=block\";\n add_header X-Frame-Options \"SAMEORIGIN\";\n add_header X-Content-Type-Options nosniff;\n add_header Referrer-Policy \"strict-origin\";\n # add_header Permissions-Policy \"permissions here\";\n root /var/www/html/website/;\n index index.html;\n location / {\n try_files $uri $uri/ /index.html =404;\n }\n}\n", + :name-c1 "test-io-configmap", + :name-c2 "example-io-configmap"} + (th/map-diff (cut/generate-nginx-configmap {:uname "test.io", + :gitea-host "gitea.evilorg", + :gitea-repo "none", + :branchname "mablain", + :fqdns ["test.de" "www.test.de" "test-it.de" "www.test-it.de"]}) + (cut/generate-nginx-configmap {:uname "example.io", + :gitea-host "gitea.evilorg", + :gitea-repo "none", + :branchname "mablain", + :fqdns ["example.de" "www.example.de" "example-by.de" "www.example-by.de"]}))))) (deftest should-generate-nginx-deployment (is (= {:apiVersion "apps/v1", :kind "Deployment", - :metadata {:name "test-de-deployment"}, + :metadata {:name "test-io-deployment"}, :spec {:replicas 1, - :selector {:matchLabels {:app "test-de-nginx"}}, + :selector {:matchLabels {:app "test-io-nginx"}}, :template - {:metadata {:labels {:app "test-de-nginx"}}, + {:metadata {:labels {:app "test-io-nginx"}}, :spec {:containers - [{:name "test-de-nginx", + [{:name "test-io-nginx", :image "nginx:latest", :imagePullPolicy "IfNotPresent", :ports [{:containerPort 80}], @@ -109,42 +124,42 @@ :volumes [{:name "nginx-config-volume", :configMap - {:name "test-de-configmap", + {:name "test-io-configmap", :items [{:key "nginx.conf", :path "nginx.conf"} {:key "website.conf", :path "conf.d/website.conf"} {:key "mime.types", :path "mime.types"}]}} {:name "log", :emptyDir {}} - {:name "website-content-volume", :persistentVolumeClaim {:claimName "test-de-content-volume"}} + {:name "website-content-volume", :persistentVolumeClaim {:claimName "test-io-content-volume"}} {:name "website-cert", :secret - {:secretName "test-de-cert", :items [{:key "tls.crt", :path "tls.crt"} {:key "tls.key", :path "tls.key"}]}}]}}}} - (cut/generate-nginx-deployment {:fqdn "test.de" - :fqdn1 "test.com" - :fqdn2 "test.io" - :single "fqdn2" - :multi ["fqdn1", "fqdn2"]})))) + {:secretName "test-io-cert", :items [{:key "tls.crt", :path "tls.crt"} {:key "tls.key", :path "tls.key"}]}}]}}}} + (cut/generate-nginx-deployment {:uname "test.io", + :gitea-host "gitea.evilorg", + :gitea-repo "none", + :branchname "mablain", + :fqdns ["test.de" "www.test.de" "test-it.de" "www.test-it.de"]})))) (deftest should-generate-nginx-service - (is (= {:name-c1 "test-de-service", - :name-c2 "test-com-service", - :app-c1 "test-de-nginx", - :app-c2 "test-com-nginx"} - (th/map-diff (cut/generate-nginx-service (cutc/set-multi-fqdn {:fqdn "test.de" - :fqdn1 "bla.de" - :fqdn2 "bla.com" - :single "fqdn1" - :multi ["fqdn", "fqdn"]})) - (cut/generate-nginx-service (cutc/set-multi-fqdn {:fqdn "test.com" - :fqdn1 "bla.de" - :fqdn2 "bla.com" - :single "fqdn1" - :multi ["fqdn", "fqdn"]})))))) + (is (= {:name-c1 "test-io-service", + :name-c2 "test-org-service", + :app-c1 "test-io-nginx", + :app-c2 "test-org-nginx"} + (th/map-diff (cut/generate-nginx-service {:uname "test.io", + :gitea-host "gitea.evilorg", + :gitea-repo "none", + :branchname "mablain", + :fqdns ["test.de" "www.test.de" "test-it.de" "www.test-it.de"]}) + (cut/generate-nginx-service {:uname "test.org", + :gitea-host "gitea.evilorg", + :gitea-repo "none", + :branchname "mablain", + :fqdns ["test.de" "www.test.de" "test-it.de" "www.test-it.de"]}))))) (deftest should-generate-website-build-cron (is (= {:apiVersion "batch/v1beta1", :kind "CronJob", - :metadata {:name "test-de-build-cron", :labels {:app.kubernetes.part-of "website"}}, + :metadata {:name "test-io-build-cron", :labels {:app.kubernetes.part-of "website"}}, :spec {:schedule "1,7,14,21,28,35,42,49,54,59 * * * *", :successfulJobsHistoryLimit 1, @@ -155,81 +170,77 @@ {:spec {:containers [{:image "domaindrivenarchitecture/c4k-website-build", - :name "test-de-build-app", + :name "test-io-build-app", :imagePullPolicy "IfNotPresent", - :command ["/entrypoint.sh"], - :envFrom [{:secretRef {:name "test-de-secret"}}], + :command ["/entrypoint.sh"], + :envFrom [{:secretRef {:name "test-io-secret"}}], :volumeMounts [{:name "content-volume", :mountPath "/var/www/html/website"}]}], - :volumes [{:name "content-volume", :persistentVolumeClaim {:claimName "test-de-content-volume"}}], + :volumes [{:name "content-volume", :persistentVolumeClaim {:claimName "test-io-content-volume"}}], :restartPolicy "OnFailure"}}}}}} - (cut/generate-website-build-cron {:fqdn "test.de" - :fqdn1 "bla.de" - :fqdn2 "bla.com" - :single "fqdn1" - :multi ["fqdn1", "fqdn"]})))) + (cut/generate-website-build-cron {:uname "test.io", + :gitea-host "gitea.evilorg", + :gitea-repo "none", + :branchname "mablain", + :fqdns ["test.de" "www.test.de" "test-it.de" "www.test-it.de"]})))) (deftest should-generate-website-build-deployment (is (= {:apiVersion "apps/v1", :kind "Deployment", - :metadata {:name "test-de-build-deployment"}, + :metadata {:name "test-io-build-deployment"}, :spec {:replicas 0, - :selector {:matchLabels {:app "test-de-builder"}}, + :selector {:matchLabels {:app "test-io-builder"}}, :strategy {:type "Recreate"}, :template {:metadata - {:labels {:app "test-de-builder", :app.kubernetes.io/name "test-de-builder", :app.kubernetes.io/part-of "website"}}, + {:labels {:app "test-io-builder", :app.kubernetes.io/name "test-io-builder", :app.kubernetes.io/part-of "website"}}, :spec {:containers [{:image "domaindrivenarchitecture/c4k-website-build", - :name "test-de-build-app", + :name "test-io-build-app", :imagePullPolicy "IfNotPresent", - :command ["/entrypoint.sh"], - :envFrom [{:secretRef {:name "test-de-secret"}}], + :command ["/entrypoint.sh"], + :envFrom [{:secretRef {:name "test-io-secret"}}], :volumeMounts [{:name "content-volume", :mountPath "/var/www/html/website"}]}], - :volumes [{:name "content-volume", :persistentVolumeClaim {:claimName "test-de-content-volume"}}]}}}} - (cut/generate-website-build-deployment {:fqdn "test.de" - :fqdn1 "bla.de" - :fqdn2 "bla.com" - :single "fqdn1" - :multi ["fqdn1", "fqdn"]})))) + :volumes [{:name "content-volume", :persistentVolumeClaim {:claimName "test-io-content-volume"}}]}}}} + (cut/generate-website-build-deployment {:uname "test.io", + :gitea-host "gitea.evilorg", + :gitea-repo "none", + :branchname "mablain", + :fqdns ["test.de" "www.test.de" "test-it.de" "www.test-it.de"]})))) (deftest should-generate-website-build-secret - (is (= {:name-c1 "test-de-secret", - :name-c2 "test-com-secret", - :AUTHTOKEN-c1 (b64/encode "token1"), + (is (= {:name-c1 "test-io-secret", + :name-c2 "test-org-secret", + :AUTHTOKEN-c1 (b64/encode "token1"), :AUTHTOKEN-c2 (b64/encode "token2"), - :GITREPOURL-c1 (b64/encode "test.de/user/repo.git"), - :GITREPOURL-c2 (b64/encode "test.com/user/repo.git")} - (th/map-diff (cut/generate-website-build-secret {:fqdn "test.de" - :fqdn1 "bla.de" - :fqdn2 "bla.com" - :single "fqdn1" - :multi ["fqdn1", "fqdn"] - :authtoken "token1" - :gitrepourl "test.de/user/repo.git" - :singlegitrepourl "test.com/user/otherrepo.git"}) - (cut/generate-website-build-secret {:fqdn "test.com" - :fqdn1 "bla.de" - :fqdn2 "bla.com" - :single "fqdn1" - :multi ["fqdn1", "fqdn"] - :authtoken "token2" - :gitrepourl "test.com/user/repo.git" - :singlegitrepourl "test.com/user/otherrepo.git"}))))) + :GITREPOURL-c1 (b64/encode "https://gitlab.org/api/v1/repos/dumpty/websitebau/archive/testname.zip"), + :GITREPOURL-c2 (b64/encode "https://github.com/api/v1/repos/humpty/websitedachs/archive/testname.zip")} + (th/map-diff (cut/generate-website-build-secret {:uname "test.io", + :authtoken "token1", + :gitea-host "gitlab.org", + :gitea-repo "websitebau", + :username "dumpty", + :branchname "testname"}) + (cut/generate-website-build-secret {:uname "test.org", + :authtoken "token2", + :gitea-host "github.com", + :gitea-repo "websitedachs", + :username "humpty", + :branchname "testname"}))))) (deftest should-generate-website-content-volume - (is (= {:name-c1 "test-de-content-volume", - :name-c2 "test-com-content-volume", - :app-c1 "test-de-nginx", - :app-c2 "test-com-nginx"} - (th/map-diff (cut/generate-website-content-volume {:fqdn "test.de" - :fqdn1 "bla.de" - :fqdn2 "bla.com" - :single "fqdn1" - :multi ["fqdn1", "fqdn"]}) - (cut/generate-website-content-volume {:fqdn "test.com" - :fqdn1 "bla.de" - :fqdn2 "bla.com" - :single "fqdn1" - :multi ["fqdn1", "fqdn"]}))))) + (is (= {:name-c1 "test-io-content-volume", + :name-c2 "test-org-content-volume", + :app-c1 "test-io-nginx", + :app-c2 "test-org-nginx"} + (th/map-diff (cut/generate-website-content-volume {:uname "test.io", + :gitea-host "gitea.evilorg", + :gitea-repo "none", + :branchname "mablain", + :fqdns ["test.de" "www.test.de" "test-it.de" "www.test-it.de"]}) + (cut/generate-website-content-volume {:uname "test.org", + :gitea-host "gitea.evilorg", + :gitea-repo "none", + :branchname "mablain", + :fqdns ["test.de" "www.test.de" "test-it.de" "www.test-it.de"]})))))