diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0da2ecc..737531e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -48,7 +48,7 @@ test-schema: stage: build_and_test script: - lein uberjar - - java -jar target/uberjar/c4k-website-standalone.jar valid-config.edn valid-auth.edn | kubeconform --kubernetes-version 1.23.0 --strict --skip Certificate - + - java -jar target/uberjar/c4k-website-standalone.jar src/test/resources/website-test/valid-config.yaml src/test/resources/website-test/valid-auth.yaml | kubeconform --kubernetes-version 1.23.0 --strict --skip Certificate - artifacts: expire_in: 1h paths: diff --git a/README.md b/README.md index 4557ed2..9f9b9cf 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,10 @@ Configs generated by c4k-website consists of the following parts: * cron job for building and build secret for storing auth data * respective volume claims +## Status + +Stable - we use this setup on production. + ## Try out Click on the image to try out in your browser: @@ -28,6 +32,13 @@ Click on the image to try out in your browser: Your input will stay in your browser. No server interaction is required. +You will also be able to try out on cli: +``` +target/graalvm/c4k-website src/test/resources/website-test/valid-config.yaml src/test/resources/website-test/valid-auth.yaml | kubeval - +target/graalvm/c4k-website src/test/resources/website-test/valid-config.yaml src/test/resources/website-test/valid-auth.yaml | kubectl apply -f - +``` + + ## Usage You need: diff --git a/project.clj b/project.clj index 2116815..a2f736a 100644 --- a/project.clj +++ b/project.clj @@ -5,7 +5,7 @@ :url "https://www.apache.org/licenses/LICENSE-2.0.html"} :dependencies [[org.clojure/clojure "1.11.1"] [org.clojure/tools.reader "1.3.6"] - [org.domaindrivenarchitecture/c4k-common-clj "4.0.0"] + [org.domaindrivenarchitecture/c4k-common-clj "5.0.1"] [hickory "0.7.1"]] :target-path "target/%s/" :source-paths ["src/main/cljc" diff --git a/shadow-cljs.edn b/shadow-cljs.edn index c21d6b4..299e665 100644 --- a/shadow-cljs.edn +++ b/shadow-cljs.edn @@ -4,7 +4,7 @@ "src/test/cljc" "src/test/cljs" "src/test/resources"] - :dependencies [[org.domaindrivenarchitecture/c4k-common-cljs "4.0.0"] + :dependencies [[org.domaindrivenarchitecture/c4k-common-cljs "5.0.1"] [hickory "0.7.1"]] :builds {:frontend {:target :browser :modules {:main {:init-fn dda.c4k-website.browser/init}} diff --git a/src/main/cljs/dda/c4k_website/browser.cljs b/src/main/cljs/dda/c4k_website/browser.cljs index 38bc381..4d10d01 100644 --- a/src/main/cljs/dda/c4k_website/browser.cljs +++ b/src/main/cljs/dda/c4k_website/browser.cljs @@ -2,34 +2,25 @@ (:require [clojure.string :as st] [clojure.tools.reader.edn :as edn] + [dda.c4k-common.monitoring :as mon] [dda.c4k-website.core :as core] [dda.c4k-website.website :as website] - [dda.c4k-common.browser :as br] - [dda.c4k-common.common :as cm])) - -(defn generate-group - [name - content] - [{:type :element - :tag :div - :attrs {:class "rounded border border-3 m-3 p-2"} - :content [{:type :element - :tag :b - :attrs {:style "z-index: 1; position: relative; top: -1.3rem;"} - :content name} - {:type :element - :tag :fieldset - :content content}]}]) + [dda.c4k-common.common :as cm] + [dda.c4k-common.browser :as br] + )) (defn generate-content [] (cm/concat-vec [(assoc (br/generate-needs-validation) :content (cm/concat-vec - (generate-group + (br/generate-group "domain" (cm/concat-vec (br/generate-input-field "issuer" "(Optional) Your issuer prod/staging:" "") + (br/generate-input-field "mon-cluster-name" "(Optional) monitoring cluster name:" "website") + (br/generate-input-field "mon-cluster-stage" "(Optional) monitoring cluster stage:" "test") + (br/generate-input-field "mon-cloud-url" "(Optional) grafana cloud url:" "https://prometheus-prod-01-eu-west-0.grafana.net/api/prom/push") (br/generate-text-area "websites" "Contains fqdns, repo infos, an optional sha256sum-output for script execution for each website:" "{:websites @@ -49,17 +40,19 @@ :build-memory-request \"512Mi\", :build-memory-limit \"1024Mi\"}]}" "16"))) - (generate-group + (br/generate-group "credentials" (br/generate-text-area "auth" "Your authentication data for each website or git repo:" - "{:auth - [{:unique-name \"test.io\", - :username \"someuser\", - :authtoken \"abedjgbasdodj\"} - {:unique-name \"example.io\", - :username \"someuser\", - :authtoken \"abedjgbasdodj\"}]}" + "{:mon-auth {:grafana-cloud-user \"your-user-id\" + :grafana-cloud-password \"your-cloud-password\"} + :auth + [{:unique-name \"test.io\", + :username \"someuser\", + :authtoken \"abedjgbasdodj\"} + {:unique-name \"example.io\", + :username \"someuser\", + :authtoken \"abedjgbasdodj\"}]}" "7")) [(br/generate-br)] (br/generate-button "generate-button" "Generate c4k yaml")))] @@ -73,15 +66,25 @@ (generate-content)}) (defn config-from-document [] - (let [issuer (br/get-content-from-element "issuer" :optional true)] + (let [issuer (br/get-content-from-element "issuer" :optional true) + mon-cluster-name (br/get-content-from-element "mon-cluster-name" :optional true) + mon-cluster-stage (br/get-content-from-element "mon-cluster-stage" :optional true :deserializer keyword) + mon-cloud-url (br/get-content-from-element "mon-cloud-url" :optional true)] (merge (br/get-content-from-element "websites" :deserializer edn/read-string) (when (not (st/blank? issuer)) - {:issuer issuer})))) + {:issuer issuer}) + (when (some? mon-cluster-name) + {:mon-cfg {:cluster-name mon-cluster-name + :cluster-stage (keyword mon-cluster-stage) + :grafana-cloud-url mon-cloud-url}})))) (defn validate-all! [] - (br/validate! "websites" website/config? :deserializer edn/read-string) + (br/validate! "websites" website/config? :deserializer edn/read-string) (br/validate! "issuer" ::website/issuer :optional true) + (br/validate! "mon-cluster-name" ::mon/cluster-name :optional true) + (br/validate! "mon-cluster-stage" ::mon/cluster-stage :optional true :deserializer keyword) + (br/validate! "mon-cloud-url" ::mon/grafana-cloud-url :optional true) (br/validate! "auth" website/auth? :deserializer edn/read-string) (br/set-form-validated!)) @@ -103,4 +106,7 @@ (br/set-output!))))) (add-validate-listener "websites") (add-validate-listener "issuer") + (add-validate-listener "mon-cluster-name") + (add-validate-listener "mon-cluster-stage") + (add-validate-listener "mon-cloud-url") (add-validate-listener "auth")) diff --git a/src/test/cljc/dda/c4k_website/core_test.cljc b/src/test/cljc/dda/c4k_website/core_test.cljc index 0d3d7a4..0991ff8 100644 --- a/src/test/cljc/dda/c4k_website/core_test.cljc +++ b/src/test/cljc/dda/c4k_website/core_test.cljc @@ -1,13 +1,24 @@ (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.test.alpha :as st] - [dda.c4k-common.test-helper :as th] - [dda.c4k-common.base64 :as b64] + [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 websites {:websites [{:unique-name "example.io" diff --git a/src/test/resources/website-test/valid-auth.yaml b/src/test/resources/website-test/valid-auth.yaml new file mode 100644 index 0000000..85bf915 --- /dev/null +++ b/src/test/resources/website-test/valid-auth.yaml @@ -0,0 +1,10 @@ +auth: +- unique-name: "test.io" + username: "someuser" + authtoken: "abedjgbasdodj" +- unique-name: "example.io" + username: "someuser" + authtoken: "abedjgbasdodj" +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 new file mode 100644 index 0000000..ae670cf --- /dev/null +++ b/src/test/resources/website-test/valid-config.yaml @@ -0,0 +1,17 @@ +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" diff --git a/valid-auth.edn b/valid-auth.edn deleted file mode 100644 index f8766c0..0000000 --- a/valid-auth.edn +++ /dev/null @@ -1,7 +0,0 @@ -{:auth - [{:unique-name "test.io" - :username "someuser" - :authtoken "abedjgbasdodj"} - {:unique-name "example.io" - :username "someuser" - :authtoken "abedjgbasdodj"}]} diff --git a/valid-config.edn b/valid-config.edn deleted file mode 100644 index 0f17e69..0000000 --- a/valid-config.edn +++ /dev/null @@ -1,13 +0,0 @@ -{: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"}]}