From ad0d0b2b57549e8d93a9d061c8dd83714a852784 Mon Sep 17 00:00:00 2001 From: a10zn8 Date: Fri, 10 Feb 2023 20:22:35 +0400 Subject: [PATCH] refactoring --- .../dshackle/config/AccessLogReader.kt | 8 +-- .../dshackle/config/AuthConfigReader.kt | 6 +- .../dshackle/config/CacheConfigReader.kt | 8 +-- .../dshackle/config/ChainsConfig.kt | 24 +++++++- .../dshackle/config/ChainsConfigReader.kt | 55 ++++++++++--------- .../config/CompressionConfigReader.kt | 8 +-- .../dshackle/config/HealthConfigReader.kt | 8 +-- .../dshackle/config/MainConfigReader.kt | 8 +-- .../dshackle/config/MonitoringConfigReader.kt | 14 +---- .../dshackle/config/ProxyConfigReader.kt | 9 +-- .../dshackle/config/SignatureConfigReader.kt | 14 +---- .../dshackle/config/TokensConfigReader.kt | 8 +-- .../dshackle/config/UpstreamsConfigReader.kt | 10 +--- .../dshackle/config/YamlConfigReader.kt | 8 ++- src/main/resources/chains.yaml | 16 ++++++ .../config/YamlConfigReaderSpec.groovy | 8 ++- src/test/resources/configs/chains-basic.yaml | 15 +++-- 17 files changed, 107 insertions(+), 120 deletions(-) create mode 100644 src/main/resources/chains.yaml diff --git a/src/main/kotlin/io/emeraldpay/dshackle/config/AccessLogReader.kt b/src/main/kotlin/io/emeraldpay/dshackle/config/AccessLogReader.kt index bdc0e3b9..c4daab89 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/config/AccessLogReader.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/config/AccessLogReader.kt @@ -1,14 +1,8 @@ package io.emeraldpay.dshackle.config -import org.slf4j.LoggerFactory import org.yaml.snakeyaml.nodes.MappingNode -class AccessLogReader : YamlConfigReader(), ConfigReader { - - companion object { - private val log = LoggerFactory.getLogger(AccessLogReader::class.java) - } - +class AccessLogReader : YamlConfigReader() { override fun read(input: MappingNode?): AccessLogConfig { return getMapping(input, "accessLog")?.let { node -> val enabled = getValueAsBool(node, "enabled") ?: false diff --git a/src/main/kotlin/io/emeraldpay/dshackle/config/AuthConfigReader.kt b/src/main/kotlin/io/emeraldpay/dshackle/config/AuthConfigReader.kt index 18efced6..272da506 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/config/AuthConfigReader.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/config/AuthConfigReader.kt @@ -19,7 +19,7 @@ package io.emeraldpay.dshackle.config import org.slf4j.LoggerFactory import org.yaml.snakeyaml.nodes.MappingNode -class AuthConfigReader : YamlConfigReader() { +class AuthConfigReader : YamlConfigReader() { companion object { private val log = LoggerFactory.getLogger(AuthConfigReader::class.java) @@ -82,4 +82,8 @@ class AuthConfigReader : YamlConfigReader() { auth } } + + override fun read(input: MappingNode?): AuthConfig? { + return null + } } diff --git a/src/main/kotlin/io/emeraldpay/dshackle/config/CacheConfigReader.kt b/src/main/kotlin/io/emeraldpay/dshackle/config/CacheConfigReader.kt index 1f779231..2cb8a772 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/config/CacheConfigReader.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/config/CacheConfigReader.kt @@ -17,19 +17,13 @@ package io.emeraldpay.dshackle.config import org.slf4j.LoggerFactory import org.yaml.snakeyaml.nodes.MappingNode -import java.io.InputStream -class CacheConfigReader : YamlConfigReader(), ConfigReader { +class CacheConfigReader : YamlConfigReader() { companion object { private val log = LoggerFactory.getLogger(CacheConfigReader::class.java) } - fun read(input: InputStream): CacheConfig? { - val configNode = readNode(input) - return read(configNode) - } - override fun read(input: MappingNode?): CacheConfig? { return getMapping(input, "cache")?.let { node -> val config = CacheConfig() diff --git a/src/main/kotlin/io/emeraldpay/dshackle/config/ChainsConfig.kt b/src/main/kotlin/io/emeraldpay/dshackle/config/ChainsConfig.kt index 6872ed9c..6565e6d8 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/config/ChainsConfig.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/config/ChainsConfig.kt @@ -1,11 +1,19 @@ package io.emeraldpay.dshackle.config import io.emeraldpay.dshackle.Chain +import java.lang.IllegalStateException -class ChainsConfig(var chains: Map, val currentDefault: ChainConfig) { +class ChainsConfig(private val chains: Map?, val currentDefault: RawChainConfig?) { companion object { @JvmStatic - fun default(): ChainsConfig = ChainsConfig(emptyMap(), ChainConfig.default()) + fun default(): ChainsConfig = ChainsConfig(emptyMap(), RawChainConfig.default()) + } + + data class RawChainConfig(val syncingLagSize: Int?, val laggingLagSize: Int?) { + companion object { + @JvmStatic + fun default() = RawChainConfig(6, 1) + } } data class ChainConfig(val syncingLagSize: Int, val laggingLagSize: Int) { @@ -15,5 +23,15 @@ class ChainsConfig(var chains: Map, val currentDefault: Chai } } - fun resolve(chain: Chain) = chains[chain] ?: currentDefault + fun resolve(chain: Chain): ChainConfig { + val default = currentDefault ?: panic() + val raw = chains?.get(chain) ?: default + + return ChainConfig( + laggingLagSize = raw.laggingLagSize ?: default.laggingLagSize ?: panic(), + syncingLagSize = raw.syncingLagSize ?: default.syncingLagSize ?: panic(), + ) + } + + fun panic(): Nothing = throw IllegalStateException("Chains settings state is illegal - default config is null") } diff --git a/src/main/kotlin/io/emeraldpay/dshackle/config/ChainsConfigReader.kt b/src/main/kotlin/io/emeraldpay/dshackle/config/ChainsConfigReader.kt index db3a08c0..ca41a618 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/config/ChainsConfigReader.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/config/ChainsConfigReader.kt @@ -3,43 +3,48 @@ package io.emeraldpay.dshackle.config import io.emeraldpay.dshackle.Global import org.yaml.snakeyaml.nodes.CollectionNode import org.yaml.snakeyaml.nodes.MappingNode -import java.io.InputStream -class ChainsConfigReader : YamlConfigReader(), ConfigReader { - - fun read(input: InputStream): ChainsConfig { - val configNode = readNode(input) - return read(configNode) - } +class ChainsConfigReader : YamlConfigReader() { override fun read(input: MappingNode?): ChainsConfig { - val chains = getList(input, "chains")?.let { - readChains(it) - } + return getMapping(input, "chain-settings")?.let { - if (chains == null) { - return ChainsConfig.default() - } else { + val chains = getList(it, "chains")?.let { + readChains(it) + } - val default = chains.firstOrNull { it.first == "default" }?.second ?: ChainsConfig.ChainConfig.default() + val default = getMapping(it, "default")?.let { + readChain(it) + } return ChainsConfig( - chains.filter { it.first != "default" } - .map { Global.chainById(it.first) to it.second } - .associateBy({ it.first }, { it.second }), + chains + ?.map { Global.chainById(it.first) to it.second } + ?.associateBy({ it.first }, { it.second }) ?: emptyMap(), default ) + } ?: ChainsConfig.default() + } + + private fun readChain(node: MappingNode): ChainsConfig.RawChainConfig? { + return getMapping(node, "lags")?.let { + return ChainsConfig.RawChainConfig( + getValueAsInt(it, "syncing"), + getValueAsInt(it, "lagging") + ) } } - private fun readChains(node: CollectionNode): List> { - return node.value.map { - val key = getValueAsString(it, "name") ?: throw IllegalArgumentException() - val value = ChainsConfig.ChainConfig( - getValueAsInt(it, "syncing-size") ?: throw IllegalArgumentException(), - getValueAsInt(it, "lagging-size") ?: throw IllegalArgumentException() - ) - key to value + private fun readChains(node: CollectionNode): List> { + return node.value.mapNotNull { + val key = getValueAsString(it, "name") + ?: throw InvalidConfigYamlException(filename, it.startMark, "chain name required") + val value = readChain(it) + if (value != null) { + return@mapNotNull key to value + } else { + return@mapNotNull null + } } } } diff --git a/src/main/kotlin/io/emeraldpay/dshackle/config/CompressionConfigReader.kt b/src/main/kotlin/io/emeraldpay/dshackle/config/CompressionConfigReader.kt index 563a5661..51f08c7b 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/config/CompressionConfigReader.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/config/CompressionConfigReader.kt @@ -1,14 +1,8 @@ package io.emeraldpay.dshackle.config import org.yaml.snakeyaml.nodes.MappingNode -import java.io.InputStream - -class CompressionConfigReader : YamlConfigReader(), ConfigReader { - fun read(input: InputStream): CompressionConfig? { - val configNode = readNode(input) - return read(configNode) - } +class CompressionConfigReader : YamlConfigReader() { override fun read(input: MappingNode?): CompressionConfig { val config = CompressionConfig() getMapping(input, "compression")?.let { node -> diff --git a/src/main/kotlin/io/emeraldpay/dshackle/config/HealthConfigReader.kt b/src/main/kotlin/io/emeraldpay/dshackle/config/HealthConfigReader.kt index fb6a23f7..433005bc 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/config/HealthConfigReader.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/config/HealthConfigReader.kt @@ -20,19 +20,13 @@ import io.emeraldpay.dshackle.Global import org.slf4j.LoggerFactory import org.yaml.snakeyaml.nodes.CollectionNode import org.yaml.snakeyaml.nodes.MappingNode -import java.io.InputStream -class HealthConfigReader : YamlConfigReader(), ConfigReader { +class HealthConfigReader : YamlConfigReader() { companion object { private val log = LoggerFactory.getLogger(HealthConfigReader::class.java) } - fun read(input: InputStream): HealthConfig { - val configNode = readNode(input) - return read(configNode) - } - override fun read(input: MappingNode?): HealthConfig { return readInternal(getMapping(input, "health")) } diff --git a/src/main/kotlin/io/emeraldpay/dshackle/config/MainConfigReader.kt b/src/main/kotlin/io/emeraldpay/dshackle/config/MainConfigReader.kt index 66d5ceab..aa11af2d 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/config/MainConfigReader.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/config/MainConfigReader.kt @@ -18,11 +18,10 @@ package io.emeraldpay.dshackle.config import io.emeraldpay.dshackle.FileResolver import org.slf4j.LoggerFactory import org.yaml.snakeyaml.nodes.MappingNode -import java.io.InputStream class MainConfigReader( fileResolver: FileResolver -) : YamlConfigReader(), ConfigReader { +) : YamlConfigReader() { companion object { private val log = LoggerFactory.getLogger(MainConfigReader::class.java) @@ -40,11 +39,6 @@ class MainConfigReader( private val compressionConfigReader = CompressionConfigReader() private val chainsConfigReader = ChainsConfigReader() - fun read(input: InputStream): MainConfig? { - val configNode = readNode(input) - return read(configNode) - } - override fun read(input: MappingNode?): MainConfig? { val config = MainConfig() getValueAsString(input, "host")?.let { diff --git a/src/main/kotlin/io/emeraldpay/dshackle/config/MonitoringConfigReader.kt b/src/main/kotlin/io/emeraldpay/dshackle/config/MonitoringConfigReader.kt index db0a84f1..e4aed615 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/config/MonitoringConfigReader.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/config/MonitoringConfigReader.kt @@ -15,21 +15,9 @@ */ package io.emeraldpay.dshackle.config -import org.slf4j.LoggerFactory import org.yaml.snakeyaml.nodes.MappingNode -import java.io.InputStream - -class MonitoringConfigReader : YamlConfigReader(), ConfigReader { - - companion object { - private val log = LoggerFactory.getLogger(MonitoringConfigReader::class.java) - } - - fun read(input: InputStream): MonitoringConfig { - val configNode = readNode(input) - return read(configNode) - } +class MonitoringConfigReader : YamlConfigReader() { override fun read(input: MappingNode?): MonitoringConfig { return readInternal(getMapping(input, "monitoring")) } diff --git a/src/main/kotlin/io/emeraldpay/dshackle/config/ProxyConfigReader.kt b/src/main/kotlin/io/emeraldpay/dshackle/config/ProxyConfigReader.kt index 9c53dca1..b9ebbc31 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/config/ProxyConfigReader.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/config/ProxyConfigReader.kt @@ -21,25 +21,18 @@ import io.emeraldpay.dshackle.Global import org.apache.commons.lang3.StringUtils import org.slf4j.LoggerFactory import org.yaml.snakeyaml.nodes.MappingNode -import java.io.InputStream /** * Read YAML config, part related to Proxy configuration */ -class ProxyConfigReader : YamlConfigReader(), ConfigReader { +class ProxyConfigReader : YamlConfigReader() { companion object { private val log = LoggerFactory.getLogger(ProxyConfigReader::class.java) } - private var filename = "dshackle.yaml" private val authConfigReader = AuthConfigReader() - fun read(input: InputStream): ProxyConfig? { - val configNode = readNode(input) - return read(configNode) - } - override fun read(input: MappingNode?): ProxyConfig? { return readInternal(getMapping(input, "proxy")) } diff --git a/src/main/kotlin/io/emeraldpay/dshackle/config/SignatureConfigReader.kt b/src/main/kotlin/io/emeraldpay/dshackle/config/SignatureConfigReader.kt index 8ea7ccf4..c40a59e1 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/config/SignatureConfigReader.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/config/SignatureConfigReader.kt @@ -1,21 +1,9 @@ package io.emeraldpay.dshackle.config import io.emeraldpay.dshackle.FileResolver -import org.slf4j.LoggerFactory import org.yaml.snakeyaml.nodes.MappingNode -import java.io.InputStream - -class SignatureConfigReader(val fileResolver: FileResolver) : YamlConfigReader(), ConfigReader { - - companion object { - private val log = LoggerFactory.getLogger(SignatureConfig::class.java) - } - - fun read(input: InputStream): SignatureConfig? { - val configNode = readNode(input) - return read(configNode) - } +class SignatureConfigReader(val fileResolver: FileResolver) : YamlConfigReader() { override fun read(input: MappingNode?): SignatureConfig? { return getMapping(input, "signed-response")?.let { node -> val config = SignatureConfig() diff --git a/src/main/kotlin/io/emeraldpay/dshackle/config/TokensConfigReader.kt b/src/main/kotlin/io/emeraldpay/dshackle/config/TokensConfigReader.kt index 85205277..733d09de 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/config/TokensConfigReader.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/config/TokensConfigReader.kt @@ -18,18 +18,12 @@ package io.emeraldpay.dshackle.config import io.emeraldpay.dshackle.Global import org.slf4j.LoggerFactory import org.yaml.snakeyaml.nodes.MappingNode -import java.io.InputStream import java.util.Locale -class TokensConfigReader : YamlConfigReader(), ConfigReader { +class TokensConfigReader : YamlConfigReader() { private val log = LoggerFactory.getLogger(TokensConfigReader::class.java) - fun read(input: InputStream): TokensConfig? { - val configNode = readNode(input) - return read(configNode) - } - override fun read(input: MappingNode?): TokensConfig? { val tokens = getList(input, "tokens")?.value?.map { node -> val token = TokensConfig.Token() diff --git a/src/main/kotlin/io/emeraldpay/dshackle/config/UpstreamsConfigReader.kt b/src/main/kotlin/io/emeraldpay/dshackle/config/UpstreamsConfigReader.kt index 3eaa9e60..9ede1a5b 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/config/UpstreamsConfigReader.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/config/UpstreamsConfigReader.kt @@ -20,31 +20,25 @@ import io.emeraldpay.dshackle.FileResolver import org.apache.commons.lang3.StringUtils import org.slf4j.LoggerFactory import org.yaml.snakeyaml.nodes.MappingNode -import java.io.InputStream import java.net.URI import java.time.Duration import java.util.Locale class UpstreamsConfigReader( private val fileResolver: FileResolver -) : YamlConfigReader(), ConfigReader { +) : YamlConfigReader() { private val log = LoggerFactory.getLogger(UpstreamsConfigReader::class.java) private val authConfigReader = AuthConfigReader() private val knownNodeIds: MutableSet = HashSet() - fun read(input: InputStream): UpstreamsConfig? { - val configNode = readNode(input) - return readInternal(configNode) - } - override fun read(input: MappingNode?): UpstreamsConfig? { return getMapping(input, "cluster")?.let { readInternal(it) } } - fun readInternal(input: MappingNode?): UpstreamsConfig? { + fun readInternal(input: MappingNode?): UpstreamsConfig { val config = UpstreamsConfig() getList(input, "defaults")?.value?.forEach { opts -> diff --git a/src/main/kotlin/io/emeraldpay/dshackle/config/YamlConfigReader.kt b/src/main/kotlin/io/emeraldpay/dshackle/config/YamlConfigReader.kt index aa256d60..9a277c0a 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/config/YamlConfigReader.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/config/YamlConfigReader.kt @@ -25,9 +25,15 @@ import java.io.InputStream import java.io.InputStreamReader import java.util.Locale -abstract class YamlConfigReader { +abstract class YamlConfigReader : ConfigReader { private val envVariables = EnvVariables() + val filename = "dshackle.yaml" + + fun read(input: InputStream): T? { + val configNode = readNode(input) + return read(configNode) + } fun readNode(input: String): MappingNode { return readNode(input.byteInputStream()) } diff --git a/src/main/resources/chains.yaml b/src/main/resources/chains.yaml new file mode 100644 index 00000000..ad84322a --- /dev/null +++ b/src/main/resources/chains.yaml @@ -0,0 +1,16 @@ +version: v1 + +chain-settings: + default: + lags: + syncing: 6 + lagging: 1 + chains: + - id: eth + lags: + syncing: 6 + lagging: 1 + - name: polygon + lags: + syncing: 20 + lagging: 10 diff --git a/src/test/groovy/io/emeraldpay/dshackle/config/YamlConfigReaderSpec.groovy b/src/test/groovy/io/emeraldpay/dshackle/config/YamlConfigReaderSpec.groovy index 8e7cd277..bb9d9b98 100644 --- a/src/test/groovy/io/emeraldpay/dshackle/config/YamlConfigReaderSpec.groovy +++ b/src/test/groovy/io/emeraldpay/dshackle/config/YamlConfigReaderSpec.groovy @@ -15,6 +15,7 @@ */ package io.emeraldpay.dshackle.config +import org.jetbrains.annotations.Nullable import org.yaml.snakeyaml.Yaml import org.yaml.snakeyaml.nodes.MappingNode import spock.lang.Specification @@ -41,5 +42,10 @@ class YamlConfigReaderSpec extends Specification { return new Yaml().compose(new StringReader("$key: $value")) as MappingNode } - class Impl extends YamlConfigReader {} + class Impl extends YamlConfigReader { + @Override + Object read(@Nullable MappingNode input) { + return null + } + } } diff --git a/src/test/resources/configs/chains-basic.yaml b/src/test/resources/configs/chains-basic.yaml index 27cf52de..606e552e 100644 --- a/src/test/resources/configs/chains-basic.yaml +++ b/src/test/resources/configs/chains-basic.yaml @@ -1,7 +1,12 @@ version: v1 -chains: - - name: eth - syncing-size: 10 - lagging-size: 5 - +chain-settings: + default: + lags: + syncing: 6 + lagging: 1 + chains: + - id: eth + lags: + syncing: 6 + lagging: 1