Support “network” field of compatible clients config bans (#774)
This commit is contained in:
@@ -13,6 +13,8 @@ data class CompatibleVersionsRules(
|
|||||||
data class CompatibleVersionsRule(
|
data class CompatibleVersionsRule(
|
||||||
@param:JsonProperty("client")
|
@param:JsonProperty("client")
|
||||||
val client: String,
|
val client: String,
|
||||||
|
@param:JsonProperty("networks")
|
||||||
|
val networks: List<String>?,
|
||||||
@param:JsonProperty("blacklist")
|
@param:JsonProperty("blacklist")
|
||||||
val blacklist: List<String>?,
|
val blacklist: List<String>?,
|
||||||
@param:JsonProperty("whitelist")
|
@param:JsonProperty("whitelist")
|
||||||
|
|||||||
@@ -115,17 +115,21 @@ class VersionValidator(
|
|||||||
}
|
}
|
||||||
val type = upstream.getLabels().first().getOrDefault("client_type", "unknown")
|
val type = upstream.getLabels().first().getOrDefault("client_type", "unknown")
|
||||||
val version = upstream.getLabels().first().getOrDefault("client_version", "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) {
|
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)
|
return Mono.just(OK)
|
||||||
}
|
}
|
||||||
if (!rule.whitelist.isNullOrEmpty() && !rule.whitelist.contains(version)) {
|
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)
|
return Mono.just(UNAVAILABLE)
|
||||||
}
|
}
|
||||||
if (!rule.blacklist.isNullOrEmpty() && rule.blacklist.contains(version)) {
|
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(UNAVAILABLE)
|
||||||
}
|
}
|
||||||
return Mono.just(OK)
|
return Mono.just(OK)
|
||||||
|
|||||||
@@ -42,4 +42,44 @@ class CompatibleVersionsRulesTest {
|
|||||||
assertEquals("1.0.2", rules[1].whitelist!![0])
|
assertEquals("1.0.2", rules[1].whitelist!![0])
|
||||||
assertEquals("1.0.3", rules[1].whitelist!![1])
|
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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user