From ff7b5387b432cacf6c3fe722f55a1fc24c10ac8a Mon Sep 17 00:00:00 2001 From: Laszlo Bende Date: Mon, 7 Oct 2024 08:46:18 +0100 Subject: [PATCH] topology changes for migrating from legacy Signed-off-by: Laszlo Bende --- .gitignore | 2 +- .../com/mwam/kafkakewl/domain/Matcher.kt | 29 +++++++++++++ .../com/mwam/kafkakewl/domain/Topology.kt | 41 +++++++++++++++++-- 3 files changed, 68 insertions(+), 4 deletions(-) create mode 100644 kafkakewl-domain/src/main/kotlin/com/mwam/kafkakewl/domain/Matcher.kt diff --git a/.gitignore b/.gitignore index 109a48e..e257b19 100644 --- a/.gitignore +++ b/.gitignore @@ -53,7 +53,7 @@ node_modules/ local.properties buildSrcTmp/ distTmp/ -outTmp/ +outTmp /test.output /kotlin-native/dist kotlin-ide/ diff --git a/kafkakewl-domain/src/main/kotlin/com/mwam/kafkakewl/domain/Matcher.kt b/kafkakewl-domain/src/main/kotlin/com/mwam/kafkakewl/domain/Matcher.kt new file mode 100644 index 0000000..81f7c71 --- /dev/null +++ b/kafkakewl-domain/src/main/kotlin/com/mwam/kafkakewl/domain/Matcher.kt @@ -0,0 +1,29 @@ +package com.mwam.kafkakewl.domain + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** Base interface for the different kind of matchers that can match a fully qualified topic or application id. */ +@Serializable +sealed interface Matcher +object Matchers { + /** It matches any topic or application id */ + @Serializable + @SerialName("any") + object Any: Matcher + + /** It matches exactly the specified topic or application id */ + @Serializable + @SerialName("exact") + data class Exact(val value: String): Matcher + + /** It matches exactly the specified topic or application id */ + @Serializable + @SerialName("regex") + data class Regex(val value: String): Matcher + + /** It matches the topic or application ids in the specified namespace */ + @Serializable + @SerialName("namespace") + data class Namespace(val value: String): Matcher +} diff --git a/kafkakewl-domain/src/main/kotlin/com/mwam/kafkakewl/domain/Topology.kt b/kafkakewl-domain/src/main/kotlin/com/mwam/kafkakewl/domain/Topology.kt index 00aa733..52ee054 100644 --- a/kafkakewl-domain/src/main/kotlin/com/mwam/kafkakewl/domain/Topology.kt +++ b/kafkakewl-domain/src/main/kotlin/com/mwam/kafkakewl/domain/Topology.kt @@ -13,6 +13,10 @@ import kotlinx.serialization.Serializable @Serializable value class TopicId(override val value: String) : StringValue +@JvmInline +@Serializable +value class TopicConfigDefaultsId(override val value: String) : StringValue + @JvmInline @Serializable value class TopicConfigKey(override val value: String) : StringValue @@ -20,9 +24,20 @@ value class TopicConfigKey(override val value: String) : StringValue @JvmInline @Serializable value class TopicConfigValue(override val value: String) : StringValue + @Serializable data class Topic( - val name: String, val partitions: Int = 1, val config: Map = emptyMap() + val name: String, + val partitions: Int = 1, + val replicationFactor: Short? = null, + val configDefaults: TopicConfigDefaultsId? = null, + val config: Map = emptyMap(), + val unManaged: Boolean = false, + val description: String? = null, + val allowConsumeFor: List = emptyList(), + val allowProduceFor: List = emptyList(), + val tags: List = emptyList(), // only for migrating existing topologies + val labels: Map = emptyMap() // only for migrating existing topologies ) { /** The topic's fully qualified id is the same as the name. */ @@ -37,6 +52,7 @@ value class ApplicationLocalId(override val value: String) : StringValue @JvmInline @Serializable value class UserId(override val value: String) : StringValue + @Serializable data class Application( val id: ApplicationLocalId, val user: UserId @@ -49,6 +65,7 @@ data class Application( @JvmInline @Serializable value class TopicAliasLocalId(override val value: String) : StringValue + @Serializable data class TopicAlias( val id: TopicAliasLocalId, @@ -62,6 +79,7 @@ data class TopicAlias( @JvmInline @Serializable value class ApplicationAliasLocalId(override val value: String) : StringValue + @Serializable data class ApplicationAlias( val id: ApplicationAliasLocalId, @@ -71,7 +89,8 @@ data class ApplicationAlias( @Serializable data class Aliases( - val topics: List = emptyList(), val applications: List = emptyList() + val topics: List = emptyList(), + val applications: List = emptyList() ) /** ApplicationFlexId can be an application alias or application id, local or fully qualified. @@ -85,10 +104,13 @@ value class ApplicationFlexId(override val value: String) : StringValue @JvmInline @Serializable value class TopicFlexId(override val value: String) : StringValue + @Serializable data class ProducedTopic(val topic: TopicFlexId) + @Serializable data class ConsumedTopic(val topic: TopicFlexId) + @Serializable data class Relationship( val application: ApplicationFlexId, @@ -99,21 +121,34 @@ data class Relationship( @JvmInline @Serializable value class TopologyId(override val value: String) : StringValue + @JvmInline @Serializable value class Namespace(override val value: String) : StringValue + @JvmInline @Serializable value class Developer(override val value: String) : StringValue + +@Serializable +enum class DevelopersAccess { + Full, + TopicReadOnly +} + @Serializable data class Topology( val id: TopologyId, val namespace: Namespace, + val description: String? = null, val developers: List = emptyList(), + val developersAccess: DevelopersAccess = DevelopersAccess.TopicReadOnly, val topics: List = emptyList(), val applications: List = emptyList(), val aliases: Aliases = Aliases(), - val relationships: List = emptyList() + val relationships: List = emptyList(), + val tags: List = emptyList(), // only for migrating existing topologies + val labels: Map = emptyMap() // only for migrating existing topologies ) typealias Topologies = Map