From 679530dbc731541f57d5796b0656c286df1cc504 Mon Sep 17 00:00:00 2001 From: erik Date: Fri, 30 Sep 2022 17:54:26 +0200 Subject: [PATCH] Add functionality for multiple fqdns --- doc/tryItOut.png | Bin 42305 -> 62816 bytes .../image/resources/entrypoint.sh | 4 - .../image/resources/functions.sh | 6 +- src/main/cljc/dda/c4k_website/core.cljc | 52 +++- src/main/cljc/dda/c4k_website/website.cljc | 97 +++++-- src/main/cljs/dda/c4k_website/browser.cljs | 19 +- .../resources/website/multi-certificate.yaml | 17 ++ src/main/resources/website/multi-ingress.yaml | 36 +++ .../website/multi-nginx-configmap.yaml | 99 ++++++++ .../resources/website/nginx-deployment.yaml | 2 +- ...rtificate.yaml => single-certificate.yaml} | 0 .../{ingress.yaml => single-ingress.yaml} | 0 ...igmap.yaml => single-nginx-configmap.yaml} | 0 .../cljc/dda/c4k_website/website_test.cljc | 236 +++++++++++++++--- valid-auth.edn | 3 +- valid-config.edn | 11 +- 16 files changed, 508 insertions(+), 74 deletions(-) create mode 100644 src/main/resources/website/multi-certificate.yaml create mode 100644 src/main/resources/website/multi-ingress.yaml create mode 100644 src/main/resources/website/multi-nginx-configmap.yaml rename src/main/resources/website/{certificate.yaml => single-certificate.yaml} (100%) rename src/main/resources/website/{ingress.yaml => single-ingress.yaml} (100%) rename src/main/resources/website/{nginx-configmap.yaml => single-nginx-configmap.yaml} (100%) diff --git a/doc/tryItOut.png b/doc/tryItOut.png index a4c2b585ed4ffa369615b56273a4b8c6b194d721..6f0bda8b50edb97f0ae1877a84ffff3f48987b72 100644 GIT binary patch literal 62816 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 - (yaml/load-as-edn "website/certificate.yaml") + (yaml/load-as-edn "website/single-certificate.yaml") (assoc-in [:spec :issuerRef :name] letsencrypt-issuer) (replace-all-matching-subvalues-in-string-start "NAME" (unique-name-from-fqdn fqdn)) (cm/replace-all-matching-values-by-new-value "FQDN" fqdn)))) -(defn-spec generate-ingress pred/map-or-seq? +(defn-spec generate-single-ingress pred/map-or-seq? [config config?] - (let [{:keys [fqdn]} config] + (let [{:keys [single]} config + fqdn ((keyword single) config)] (-> - (yaml/load-as-edn "website/ingress.yaml") + (yaml/load-as-edn "website/single-ingress.yaml") (replace-all-matching-subvalues-in-string-start "NAME" (unique-name-from-fqdn fqdn)) (cm/replace-all-matching-values-by-new-value "FQDN" fqdn)))) -(defn-spec generate-nginx-configmap pred/map-or-seq? +(defn-spec generate-single-nginx-configmap pred/map-or-seq? [config config?] - (let [{:keys [fqdn]} config - configmap (yaml/load-as-edn "website/nginx-configmap.yaml")] + (let [{:keys [single]} config + fqdn ((keyword single) config) + configmap (yaml/load-as-edn "website/single-nginx-configmap.yaml")] (-> configmap (assoc-in [:data :website.conf] (st/replace (-> configmap :data :website.conf) #"FQDN" (str fqdn ";"))) - (replace-all-matching-subvalues-in-string-start "NAME" (unique-name-from-fqdn fqdn))))) + (replace-all-matching-subvalues-in-string-start "NAME" (unique-name-from-fqdn fqdn))))) + +(defn-spec generate-multi-certificate pred/map-or-seq? + [config config?] + (let [{:keys [issuer multi] + :or {issuer "staging"}} config + fqdn ((keyword (first multi)) config) + fqdn1 ((keyword (second multi)) config) + letsencrypt-issuer (name issuer)] + (-> + (yaml/load-as-edn "website/multi-certificate.yaml") + (assoc-in [:spec :issuerRef :name] letsencrypt-issuer) + (replace-all-matching-subvalues-in-string-start "NAME" (unique-name-from-fqdn fqdn)) + (cm/replace-all-matching-values-by-new-value "FQDN" fqdn) + (cm/replace-all-matching-values-by-new-value "FQDN1" fqdn1)))) + +(defn-spec generate-multi-ingress pred/map-or-seq? + [config config?] + (let [{:keys [multi]} config + fqdn ((keyword (first multi)) config) + fqdn1 ((keyword (second multi)) config)] + (-> + (yaml/load-as-edn "website/multi-ingress.yaml") + (replace-all-matching-subvalues-in-string-start "NAME" (unique-name-from-fqdn fqdn)) + (cm/replace-all-matching-values-by-new-value "FQDN" fqdn) + (cm/replace-all-matching-values-by-new-value "FQDN1" fqdn1)))) + +(defn-spec generate-multi-nginx-configmap pred/map-or-seq? + [config config?] + (let [{:keys [multi]} config + fqdn ((keyword (first multi)) config) + fqdn1 ((keyword (second multi)) config) + configmap (yaml/load-as-edn "website/multi-nginx-configmap.yaml")] + (-> + configmap + (assoc-in [:data :website.conf] (st/replace (-> configmap :data :website.conf) #"FQDN\ FQDN1" (str fqdn " " fqdn1 ";"))) + (replace-all-matching-subvalues-in-string-start "NAME" (unique-name-from-fqdn fqdn))))) (defn-spec generate-nginx-deployment pred/map-or-seq? [config config?] @@ -124,8 +179,8 @@ (defn-spec generate-website-build-secret pred/map-or-seq? [auth auth?] - (let [{:keys [fqdn - authtoken + (let [{:keys [fqdn + authtoken gitrepourl]} auth] (-> (yaml/load-as-edn "website/website-build-secret.yaml") diff --git a/src/main/cljs/dda/c4k_website/browser.cljs b/src/main/cljs/dda/c4k_website/browser.cljs index d69d012..ef168dc 100644 --- a/src/main/cljs/dda/c4k_website/browser.cljs +++ b/src/main/cljs/dda/c4k_website/browser.cljs @@ -29,14 +29,19 @@ (generate-group "domain" (cm/concat-vec - (br/generate-input-field "fqdn" "Your fqdn:" "deineWebsite.de") + (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:" ""))) (generate-group "credentials" (br/generate-text-area "auth" "Your auth.edn:" - "{:gitrepourl \"https://your.gitea.host/api/v1/repos///archive/.zip\" - :authtoken \"yourgiteaauthtoken\" + "{:authtoken \"yourgiteaauthtoken\" + :gitrepourl \"https://your.gitea.host/api/v1/repos///archive/.zip\" + :singlegitrepourl \"https://your.gitea.host/api/v1/repos///archive/.zip\" }" "3")) [(br/generate-br)] @@ -59,6 +64,10 @@ (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! "issuer" ::website/issuer :optional true) (br/validate! "auth" core/auth? :deserializer edn/read-string) (br/set-form-validated!)) @@ -81,5 +90,9 @@ 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 "issuer") (add-validate-listener "auth")) diff --git a/src/main/resources/website/multi-certificate.yaml b/src/main/resources/website/multi-certificate.yaml new file mode 100644 index 0000000..27768b3 --- /dev/null +++ b/src/main/resources/website/multi-certificate.yaml @@ -0,0 +1,17 @@ +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: NAME-cert + namespace: default +spec: + secretName: NAME-cert + commonName: FQDN + duration: 2160h # 90d + renewBefore: 360h # 15d + dnsNames: + - FQDN + - FQDN1 + issuerRef: + name: staging + kind: ClusterIssuer + \ No newline at end of file diff --git a/src/main/resources/website/multi-ingress.yaml b/src/main/resources/website/multi-ingress.yaml new file mode 100644 index 0000000..a37e8db --- /dev/null +++ b/src/main/resources/website/multi-ingress.yaml @@ -0,0 +1,36 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: NAME-ingress + namespace: default + annotations: + ingress.kubernetes.io/ssl-redirect: "true" + traefik.ingress.kubernetes.io/router.middlewares: default-redirect-https@kubernetescrd +spec: + tls: + - hosts: + - FQDN + - FQDN1 + secretName: NAME-cert + rules: + - host: FQDN + http: + paths: + - pathType: Prefix + path: "/" + backend: + service: + name: NAME-service + port: + number: 80 + - host: FQDN1 + http: + paths: + - pathType: Prefix + path: "/" + backend: + service: + name: NAME-service + port: + number: 80 + \ No newline at end of file diff --git a/src/main/resources/website/multi-nginx-configmap.yaml b/src/main/resources/website/multi-nginx-configmap.yaml new file mode 100644 index 0000000..a8e0348 --- /dev/null +++ b/src/main/resources/website/multi-nginx-configmap.yaml @@ -0,0 +1,99 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: NAME-configmap + namespace: default +data: + nginx.conf: | + user nginx; + worker_processes 3; + error_log /var/log/nginx/error.log; + pid /var/log/nginx/nginx.pid; + worker_rlimit_nofile 8192; + events { + worker_connections 4096; + } + http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + log_format main '$remote_addr - $remote_user [$time_local] $status' + '"$request" $body_bytes_sent "$http_referer"' + '"$http_user_agent" "$http_x_forwarded_for"'; + access_log /var/log/nginx/access.log main; + sendfile on; + tcp_nopush on; + keepalive_timeout 65; + server_names_hash_bucket_size 128; + include /etc/nginx/conf.d/website.conf; + } + mime.types: | + types { + text/html html htm shtml; + text/css css; + text/xml xml rss; + image/gif gif; + image/jpeg jpeg jpg; + application/x-javascript js; + text/plain txt; + text/x-component htc; + text/mathml mml; + image/png png; + image/x-icon ico; + image/x-jng jng; + image/vnd.wap.wbmp wbmp; + application/java-archive jar war ear; + application/mac-binhex40 hqx; + application/pdf pdf; + application/x-cocoa cco; + application/x-java-archive-diff jardiff; + application/x-java-jnlp-file jnlp; + application/x-makeself run; + application/x-perl pl pm; + application/x-pilot prc pdb; + application/x-rar-compressed rar; + application/x-redhat-package-manager rpm; + application/x-sea sea; + application/x-shockwave-flash swf; + application/x-stuffit sit; + application/x-tcl tcl tk; + application/x-x509-ca-cert der pem crt; + application/x-xpinstall xpi; + application/zip zip; + application/octet-stream deb; + application/octet-stream bin exe dll; + application/octet-stream dmg; + application/octet-stream eot; + application/octet-stream iso img; + application/octet-stream msi msp msm; + audio/mpeg mp3; + audio/x-realaudio ra; + video/mpeg mpeg mpg; + video/quicktime mov; + video/x-flv flv; + video/x-msvideo avi; + video/x-ms-wmv wmv; + video/x-ms-asf asx asf; + video/x-mng mng; + } + website.conf: | + server { + listen 80 default_server; + listen [::]:80 default_server; + listen 443 ssl; + ssl_certificate /etc/certs/tls.crt; + ssl_certificate_key /etc/certs/tls.key; + server_name FQDN FQDN1 + add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload'; + add_header Content-Security-Policy "default-src 'self'; font-src *;img-src * data:; script-src *; style-src *"; + add_header X-XSS-Protection "1; mode=block"; + add_header X-Frame-Options "SAMEORIGIN"; + add_header X-Content-Type-Options nosniff; + add_header Referrer-Policy "strict-origin"; + # add_header Permissions-Policy "permissions here"; + root /var/www/html/website/; + index index.html; + location / { + try_files $uri $uri/ /index.html =404; + } + } + \ No newline at end of file diff --git a/src/main/resources/website/nginx-deployment.yaml b/src/main/resources/website/nginx-deployment.yaml index eba5998..ce44bda 100644 --- a/src/main/resources/website/nginx-deployment.yaml +++ b/src/main/resources/website/nginx-deployment.yaml @@ -15,7 +15,7 @@ spec: containers: - name: NAME-nginx image: nginx:latest - imagePullPolicy: "Always" + imagePullPolicy: IfNotPresent ports: - containerPort: 80 volumeMounts: diff --git a/src/main/resources/website/certificate.yaml b/src/main/resources/website/single-certificate.yaml similarity index 100% rename from src/main/resources/website/certificate.yaml rename to src/main/resources/website/single-certificate.yaml diff --git a/src/main/resources/website/ingress.yaml b/src/main/resources/website/single-ingress.yaml similarity index 100% rename from src/main/resources/website/ingress.yaml rename to src/main/resources/website/single-ingress.yaml diff --git a/src/main/resources/website/nginx-configmap.yaml b/src/main/resources/website/single-nginx-configmap.yaml similarity index 100% rename from src/main/resources/website/nginx-configmap.yaml rename to src/main/resources/website/single-nginx-configmap.yaml diff --git a/src/test/cljc/dda/c4k_website/website_test.cljc b/src/test/cljc/dda/c4k_website/website_test.cljc index da52cf0..a4507c6 100644 --- a/src/test/cljc/dda/c4k_website/website_test.cljc +++ b/src/test/cljc/dda/c4k_website/website_test.cljc @@ -5,20 +5,32 @@ [clojure.spec.test.alpha :as st] [dda.c4k-common.test-helper :as th] [dda.c4k-common.base64 :as b64] - [dda.c4k-website.website :as cut])) + [dda.c4k-website.website :as cut] + [dda.c4k-website.core :as cutc])) -(st/instrument `cut/generate-certificate) -(st/instrument `cut/generate-ingress) -(st/instrument `cut/generate-nginx-configmap) +(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-website-content-volume) -(deftest should-generate-certificate +(deftest should-generate-single-certificate (is (= {:name-c2 "prod", :name-c1 "staging"} - (th/map-diff (cut/generate-certificate {:fqdn "test.de"}) - (cut/generate-certificate {:issuer "prod" - :fqdn "test.de"}))))) + (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-single-ingress (is (= {:apiVersion "networking.k8s.io/v1", :kind "Ingress", :metadata @@ -32,15 +44,79 @@ :rules [{:host "test.de", :http {:paths [{:pathType "Prefix", :path "/", :backend {:service {:name "test-de-service", :port {:number 80}}}}]}}]}} - (cut/generate-ingress {:fqdn "test.de"})))) + (cut/generate-single-ingress {:fqdn "test.de" + :fqdn1 "test.org" + :fqdn2 "bla.com" + :multi ["fqdn1", "fqdn"] + :single "fqdn"})))) -(deftest should-generate-nginx-configmap +(deftest should-generate-single-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-nginx-configmap {:fqdn "test.de"}) - (cut/generate-nginx-configmap {:fqdn "test.com"}))))) + (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"]}))))) + +(deftest should-generate-multi-certificate + (is (= {:name-c2 "prod", :name-c1 "staging"} + (th/map-diff (cut/generate-multi-certificate {:fqdn "test.de" + :fqdn1 "test.com" + :fqdn2 "test.io" + :single "fqdn1" + :multi ["fqdn", "fqdn2"]}) + (cut/generate-multi-certificate {:fqdn "test.io" + :fqdn1 "test.com" + :fqdn2 "test.de" + :single "fqdn1" + :multi ["fqdn2", "fqdn"] + :issuer "prod"}))))) + +(deftest should-generate-multi-ingress + (is (= {:apiVersion "networking.k8s.io/v1", + :kind "Ingress", + :metadata + {:name "test-de-ingress", + :namespace "default", + :annotations + {:ingress.kubernetes.io/ssl-redirect "true", + :traefik.ingress.kubernetes.io/router.middlewares "default-redirect-https@kubernetescrd"}}, + :spec + {:tls [{:hosts ["test.de", "test.io"], :secretName "test-de-cert"}], + :rules + [{:host "test.de", + :http {:paths [{:pathType "Prefix", :path "/", :backend {:service {:name "test-de-service", :port {:number 80}}}}]}} + {:host "test.io", + :http {:paths [{:pathType "Prefix", :path "/", :backend {:service {:name "test-de-service", :port {:number 80}}}}]}}]}} + (cut/generate-multi-ingress {:fqdn "test.de" + :fqdn1 "test.com" + :fqdn2 "test.io" + :single "fqdn1" + :multi ["fqdn", "fqdn2"]})))) + +(deftest should-generate-nginx-multi-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 test.io; \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 test.io; \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-multi-nginx-configmap {:fqdn "test.de" + :fqdn1 "test.com" + :fqdn2 "test.io" + :single "fqdn1" + :multi ["fqdn", "fqdn2"]}) + (cut/generate-multi-nginx-configmap {:fqdn "test.de" + :fqdn1 "test.com" + :fqdn2 "test.io" + :single "fqdn2" + :multi ["fqdn1", "fqdn2"]}))))) (deftest should-generate-nginx-deployment (is (= {:apiVersion "apps/v1", @@ -55,7 +131,7 @@ {:containers [{:name "test-de-nginx", :image "nginx:latest", - :imagePullPolicy "Always", + :imagePullPolicy "IfNotPresent", :ports [{:containerPort 80}], :volumeMounts [{:mountPath "/etc/nginx", :readOnly true, :name "nginx-config-volume"} @@ -75,18 +151,69 @@ {: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"})))) + (cut/generate-nginx-deployment {:fqdn "test.de" + :fqdn1 "test.com" + :fqdn2 "test.io" + :single "fqdn2" + :multi ["fqdn1", "fqdn2"]})))) -(deftest should-generate-nginx-service ;todo +(deftest should-generate-nginx-deployment-set-single + (is (= {:apiVersion "apps/v1", + :kind "Deployment", + :metadata {:name "test-de-deployment"}, + :spec + {:replicas 1, + :selector {:matchLabels {:app "test-de-nginx"}}, + :template + {:metadata {:labels {:app "test-de-nginx"}}, + :spec + {:containers + [{:name "test-de-nginx", + :image "nginx:latest", + :imagePullPolicy "IfNotPresent", + :ports [{:containerPort 80}], + :volumeMounts + [{:mountPath "/etc/nginx", :readOnly true, :name "nginx-config-volume"} + {:mountPath "/var/log/nginx", :name "log"} + {:mountPath "/var/www/html/website", :name "website-content-volume", :readOnly true} + {:mountPath "/etc/certs", :name "website-cert", :readOnly true}]}], + :volumes + [{:name "nginx-config-volume", + :configMap + {:name "test-de-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-cert", + :secret + {:secretName "test-de-cert", :items [{:key "tls.crt", :path "tls.crt"} {:key "tls.key", :path "tls.key"}]}}]}}}} + (cut/generate-nginx-deployment (cutc/set-single-fqdn + {:fqdn "test.io" + :fqdn1 "test.com" + :fqdn2 "test.de" + :single "fqdn2" + :multi ["fqdn1", "fqdn2"]}))))) + +(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 {:fqdn "test.de"}) - (cut/generate-nginx-service {:fqdn "test.com"}))))) + :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"]})))))) -(deftest should-generate-website-build-cron ;todo +(deftest should-generate-website-build-cron (is (= {:apiVersion "batch/v1beta1", :kind "CronJob", :metadata {:name "test-de-build-cron", :labels {:app.kubernetes.part-of "website"}}, @@ -108,7 +235,11 @@ :volumeMounts [{:name "content-volume", :mountPath "/var/www/html/website"}]}], :volumes [{:name "content-volume", :persistentVolumeClaim {:claimName "test-de-content-volume"}}], :restartPolicy "OnFailure"}}}}}} - (cut/generate-website-build-cron {:fqdn "test.de"})))) + (cut/generate-website-build-cron {:fqdn "test.de" + :fqdn1 "bla.de" + :fqdn2 "bla.com" + :single "fqdn1" + :multi ["fqdn1", "fqdn"]})))) (deftest should-generate-website-build-deployment (is (= {:apiVersion "apps/v1", @@ -131,7 +262,11 @@ :envFrom [{:secretRef {:name "test-de-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"})))) + (cut/generate-website-build-deployment {:fqdn "test.de" + :fqdn1 "bla.de" + :fqdn2 "bla.com" + :single "fqdn1" + :multi ["fqdn1", "fqdn"]})))) (deftest should-generate-website-build-secret (is (= {:name-c1 "test-de-secret", @@ -140,17 +275,60 @@ :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" - :authtoken "token1" - :gitrepourl "test.de/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"}))))) + :gitrepourl "test.com/user/repo.git" + :singlegitrepourl "test.com/user/otherrepo.git"}))))) +(deftest should-generate-website-build-secret-set-single + (is (= {:name-c1 "test-de-secret", + :name-c2 "test-com-secret", + :AUTHTOKEN-c1 (b64/encode "token1"), + :AUTHTOKEN-c2 (b64/encode "token2"), + :GITREPOURL-c1 (b64/encode "test.de/user/main.git"), + :GITREPOURL-c2 (b64/encode "test.com/user/master.git")} + (th/map-diff (cut/generate-website-build-secret (cutc/set-single-repo-url + {:fqdn "test.de" + :fqdn1 "bla.de" + :fqdn2 "bla.com" + :single "fqdn" + :multi ["fqdn", "fqdn"] + :authtoken "token1" + :gitrepourl "test.de/user/repo.git" + :singlegitrepourl "test.de/user/main.git"})) + (cut/generate-website-build-secret (cutc/set-single-repo-url + {:fqdn "test.com" + :fqdn1 "bla.de" + :fqdn2 "bla.com" + :single "fqdn" + :multi ["fqdn1", "fqdn"] + :authtoken "token2" + :gitrepourl "test.com/user/repo.git" + :singlegitrepourl "test.com/user/master.git"})))))) (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"}) - (cut/generate-website-content-volume {:fqdn "test.com"}))))) + (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"]}))))) diff --git a/valid-auth.edn b/valid-auth.edn index 0feaed6..efd6262 100644 --- a/valid-auth.edn +++ b/valid-auth.edn @@ -1,2 +1,3 @@ {:authtoken "asdfasdfe" - :gitrepourl "https://some.de/path/to/repo.zip"} + :gitrepourl "https://some.de/path/to/repo.zip" + :singlegitrepourl "https://someother.de/path/to/repo.zip"} diff --git a/valid-config.edn b/valid-config.edn index 18105d1..ddd65b7 100644 --- a/valid-config.edn +++ b/valid-config.edn @@ -1,5 +1,6 @@ -{:fqdn "repo.test.meissa.de" - :issuer "staging" - :volume-total-storage-size 20 - :number-of-websites 5 - } +{:fqdn "meissa.de" + :fqdn1 "meissa-gmbh.de" + :fqdn2 "domaindrivenarchitecture.org" + :multi ["fqdn", "fqdn1"] + :single "fqdn2" + :issuer "staging"} \ No newline at end of file