From d7ad34bb832bb5d666ddda03514732ea32761028 Mon Sep 17 00:00:00 2001 From: Pat Dyn Date: Tue, 7 Feb 2023 08:41:04 +0000 Subject: [PATCH] Check the application.yaml for errors --- .../domain/k3s/ApplicationFileRepository.kt | 2 + .../provs/server/domain/k3s/K3sService.kt | 2 + .../DefaultApplicationFileRepository.kt | 27 ++++++++ .../DefaultConfigFileRepositoryKtTest.kt | 2 +- .../DefaultApplicationFileRepositoryKtTest.kt | 69 ++++++++++++++++++- .../{existing_file => existing-file} | 0 src/test/resources/failed-spec.yaml | 13 ++++ src/test/resources/java-exception.yaml | 34 +++++++++ src/test/resources/valid.yaml | 9 +++ 9 files changed, 156 insertions(+), 2 deletions(-) rename src/test/resources/{existing_file => existing-file} (100%) create mode 100644 src/test/resources/failed-spec.yaml create mode 100644 src/test/resources/java-exception.yaml create mode 100644 src/test/resources/valid.yaml diff --git a/src/main/kotlin/org/domaindrivenarchitecture/provs/server/domain/k3s/ApplicationFileRepository.kt b/src/main/kotlin/org/domaindrivenarchitecture/provs/server/domain/k3s/ApplicationFileRepository.kt index 9bce73e..775d95f 100644 --- a/src/main/kotlin/org/domaindrivenarchitecture/provs/server/domain/k3s/ApplicationFileRepository.kt +++ b/src/main/kotlin/org/domaindrivenarchitecture/provs/server/domain/k3s/ApplicationFileRepository.kt @@ -2,4 +2,6 @@ package org.domaindrivenarchitecture.provs.server.domain.k3s interface ApplicationFileRepository { fun assertExists(applicationFileName: ApplicationFileName?) + fun assertC4kSpecError(applicationFileName: ApplicationFileName?) + fun assertC4kJavaException(applicationFileName: ApplicationFileName?) } \ No newline at end of file diff --git a/src/main/kotlin/org/domaindrivenarchitecture/provs/server/domain/k3s/K3sService.kt b/src/main/kotlin/org/domaindrivenarchitecture/provs/server/domain/k3s/K3sService.kt index b569410..e8fdd92 100644 --- a/src/main/kotlin/org/domaindrivenarchitecture/provs/server/domain/k3s/K3sService.kt +++ b/src/main/kotlin/org/domaindrivenarchitecture/provs/server/domain/k3s/K3sService.kt @@ -15,6 +15,8 @@ fun Prov.provisionK3sCommand(cli: K3sCliCommand) = task { if (cli.onlyModules == null ) { val k3sConfig: K3sConfig = getK3sConfig(cli.configFileName) DefaultApplicationFileRepository().assertExists(cli.applicationFileName) + DefaultApplicationFileRepository().assertC4kSpecError(cli.applicationFileName) + DefaultApplicationFileRepository().assertC4kJavaException(cli.applicationFileName) DefaultConfigFileRepository().assertExists(cli.configFileName) val k3sConfigReprovision = k3sConfig.copy(reprovision = cli.reprovision || k3sConfig.reprovision) diff --git a/src/main/kotlin/org/domaindrivenarchitecture/provs/server/infrastructure/DefaultApplicationFileRepository.kt b/src/main/kotlin/org/domaindrivenarchitecture/provs/server/infrastructure/DefaultApplicationFileRepository.kt index 806356d..3af1cc2 100644 --- a/src/main/kotlin/org/domaindrivenarchitecture/provs/server/infrastructure/DefaultApplicationFileRepository.kt +++ b/src/main/kotlin/org/domaindrivenarchitecture/provs/server/infrastructure/DefaultApplicationFileRepository.kt @@ -3,6 +3,7 @@ package org.domaindrivenarchitecture.provs.server.infrastructure import org.domaindrivenarchitecture.provs.framework.ubuntu.filesystem.base.checkLocalFile import org.domaindrivenarchitecture.provs.server.domain.k3s.ApplicationFileName import org.domaindrivenarchitecture.provs.server.domain.k3s.ApplicationFileRepository +import java.io.File class DefaultApplicationFileRepository : ApplicationFileRepository { @@ -11,4 +12,30 @@ class DefaultApplicationFileRepository : ApplicationFileRepository { throw RuntimeException("Application file ${applicationFileName.fileName} not found. Please check if path is correct.") } } + + override fun assertC4kSpecError(applicationFileName: ApplicationFileName?) { + if (applicationFileName != null) { + val fileContent = File(applicationFileName.fullqualified()).readText() + + + if (fileContent.contains("Spec.failed".toRegex()) && fileContent.contains("Detected.*[0-9].*error+".toRegex())) { + throw RuntimeException("Application file ${applicationFileName.fileName} contains spec errors. Please check your configuration file.") + } + + } + } + + override fun assertC4kJavaException(applicationFileName: ApplicationFileName?) { + if (applicationFileName != null) { + val fileContent = File(applicationFileName.fullqualified()).readText() + + + if (fileContent.contains("Exception.in.thread".toRegex())) { + throw RuntimeException("Application file ${applicationFileName.fileName} contains java exception. Please check the c4k code for errors.") + } + + } + } + + } diff --git a/src/test/kotlin/org/domaindrivenarchitecture/provs/configuration/infrastructure/DefaultConfigFileRepositoryKtTest.kt b/src/test/kotlin/org/domaindrivenarchitecture/provs/configuration/infrastructure/DefaultConfigFileRepositoryKtTest.kt index 6319fdb..e000459 100644 --- a/src/test/kotlin/org/domaindrivenarchitecture/provs/configuration/infrastructure/DefaultConfigFileRepositoryKtTest.kt +++ b/src/test/kotlin/org/domaindrivenarchitecture/provs/configuration/infrastructure/DefaultConfigFileRepositoryKtTest.kt @@ -28,7 +28,7 @@ internal class DefaultConfigFileRepositoryKtTest { @Test fun assertExistsPasses() { // given - val validFileName = "src/test/resources/existing_file" + val validFileName = "src/test/resources/existing-file" // when val validFile = ApplicationFileName(File(validFileName).path) diff --git a/src/test/kotlin/org/domaindrivenarchitecture/provs/server/infrastructure/DefaultApplicationFileRepositoryKtTest.kt b/src/test/kotlin/org/domaindrivenarchitecture/provs/server/infrastructure/DefaultApplicationFileRepositoryKtTest.kt index eb57bd6..c3973e8 100644 --- a/src/test/kotlin/org/domaindrivenarchitecture/provs/server/infrastructure/DefaultApplicationFileRepositoryKtTest.kt +++ b/src/test/kotlin/org/domaindrivenarchitecture/provs/server/infrastructure/DefaultApplicationFileRepositoryKtTest.kt @@ -2,6 +2,7 @@ package org.domaindrivenarchitecture.provs.server.infrastructure import org.domaindrivenarchitecture.provs.configuration.domain.ConfigFileName import org.domaindrivenarchitecture.provs.configuration.infrastructure.DefaultConfigFileRepository +import org.domaindrivenarchitecture.provs.server.domain.k3s.ApplicationFileName import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows @@ -28,7 +29,7 @@ internal class DefaultApplicationFileRepositoryKtTest { @Test fun assertExistsPasses() { // given - val validFileName = "src/test/resources/existing_file" + val validFileName = "src/test/resources/existing-file" // when val validFile = ConfigFileName(File(validFileName).path) @@ -38,4 +39,70 @@ internal class DefaultApplicationFileRepositoryKtTest { // then // no exception is thrown } + + @Test + fun assertC4kSpecErrorThrows() { + // given + val applicationFileName = "src/test/resources/failed-spec.yaml" + + // when + val failedFile = ApplicationFileName(File(applicationFileName).path) + val repo = DefaultApplicationFileRepository() + + // then + val exception = assertThrows( + "Should throw because of bad spec." + ) { repo.assertC4kSpecError(failedFile) } + + assertEquals( + "Application file src/test/resources/failed-spec.yaml contains spec errors. Please check your configuration file.", + exception.message) + } + + @Test + fun assertC4kSpecErrorPasses() { + // given + val validFileName = "src/test/resources/valid.yaml" + + // when + val validFile = ApplicationFileName(File(validFileName).path) + val repo = DefaultApplicationFileRepository() + repo.assertC4kSpecError(validFile) + + // then + // no exception is thrown + } + + @Test + fun assertC4kJavaExceptionThrows() { + // given + val applicationFileName = "src/test/resources/java-exception.yaml" + + // when + val failedFile = ApplicationFileName(File(applicationFileName).path) + val repo = DefaultApplicationFileRepository() + + // then + val exception = assertThrows( + "Should throw because of java exception." + ) { repo.assertC4kJavaException(failedFile) } + + assertEquals( + "Application file src/test/resources/java-exception.yaml contains java exception. Please check the c4k code for errors.", + exception.message) + } + + @Test + fun assertC4kJavaExceptionPasses() { + // given + val validFileName = "src/test/resources/valid.yaml" + + // when + val validFile = ApplicationFileName(File(validFileName).path) + val repo = DefaultApplicationFileRepository() + repo.assertC4kJavaException(validFile) + + // then + // no exception is thrown + } } \ No newline at end of file diff --git a/src/test/resources/existing_file b/src/test/resources/existing-file similarity index 100% rename from src/test/resources/existing_file rename to src/test/resources/existing-file diff --git a/src/test/resources/failed-spec.yaml b/src/test/resources/failed-spec.yaml new file mode 100644 index 0000000..028b008 --- /dev/null +++ b/src/test/resources/failed-spec.yaml @@ -0,0 +1,13 @@ + -- Spec failed -------------------- + + {:jvb-auth-password 1234, + ^^^^ + :jicofo-auth-password ..., + :jicofo-component-secret ...} + + should satisfy + + bash-env-string? + + ------------------------- + Detected 1 error \ No newline at end of file diff --git a/src/test/resources/java-exception.yaml b/src/test/resources/java-exception.yaml new file mode 100644 index 0000000..d8c5ac7 --- /dev/null +++ b/src/test/resources/java-exception.yaml @@ -0,0 +1,34 @@ +Exception in thread "main" java.lang.IllegalArgumentException: Cannot open as a Reader. + at clojure.java.io$fn__11641.invokeStatic(io.clj:288) + at clojure.java.io$fn__11641.invoke(io.clj:288) + at clojure.java.io$fn__11530$G__11519__11537.invoke(io.clj:69) + at clojure.java.io$reader.invokeStatic(io.clj:102) + at clojure.java.io$reader.doInvoke(io.clj:86) + at clojure.lang.RestFn.invoke(RestFn.java:410) + at clojure.lang.AFn.applyToHelper(AFn.java:154) + at clojure.lang.RestFn.applyTo(RestFn.java:132) + at clojure.core$apply.invokeStatic(core.clj:669) + at clojure.core$slurp.invokeStatic(core.clj:7009) + at clojure.core$slurp.doInvoke(core.clj:7009) + at clojure.lang.RestFn.invoke(RestFn.java:410) + at dda.c4k_common.yaml$fn__577.invokeStatic(yaml.clj:39) + at dda.c4k_common.yaml$fn__577.invoke(yaml.clj:38) + at clojure.lang.MultiFn.invoke(MultiFn.java:229) + at dda.c4k_common.yaml$load_as_edn.invokeStatic(yaml.clj:42) + at dda.c4k_common.yaml$load_as_edn.invoke(yaml.clj:41) + at dda.c4k_website.website$replace_common_data.invokeStatic(website.cljc:122) + at dda.c4k_website.website$replace_common_data.invoke(website.cljc:117) + at dda.c4k_website.website$generate_hashfile_volume.invokeStatic(website.cljc:198) + at dda.c4k_website.website$generate_hashfile_volume.invoke(website.cljc:196) + at dda.c4k_website.core$generate_configs.invokeStatic(core.cljc:60) + at dda.c4k_website.core$generate_configs.invoke(core.cljc:45) + at dda.c4k_website.core$k8s_objects.invokeStatic(core.cljc:74) + at dda.c4k_website.core$k8s_objects.invoke(core.cljc:66) + at dda.c4k_common.common$generate_common.invokeStatic(common.cljc:68) + at dda.c4k_common.common$generate_common.invoke(common.cljc:60) + at dda.c4k_common.uberjar$main_common.invokeStatic(uberjar.clj:50) + at dda.c4k_common.uberjar$main_common.invoke(uberjar.clj:31) + at dda.c4k_website.uberjar$_main.invokeStatic(uberjar.clj:9) + at dda.c4k_website.uberjar$_main.doInvoke(uberjar.clj:8) + at clojure.lang.RestFn.applyTo(RestFn.java:137) + at dda.c4k_website.uberjar.main(Unknown Source) \ No newline at end of file diff --git a/src/test/resources/valid.yaml b/src/test/resources/valid.yaml new file mode 100644 index 0000000..6f1afbf --- /dev/null +++ b/src/test/resources/valid.yaml @@ -0,0 +1,9 @@ +apiVersion: v1 +kind: Secret +metadata: + name: config +type: Opaque +data: + JVB_AUTH_PASSWORD: BLA + JICOFO_AUTH_PASSWORD: BLA + JICOFO_COMPONENT_SECRET: BLA \ No newline at end of file