Support “network” field of compatible clients config bans (#774)

This commit is contained in:
Anton
2026-01-15 12:25:29 +03:00
committed by GitHub
parent be77e4caeb
commit 236f560f2a
3 changed files with 54 additions and 8 deletions

View File

@@ -13,6 +13,8 @@ data class CompatibleVersionsRules(
data class CompatibleVersionsRule(
@param:JsonProperty("client")
val client: String,
@param:JsonProperty("networks")
val networks: List<String>?,
@param:JsonProperty("blacklist")
val blacklist: List<String>?,
@param:JsonProperty("whitelist")

View File

@@ -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)

View File

@@ -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)
}
}