diff --git a/src/main/cljc/dda/c4k_website/website.cljc b/src/main/cljc/dda/c4k_website/website.cljc index 8c9b906..99a033c 100644 --- a/src/main/cljc/dda/c4k_website/website.cljc +++ b/src/main/cljc/dda/c4k_website/website.cljc @@ -40,7 +40,8 @@ :build-cpu-limit "1700m" :build-memory-request "256Mi" :build-memory-limit "512Mi" - :volume-size "3"}) + :volume-size "3" + :redirects []}) (defn-spec generate-nginx-deployment map? [config websiteconfig?] diff --git a/src/main/cljc/dda/c4k_website/website/website_internal.cljc b/src/main/cljc/dda/c4k_website/website/website_internal.cljc index 6ee91f9..fc26cf0 100644 --- a/src/main/cljc/dda/c4k_website/website/website_internal.cljc +++ b/src/main/cljc/dda/c4k_website/website/website_internal.cljc @@ -8,8 +8,7 @@ [dda.c4k-common.yaml :as yaml] [dda.c4k-common.common :as cm] [dda.c4k-common.base64 :as b64] - [dda.c4k-common.predicate :as pred] - [dda.c4k-common.ingress :as ing])) + [dda.c4k-common.predicate :as pred])) (defn fqdn-list? [input] @@ -28,6 +27,9 @@ (s/def ::build-memory-request string?) (s/def ::build-cpu-limit string?) (s/def ::build-memory-limit string?) +(s/def ::redirect (s/tuple string? string?)) +(s/def ::redirects (s/coll-of ::redirect)) + (def websiteconfig? (s/keys :req-un [::unique-name ::fqdns @@ -39,7 +41,8 @@ ::build-cpu-request ::build-cpu-limit ::build-memory-request - ::build-memory-limit])) + ::build-memory-limit + ::redirects])) (def websiteauth? (s/keys :req-un [::unique-name ::username ::authtoken])) @@ -70,8 +73,9 @@ user string?] (str "https://" host "/api/v1/repos/" user "/" repo "/git/" "commits/" "HEAD")) -(defn-spec replace-all-matching-substrings-beginning-with pred/map-or-seq? - [col pred/map-or-seq? +; TODO: Rename replace-all-matching-prefixes +(defn-spec replace-all-matching-substrings-beginning-with map? + [col map? value-to-partly-match string? value-to-inplace string?] (clojure.walk/postwalk #(if (and (= (type value-to-partly-match) (type %)) @@ -80,19 +84,15 @@ col)) -(defn-spec generate-nginx-deployment map? - [config websiteconfig?] - (let [{:keys [unique-name build-cpu-request build-cpu-limit - build-memory-request build-memory-limit]} config - name (replace-dots-by-minus unique-name)] - (-> - (yaml/load-as-edn "website/nginx-deployment.yaml") - (assoc-in [:metadata :namespace] name) - (replace-all-matching-substrings-beginning-with "NAME" name) - (cm/replace-all-matching-values-by-new-value "BUILD_CPU_REQUEST" build-cpu-request) - (cm/replace-all-matching-values-by-new-value "BUILD_CPU_LIMIT" build-cpu-limit) - (cm/replace-all-matching-values-by-new-value "BUILD_MEMORY_REQUEST" build-memory-request) - (cm/replace-all-matching-values-by-new-value "BUILD_MEMORY_LIMIT" build-memory-limit)))) +(defn-spec generate-redirects string? + [config websiteconfig? + indent (s/or :pos pos-int? :zero zero?)] + (let [{:keys [redirects]} config] + (str/join + (str "\n" (str/join (take indent (repeat " ")))) + (map + #(str "rewrite ^" (first %1) "$ " (second %1) " permanent;") + redirects)))) (defn-spec generate-nginx-configmap map? @@ -109,30 +109,6 @@ (-> % :data :website.conf) #"FQDN" (str (str/join " " fqdns) ";"))))))) -(defn-spec generate-nginx-service map? - [config websiteconfig?] - (let [{:keys [unique-name]} config - name (replace-dots-by-minus unique-name)] - (-> - (yaml/load-as-edn "website/nginx-service.yaml") - (assoc-in [:metadata :namespace] name) - (replace-all-matching-substrings-beginning-with "NAME" name)))) - - -(defn-spec generate-website-build-cron map? - [config websiteconfig?] - (let [{:keys [unique-name build-cpu-request build-cpu-limit build-memory-request - build-memory-limit]} config - name (replace-dots-by-minus unique-name)] - (-> - (yaml/load-as-edn "website/build-cron.yaml") - (replace-all-matching-substrings-beginning-with "NAME" name) - (cm/replace-all-matching-values-by-new-value "BUILD_CPU_REQUEST" build-cpu-request) - (cm/replace-all-matching-values-by-new-value "BUILD_CPU_LIMIT" build-cpu-limit) - (cm/replace-all-matching-values-by-new-value "BUILD_MEMORY_REQUEST" build-memory-request) - (cm/replace-all-matching-values-by-new-value "BUILD_MEMORY_LIMIT" build-memory-limit)))) - - (defn-spec generate-website-build-secret pred/map-or-seq? [config websiteconfig? auth websiteauth?] @@ -180,6 +156,45 @@ (replace-all-matching-substrings-beginning-with "NAME" name)))) +(defn-spec generate-nginx-deployment map? + [config websiteconfig?] + (let [{:keys [unique-name build-cpu-request build-cpu-limit + build-memory-request build-memory-limit]} config + name (replace-dots-by-minus unique-name)] + (-> + (yaml/load-as-edn "website/nginx-deployment.yaml") + (assoc-in [:metadata :namespace] name) + (replace-all-matching-substrings-beginning-with "NAME" name) + (cm/replace-all-matching-values-by-new-value "BUILD_CPU_REQUEST" build-cpu-request) + (cm/replace-all-matching-values-by-new-value "BUILD_CPU_LIMIT" build-cpu-limit) + (cm/replace-all-matching-values-by-new-value "BUILD_MEMORY_REQUEST" build-memory-request) + (cm/replace-all-matching-values-by-new-value "BUILD_MEMORY_LIMIT" build-memory-limit)))) + + +(defn-spec generate-website-build-cron map? + [config websiteconfig?] + (let [{:keys [unique-name build-cpu-request build-cpu-limit build-memory-request + build-memory-limit]} config + name (replace-dots-by-minus unique-name)] + (-> + (yaml/load-as-edn "website/build-cron.yaml") + (replace-all-matching-substrings-beginning-with "NAME" name) + (cm/replace-all-matching-values-by-new-value "BUILD_CPU_REQUEST" build-cpu-request) + (cm/replace-all-matching-values-by-new-value "BUILD_CPU_LIMIT" build-cpu-limit) + (cm/replace-all-matching-values-by-new-value "BUILD_MEMORY_REQUEST" build-memory-request) + (cm/replace-all-matching-values-by-new-value "BUILD_MEMORY_LIMIT" build-memory-limit)))) + + +(defn-spec generate-nginx-service map? + [config websiteconfig?] + (let [{:keys [unique-name]} config + name (replace-dots-by-minus unique-name)] + (-> + (yaml/load-as-edn "website/nginx-service.yaml") + (assoc-in [:metadata :namespace] name) + (replace-all-matching-substrings-beginning-with "NAME" name)))) + + #?(:cljs (defmethod yaml/load-resource :website [resource-name] (get (inline-resources "website") resource-name))) diff --git a/src/main/resources/website/nginx-configmap.yaml b/src/main/resources/website/nginx-configmap.yaml index 8b1e9bd..3193813 100644 --- a/src/main/resources/website/nginx-configmap.yaml +++ b/src/main/resources/website/nginx-configmap.yaml @@ -2,7 +2,7 @@ apiVersion: v1 kind: ConfigMap metadata: name: etc-nginx - namespace: default + namespace: NAME labels: app.kubernetes.part-of: NAME-website data: @@ -93,5 +93,7 @@ data: location / { try_files $uri $uri/ /index.html =404; } + # redirects + REDIRECTS } \ No newline at end of file diff --git a/src/test/cljc/dda/c4k_website/website/website_internal_test.cljc b/src/test/cljc/dda/c4k_website/website/website_internal_test.cljc index f883a02..e3cff63 100644 --- a/src/test/cljc/dda/c4k_website/website/website_internal_test.cljc +++ b/src/test/cljc/dda/c4k_website/website/website_internal_test.cljc @@ -5,14 +5,49 @@ [clojure.spec.test.alpha :as st] [dda.c4k-website.website.website-internal :as cut])) +(st/instrument `cut/replace-dots-by-minus) +(st/instrument `cut/generate-gitrepourl) +(st/instrument `cut/generate-gitcommiturl) +(st/instrument `cut/replace-all-matching-substrings-beginning-with) +(st/instrument `cut/generate-redirects) (st/instrument `cut/generate-nginx-configmap) -(st/instrument `cut/generate-nginx-service) +(st/instrument `cut/generate-website-build-secret) (st/instrument `cut/generate-website-content-volume) (st/instrument `cut/generate-hashfile-volume) -(st/instrument `cut/generate-website-ingress) -(st/instrument `cut/generate-website-certificate) (st/instrument `cut/generate-website-build-cron) -(st/instrument `cut/generate-website-build-secret) +(st/instrument `cut/generate-nginx-service) + +(deftest should-generate-redirects + (is (= "rewrite ^/products.html$ /offer.html permanent;\n rewrite ^/one-more$ /redirect permanent;" + (cut/generate-redirects {:issuer "staging" + :build-cpu-request "500m" + :build-cpu-limit "1700m" + :build-memory-request "256Mi" + :build-memory-limit "512Mi" + :volume-size "3" + :unique-name "test.io", + :redirects [["/products.html", "/offer.html"] + ["/one-more", "/redirect"]] + :forgejo-host "gitea.evilorg", + :forgejo-repo "none", + :branchname "mablain", + :fqdns ["test.de" "www.test.de" "test-it.de" "www.test-it.de"]} + 2))) + (is (= "" + (cut/generate-redirects {:issuer "staging" + :build-cpu-request "500m" + :build-cpu-limit "1700m" + :build-memory-request "256Mi" + :build-memory-limit "512Mi" + :volume-size "3" + :unique-name "test.io", + :redirects [] + :forgejo-host "gitea.evilorg", + :forgejo-repo "none", + :branchname "mablain", + :fqdns ["test.de" "www.test.de" "test-it.de" "www.test-it.de"]} + 0)))) + (deftest should-generate-resource-requests (is (= {:requests {:cpu "1500m", :memory "512Mi"}, :limits {:cpu "3000m", :memory "1024Mi"}} @@ -21,7 +56,8 @@ :forgejo-repo "repo", :issuer "staging", :branchname "main", - :unique-name "test.io" + :unique-name "test.io", + :redirects [], :build-cpu-request "1500m" :build-cpu-limit "3000m" :build-memory-request "512Mi" @@ -34,7 +70,8 @@ :forgejo-repo "repo", :issuer "staging", :branchname "main", - :unique-name "test.io" + :unique-name "test.io", + :redirects [], :build-cpu-request "1500m" :build-cpu-limit "3000m" :build-memory-request "512Mi" @@ -42,9 +79,8 @@ :volume-size 3}) :metadata :namespace)))) - (deftest should-generate-nginx-configmap-website - (is (= "server {\n listen 80 default_server;\n listen [::]:80 default_server;\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 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" + (is (= "server {\n listen 80 default_server;\n listen [::]:80 default_server;\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 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 # redirects\n REDIRECTS\n}\n" (:website.conf (:data (cut/generate-nginx-configmap {:issuer "staging" :build-cpu-request "500m" :build-cpu-limit "1700m" @@ -52,6 +88,7 @@ :build-memory-limit "512Mi" :volume-size "3" :unique-name "test.io", + :redirects [], :forgejo-host "gitea.evilorg", :forgejo-repo "none", :branchname "mablain", @@ -64,6 +101,7 @@ :build-memory-limit "512Mi" :volume-size "3" :unique-name "test.io", + :redirects [], :forgejo-host "gitea.evilorg", :forgejo-repo "none", :branchname "mablain", @@ -76,6 +114,7 @@ :build-memory-limit "512Mi" :volume-size "3" :unique-name "test.io", + :redirects [], :forgejo-host "gitea.evilorg", :forgejo-repo "none", :branchname "mablain", @@ -92,6 +131,7 @@ :build-memory-limit "512Mi" :volume-size "3" :unique-name "test.io", + :redirects [], :forgejo-host "gitea.evilorg", :forgejo-repo "none", :branchname "mablain", @@ -107,18 +147,20 @@ :spec {:selector {:app "nginx"}, :ports [{:name "nginx-http", :port 80}]}} (cut/generate-nginx-service {:issuer "staging" - :build-cpu-request "500m" - :build-cpu-limit "1700m" - :build-memory-request "256Mi" - :build-memory-limit "512Mi" - :volume-size "3" - :unique-name "test.io", - :forgejo-host "gitea.evilorg", - :forgejo-repo "none", - :branchname "mablain", - :fqdns ["test.de" "www.test.de" "test-it.de" "www.test-it.de"]}) + :build-cpu-request "500m" + :build-cpu-limit "1700m" + :build-memory-request "256Mi" + :build-memory-limit "512Mi" + :volume-size "3" + :unique-name "test.io", + :redirects [], + :forgejo-host "gitea.evilorg", + :forgejo-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/v1", :kind "CronJob", @@ -159,8 +201,8 @@ :fqdns ["test.de" "test.org" "www.test.de" "www.test.org"], :forgejo-repo "repo", :branchname "main", - :unique-name "test.io"})))) - + :unique-name "test.io", + :redirects [],})))) (deftest should-generate-website-build-secret (is (= {:apiVersion "v1", @@ -177,6 +219,7 @@ :issuer "staging", :branchname "main", :unique-name "test.io", + :redirects [], :forgejo-host "gitlab.de" :build-cpu-request "500m" :build-cpu-limit "1700m" @@ -205,11 +248,13 @@ :build-memory-limit "512Mi" :volume-size "3" :unique-name "test.io", + :redirects [], :forgejo-host "gitea.evilorg", :forgejo-repo "none", :branchname "mablain", :fqdns ["test.de" "www.test.de" "test-it.de" "www.test-it.de"]})))) + (deftest should-generate-hashfile-volume (is (= {:apiVersion "v1", :kind "PersistentVolumeClaim", @@ -227,7 +272,8 @@ :build-memory-limit "512Mi" :volume-size "3" :unique-name "test.io", + :redirects [], :forgejo-host "gitea.evilorg", :forgejo-repo "none", :branchname "mablain", - :fqdns ["test.de" "www.test.de" "test-it.de" "www.test-it.de"]})))) + :fqdns ["test.de" "www.test.de" "test-it.de" "www.test-it.de"]})))) \ No newline at end of file