From d1d5bd6fe59699c07f118a68efe07208d17fae1b Mon Sep 17 00:00:00 2001 From: German Osin Date: Fri, 28 Feb 2025 13:58:18 +0100 Subject: [PATCH 1/3] basic test --- .../kafbat/ui/config/ClustersProperties.java | 4 +++ .../java/io/kafbat/ui/ConfigurationTests.java | 27 +++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 api/src/test/java/io/kafbat/ui/ConfigurationTests.java diff --git a/api/src/main/java/io/kafbat/ui/config/ClustersProperties.java b/api/src/main/java/io/kafbat/ui/config/ClustersProperties.java index 5931602b2..3e6727506 100644 --- a/api/src/main/java/io/kafbat/ui/config/ClustersProperties.java +++ b/api/src/main/java/io/kafbat/ui/config/ClustersProperties.java @@ -2,6 +2,8 @@ import io.kafbat.ui.model.MetricsConfig; import jakarta.annotation.PostConstruct; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -33,7 +35,9 @@ public class ClustersProperties { @Data public static class Cluster { + @NotEmpty String name; + @NotEmpty String bootstrapServers; TruststoreConfig ssl; diff --git a/api/src/test/java/io/kafbat/ui/ConfigurationTests.java b/api/src/test/java/io/kafbat/ui/ConfigurationTests.java new file mode 100644 index 000000000..581bc3b75 --- /dev/null +++ b/api/src/test/java/io/kafbat/ui/ConfigurationTests.java @@ -0,0 +1,27 @@ +package io.kafbat.ui; + +import static org.junit.jupiter.api.Assertions.assertThrows; + +import io.kafbat.ui.config.ClustersProperties; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.properties.bind.BindException; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.TestPropertySource; + +@SpringBootTest +//@EnableConfigurationProperties(ClustersProperties.class) +@TestPropertySource(properties = { + "kafka.clusters.0.name=", +}) +class ConfigurationTests { + + @Autowired + private ClustersProperties clustersProperties; + + @Test + void shouldFailWithotName() { + assertThrows(BindException.class, () -> clustersProperties.getClusters()); + } + +} From d7f984a17305251f8517f6ddc164d14177884a71 Mon Sep 17 00:00:00 2001 From: German Osin Date: Fri, 28 Feb 2025 15:44:03 +0100 Subject: [PATCH 2/3] Validate config before start --- api/pom.xml | 4 +++ .../kafbat/ui/config/ClustersProperties.java | 26 +++++++++++++----- .../java/io/kafbat/ui/ConfigurationTests.java | 27 ------------------- 3 files changed, 23 insertions(+), 34 deletions(-) delete mode 100644 api/src/test/java/io/kafbat/ui/ConfigurationTests.java diff --git a/api/pom.xml b/api/pom.xml index fac019ab5..0c44d462e 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -29,6 +29,10 @@ org.springframework.boot spring-boot-starter-security + + org.springframework.boot + spring-boot-starter-validation + org.springframework.boot spring-boot-actuator diff --git a/api/src/main/java/io/kafbat/ui/config/ClustersProperties.java b/api/src/main/java/io/kafbat/ui/config/ClustersProperties.java index 3e6727506..c05a6dd6c 100644 --- a/api/src/main/java/io/kafbat/ui/config/ClustersProperties.java +++ b/api/src/main/java/io/kafbat/ui/config/ClustersProperties.java @@ -2,6 +2,8 @@ import io.kafbat.ui.model.MetricsConfig; import jakarta.annotation.PostConstruct; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import java.util.ArrayList; @@ -19,13 +21,15 @@ import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; import org.springframework.util.StringUtils; +import org.springframework.validation.annotation.Validated; @Configuration @ConfigurationProperties("kafka") @Data +@Validated public class ClustersProperties { - List clusters = new ArrayList<>(); + List<@Valid Cluster> clusters = new ArrayList<>(); String internalTopicPrefix; @@ -35,9 +39,9 @@ public class ClustersProperties { @Data public static class Cluster { - @NotEmpty + @NotBlank(message = "field name for for cluster could not be blank") String name; - @NotEmpty + @NotBlank(message = "field bootstrapServers for for cluster could not be blank") String bootstrapServers; TruststoreConfig ssl; @@ -50,9 +54,9 @@ public static class Cluster { KsqldbServerAuth ksqldbServerAuth; KeystoreConfig ksqldbServerSsl; - List kafkaConnect; + List<@Valid ConnectCluster> kafkaConnect; - List serde; + List<@Valid SerdeConfig> serde; String defaultKeySerde; String defaultValueSerde; @@ -62,9 +66,9 @@ public static class Cluster { Long pollingThrottleRate; - List masking; + List<@Valid Masking> masking; - AuditProperties audit; + @Valid AuditProperties audit; } @Data @@ -92,7 +96,9 @@ public static class MetricsConfigData { @Builder(toBuilder = true) @ToString(exclude = {"password", "keystorePassword"}) public static class ConnectCluster { + @NotBlank String name; + @NotBlank String address; String username; String password; @@ -126,8 +132,11 @@ public static class KeystoreConfig { @Data public static class SerdeConfig { + @NotBlank String name; + @NotBlank String className; + @NotBlank String filePath; Map properties; String topicKeysPattern; @@ -143,6 +152,7 @@ public static class KsqldbServerAuth { @Data public static class Masking { + @NotNull Type type; List fields; String fieldsNamePattern; @@ -160,10 +170,12 @@ public enum Type { @NoArgsConstructor @AllArgsConstructor public static class AuditProperties { + @NotBlank String topic; Integer auditTopicsPartitions; Boolean topicAuditEnabled; Boolean consoleAuditEnabled; + @NotNull LogLevel level; Map auditTopicProperties; diff --git a/api/src/test/java/io/kafbat/ui/ConfigurationTests.java b/api/src/test/java/io/kafbat/ui/ConfigurationTests.java deleted file mode 100644 index 581bc3b75..000000000 --- a/api/src/test/java/io/kafbat/ui/ConfigurationTests.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.kafbat.ui; - -import static org.junit.jupiter.api.Assertions.assertThrows; - -import io.kafbat.ui.config.ClustersProperties; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.context.properties.bind.BindException; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.TestPropertySource; - -@SpringBootTest -//@EnableConfigurationProperties(ClustersProperties.class) -@TestPropertySource(properties = { - "kafka.clusters.0.name=", -}) -class ConfigurationTests { - - @Autowired - private ClustersProperties clustersProperties; - - @Test - void shouldFailWithotName() { - assertThrows(BindException.class, () -> clustersProperties.getClusters()); - } - -} From 76a83ea313959b8be1616c4e1787a1afc9685751 Mon Sep 17 00:00:00 2001 From: German Osin Date: Fri, 28 Feb 2025 16:53:10 +0100 Subject: [PATCH 3/3] fixed issues --- .../java/io/kafbat/ui/config/ClustersProperties.java | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/api/src/main/java/io/kafbat/ui/config/ClustersProperties.java b/api/src/main/java/io/kafbat/ui/config/ClustersProperties.java index c05a6dd6c..e73029c4f 100644 --- a/api/src/main/java/io/kafbat/ui/config/ClustersProperties.java +++ b/api/src/main/java/io/kafbat/ui/config/ClustersProperties.java @@ -4,7 +4,6 @@ import jakarta.annotation.PostConstruct; import jakarta.validation.Valid; import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import java.util.ArrayList; import java.util.HashMap; @@ -68,7 +67,7 @@ public static class Cluster { List<@Valid Masking> masking; - @Valid AuditProperties audit; + AuditProperties audit; } @Data @@ -134,9 +133,7 @@ public static class KeystoreConfig { public static class SerdeConfig { @NotBlank String name; - @NotBlank String className; - @NotBlank String filePath; Map properties; String topicKeysPattern; @@ -170,13 +167,11 @@ public enum Type { @NoArgsConstructor @AllArgsConstructor public static class AuditProperties { - @NotBlank String topic; Integer auditTopicsPartitions; Boolean topicAuditEnabled; Boolean consoleAuditEnabled; - @NotNull - LogLevel level; + LogLevel level = LogLevel.ALTER_ONLY; Map auditTopicProperties; public enum LogLevel {