diff --git a/README.md b/README.md index bcd7f64..b866ea5 100644 --- a/README.md +++ b/README.md @@ -6,10 +6,43 @@ ## Configuration Issues +We currently can no login even after `python manage.py createsuperuser --noinput` in the taiga-back-deployment container. What might help: https://docs.taiga.io/setup-production.html#taiga-back + +Note: taiga-manage,-back und -async verwenden die gleichen docker images mit unterschiedlichen entry-points. + https://github.com/kaleidos-ventures/taiga-docker https://community.taiga.io/t/taiga-30min-setup/170 -Note: taiga-manage,-back und -async verwenden die gleichen docker images mit unterschiedlichen entry-points. +### Steps to start and get an admin user + +Philosophy: First create the superuser, then populate the DB. +https://docs.taiga.io/setup-production.html#taiga-back +https://docs.taiga.io/setup-production.html#_configure_an_admin_user +https://github.com/kaleidos-ventures/taiga-back/blob/main/docker/entrypoint.sh + +In the init container we create the super user. Difference between init-container and container: CELERY_ENABLED: false +The init container gets the following command and args: + +```yaml +command: ["/bin/bash"] +args: ["-c", "source /opt/venv/bin/activate && python manage.py createsuperuser --noinput"] +``` + +Thus the dockerfile default entrypoint is ignored. + +Problem: Login using this method is still not available with the proposed credentials. + +#### Option 1: Init container, currently under test + +Create an init container (celery disabled) with the python manage.py command and the taiga-manage createsuperuser args + +#### Option 2: Single container + +Create a single container that has celery disabled at the beginning. +Runs the following cmds: +* python manage.py taiga-manage createsuperuser +* enable celery +* execute entrypoint.sh ### HTTPS @@ -49,24 +82,6 @@ taiga-async -> taiga-async-rabbitmq taiga-events -> taiga-events-rabbitmq This is not quite clear, but probably solved with the implementation of services. -### Init container - -Es gibt einen Init-Container mit namen *taiga-manage* im deployment. -Dieser erstellt einen Admin User mit credentials aus dem taiga-back-secret. - -#### Einen admin-user anlegen - -https://github.com/kaleidos-ventures/taiga-docker#configure-an-admin-user - -folglich: - -https://docs.djangoproject.com/en/4.2/ref/django-admin/#django-admin-createsuperuser - -Also DJANGO_SUPERUSER_TAIGAADMIN und DJANGO_SUPERUSER_PASSWORD -sollten für den Container gesetzt sein. - -Dann noch ein run befehl mit: python manage.py createsuperuser im init container unterbringen. - ### Deployments Separate deployments exist for each of the taiga modules: diff --git a/project.clj b/project.clj index 04e6925..da164fb 100644 --- a/project.clj +++ b/project.clj @@ -20,8 +20,8 @@ :dependencies [[dda/data-test "0.1.1"]]} :dev {:plugins [[lein-shell "0.5.0"]]} :uberjar {:aot :all - :main dda.c4k-website.uberjar - :uberjar-name "c4k-website-standalone.jar" + :main dda.c4k-taiga.uberjar + :uberjar-name "c4k-taiga-standalone.jar" :dependencies [[org.clojure/tools.cli "1.0.214"] [ch.qos.logback/logback-classic "1.4.5" :exclusions [com.sun.mail/javax.mail]] @@ -36,11 +36,11 @@ "native-image" "--report-unsupported-elements-at-runtime" "--initialize-at-build-time" - "-jar" "target/uberjar/c4k-website-standalone.jar" + "-jar" "target/uberjar/c4k-taiga-standalone.jar" "-H:ResourceConfigurationFiles=graalvm-resource-config.json" "-H:Log=registerResource" "-H:Name=target/graalvm/${:name}"] "inst" ["shell" "sh" "-c" - "lein uberjar && sudo install -m=755 target/uberjar/c4k-website-standalone.jar /usr/local/bin/c4k-website-standalone.jar"]}) + "lein uberjar && sudo install -m=755 target/uberjar/c4k-taiga-standalone.jar /usr/local/bin/c4k-taiga-standalone.jar"]}) diff --git a/public/index.html b/public/index.html index 99ea0c9..865aea6 100644 --- a/public/index.html +++ b/public/index.html @@ -3,7 +3,7 @@ - c4k-website + c4k-taiga diff --git a/shadow-cljs.edn b/shadow-cljs.edn index b8ceb62..b47c277 100644 --- a/shadow-cljs.edn +++ b/shadow-cljs.edn @@ -7,7 +7,7 @@ :dependencies [[org.domaindrivenarchitecture/c4k-common-cljs "6.0.1"] [hickory "0.7.1"]] :builds {:frontend {:target :browser - :modules {:main {:init-fn dda.c4k-website.browser/init}} + :modules {:main {:init-fn dda.c4k-taiga.browser/init}} :release {} :compiler-options {:optimizations :advanced}} :test {:target :node-test diff --git a/src/main/cljc/dda/c4k_taiga/core.cljc b/src/main/cljc/dda/c4k_taiga/core.cljc index 775e64f..80aeb55 100644 --- a/src/main/cljc/dda/c4k_taiga/core.cljc +++ b/src/main/cljc/dda/c4k_taiga/core.cljc @@ -7,33 +7,53 @@ [dda.c4k-common.common :as cm] [dda.c4k-common.predicate :as cp] [dda.c4k-common.monitoring :as mon] - [dda.c4k-taiga.taiga :as taiga])) + [dda.c4k-taiga.taiga :as taiga] + [dda.c4k-common.postgres :as postgres])) -(def config-defaults {:issuer "staging" - :volume-size "3"}) +(def default-storage-class :local-path) -(s/def ::mon-cfg ::mon/mon-cfg) -(s/def ::mon-auth ::mon/mon-auth) +(def config? taiga/config?) +(def auth? taiga/auth?) -; ToDo -(def config? (s/keys :req-un - :opt-un [::mon-cfg])) - -; ToDo -(def auth? (s/keys :req-un - :opt-un [::mon-auth])) - -; ToDo: -(defn generate-configs [config auth]) +(def config-defaults taiga/config-defaults) (defn-spec k8s-objects cp/map-or-seq? - [config config? - auth auth?] + [config taiga/config? + auth taiga/auth?] (cm/concat-vec (map yaml/to-string (filter #(not (nil? %)) (cm/concat-vec - (generate-configs config auth) + [(postgres/generate-config {:postgres-size :8gb :db-name "taiga"}) + (postgres/generate-secret auth) + (postgres/generate-pvc {:pv-storage-size-gb 50 + :pvc-storage-class-name default-storage-class}) + (postgres/generate-deployment) + (postgres/generate-service) + (taiga/generate-async-deployment) + (taiga/generate-async-rabbitmq-deployment) + (taiga/generate-async-rabbitmq-service) + (taiga/generate-async-service) + (taiga/generate-back-deployment) + (taiga/generate-back-service) + (taiga/generate-configmap config) + (taiga/generate-pvc-taiga-media-data config) + (taiga/generate-pvc-taiga-static-data config) + (taiga/generate-events-deployment) + (taiga/generate-events-rabbitmq-deployment) + (taiga/generate-events-rabbitmq-service) + (taiga/generate-events-service) + (taiga/generate-front-deployment) + (taiga/generate-front-service) + (taiga/generate-gateway-configmap) + (taiga/generate-gateway-deployment) + (taiga/generate-gateway-service) + (taiga/generate-protected-deployment) + (taiga/generate-protected-service) + (taiga/generate-rabbitmq-pvc-async config) + (taiga/generate-rabbitmq-pvc-events config) + (taiga/generate-secret auth)] + (taiga/generate-ingress-and-cert config) (when (:contains? config :mon-cfg) (mon/generate (:mon-cfg config) (:mon-auth auth)))))))) diff --git a/src/main/cljc/dda/c4k_taiga/taiga.cljc b/src/main/cljc/dda/c4k_taiga/taiga.cljc new file mode 100644 index 0000000..044711e --- /dev/null +++ b/src/main/cljc/dda/c4k_taiga/taiga.cljc @@ -0,0 +1,224 @@ +(ns dda.c4k-taiga.taiga + (:require + [clojure.spec.alpha :as s] + #?(:cljs [shadow.resource :as rc]) + #?(:clj [orchestra.core :refer [defn-spec]] + :cljs [orchestra.core :refer-macros [defn-spec]]) + #?(:clj [clojure.edn :as edn] + :cljs [cljs.reader :as edn]) + [dda.c4k-common.yaml :as yaml] + [dda.c4k-common.common :as cm] + [dda.c4k-common.base64 :as b64] + [dda.c4k-common.predicate :as cp] + [dda.c4k-common.monitoring :as mon] + [dda.c4k-common.postgres :as postgres] + [dda.c4k-common.ingress :as ing] + [clojure.string :as str])) + + +(def config-defaults {:issuer "staging" + :storage-class-name "local-path" + :pv-storage-size-gb "5" ;; ToDo: check sensible defaults + :storage-media-size "5" + :storage-static-size "5" + :storage-async-rabbitmq-size "5" + :storage-events-rabbitmq-size "5" + :public-register-enabled "false" + :enable-telemetry "false"}) + +(s/def ::mon-cfg ::mon/mon-cfg) +(s/def ::mon-auth ::mon/mon-auth) +(s/def ::taiga-secret-key cp/bash-env-string?) +(s/def ::mailer-user string?) +(s/def ::mailer-pw string?) +(s/def ::django-superuser-username string?) +(s/def ::django-superuser-password string?) +(s/def ::django-superuser-email string?) +(s/def ::rabbitmq-user string?) +(s/def ::rabbitmq-pw string?) +(s/def ::rabbitmq-erlang-cookie string?) + +(s/def ::issuer cp/letsencrypt-issuer?) +(s/def ::fqdn cp/fqdn-string?) +(s/def ::public-register-enabled string?) ;; ToDo maybe check for boolean string +(s/def ::enable-telemetry string?) +(s/def ::storage-class-name string?) +(s/def ::storage-media-size int?) +(s/def ::storage-static-size int?) +(s/def ::storage-async-rabbitmq-size int?) +(s/def ::storage-events-rabbitmq-size int?) + +(def auth? (s/keys :req-un [::postgres/postgres-db-user + ::postgres/postgres-db-password + ::taiga-secret-key + ::mailer-pw + ::mailer-user + ::django-superuser-email + ::django-superuser-password + ::django-superuser-username + ::rabbitmq-erlang-cookie + ::rabbitmq-pw + ::rabbitmq-user] + :opt-un [::mon-auth])) + +(def config? (s/keys :req-un [::fqdn] + :opt-un [::issuer + ::storage-class-name + ::storage-media-size + ::storage-static-size + ::storage-async-rabbitmq-size + ::storage-events-rabbitmq-size + ::pv-storage-size-gb + ::public-register-enabled + ::enable-telemetry + ::mon-cfg])) + +#?(:cljs + (defmethod yaml/load-resource :taiga [resource-name] + (case resource-name + "taiga/events-rabbitmq-deployment.yaml" (rc/inline "taiga/events-rabbitmq-deployment.yaml") + "taiga/gateway-deployment.yaml" (rc/inline "taiga/gateway-deployment.yaml") + "taiga/protected-deployment.yaml" (rc/inline "taiga/protected-deployment.yaml") + "taiga/gateway-configmap.yaml" (rc/inline "taiga/gateway-configmap.yaml") + "taiga/configmap.yaml" (rc/inline "taiga/configmap.yaml") + "taiga/async-service.yaml" (rc/inline "taiga/async-service.yaml") + "taiga/events-deployment.yaml" (rc/inline "taiga/events-deployment.yaml") + "taiga/async-deployment.yaml" (rc/inline "taiga/async-deployment.yaml") + "taiga/back-deployment.yaml" (rc/inline "taiga/back-deployment.yaml") + "taiga/front-deployment.yaml" (rc/inline "taiga/front-deployment.yaml") + "taiga/front-service.yaml" (rc/inline "taiga/front-service.yaml") + "taiga/gateway-service.yaml" (rc/inline "taiga/gateway-service.yaml") + "taiga/pvc-taiga-media-data.yaml" (rc/inline "taiga/pvc-taiga-media-data.yaml") + "taiga/pvc-taiga-static-data.yaml" (rc/inline "taiga/pvc-taiga-static-data.yaml") + "taiga/async-rabbitmq-deployment.yaml" (rc/inline "taiga/async-rabbitmq-deployment.yaml") + "taiga/protected-service.yaml" (rc/inline "taiga/protected-service.yaml") + "taiga/secret.yaml" (rc/inline "taiga/secret.yaml") + "taiga/async-rabbitmq-service.yaml" (rc/inline "taiga/async-rabbitmq-service.yaml") + "taiga/events-service.yaml" (rc/inline "taiga/events-service.yaml") + "taiga/back-service.yaml" (rc/inline "taiga/back-service.yaml") + "taiga/events-rabbitmq-service.yaml" (rc/inline "taiga/events-rabbitmq-service.yaml") + "taiga/rabbitmq-pvc-async.yaml" (rc/inline "taiga/rabbitmq-pvc-async.yaml") + "taiga/rabbitmq-pvc-events.yaml" (rc/inline "taiga/rabbitmq-pvc-events.yaml") + (throw (js/Error. "Undefined Resource!"))))) + +(defn-spec generate-ingress-and-cert cp/map-or-seq? + [config config?] + (let [{:keys [fqdn]} config] + (ing/generate-ingress-and-cert + (merge + {:service-name "taiga-gateway" + :service-port 80 + :fqdns [fqdn]} + config)))) + +(defn-spec generate-async-deployment cp/map-or-seq? [] + (yaml/from-string (yaml/load-resource "taiga/async-deployment.yaml"))) + +(defn-spec generate-async-service cp/map-or-seq? [] + (yaml/from-string (yaml/load-resource "taiga/async-service.yaml"))) + +(defn-spec generate-async-rabbitmq-deployment cp/map-or-seq? [] + (yaml/from-string (yaml/load-resource "taiga/async-rabbitmq-deployment.yaml"))) + +(defn-spec generate-events-rabbitmq-service cp/map-or-seq? [] + (yaml/from-string (yaml/load-resource "taiga/events-rabbitmq-service.yaml"))) + +(defn-spec generate-async-rabbitmq-service cp/map-or-seq? [] + (yaml/from-string (yaml/load-resource "taiga/async-rabbitmq-service.yaml"))) + +(defn-spec generate-back-deployment cp/map-or-seq? [] + (yaml/from-string (yaml/load-resource "taiga/back-deployment.yaml"))) + +(defn-spec generate-back-service cp/map-or-seq? [] + (yaml/from-string (yaml/load-resource "taiga/back-service.yaml"))) + +(defn-spec generate-events-rabbitmq-deployment cp/map-or-seq? [] + (yaml/from-string (yaml/load-resource "taiga/events-rabbitmq-deployment.yaml"))) + +(defn-spec generate-events-deployment cp/map-or-seq? [] + (yaml/from-string (yaml/load-resource "taiga/events-deployment.yaml"))) + +(defn-spec generate-events-service cp/map-or-seq? [] + (yaml/from-string (yaml/load-resource "taiga/events-service.yaml"))) + +(defn-spec generate-front-deployment cp/map-or-seq? [] + (yaml/from-string (yaml/load-resource "taiga/front-deployment.yaml"))) + +(defn-spec generate-front-service cp/map-or-seq? [] + (yaml/from-string (yaml/load-resource "taiga/front-service.yaml"))) + +(defn-spec generate-gateway-configmap cp/map-or-seq? [] + (yaml/from-string (yaml/load-resource "taiga/gateway-configmap.yaml"))) + +(defn-spec generate-gateway-deployment cp/map-or-seq? [] + (yaml/from-string (yaml/load-resource "taiga/gateway-deployment.yaml"))) + +(defn-spec generate-gateway-service cp/map-or-seq? [] + (yaml/from-string (yaml/load-resource "taiga/gateway-service.yaml"))) + +(defn-spec generate-protected-deployment cp/map-or-seq? [] + (yaml/from-string (yaml/load-resource "taiga/protected-deployment.yaml"))) + +(defn-spec generate-protected-service cp/map-or-seq? [] + (yaml/from-string (yaml/load-resource "taiga/protected-service.yaml"))) + +(defn-spec generate-configmap cp/map-or-seq? + [config config?] + (let [{:keys [fqdn enable-telemetry public-register-enabled]} (merge config-defaults config)] + (-> (yaml/load-as-edn "taiga/configmap.yaml") + (cm/replace-key-value :TAIGA_SITES_DOMAIN fqdn) + (cm/replace-key-value :TAIGA_URL (str "https://" fqdn)) + (cm/replace-key-value :TAIGA_WEBSOCKETS_URL (str "wss://" fqdn)) + (cm/replace-key-value :ENABLE_TELEMETRY enable-telemetry) + (cm/replace-key-value :PUBLIC_REGISTER_ENABLED public-register-enabled)))) + +(defn-spec generate-pvc-taiga-media-data cp/map-or-seq? + [config config?] + (let [{:keys [storage-class-name storage-media-size]} (merge config-defaults config)] + (-> + (yaml/from-string (yaml/load-resource "taiga/pvc-taiga-media-data.yaml")) + (assoc-in [:spec :storageClassName] storage-class-name) + (assoc-in [:spec :resources :requests :storage] (str storage-media-size "Gi"))))) + +(defn-spec generate-pvc-taiga-static-data cp/map-or-seq? + [config config?] + (let [{:keys [storage-class-name storage-static-size]} (merge config-defaults config)] + (-> + (yaml/from-string (yaml/load-resource "taiga/pvc-taiga-static-data.yaml")) + (assoc-in [:spec :storageClassName] storage-class-name) + (assoc-in [:spec :resources :requests :storage] (str storage-static-size "Gi"))))) + +(defn-spec generate-secret cp/map-or-seq? + [auth auth?] + (let [{:keys [taiga-secret-key + mailer-user mailer-pw + rabbitmq-user rabbitmq-pw rabbitmq-erlang-cookie + django-superuser-username django-superuser-password django-superuser-email]} auth] + (-> + (yaml/from-string (yaml/load-resource "taiga/secret.yaml")) + (cm/replace-key-value :TAIGA_SECRET_KEY (b64/encode taiga-secret-key)) + (cm/replace-key-value :EMAIL_HOST_USER (b64/encode mailer-user)) + (cm/replace-key-value :EMAIL_HOST_PASSWORD (b64/encode mailer-pw)) + (cm/replace-key-value :RABBITMQ_USER (b64/encode rabbitmq-user)) + (cm/replace-key-value :RABBITMQ_PASS (b64/encode rabbitmq-pw)) + (cm/replace-key-value :RABBITMQ_ERLANG_COOKIE (b64/encode rabbitmq-erlang-cookie)) + (cm/replace-key-value :DJANGO_SUPERUSER_USERNAME (b64/encode django-superuser-username)) + (cm/replace-key-value :DJANGO_SUPERUSER_PASSWORD (b64/encode django-superuser-password)) + (cm/replace-key-value :DJANGO_SUPERUSER_EMAIL (b64/encode django-superuser-email))))) + +(defn-spec generate-rabbitmq-pvc-async cp/map-or-seq? + [config config?] + (let [{:keys [storage-class-name storage-async-rabbitmq-size]} (merge config-defaults config)] + (-> + (yaml/from-string (yaml/load-resource "taiga/rabbitmq-pvc-async.yaml")) + (assoc-in [:spec :storageClassName] storage-class-name) + (assoc-in [:spec :resources :requests :storage] (str storage-async-rabbitmq-size "Gi"))))) + +(defn-spec generate-rabbitmq-pvc-events cp/map-or-seq? + [config config?] + (let [{:keys [storage-class-name storage-events-rabbitmq-size]} (merge config-defaults config)] + (-> + (yaml/from-string (yaml/load-resource "taiga/rabbitmq-pvc-events.yaml")) + (assoc-in [:spec :storageClassName] storage-class-name) + (assoc-in [:spec :resources :requests :storage] (str storage-events-rabbitmq-size "Gi"))))) + diff --git a/src/main/cljc/dda/c4k_taiga/website.cljc b/src/main/cljc/dda/c4k_taiga/website.cljc deleted file mode 100644 index 9126f81..0000000 --- a/src/main/cljc/dda/c4k_taiga/website.cljc +++ /dev/null @@ -1,181 +0,0 @@ -(ns dda.c4k-website.website - (:require - [clojure.spec.alpha :as s] - #?(:cljs [shadow.resource :as rc]) - #?(:clj [orchestra.core :refer [defn-spec]] - :cljs [orchestra.core :refer-macros [defn-spec]]) - #?(:clj [clojure.edn :as edn] - :cljs [cljs.reader :as edn]) - [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] - [clojure.string :as str])) - -; ToDo -(s/def ::issuer pred/letsencrypt-issuer?) - -; ToDo -(def config? (s/keys :req-un - :opt-un )) - -; ToDo -(def auth? (s/keys :req-un )) - -; ToDo -(defn-spec replace-dots-by-minus string? - [fqdn pred/fqdn-string?] - (str/replace fqdn #"\." "-")) - -(defn-spec generate-app-name string? - [unique-name pred/fqdn-string?] - (str (replace-dots-by-minus unique-name) "-website")) - -(defn-spec generate-service-name string? - [unique-name pred/fqdn-string?] - (str (replace-dots-by-minus unique-name) "-service")) - -(defn-spec generate-cert-name string? - [unique-name pred/fqdn-string?] - (str (replace-dots-by-minus unique-name) "-cert")) - -(defn-spec generate-ingress-name string? - [unique-name pred/fqdn-string?] - (str (replace-dots-by-minus unique-name) "-ingress")) - -; https://your.gitea.host/api/v1/repos///archive/.zip -(defn-spec generate-gitrepourl string? - [host pred/fqdn-string? - repo string? - user string? - branch string?] - (str "https://" host "/api/v1/repos/" user "/" repo "/archive/" branch ".zip")) - -; https://your.gitea.host/api/v1/repos///git/commits/HEAD -(defn-spec generate-gitcommiturl string? - [host pred/fqdn-string? - repo string? - 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? - value-to-partly-match string? - value-to-inplace string?] - (clojure.walk/postwalk #(if (and (= (type value-to-partly-match) (type %)) - (re-matches (re-pattern (str value-to-partly-match ".*")) %)) - (str/replace % value-to-partly-match value-to-inplace) %) - col)) - -(defn-spec replace-common-data pred/map-or-seq? - [resource-file string? - config websiteconfig?] - (let [{:keys [unique-name]} config] - (-> - (yaml/load-as-edn resource-file) - (assoc-in [:metadata :labels :app.kubernetes.part-of] (generate-app-name unique-name)) - (replace-all-matching-substrings-beginning-with "NAME" (replace-dots-by-minus unique-name))))) - -(defn-spec replace-build-data pred/map-or-seq? - [resource-file string? - config websiteconfig?] - (let [{:keys [sha256sum-output build-cpu-request build-cpu-limit build-memory-request build-memory-limit] - :or {build-cpu-request "500m" build-cpu-limit "1700m" build-memory-request "256Mi" build-memory-limit "512Mi"}} config] - (-> - (replace-common-data resource-file config) - (cm/replace-all-matching-values-by-new-value "CHECK_SUM" (get-hash-from-sha256sum-output sha256sum-output)) - (cm/replace-all-matching-values-by-new-value "SCRIPT_FILE" (get-file-name-from-sha256sum-output sha256sum-output)) - (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)))) - -#?(:cljs - (defmethod yaml/load-resource :website [resource-name] - (case resource-name - "website/nginx-configmap.yaml" (rc/inline "website/nginx-configmap.yaml") - "website/nginx-deployment.yaml" (rc/inline "website/nginx-deployment.yaml") - "website/nginx-service.yaml" (rc/inline "website/nginx-service.yaml") - "website/website-build-cron.yaml" (rc/inline "website/website-build-cron.yaml") - "website/website-build-secret.yaml" (rc/inline "website/website-build-secret.yaml") - "website/website-content-volume.yaml" (rc/inline "website/website-content-volume.yaml") - "website/hashfile-volume.yaml" (rc/inline "website/hashfile-volume.yaml") - (throw (js/Error. "Undefined Resource!"))))) - -(defn-spec generate-nginx-deployment pred/map-or-seq? - [config websiteconfig?] - (replace-build-data "website/nginx-deployment.yaml" config)) - -(defn-spec generate-nginx-configmap pred/map-or-seq? - [config websiteconfig?] - (let [{:keys [fqdns]} config] - (-> - (replace-common-data "website/nginx-configmap.yaml" config) - (#(assoc-in % - [:data :website.conf] - (str/replace - (-> % :data :website.conf) #"FQDN" (str (str/join " " fqdns) ";"))))))) - -(defn-spec generate-nginx-service pred/map-or-seq? - [config websiteconfig?] - (replace-common-data "website/nginx-service.yaml" config)) - -(defn-spec generate-website-content-volume pred/map-or-seq? - [config websiteconfig?] - (let [{:keys [volume-size] - :or {volume-size "3"}} config] - (-> - (replace-common-data "website/website-content-volume.yaml" config) - (cm/replace-all-matching-values-by-new-value "WEBSITESTORAGESIZE" (str volume-size "Gi"))))) - -(defn-spec generate-hashfile-volume pred/map-or-seq? - [config websiteconfig?] - (replace-common-data "website/hashfile-volume.yaml" config)) - - -(defn-spec generate-website-ingress pred/map-or-seq? - [config websiteconfig?] - (let [{:keys [unique-name fqdns]} config] - (ing/generate-ingress {:fqdns fqdns - :app-name (generate-app-name unique-name) - :ingress-name (generate-ingress-name unique-name) - :service-name (generate-service-name unique-name) - :service-port 80}))) - -(defn-spec generate-website-certificate pred/map-or-seq? - [config websiteconfig?] - (let [{:keys [unique-name issuer fqdns] - :or {issuer "staging"}} config] - (ing/generate-certificate {:fqdns fqdns - :app-name (generate-app-name unique-name) - :cert-name (generate-cert-name unique-name) - :issuer issuer}))) - -(defn-spec generate-website-build-cron pred/map-or-seq? - [config websiteconfig?] - (replace-build-data "website/website-build-cron.yaml" config)) - -(defn-spec generate-website-build-secret pred/map-or-seq? - [config websiteconfig? - auth websiteauth?] - (let [{:keys [gitea-host - gitea-repo - branchname]} config - {:keys [authtoken - username]} auth] - (-> - (replace-common-data "website/website-build-secret.yaml" config) - (cm/replace-all-matching-values-by-new-value "TOKEN" (b64/encode authtoken)) - (cm/replace-all-matching-values-by-new-value "REPOURL" (b64/encode - (generate-gitrepourl - gitea-host - gitea-repo - username - branchname))) - (cm/replace-all-matching-values-by-new-value "COMMITURL" (b64/encode - (generate-gitcommiturl - gitea-host - gitea-repo - username)))))) - diff --git a/src/main/resources/taiga/taiga-async-deployment.yaml b/src/main/resources/taiga/async-deployment.yaml similarity index 85% rename from src/main/resources/taiga/taiga-async-deployment.yaml rename to src/main/resources/taiga/async-deployment.yaml index 781508e..686ed72 100644 --- a/src/main/resources/taiga/taiga-async-deployment.yaml +++ b/src/main/resources/taiga/async-deployment.yaml @@ -4,16 +4,16 @@ metadata: name: taiga-async-deployment labels: app.kubernetes.part-of: c4k-taiga - app.kubernetes.io/component: taiga-async + app.kubernetes.io/component: taiga-async spec: replicas: 1 selector: matchLabels: - app: taiga - template: + app.kubernetes.io/component: taiga-async + template: metadata: labels: - app: taiga + app.kubernetes.io/component: taiga-async spec: containers: - name: taiga-async @@ -54,12 +54,11 @@ spec: - name: POSTGRES_HOST value: "postgresql-service" - name: POSTGRES_PORT - value: 5432 - + value: "5432" volumes: - name: taiga-static persistentVolumeClaim: - claimName: taiga-static + claimName: taiga-static-data - name: taiga-media persistentVolumeClaim: - claimName: taiga-media + claimName: taiga-media-data diff --git a/src/main/resources/taiga/taiga-async-rabbitmq-deployment.yaml b/src/main/resources/taiga/async-rabbitmq-deployment.yaml similarity index 67% rename from src/main/resources/taiga/taiga-async-rabbitmq-deployment.yaml rename to src/main/resources/taiga/async-rabbitmq-deployment.yaml index 0a3cb2d..0fab2e5 100644 --- a/src/main/resources/taiga/taiga-async-rabbitmq-deployment.yaml +++ b/src/main/resources/taiga/async-rabbitmq-deployment.yaml @@ -9,11 +9,11 @@ spec: replicas: 1 selector: matchLabels: - app: taiga + app.kubernetes.io/component: taiga-async-rabbitmq template: metadata: labels: - app: taiga + app.kubernetes.io/component: taiga-async-rabbitmq spec: containers: - name: taiga-async-rabbitmq @@ -30,17 +30,23 @@ spec: - name: RABBITMQ_DEFAULT_USER valueFrom: secretKeyRef: - name: taiga-rabbitmq-secret - key: RABBITMQ_DEFAULT_USER + name: taiga-secret + key: RABBITMQ_USER - name: RABBITMQ_DEFAULT_PASS valueFrom: secretKeyRef: - name: taiga-rabbitmq-secret - key: RABBITMQ_DEFAULT_PASS + name: taiga-secret + key: RABBITMQ_PASS - name: RABBITMQ_ERLANG_COOKIE - value: ERLANG_COOKIE_VALUE + valueFrom: + secretKeyRef: + name: taiga-secret + key: RABBITMQ_ERLANG_COOKIE - name: RABBITMQ_DEFAULT_VHOST - value: RABBITMQ_VHOST + valueFrom: + configMapKeyRef: + name: taiga-configmap + key: RABBITMQ_DEFAULT_VHOST volumes: - name: taiga-async-rabbitmq-data diff --git a/src/main/resources/taiga/taiga-async-rabbitmq-service.yaml b/src/main/resources/taiga/async-rabbitmq-service.yaml similarity index 80% rename from src/main/resources/taiga/taiga-async-rabbitmq-service.yaml rename to src/main/resources/taiga/async-rabbitmq-service.yaml index f62ce44..dc8a1e1 100644 --- a/src/main/resources/taiga/taiga-async-rabbitmq-service.yaml +++ b/src/main/resources/taiga/async-rabbitmq-service.yaml @@ -1,7 +1,7 @@ kind: Service apiVersion: v1 metadata: - name: taiga-async-rabbitmq-service + name: taiga-async-rabbitmq labels: app.kubernetes.part-of: c4k-taiga app.kubernetes.io/component: taiga-async-rabbitmq @@ -14,5 +14,4 @@ spec: - name: amqp targetPort: amqp port: 5672 - protocol: TCP - \ No newline at end of file + protocol: TCP diff --git a/src/main/resources/taiga/taiga-async-service.yaml b/src/main/resources/taiga/async-service.yaml similarity index 83% rename from src/main/resources/taiga/taiga-async-service.yaml rename to src/main/resources/taiga/async-service.yaml index e349899..f24f84a 100644 --- a/src/main/resources/taiga/taiga-async-service.yaml +++ b/src/main/resources/taiga/async-service.yaml @@ -1,7 +1,7 @@ kind: Service apiVersion: v1 metadata: - name: taiga-async-service + name: taiga-async labels: app.kubernetes.part-of: c4k-taiga app.kubernetes.io/component: taiga-async @@ -14,5 +14,5 @@ spec: - name: http targetPort: http port: 8000 - protocol: TCP + protocol: TCP \ No newline at end of file diff --git a/src/main/resources/taiga/taiga-back-deployment.yaml b/src/main/resources/taiga/back-deployment.yaml similarity index 74% rename from src/main/resources/taiga/taiga-back-deployment.yaml rename to src/main/resources/taiga/back-deployment.yaml index e803734..f389e23 100644 --- a/src/main/resources/taiga/taiga-back-deployment.yaml +++ b/src/main/resources/taiga/back-deployment.yaml @@ -9,21 +9,21 @@ spec: replicas: 1 selector: matchLabels: - app: taiga + app.kubernetes.io/component: taiga-back template: metadata: labels: - app: taiga + app.kubernetes.io/component: taiga-back spec: - initContainers: # ToDo: this needs to run only once! + initContainers: - name: taiga-manage - image: taigaio/taiga-back:latest + image: taigaio/taiga-back:latest imagePullPolicy: IfNotPresent - ports: # ToDo: we may need to check for the DB pod to be live + command: ["/bin/bash"] + args: ["-c", "source /opt/venv/bin/activate && CELERY_ENABLE=true python manage.py migrate && sleep 15 && python manage.py createsuperuser --noinput"] + ports: - name: http - containerPort: 80 - command: - - python manage.py && python manage.py createsuperuser + containerPort: 8000 volumeMounts: - name: taiga-static mountPath: /taiga-back/static @@ -33,13 +33,13 @@ spec: readOnly: false envFrom: - configMapRef: - name: taiga-back-configmap + name: taiga-configmap - secretRef: - name: taiga-back-secret - - secretRef: - name: taiga-rabbitmq-secret + name: taiga-secret env: - - name: POSTGRES_USER # ToDo: Does taiga need a specific postgres version? Maybe test this + - name: CELERY_ENABLED + value: "false" + - name: POSTGRES_USER valueFrom: secretKeyRef: name: postgres-secret @@ -57,9 +57,7 @@ spec: - name: POSTGRES_HOST value: "postgresql-service" - name: POSTGRES_PORT - value: 5432 - - name: CELERY_ENABLED - value: false + value: "5432" containers: - name: taiga-back image: taigaio/taiga-back:latest @@ -79,8 +77,6 @@ spec: name: taiga-configmap - secretRef: name: taiga-secret - - secretRef: - name: taiga-rabbitmq-secret env: - name: POSTGRES_USER valueFrom: @@ -100,12 +96,12 @@ spec: - name: POSTGRES_HOST value: "postgresql-service" - name: POSTGRES_PORT - value: 5432 + value: "5432" - volumes: # ToDo: Remove Volumes where not necessary + volumes: - name: taiga-static persistentVolumeClaim: - claimName: taiga-static + claimName: taiga-static-data - name: taiga-media persistentVolumeClaim: - claimName: taiga-media + claimName: taiga-media-data diff --git a/src/main/resources/taiga/taiga-back-service.yaml b/src/main/resources/taiga/back-service.yaml similarity index 79% rename from src/main/resources/taiga/taiga-back-service.yaml rename to src/main/resources/taiga/back-service.yaml index 0d1ca19..b6f9d75 100644 --- a/src/main/resources/taiga/taiga-back-service.yaml +++ b/src/main/resources/taiga/back-service.yaml @@ -1,7 +1,7 @@ kind: Service apiVersion: v1 metadata: - name: taiga-back-service + name: taiga-back labels: app.kubernetes.part-of: c4k-taiga app.kubernetes.io/component: taiga-back @@ -13,6 +13,6 @@ spec: ports: - name: http targetPort: http - port: 80 - protocol: TCP + port: 8000 + protocol: TCP \ No newline at end of file diff --git a/src/main/resources/taiga/configmap.yaml b/src/main/resources/taiga/configmap.yaml new file mode 100644 index 0000000..425ac94 --- /dev/null +++ b/src/main/resources/taiga/configmap.yaml @@ -0,0 +1,30 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: taiga-configmap + namespace: default +data: + # These environment variables will be used by taiga-back and taiga-async. + # Database settings handled in deployment + + # Telemetry settings + ENABLE_TELEMETRY: REPLACEME + + # Taiga settings + TAIGA_SITES_SCHEME: https + TAIGA_SITES_DOMAIN: FQDN + TAIGA_SUBPATH: "" + + # Taiga Front Settings + TAIGA_URL: https://FQDN + TAIGA_WEBSOCKETS_URL: ws://FQDN + PUBLIC_REGISTER_ENABLED: REPLACEME + ENABLE_GITHUB_IMPORTER: "false" + ENABLE_JIRA_IMPORTER: "false" + ENABLE_TRELLO_IMPORTER: "false" + + # Rabbitmq settings + RABBITMQ_DEFAULT_VHOST: taiga + + SESSION_COOKIE_SECURE: "False" + CSRF_COOKIE_SECURE: "False" diff --git a/src/main/resources/taiga/.env b/src/main/resources/taiga/donotapply/.env similarity index 100% rename from src/main/resources/taiga/.env rename to src/main/resources/taiga/donotapply/.env diff --git a/src/main/resources/taiga/donotapply/changes-made.md b/src/main/resources/taiga/donotapply/changes-made.md new file mode 100644 index 0000000..1731d61 --- /dev/null +++ b/src/main/resources/taiga/donotapply/changes-made.md @@ -0,0 +1,34 @@ +Comment EVENTS_PUSH_BACKEND_URL in taiga-events-deployment +Indent name fields in envFrom field in taiga-back-deployment +Remove indentation from name field in taiga-gateway-deployment +Switch name and mountPath field positions in taiga-gateway-deployment +Change postres to 1Gi in pvc.yaml +b64 encoded values in *-secret.yaml +Change integers to strings in env vars in deployments and configmaps +Change bools to strings in env vars in deployments and configmaps +Increase storage to 8Gi in pvc.yaml +Change storageClassName to local-path in pvc.yaml +Correct volume names in async, back, gateway +Use service name as address in taiga-gateway-configmap.yaml +Correct reference to taiga-configmap and taiga-secret in taiga-back-deployment +Remove init-container in taiga-back-deployment +Update command in taiga-back-deployment to ["/taiga-back/docker/entrypoint.sh"] +Update command in taiga-back-deployment to command: ["/taiga-back/docker/entrypoint.sh && python manage.py createsupersuer"] +Extend configmap in taiga-config map by values for taiga-front # we may want to check CAPITALIZATION of KW before starting work in c4k code +Rename taiga-async-rabbitmq-service to taiga-async-rabbitmq +Move erlang cookie to taiga-rabbitmq-secret in taiga-async-rabbitmq-deployment +Change value of RABBITMQ_DEFAULT_VHOST to taiga in taiga-async-rabbitmq-deployment +Change value of RABBITMQ_USER in taiga-secret.yaml to b64/encode taiga +Change value of RABBITMQ_DEFAULT_USER in taiga-rabbitmq-secret.yaml to b64/encode taiga +Remove -service suffix from all taiga service names +Remove -service suffix from all urls in taiga-gateway configmap +Remove -service suffix from ingress +Add - name: RABBITMQ_LOGS value: /opt/rabbitmq/logs.log in taiga-async-rabbitmq-deployment +Get RABBITMQ_ERLANG_COOKIE from taiga-secret in taiga-events-rabbitmq-deployment +Put RABBITMQ_DEFAULT_VHOST KV pair in taiga-configmap +Get RABBITMQ_DEFAULT_VHOST from taiga-configmap in taiga-events-rabbitmq-deployment +Get RABBITMQ_DEFAULT_VHOST from taiga-configmap in taiga-async-rabbitmq-deployment +Move all values from taiga-rabbitmq-secret to taiga-secret +Remove taiga-rabbitmq-secret from config +Rename all occurrences of taiga-rabbitmq-secret to taiga-secret +Add SESSION_COOKIE_SECURE: "False" and CSRF_COOKIE_SECURE: "False" to taiga-configmap.yaml \ No newline at end of file diff --git a/src/main/resources/taiga/conf.json b/src/main/resources/taiga/donotapply/conf.json similarity index 100% rename from src/main/resources/taiga/conf.json rename to src/main/resources/taiga/donotapply/conf.json diff --git a/src/main/resources/taiga/config.py b/src/main/resources/taiga/donotapply/config.py similarity index 100% rename from src/main/resources/taiga/config.py rename to src/main/resources/taiga/donotapply/config.py diff --git a/src/main/resources/taiga/old-docker-compose-inits.yml b/src/main/resources/taiga/donotapply/old-docker-compose-inits.yml similarity index 100% rename from src/main/resources/taiga/old-docker-compose-inits.yml rename to src/main/resources/taiga/donotapply/old-docker-compose-inits.yml diff --git a/src/main/resources/taiga/old-docker-compose.yml b/src/main/resources/taiga/donotapply/old-docker-compose.yml similarity index 100% rename from src/main/resources/taiga/old-docker-compose.yml rename to src/main/resources/taiga/donotapply/old-docker-compose.yml diff --git a/src/main/resources/taiga/taiga-events-deployment.yaml b/src/main/resources/taiga/events-deployment.yaml similarity index 73% rename from src/main/resources/taiga/taiga-events-deployment.yaml rename to src/main/resources/taiga/events-deployment.yaml index 08f15a0..824f2ba 100644 --- a/src/main/resources/taiga/taiga-events-deployment.yaml +++ b/src/main/resources/taiga/events-deployment.yaml @@ -9,11 +9,11 @@ spec: replicas: 1 selector: matchLabels: - app: taiga # ToDo: Check for consistent labels (maybe use app.kubernetes.io) + app.kubernetes.io/component: taiga-events template: metadata: labels: - app: taiga + app.kubernetes.io/component: taiga-events spec: containers: - name: taiga-events @@ -23,11 +23,6 @@ spec: - name: http containerPort: 8888 env: - - name: EVENTS_PUSH_BACKEND_URL # ToDo: check if we really need to set these URLs - valueFrom: - configMapKeyRef: - name: taiga-configmap - key: EVENTS_PUSH_BACKEND_URL - name: RABBITMQ_USER valueFrom: secretKeyRef: diff --git a/src/main/resources/taiga/taiga-events-rabbitmq-deployment.yaml b/src/main/resources/taiga/events-rabbitmq-deployment.yaml similarity index 71% rename from src/main/resources/taiga/taiga-events-rabbitmq-deployment.yaml rename to src/main/resources/taiga/events-rabbitmq-deployment.yaml index e142073..bb78f80 100644 --- a/src/main/resources/taiga/taiga-events-rabbitmq-deployment.yaml +++ b/src/main/resources/taiga/events-rabbitmq-deployment.yaml @@ -9,11 +9,11 @@ spec: replicas: 1 selector: matchLabels: - app: taiga + app.kubernetes.io/component: taiga-events-rabbitmq template: metadata: labels: - app: taiga + app.kubernetes.io/component: taiga-events-rabbitmq spec: containers: - name: taiga-events-rabbitmq @@ -28,15 +28,21 @@ spec: readOnly: false env: - name: RABBITMQ_ERLANG_COOKIE - value: ERLANG_COOKIE_VALUE + valueFrom: + secretKeyRef: + name: taiga-secret + key: RABBITMQ_ERLANG_COOKIE - name: RABBITMQ_DEFAULT_VHOST - value: RABBITMQ_VHOST - - name: RABBITMQ_USER + valueFrom: + configMapKeyRef: + name: taiga-configmap + key: RABBITMQ_DEFAULT_VHOST + - name: RABBITMQ_DEFAULT_USER valueFrom: secretKeyRef: name: taiga-secret key: RABBITMQ_USER - - name: RABBITMQ_PASS + - name: RABBITMQ_DEFAULT_PASS valueFrom: secretKeyRef: name: taiga-secret diff --git a/src/main/resources/taiga/taiga-events-rabbitmq-service.yaml b/src/main/resources/taiga/events-rabbitmq-service.yaml similarity index 90% rename from src/main/resources/taiga/taiga-events-rabbitmq-service.yaml rename to src/main/resources/taiga/events-rabbitmq-service.yaml index 6d0662c..2f542fc 100644 --- a/src/main/resources/taiga/taiga-events-rabbitmq-service.yaml +++ b/src/main/resources/taiga/events-rabbitmq-service.yaml @@ -1,7 +1,7 @@ kind: Service apiVersion: v1 metadata: - name: taiga-events-rabbitmq-service + name: taiga-events-rabbitmq labels: app.kubernetes.part-of: c4k-taiga app.kubernetes.io/component: taiga-events-rabbitmq diff --git a/src/main/resources/taiga/taiga-events-service.yaml b/src/main/resources/taiga/events-service.yaml similarity index 92% rename from src/main/resources/taiga/taiga-events-service.yaml rename to src/main/resources/taiga/events-service.yaml index 3d448b0..4ec0f51 100644 --- a/src/main/resources/taiga/taiga-events-service.yaml +++ b/src/main/resources/taiga/events-service.yaml @@ -1,7 +1,7 @@ kind: Service apiVersion: v1 metadata: - name: taiga-events-service + name: taiga-events labels: app.kubernetes.part-of: c4k-taiga app.kubernetes.io/component: taiga-events diff --git a/src/main/resources/taiga/taiga-front-deployment.yaml b/src/main/resources/taiga/front-deployment.yaml similarity index 55% rename from src/main/resources/taiga/taiga-front-deployment.yaml rename to src/main/resources/taiga/front-deployment.yaml index 738df74..08424d8 100644 --- a/src/main/resources/taiga/taiga-front-deployment.yaml +++ b/src/main/resources/taiga/front-deployment.yaml @@ -9,11 +9,11 @@ spec: replicas: 1 selector: matchLabels: - app: taiga + app.kubernetes.io/component: taiga-front template: metadata: labels: - app: taiga + app.kubernetes.io/component: taiga-front spec: containers: - name: taiga-front @@ -24,8 +24,17 @@ spec: containerPort: 80 env: - name: TAIGA_URL - value: TAGA_SCHEME://TAIGA_DOMAIN - - name: TAIGA_WEBSOCKETS_URL - value: WEBSOCKETS_SCHEME://TAIGA_DOMAIN + valueFrom: + configMapKeyRef: + name: taiga-configmap + key: TAIGA_URL - name: TAIGA_SUBPATH - value: SUBPATH + valueFrom: + configMapKeyRef: + name: taiga-configmap + key: TAIGA_SUBPATH + - name: TAIGA_WEBSOCKETS_URL + valueFrom: + configMapKeyRef: + name: taiga-configmap + key: TAIGA_WEBSOCKETS_URL diff --git a/src/main/resources/taiga/taiga-front-service.yaml b/src/main/resources/taiga/front-service.yaml similarity index 92% rename from src/main/resources/taiga/taiga-front-service.yaml rename to src/main/resources/taiga/front-service.yaml index 6e857bb..d586429 100644 --- a/src/main/resources/taiga/taiga-front-service.yaml +++ b/src/main/resources/taiga/front-service.yaml @@ -1,7 +1,7 @@ kind: Service apiVersion: v1 metadata: - name: taiga-front-service + name: taiga-front labels: app.kubernetes.part-of: c4k-taiga app.kubernetes.io/component: taiga-front diff --git a/src/main/resources/taiga/taiga-gateway-configmap.yaml b/src/main/resources/taiga/gateway-configmap.yaml similarity index 100% rename from src/main/resources/taiga/taiga-gateway-configmap.yaml rename to src/main/resources/taiga/gateway-configmap.yaml diff --git a/src/main/resources/taiga/taiga-gateway-deployment.yaml b/src/main/resources/taiga/gateway-deployment.yaml similarity index 75% rename from src/main/resources/taiga/taiga-gateway-deployment.yaml rename to src/main/resources/taiga/gateway-deployment.yaml index 79e85f3..b6c1beb 100644 --- a/src/main/resources/taiga/taiga-gateway-deployment.yaml +++ b/src/main/resources/taiga/gateway-deployment.yaml @@ -9,11 +9,11 @@ spec: replicas: 1 selector: matchLabels: - app: taiga + app.kubernetes.io/component: taiga-gateway template: metadata: labels: - app: taiga + app.kubernetes.io/component: taiga-gateway spec: restartPolicy: Always containers: @@ -24,8 +24,9 @@ spec: - name: http containerPort: 80 volumeMounts: - - mountPath: /etc/nginx/conf.d - name: taiga-gateway-configmap + - name: taiga-gateway-configmap + mountPath: /etc/nginx/conf.d + readOnly: false - name: taiga-static mountPath: /taiga/static readOnly: false @@ -39,7 +40,7 @@ spec: name: taiga-gateway-configmap - name: taiga-static persistentVolumeClaim: - claimName: taiga-static + claimName: taiga-static-data - name: taiga-media persistentVolumeClaim: - claimName: taiga-media + claimName: taiga-media-data diff --git a/src/main/resources/taiga/taiga-gateway-service.yaml b/src/main/resources/taiga/gateway-service.yaml similarity index 91% rename from src/main/resources/taiga/taiga-gateway-service.yaml rename to src/main/resources/taiga/gateway-service.yaml index cfcd524..441dedf 100644 --- a/src/main/resources/taiga/taiga-gateway-service.yaml +++ b/src/main/resources/taiga/gateway-service.yaml @@ -1,7 +1,7 @@ kind: Service apiVersion: v1 metadata: - name: taiga-gateway-service + name: taiga-gateway labels: app.kubernetes.part-of: c4k-taiga app.kubernetes.io/component: taiga-gateway diff --git a/src/main/resources/taiga/taiga-protected-deployment.yaml b/src/main/resources/taiga/protected-deployment.yaml similarity index 84% rename from src/main/resources/taiga/taiga-protected-deployment.yaml rename to src/main/resources/taiga/protected-deployment.yaml index 3f78384..729de1e 100644 --- a/src/main/resources/taiga/taiga-protected-deployment.yaml +++ b/src/main/resources/taiga/protected-deployment.yaml @@ -9,11 +9,11 @@ spec: replicas: 1 selector: matchLabels: - app: taiga + app.kubernetes.io/component: taiga-protected template: metadata: labels: - app: taiga + app.kubernetes.io/component: taiga-protected spec: containers: - name: taiga-protected @@ -24,7 +24,7 @@ spec: containerPort: 8003 env: - name: MAX_AGE - value: ATTACHMENTS_MAX_AGE + value: "5" - name: SECRET_KEY valueFrom: secretKeyRef: diff --git a/src/main/resources/taiga/taiga-protected-service.yaml b/src/main/resources/taiga/protected-service.yaml similarity index 89% rename from src/main/resources/taiga/taiga-protected-service.yaml rename to src/main/resources/taiga/protected-service.yaml index d84f539..6f448ac 100644 --- a/src/main/resources/taiga/taiga-protected-service.yaml +++ b/src/main/resources/taiga/protected-service.yaml @@ -1,7 +1,7 @@ kind: Service apiVersion: v1 metadata: - name: taiga-protected-service + name: taiga-protected labels: app.kubernetes.part-of: c4k-taiga app.kubernetes.io/component: taiga-protected @@ -15,4 +15,3 @@ spec: targetPort: http port: 8003 protocol: TCP - \ No newline at end of file diff --git a/src/main/resources/website/hashfile-volume.yaml b/src/main/resources/taiga/pvc-taiga-media-data.yaml similarity index 50% rename from src/main/resources/website/hashfile-volume.yaml rename to src/main/resources/taiga/pvc-taiga-media-data.yaml index 99f35db..65b1867 100644 --- a/src/main/resources/website/hashfile-volume.yaml +++ b/src/main/resources/taiga/pvc-taiga-media-data.yaml @@ -1,16 +1,15 @@ apiVersion: v1 kind: PersistentVolumeClaim metadata: - name: NAME-hashfile-volume + name: taiga-media-data namespace: default labels: - app: NAME-nginx - app.kubernetes.part-of: NAME-website + app: taiga + app.kubernetes.part-of: taiga spec: - storageClassName: local-path + storageClassName: REPLACEME accessModes: - ReadWriteOnce resources: requests: - storage: 16Mi - \ No newline at end of file + storage: REPLACEME diff --git a/src/main/resources/taiga/pvc-taiga-static-data.yaml b/src/main/resources/taiga/pvc-taiga-static-data.yaml new file mode 100644 index 0000000..3663d24 --- /dev/null +++ b/src/main/resources/taiga/pvc-taiga-static-data.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: taiga-static-data + namespace: default + labels: + app: taiga + app.kubernetes.part-of: taiga +spec: + storageClassName: REPLACEME + accessModes: + - ReadWriteOnce + resources: + requests: + storage: REPLACEME diff --git a/src/main/resources/taiga/rabbitmq-pvc-async.yaml b/src/main/resources/taiga/rabbitmq-pvc-async.yaml new file mode 100644 index 0000000..52d745a --- /dev/null +++ b/src/main/resources/taiga/rabbitmq-pvc-async.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: taiga-async-rabbitmq-data + namespace: default + labels: + app: taiga + app.kubernetes.part-of: taiga +spec: + storageClassName: REPLACEME + accessModes: + - ReadWriteOnce + resources: + requests: + storage: REPLACEME diff --git a/src/main/resources/taiga/rabbitmq-pvc-events.yaml b/src/main/resources/taiga/rabbitmq-pvc-events.yaml new file mode 100644 index 0000000..7ce880e --- /dev/null +++ b/src/main/resources/taiga/rabbitmq-pvc-events.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: taiga-events-rabbitmq-data + namespace: default + labels: + app: taiga + app.kubernetes.part-of: taiga +spec: + storageClassName: REPLACEME + accessModes: + - ReadWriteOnce + resources: + requests: + storage: REPLACEME diff --git a/src/main/resources/taiga/secret.yaml b/src/main/resources/taiga/secret.yaml new file mode 100644 index 0000000..785444b --- /dev/null +++ b/src/main/resources/taiga/secret.yaml @@ -0,0 +1,23 @@ +apiVersion: v1 +kind: Secret +metadata: + name: taiga-secret + labels: + app.kubernetes.part-of: taiga +data: + # Taiga settings + TAIGA_SECRET_KEY: TAIGA_SECRET_KEY + + # Email settings + EMAIL_HOST_USER: EMAIL_HOST_USER + EMAIL_HOST_PASSWORD: EMAIL_HOST_PASSWORD + + # Rabbitmq settings + RABBITMQ_USER: RABBITMQ_USER + RABBITMQ_PASS: RABBITMQ_PASS + RABBITMQ_ERLANG_COOKIE: RABBITMQ_ERLANG_COOKIE + + # Django settings + DJANGO_SUPERUSER_USERNAME: SUPERUSER_USERNAME + DJANGO_SUPERUSER_PASSWORD: SUPERUSER_PASSWORD + DJANGO_SUPERUSER_EMAIL: SUPERUSER_EMAIL diff --git a/src/main/resources/taiga/taiga-configmap.yaml b/src/main/resources/taiga/taiga-configmap.yaml deleted file mode 100644 index 696cbff..0000000 --- a/src/main/resources/taiga/taiga-configmap.yaml +++ /dev/null @@ -1,33 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: taiga-configmap - namespace: default -data: - # These environment variables will be used by taiga-back and taiga-async. - # Database settings handled in deployment - - # Taiga settings - TAIGA_SITES_SCHEME: TAIGA_SCHEME - TAIGA_SITES_DOMAIN: TAIGA_DOMAIN - TAIGA_SUBPATH: SUBPATH - - # Email settings. - EMAIL_BACKEND: EMAIL_BACKEND # django.core.mail.backends.${EMAIL_BACKEND}.EmailBackend # ToDo move to code base - DEFAULT_FROM_EMAIL: DEFAULT_FROM_EMAIL_VALUE - EMAIL_USE_TLS: EMAIL_USE_TLS_VALUE - EMAIL_USE_SSL: EMAIL_USE_SSL_VALUE - EMAIL_HOST: EMAIL_HOST_VALUE - EMAIL_PORT: EMAIL_PORT_VALUE - - # Telemetry settings - ENABLE_TELEMETRY: ENABLE_TELEMETRY_VALUE - # ...your customizations go here - - # Taiga Events Settings - # EVENTS_PUSH_BACKEND_URL: RABBITMQ_URL_VALUE - ## Format RABBITMQ_URL="amqp://${RABBITMQ_USER}:${RABBITMQ_PASS}@taiga-events-rabbitmq:5672/taiga" - # RABBITMQ_URL: RABBITMQ_URL_VALUE # found in https://github.com/kaleidos-ventures/taiga-events/blob/main/docker/env.template - - # Taiga Async Settings - # CELERY_BROKER_URL: CELERY_URL_VALUE \ No newline at end of file diff --git a/src/main/resources/taiga/taiga-data-pvcs.yaml b/src/main/resources/taiga/taiga-data-pvcs.yaml deleted file mode 100644 index c9adf34..0000000 --- a/src/main/resources/taiga/taiga-data-pvcs.yaml +++ /dev/null @@ -1,31 +0,0 @@ -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: taiga-media-data - namespace: default - labels: - app: taiga - app.kubernetes.part-of: taiga -spec: - storageClassName: local-path - accessModes: - - ReadWriteOnce - resources: - requests: - storage: TAIGA_MEDIA_DATA_STORAGE_SIZE ---- -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: taiga-static-data - namespace: default - labels: - app: taiga - app.kubernetes.part-of: taiga -spec: - storageClassName: local-path - accessModes: - - ReadWriteOnce - resources: - requests: - storage: TAIGA_STATIC_DATA_STORAGE_SIZE diff --git a/src/main/resources/taiga/taiga-rabbitmq-pvc.yaml b/src/main/resources/taiga/taiga-rabbitmq-pvc.yaml deleted file mode 100644 index 58f2b3e..0000000 --- a/src/main/resources/taiga/taiga-rabbitmq-pvc.yaml +++ /dev/null @@ -1,31 +0,0 @@ -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: taiga-async-rabbitmq-data - namespace: default - labels: - app: taiga - app.kubernetes.part-of: taiga -spec: - storageClassName: local-path - accessModes: - - ReadWriteOnce - resources: - requests: - storage: TAIGA_RABBITMQ_DATA_STORAGE_SIZE ---- -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: taiga-events-rabbitmq-data - namespace: default - labels: - app: taiga - app.kubernetes.part-of: taiga -spec: - storageClassName: local-path - accessModes: - - ReadWriteOnce - resources: - requests: - storage: TAIGA_RABBITMQ_DATA_STORAGE_SIZE diff --git a/src/main/resources/taiga/taiga-rabbitmq-secret.yaml b/src/main/resources/taiga/taiga-rabbitmq-secret.yaml deleted file mode 100644 index 79a6286..0000000 --- a/src/main/resources/taiga/taiga-rabbitmq-secret.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: v1 -kind: Secret -metadata: - name: taiga-rabbitmq-secret - labels: - app.kubernetes.part-of: taiga -data: - # Rabbitmq settings - RABBITMQ_DEFAULT_USER: RABBITMQ_USER_VALUE # ToDo: Evaluate if we need two different users and passes for rabbitmq - RABBITMQ_DEFAULT_PASS: RABBITMQ_PASS_VALUE diff --git a/src/main/resources/taiga/taiga-secret.yaml b/src/main/resources/taiga/taiga-secret.yaml deleted file mode 100644 index 08fd205..0000000 --- a/src/main/resources/taiga/taiga-secret.yaml +++ /dev/null @@ -1,22 +0,0 @@ -apiVersion: v1 -kind: Secret -metadata: - name: taiga-secret - labels: - app.kubernetes.part-of: taiga -data: - - # Taiga settings - TAIGA_SECRET_KEY: SECRET_KEY_VALUE - - # Email settings - EMAIL_HOST_USER: EMAIL_HOST_USER_VALUE - EMAIL_HOST_PASSWORD: EMAIL_HOST_USER_PASS - - # Rabbitmq settings - RABBITMQ_USER: RABBITMQ_USER_VALUE - RABBITMQ_PASS: RABBITMQ_PASS_VALUE - - # Django settings - DJANGO_SUPERUSER_TAIGAADMIN: TAIGA_ADMIN - DJANGO_SUPERUSER_PASSWORD: TAIGA_ADMIN_PASS diff --git a/src/main/resources/website/nginx-configmap.yaml b/src/main/resources/website/nginx-configmap.yaml deleted file mode 100644 index cd9a1dc..0000000 --- a/src/main/resources/website/nginx-configmap.yaml +++ /dev/null @@ -1,97 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: NAME-configmap - namespace: default - labels: - app.kubernetes.part-of: NAME-website -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/svg+xml svg svgz; - 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; - server_name FQDN - add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload'; - 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 deleted file mode 100644 index 9133cd2..0000000 --- a/src/main/resources/website/nginx-deployment.yaml +++ /dev/null @@ -1,76 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: NAME-deployment - labels: - app.kubernetes.part-of: NAME-website -spec: - replicas: 1 - selector: - matchLabels: - app: NAME-nginx - template: - metadata: - labels: - app: NAME-nginx - spec: - containers: - - name: NAME-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: content-volume - readOnly: true - initContainers: - - image: domaindrivenarchitecture/c4k-website-build - name: NAME-init-build-container - imagePullPolicy: IfNotPresent - resources: - requests: - cpu: BUILD_CPU_REQUEST - memory: BUILD_MEMORY_REQUEST - limits: - cpu: BUILD_CPU_LIMIT - memory: BUILD_MEMORY_LIMIT - command: ["/entrypoint.sh"] - envFrom: - - secretRef: - name: NAME-secret - env: - - name: SHA256SUM - value: CHECK_SUM - - name: SCRIPTFILE - value: SCRIPT_FILE - volumeMounts: - - name: content-volume - mountPath: /var/www/html/website - - name: hashfile-volume - mountPath: /var/hashfile.d - volumes: - - name: nginx-config-volume - configMap: - name: NAME-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: content-volume - persistentVolumeClaim: - claimName: NAME-content-volume - - name: hashfile-volume - persistentVolumeClaim: - claimName: NAME-hashfile-volume - \ No newline at end of file diff --git a/src/main/resources/website/nginx-service.yaml b/src/main/resources/website/nginx-service.yaml deleted file mode 100644 index 36ab954..0000000 --- a/src/main/resources/website/nginx-service.yaml +++ /dev/null @@ -1,15 +0,0 @@ -kind: Service -apiVersion: v1 -metadata: - name: NAME-service - labels: - app: NAME-nginx - app.kubernetes.part-of: NAME-website - namespace: default -spec: - selector: - app: NAME-nginx - ports: - - name: nginx-http - port: 80 - \ No newline at end of file diff --git a/src/main/resources/website/website-build-cron.yaml b/src/main/resources/website/website-build-cron.yaml deleted file mode 100644 index 1c79d09..0000000 --- a/src/main/resources/website/website-build-cron.yaml +++ /dev/null @@ -1,48 +0,0 @@ -apiVersion: batch/v1 -kind: CronJob -metadata: - name: NAME-build-cron - labels: - app.kubernetes.part-of: NAME-website -spec: - schedule: "0/7 * * * *" - successfulJobsHistoryLimit: 1 - failedJobsHistoryLimit: 1 - jobTemplate: - spec: - template: - spec: - containers: - - image: domaindrivenarchitecture/c4k-website-build - name: NAME-build-app - imagePullPolicy: IfNotPresent - resources: - requests: - cpu: BUILD_CPU_REQUEST - memory: BUILD_MEMORY_REQUEST - limits: - cpu: BUILD_CPU_LIMIT - memory: BUILD_MEMORY_LIMIT - command: ["/entrypoint.sh"] - envFrom: - - secretRef: - name: NAME-secret - env: - - name: SHA256SUM - value: CHECK_SUM - - name: SCRIPTFILE - value: SCRIPT_FILE - volumeMounts: - - name: content-volume - mountPath: /var/www/html/website - - name: hashfile-volume - mountPath: /var/hashfile.d - volumes: - - name: content-volume - persistentVolumeClaim: - claimName: NAME-content-volume - - name: hashfile-volume - persistentVolumeClaim: - claimName: NAME-hashfile-volume - restartPolicy: OnFailure - \ No newline at end of file diff --git a/src/main/resources/website/website-build-secret.yaml b/src/main/resources/website/website-build-secret.yaml deleted file mode 100644 index f173d46..0000000 --- a/src/main/resources/website/website-build-secret.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: v1 -kind: Secret -metadata: - name: NAME-secret - labels: - app.kubernetes.part-of: NAME-website -data: - AUTHTOKEN: TOKEN - GITREPOURL: REPOURL - GITCOMMITURL: COMMITURL diff --git a/src/main/resources/website/website-content-volume.yaml b/src/main/resources/website/website-content-volume.yaml deleted file mode 100644 index 4e6f130..0000000 --- a/src/main/resources/website/website-content-volume.yaml +++ /dev/null @@ -1,16 +0,0 @@ -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: NAME-content-volume - namespace: default - labels: - app: NAME-nginx - app.kubernetes.part-of: NAME-website -spec: - storageClassName: local-path - accessModes: - - ReadWriteOnce - resources: - requests: - storage: WEBSITESTORAGESIZE - \ No newline at end of file diff --git a/src/test/cljc/dda/c4k_taiga/core_test.cljc b/src/test/cljc/dda/c4k_taiga/core_test.cljc new file mode 100644 index 0000000..a5de164 --- /dev/null +++ b/src/test/cljc/dda/c4k_taiga/core_test.cljc @@ -0,0 +1,19 @@ +(ns dda.c4k-taiga.core-test + (:require + #?(:cljs [shadow.resource :as rc]) + #?(:clj [clojure.test :refer [deftest is are testing run-tests]] + :cljs [cljs.test :refer-macros [deftest is are testing run-tests]]) + [clojure.spec.alpha :as s] + [dda.c4k-common.yaml :as yaml] + [dda.c4k-taiga.core :as cut])) + +#?(:cljs + (defmethod yaml/load-resource :website-test [resource-name] + (case resource-name + "taiga-test/valid-config.yaml" (rc/inline "taiga-test/valid-config.yaml") + "taiga-test/valid-auth.yaml" (rc/inline "taiga-test/valid-auth.yaml") + (throw (js/Error. "Undefined Resource!"))))) + +(deftest validate-valid-resources + (is (s/valid? cut/config? (yaml/load-as-edn "taiga-test/valid-config.yaml"))) + (is (s/valid? cut/auth? (yaml/load-as-edn "taiga-test/valid-auth.yaml")))) diff --git a/src/test/cljc/dda/c4k_taiga/taiga_test.cljc b/src/test/cljc/dda/c4k_taiga/taiga_test.cljc new file mode 100644 index 0000000..c50288d --- /dev/null +++ b/src/test/cljc/dda/c4k_taiga/taiga_test.cljc @@ -0,0 +1,105 @@ +(ns dda.c4k-taiga.taiga-test + (:require + #?(:cljs [shadow.resource :as rc]) + #?(:clj [clojure.test :refer [deftest is are testing run-tests]] + :cljs [cljs.test :refer-macros [deftest is are testing run-tests]]) + [clojure.spec.alpha :as s] + [dda.c4k-common.yaml :as yaml] + [dda.c4k-taiga.taiga :as cut])) + +#?(:cljs + (defmethod yaml/load-resource :taiga-test [resource-name] + (case resource-name + "taiga-test/valid-config.yaml" (rc/inline "taiga-test/valid-config.yaml") + "taiga-test/valid-auth.yaml" (rc/inline "taiga-test/valid-auth.yaml") + (throw (js/Error. "Undefined Resource!"))))) + +(deftest should-generate-configmap + (is (= {:apiVersion "v1", + :kind "ConfigMap", + :metadata {:name "taiga-configmap", :namespace "default"}, + :data + {:CELERY_ENABLED "false", + :ENABLE_TELEMETRY "false", + :TAIGA_SITES_SCHEME "https", + :TAIGA_SITES_DOMAIN "taiga.test.meissa.de", + :TAIGA_SUBPATH "", + :TAIGA_URL "https://taiga.test.meissa.de", + :TAIGA_WEBSOCKETS_URL "wss://taiga.test.meissa.de", + :PUBLIC_REGISTER_ENABLED "false", + :ENABLE_GITHUB_IMPORTER "false", + :ENABLE_JIRA_IMPORTER "false", + :ENABLE_TRELLO_IMPORTER "false", + :RABBITMQ_DEFAULT_VHOST "taiga", + :SESSION_COOKIE_SECURE "false", + :CSRF_COOKIE_SECURE "false"}} + (cut/generate-configmap (yaml/load-as-edn "taiga-test/valid-config.yaml"))))) + +(deftest should-generate-pvc-taiga-media-data + (is (= {:apiVersion "v1", + :kind "PersistentVolumeClaim", + :metadata + {:name "taiga-media-data", + :namespace "default", + :labels {:app "taiga", :app.kubernetes.part-of "taiga"}}, + :spec + {:storageClassName "local-path", + :accessModes ["ReadWriteOnce"], + :resources {:requests {:storage "2Gi"}}}} + (cut/generate-pvc-taiga-media-data (yaml/load-as-edn "taiga-test/valid-config.yaml"))))) + +(deftest should-generate-pvc-taiga-static-data + (is (= {:apiVersion "v1", + :kind "PersistentVolumeClaim", + :metadata + {:name "taiga-static-data", + :namespace "default", + :labels {:app "taiga", :app.kubernetes.part-of "taiga"}}, + :spec + {:storageClassName "local-path", + :accessModes ["ReadWriteOnce"], + :resources {:requests {:storage "3Gi"}}}} + (cut/generate-pvc-taiga-static-data (yaml/load-as-edn "taiga-test/valid-config.yaml"))))) + +(deftest should-generate-rabbitmq-pvc-async + (is (= {:apiVersion "v1", + :kind "PersistentVolumeClaim", + :metadata + {:name "taiga-async-rabbitmq-data", + :namespace "default", + :labels {:app "taiga", :app.kubernetes.part-of "taiga"}}, + :spec + {:storageClassName "local-path", + :accessModes ["ReadWriteOnce"], + :resources {:requests {:storage "4Gi"}}}} + (cut/generate-rabbitmq-pvc-async(yaml/load-as-edn "taiga-test/valid-config.yaml"))))) + +(deftest should-generate-rabbitmq-pvc-events + (is (= {:apiVersion "v1", + :kind "PersistentVolumeClaim", + :metadata + {:name "taiga-events-rabbitmq-data", + :namespace "default", + :labels {:app "taiga", :app.kubernetes.part-of "taiga"}}, + :spec + {:storageClassName "local-path", + :accessModes ["ReadWriteOnce"], + :resources {:requests {:storage "5Gi"}}}} + (cut/generate-rabbitmq-pvc-events (yaml/load-as-edn "taiga-test/valid-config.yaml"))))) + +(deftest should-generate-secret + (is (= {:apiVersion "v1", + :kind "Secret", + :metadata + {:name "taiga-secret", :labels {:app.kubernetes.part-of "taiga"}}, + :data + {:TAIGA_SECRET_KEY "c29tZS1rZXk=", + :EMAIL_HOST_USER "bWFpbGVyLXVzZXI=", + :EMAIL_HOST_PASSWORD "bWFpbGVyLXB3", + :RABBITMQ_USER "cmFiYml0LXVzZXI=", + :RABBITMQ_PASS "cmFiYml0LXB3", + :RABBITMQ_ERLANG_COOKIE "cmFiYml0LWVybGFuZw==", + :DJANGO_SUPERUSER_USERNAME "dGFpZ2EtYWRtaW4=", + :DJANGO_SUPERUSER_PASSWORD "c3VwZXItcGFzc3dvcmQ=", + :DJANGO_SUPERUSER_EMAIL "c29tZUBleGFtcGxlLmNvbQ=="}} + (cut/generate-secret (yaml/load-as-edn "taiga-test/valid-auth.yaml"))))) \ No newline at end of file diff --git a/src/test/cljc/dda/c4k_website/core_test.cljc b/src/test/cljc/dda/c4k_website/core_test.cljc deleted file mode 100644 index d51d28b..0000000 --- a/src/test/cljc/dda/c4k_website/core_test.cljc +++ /dev/null @@ -1,121 +0,0 @@ -(ns dda.c4k-website.core-test - (:require - #?(:cljs [shadow.resource :as rc]) - #?(:clj [clojure.test :refer [deftest is are testing run-tests]] - :cljs [cljs.test :refer-macros [deftest is are testing run-tests]]) - [clojure.spec.alpha :as s] - [dda.c4k-common.yaml :as yaml] - [dda.c4k-website.core :as cut] - [clojure.spec.alpha :as s])) - -#?(:cljs - (defmethod yaml/load-resource :website-test [resource-name] - (case resource-name - "website-test/valid-auth.yaml" (rc/inline "website-test/valid-auth.yaml") - "website-test/valid-config.yaml" (rc/inline "website-test/valid-config.yaml") - (throw (js/Error. "Undefined Resource!"))))) - -(deftest validate-valid-resources - (is (s/valid? cut/config? (yaml/load-as-edn "website-test/valid-config.yaml"))) - (is (s/valid? cut/auth? (yaml/load-as-edn "website-test/valid-auth.yaml")))) - -(def websites1 - {:websites - [{:unique-name "example.io" - :fqdns ["example.org", "www.example.com"] - :gitea-host "finegitehost.net" - :gitea-repo "repo" - :branchname "main"} - {:unique-name "test.io" - :fqdns ["test.de" "test.org" "www.test.de" "www.test.org"] - :gitea-host "gitlab.de" - :gitea-repo "repo" - :branchname "main"}]}) - -(def websites2 - {:websites - [{:unique-name "test.io" - :fqdns ["test.de" "test.org" "www.test.de" "www.test.org"] - :gitea-host "gitlab.de" - :gitea-repo "repo" - :branchname "main"} - {:unique-name "example.io" - :fqdns ["example.org", "www.example.com"] - :gitea-host "finegitehost.net" - :gitea-repo "repo" - :branchname "main"}]}) - -(def auth1 - {:auth - [{:unique-name "example.io" - :username "someuser" - :authtoken "abedjgbasdodj"} - {:unique-name "test.io" - :username "someuser" - :authtoken "abedjgbasdodj"}]}) - -(def auth2 - {:auth - [{:unique-name "test.io" - :username "someuser" - :authtoken "abedjgbasdodj"} - {:unique-name "example.io" - :username "someuser" - :authtoken "abedjgbasdodj"}]}) - -(def flattened-and-reduced-config - {:unique-name "example.io", - :fqdns ["example.org" "www.example.com"], - :gitea-host "finegitehost.net", - :gitea-repo "repo", - :branchname "main"}) - -(def flattened-and-reduced-auth - {:unique-name "example.io", - :username "someuser", - :authtoken "abedjgbasdodj"}) - -(deftest sorts-config - (is (= {:issuer "staging", - :websites - [{:unique-name "example.io", - :fqdns ["example.org" "www.example.com"], - :gitea-host "finegitehost.net", - :gitea-repo "repo", - :branchname "main"}, - {:unique-name "test.io", - :fqdns ["test.de" "test.org" "www.test.de" "www.test.org"], - :gitea-host "gitlab.de", - :gitea-repo "repo", - :branchname "main", - :sha256sum-output "123456789ab123cd345de script-file-name.sh"}], - :mon-cfg {:grafana-cloud-url "url-for-your-prom-remote-write-endpoint", :cluster-name "jitsi", :cluster-stage "test"}} - (cut/sort-config - {:issuer "staging", - :websites - [{:unique-name "test.io", - :fqdns ["test.de" "test.org" "www.test.de" "www.test.org"], - :gitea-host "gitlab.de", - :gitea-repo "repo", - :branchname "main", - :sha256sum-output "123456789ab123cd345de script-file-name.sh"} - {:unique-name "example.io", - :fqdns ["example.org" "www.example.com"], - :gitea-host "finegitehost.net", - :gitea-repo "repo", - :branchname "main"}], - :mon-cfg {:grafana-cloud-url "url-for-your-prom-remote-write-endpoint", :cluster-name "jitsi", :cluster-stage "test"}})))) - -(deftest test-flatten-and-reduce-config - (is (= - flattened-and-reduced-config - (cut/flatten-and-reduce-config (cut/sort-config websites1)))) - (is (= - flattened-and-reduced-config - (cut/flatten-and-reduce-config (cut/sort-config websites2))))) - -(deftest test-flatten-and-reduce-auth - (is (= flattened-and-reduced-auth - (cut/flatten-and-reduce-auth (cut/sort-auth auth1)))) - (is (= flattened-and-reduced-auth - (cut/flatten-and-reduce-auth (cut/sort-auth auth2))))) diff --git a/src/test/cljc/dda/c4k_website/website_test.cljc b/src/test/cljc/dda/c4k_website/website_test.cljc deleted file mode 100644 index 8f19da8..0000000 --- a/src/test/cljc/dda/c4k_website/website_test.cljc +++ /dev/null @@ -1,223 +0,0 @@ -(ns dda.c4k-website.website-test - (:require - #?(:clj [clojure.test :refer [deftest is are testing run-tests]] - :cljs [cljs.test :refer-macros [deftest is are testing run-tests]]) - [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] - [clojure.spec.alpha :as s])) - -(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-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) - -(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" - (:website.conf (:data (cut/generate-nginx-configmap {:unique-name "test.io", - :gitea-host "gitea.evilorg", - :gitea-repo "none", - :branchname "mablain", - :fqdns ["test.de" "www.test.de" "test-it.de" "www.test-it.de"]}))))) - (is (= "types {\n text/html html htm shtml;\n text/css css;\n text/xml xml rss;\n image/gif gif;\n image/jpeg jpeg jpg;\n application/x-javascript js;\n text/plain txt;\n text/x-component htc;\n text/mathml mml;\n image/svg+xml svg svgz;\n image/png png;\n image/x-icon ico;\n image/x-jng jng;\n image/vnd.wap.wbmp wbmp;\n application/java-archive jar war ear;\n application/mac-binhex40 hqx;\n application/pdf pdf;\n application/x-cocoa cco;\n application/x-java-archive-diff jardiff;\n application/x-java-jnlp-file jnlp;\n application/x-makeself run;\n application/x-perl pl pm;\n application/x-pilot prc pdb;\n application/x-rar-compressed rar;\n application/x-redhat-package-manager rpm;\n application/x-sea sea;\n application/x-shockwave-flash swf;\n application/x-stuffit sit;\n application/x-tcl tcl tk;\n application/x-x509-ca-cert der pem crt;\n application/x-xpinstall xpi;\n application/zip zip;\n application/octet-stream deb;\n application/octet-stream bin exe dll;\n application/octet-stream dmg;\n application/octet-stream eot;\n application/octet-stream iso img;\n application/octet-stream msi msp msm;\n audio/mpeg mp3;\n audio/x-realaudio ra;\n video/mpeg mpeg mpg;\n video/quicktime mov;\n video/x-flv flv;\n video/x-msvideo avi;\n video/x-ms-wmv wmv;\n video/x-ms-asf asx asf;\n video/x-mng mng;\n}\n" - (:mime.types (:data (cut/generate-nginx-configmap {:unique-name "test.io", - :gitea-host "gitea.evilorg", - :gitea-repo "none", - :branchname "mablain", - :fqdns ["test.de" "www.test.de" "test-it.de" "www.test-it.de"]}))))) - (is (= "user nginx;\nworker_processes 3;\nerror_log /var/log/nginx/error.log;\npid /var/log/nginx/nginx.pid;\nworker_rlimit_nofile 8192;\nevents {\n worker_connections 4096;\n}\nhttp {\n include /etc/nginx/mime.types;\n default_type application/octet-stream;\n log_format main '$remote_addr - $remote_user [$time_local] $status'\n '\"$request\" $body_bytes_sent \"$http_referer\"'\n '\"$http_user_agent\" \"$http_x_forwarded_for\"';\n access_log /var/log/nginx/access.log main;\n sendfile on;\n tcp_nopush on;\n keepalive_timeout 65;\n server_names_hash_bucket_size 128;\n include /etc/nginx/conf.d/website.conf;\n}\n" - (:nginx.conf (:data (cut/generate-nginx-configmap {:unique-name "test.io", - :gitea-host "gitea.evilorg", - :gitea-repo "none", - :branchname "mablain", - :fqdns ["test.de" "www.test.de" "test-it.de" "www.test-it.de"]}))))) - (is (= {:apiVersion "v1", - :kind "ConfigMap", - :metadata {:name "test-io-configmap", - :labels {:app.kubernetes.part-of "test-io-website"}, - :namespace "default"}} - (dissoc (cut/generate-nginx-configmap {:unique-name "test.io", - :gitea-host "gitea.evilorg", - :gitea-repo "none", - :branchname "mablain", - :fqdns ["test.de" "www.test.de" "test-it.de" "www.test-it.de"]}) :data)))) - -(deftest should-generate-nginx-deployment - (is (= {:apiVersion "apps/v1", - :kind "Deployment", - :metadata {:name "test-io-deployment", :labels {:app.kubernetes.part-of "test-io-website"}}, - :spec - {:replicas 1, - :selector {:matchLabels {:app "test-io-nginx"}}, - :template - {:metadata {:labels {:app "test-io-nginx"}}, - :spec - {:containers - [{:name "test-io-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 "content-volume", :readOnly true}]}], - :initContainers - [{:image "domaindrivenarchitecture/c4k-website-build", - :name "test-io-init-build-container", - :imagePullPolicy "IfNotPresent", - :resources {:requests {:cpu "500m", :memory "256Mi"}, :limits {:cpu "1700m", :memory "512Mi"}}, - :command ["/entrypoint.sh"], - :envFrom [{:secretRef {:name "test-io-secret"}}], - :env [{:name "SHA256SUM", :value "123456789ab123cd345de"} {:name "SCRIPTFILE", :value "script-file-name.sh"}], - :volumeMounts [{:name "content-volume", :mountPath "/var/www/html/website"} - {:name "hashfile-volume", :mountPath "/var/hashfile.d"}]}], - :volumes - [{:name "nginx-config-volume", - :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 "content-volume", :persistentVolumeClaim {:claimName "test-io-content-volume"}} - {:name "hashfile-volume", :persistentVolumeClaim {:claimName "test-io-hashfile-volume"}}]}}}} - (cut/generate-nginx-deployment {:gitea-host "gitlab.de", - :fqdns ["test.de" "test.org" "www.test.de" "www.test.org"], - :gitea-repo "repo", - :sha256sum-output "123456789ab123cd345de script-file-name.sh", - :issuer "staging", - :branchname "main", - :unique-name "test.io"})))) - -(deftest should-generate-resource-requests - (is (= {:requests {:cpu "500m", :memory "256Mi"}, :limits {:cpu "1700m", :memory "512Mi"}} - (-> (cut/generate-nginx-deployment {:gitea-host "gitlab.de", - :fqdns ["test.de" "test.org" "www.test.de" "www.test.org"], - :gitea-repo "repo", - :sha256sum-output "123456789ab123cd345de script-file-name.sh", - :issuer "staging", - :branchname "main", - :unique-name "test.io"}) - :spec :template :spec :initContainers first :resources ))) - (is (= {:requests {:cpu "1500m", :memory "512Mi"}, :limits {:cpu "3000m", :memory "1024Mi"}} - (-> (cut/generate-nginx-deployment {:gitea-host "gitlab.de", - :fqdns ["test.de" "test.org" "www.test.de" "www.test.org"], - :gitea-repo "repo", - :sha256sum-output "123456789ab123cd345de script-file-name.sh", - :issuer "staging", - :branchname "main", - :unique-name "test.io" - :build-cpu-request "1500m" - :build-cpu-limit "3000m" - :build-memory-request "512Mi" - :build-memory-limit "1024Mi"}) - :spec :template :spec :initContainers first :resources)))) - -(deftest should-generate-nginx-service - (is (= {:name-c1 "test-io-service", - :name-c2 "test-org-service", - :app-c1 "test-io-nginx", - :app-c2 "test-org-nginx", - :app.kubernetes.part-of-c1 "test-io-website", - :app.kubernetes.part-of-c2 "test-org-website"} - (th/map-diff (cut/generate-nginx-service {:unique-name "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 {:unique-name "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/v1", - :kind "CronJob", - :metadata {:name "test-io-build-cron", :labels {:app.kubernetes.part-of "test-io-website"}}, - :spec - {:schedule "0/7 * * * *", - :successfulJobsHistoryLimit 1, - :failedJobsHistoryLimit 1, - :jobTemplate - {:spec - {:template - {:spec - {:containers - [{:image "domaindrivenarchitecture/c4k-website-build", - :name "test-io-build-app", - :imagePullPolicy "IfNotPresent", - :resources {:requests {:cpu "500m", :memory "256Mi"}, :limits {:cpu "1700m", :memory "512Mi"}}, - :command ["/entrypoint.sh"], - :envFrom [{:secretRef {:name "test-io-secret"}}], - :env [{:name "SHA256SUM", :value "123456789ab123cd345de"} {:name "SCRIPTFILE", :value "script-file-name.sh"}], - :volumeMounts [{:name "content-volume", :mountPath "/var/www/html/website"} - {:name "hashfile-volume", :mountPath "/var/hashfile.d"}]}], - :volumes [{:name "content-volume", :persistentVolumeClaim {:claimName "test-io-content-volume"}} - {:name "hashfile-volume", :persistentVolumeClaim {:claimName "test-io-hashfile-volume"}}], - :restartPolicy "OnFailure"}}}}}} - (cut/generate-website-build-cron {:gitea-host "gitlab.de", - :fqdns ["test.de" "test.org" "www.test.de" "www.test.org"], - :gitea-repo "repo", - :sha256sum-output "123456789ab123cd345de script-file-name.sh", - :issuer "staging", - :branchname "main", - :unique-name "test.io"})))) - -(deftest should-generate-website-build-secret - (is (= {:apiVersion "v1", - :kind "Secret", - :metadata {:name "test-io-secret", :labels {:app.kubernetes.part-of "test-io-website"}}, - :data - {:AUTHTOKEN "YWJlZGpnYmFzZG9kag==", - :GITREPOURL "aHR0cHM6Ly9naXRsYWIuZGUvYXBpL3YxL3JlcG9zL3NvbWV1c2VyL3JlcG8vYXJjaGl2ZS9tYWluLnppcA==", - :GITCOMMITURL "aHR0cHM6Ly9naXRsYWIuZGUvYXBpL3YxL3JlcG9zL3NvbWV1c2VyL3JlcG8vZ2l0L2NvbW1pdHMvSEVBRA=="}} - (cut/generate-website-build-secret {:fqdns ["test.de" "test.org" "www.test.de" "www.test.org"], - :gitea-repo "repo", - :sha256sum-output "123456789ab123cd345de script-file-name.sh", - :issuer "staging", - :branchname "main", - :unique-name "test.io", - :gitea-host "gitlab.de"} - {:unique-name "test.io", - :authtoken "abedjgbasdodj", - :username "someuser"})))) - -(deftest should-generate-website-content-volume - (is (= {:name-c1 "test-io-content-volume", - :name-c2 "test-org-content-volume", - :app-c1 "test-io-nginx", - :app-c2 "test-org-nginx", - :app.kubernetes.part-of-c1 "test-io-website", - :app.kubernetes.part-of-c2 "test-org-website"} - (th/map-diff (cut/generate-website-content-volume {:unique-name "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 {:unique-name "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-hashfile-volume - (is (= {:apiVersion "v1", - :kind "PersistentVolumeClaim", - :metadata - {:name "test-io-hashfile-volume", - :namespace "default", - :labels {:app "test-io-nginx", :app.kubernetes.part-of "test-io-website"}}, - :spec {:storageClassName "local-path", :accessModes ["ReadWriteOnce"], :resources {:requests {:storage "16Mi"}}}} - (cut/generate-hashfile-volume {:unique-name "test.io", - :gitea-host "gitea.evilorg", - :gitea-repo "none", - :branchname "mablain", - :fqdns ["test.de" "www.test.de" "test-it.de" "www.test-it.de"]})))) diff --git a/src/test/resources/taiga-test/valid-auth.yaml b/src/test/resources/taiga-test/valid-auth.yaml new file mode 100644 index 0000000..6ed8858 --- /dev/null +++ b/src/test/resources/taiga-test/valid-auth.yaml @@ -0,0 +1,14 @@ +taiga-secret-key: "some-key" +postgres-db-user: "forgejo" +postgres-db-password: "forgejo-db-password" +mailer-user: "mailer-user" +mailer-pw: "mailer-pw" +django-superuser-username: "taiga-admin" +django-superuser-password: "super-password" +django-superuser-email: "some@example.com" +rabbitmq-user: "rabbit-user" +rabbitmq-pw: "rabbit-pw" +rabbitmq-erlang-cookie: "rabbit-erlang" +mon-auth: + grafana-cloud-user: "user" + grafana-cloud-password: "password" diff --git a/src/test/resources/taiga-test/valid-config.yaml b/src/test/resources/taiga-test/valid-config.yaml new file mode 100644 index 0000000..a0a21f7 --- /dev/null +++ b/src/test/resources/taiga-test/valid-config.yaml @@ -0,0 +1,13 @@ +issuer: "staging" +fqdn: "taiga.test.meissa.de" +public-register-enabled: "false" +enable-telemetry: "false" +storage-class-name: "local-path" +storage-media-size: 2 +storage-static-size: 3 +storage-async-rabbitmq-size: 4 +storage-events-rabbitmq-size: 5 +mon-cfg: + grafana-cloud-url: "url-for-your-prom-remote-write-endpoint" + cluster-name: "jitsi" + cluster-stage: "test" diff --git a/src/test/resources/website-test/valid-auth.yaml b/src/test/resources/website-test/valid-auth.yaml deleted file mode 100644 index de1fe08..0000000 --- a/src/test/resources/website-test/valid-auth.yaml +++ /dev/null @@ -1,12 +0,0 @@ -taiga-secret-key: "some-key" -postgres-db-user: "forgejo" -postgres-db-password: "forgejo-db-password" -mailer-user: "" -mailer-pw: "" -rabbitmq-user: "" -rabbitmq-pw: "" -django-superuser: "taiga-admin" -django-superuser-password: "" -mon-auth: - grafana-cloud-user: "user" - grafana-cloud-password: "password" diff --git a/src/test/resources/website-test/valid-config.yaml b/src/test/resources/website-test/valid-config.yaml deleted file mode 100644 index 71d94b0..0000000 --- a/src/test/resources/website-test/valid-config.yaml +++ /dev/null @@ -1,5 +0,0 @@ -issuer: "staging" -mon-cfg: - grafana-cloud-url: "url-for-your-prom-remote-write-endpoint" - cluster-name: "jitsi" - cluster-stage: "test"