diff --git a/src/main/kotlin/io/emeraldpay/dshackle/config/hot/CompatibleVersionsRules.kt b/src/main/kotlin/io/emeraldpay/dshackle/config/hot/CompatibleVersionsRules.kt index 10244f6f..3f5683c7 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/config/hot/CompatibleVersionsRules.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/config/hot/CompatibleVersionsRules.kt @@ -13,6 +13,8 @@ data class CompatibleVersionsRules( data class CompatibleVersionsRule( @param:JsonProperty("client") val client: String, + @param:JsonProperty("networks") + val networks: List?, @param:JsonProperty("blacklist") val blacklist: List?, @param:JsonProperty("whitelist") diff --git a/src/main/kotlin/io/emeraldpay/dshackle/upstream/UpstreamValidator.kt b/src/main/kotlin/io/emeraldpay/dshackle/upstream/UpstreamValidator.kt index 303b75b8..863ec57a 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/upstream/UpstreamValidator.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/upstream/UpstreamValidator.kt @@ -115,17 +115,21 @@ class VersionValidator( } val type = upstream.getLabels().first().getOrDefault("client_type", "unknown") val version = upstream.getLabels().first().getOrDefault("client_version", "unknown") - val rule = versionsConfig.get()!!.rules.find { it.client == type } + val chain = upstream.getChain() + val rule = versionsConfig.get()!!.rules.find { rule -> + rule.client == type && + (rule.networks.isNullOrEmpty() || rule.networks.any { chain.shortNames.contains(it) }) + } if (rule == null) { - log.info("No rules for client type $type, skipping validation for upstream ${upstream.getId()}") + log.info("No rules for client type $type on chain ${chain.chainCode}, skipping validation for upstream ${upstream.getId()}") return Mono.just(OK) } if (!rule.whitelist.isNullOrEmpty() && !rule.whitelist.contains(version)) { - log.warn("Version $version is in not in defined whitelist for $type, please change client version for upstream ${upstream.getId()}") + log.warn("Version $version is in not in defined whitelist for $type on chain ${chain.chainCode}, please change client version for upstream ${upstream.getId()}") return Mono.just(UNAVAILABLE) } if (!rule.blacklist.isNullOrEmpty() && rule.blacklist.contains(version)) { - log.warn("Version $version is in defined blacklist for $type, please change client version for upstream ${upstream.getId()}") + log.warn("Version $version is in defined blacklist for $type on chain ${chain.chainCode}, please change client version for upstream ${upstream.getId()}") return Mono.just(UNAVAILABLE) } return Mono.just(OK) diff --git a/src/test/kotlin/io/emeraldpay/dshackle/config/hot/CompatibleVersionsRulesTest.kt b/src/test/kotlin/io/emeraldpay/dshackle/config/hot/CompatibleVersionsRulesTest.kt index 4af6e4e5..31ee97c1 100644 --- a/src/test/kotlin/io/emeraldpay/dshackle/config/hot/CompatibleVersionsRulesTest.kt +++ b/src/test/kotlin/io/emeraldpay/dshackle/config/hot/CompatibleVersionsRulesTest.kt @@ -10,17 +10,17 @@ class CompatibleVersionsRulesTest { val raw = """ rules: - client: "client1" - blacklist: + blacklist: - 1.0.0 - 1.0.1 - whitelist: + whitelist: - 1.0.2 - 1.0.3 - client: "client2" - blacklist: + blacklist: - 1.0.0 - 1.0.1 - whitelist: + whitelist: - 1.0.2 - 1.0.3 """.trimIndent() @@ -42,4 +42,44 @@ class CompatibleVersionsRulesTest { assertEquals("1.0.2", rules[1].whitelist!![0]) assertEquals("1.0.3", rules[1].whitelist!![1]) } + + @Test + fun `test parsing with networks`() { + val raw = """ + rules: + - client: "erigon" + networks: + - ethereum + blacklist: + - v2.40.0 + - 3.1.0 + - client: "reth" + blacklist: + - v1.4.0 + - v1.4.1 + - client: "reth" + networks: + - bsc + blacklist: + - "reth/v1.6.0-2a4968e/x86_64-unknown-linux-gnu" + """.trimIndent() + + val rules = Global.yamlMapper.readValue(raw, CompatibleVersionsRules::class.java)!!.rules + assertEquals(3, rules.size) + + // First rule: erigon with networks + assertEquals("erigon", rules[0].client) + assertEquals(listOf("ethereum"), rules[0].networks) + assertEquals(listOf("v2.40.0", "3.1.0"), rules[0].blacklist) + + // Second rule: reth without networks (applies to all) + assertEquals("reth", rules[1].client) + assertEquals(null, rules[1].networks) + assertEquals(listOf("v1.4.0", "v1.4.1"), rules[1].blacklist) + + // Third rule: reth with networks (bsc only) + assertEquals("reth", rules[2].client) + assertEquals(listOf("bsc"), rules[2].networks) + assertEquals(listOf("reth/v1.6.0-2a4968e/x86_64-unknown-linux-gnu"), rules[2].blacklist) + } }