config merge

This commit is contained in:
a10zn8
2023-02-10 21:33:58 +04:00
parent ad0d0b2b57
commit 2809e87d33
10 changed files with 169 additions and 40 deletions

View File

@@ -3,7 +3,7 @@ package io.emeraldpay.dshackle.config
import io.emeraldpay.dshackle.Chain
import java.lang.IllegalStateException
class ChainsConfig(private val chains: Map<Chain, RawChainConfig>?, val currentDefault: RawChainConfig?) {
data class ChainsConfig(private val chains: Map<Chain, RawChainConfig>, val currentDefault: RawChainConfig?) {
companion object {
@JvmStatic
fun default(): ChainsConfig = ChainsConfig(emptyMap(), RawChainConfig.default())
@@ -25,7 +25,7 @@ class ChainsConfig(private val chains: Map<Chain, RawChainConfig>?, val currentD
fun resolve(chain: Chain): ChainConfig {
val default = currentDefault ?: panic()
val raw = chains?.get(chain) ?: default
val raw = chains[chain] ?: default
return ChainConfig(
laggingLagSize = raw.laggingLagSize ?: default.laggingLagSize ?: panic(),
@@ -33,5 +33,31 @@ class ChainsConfig(private val chains: Map<Chain, RawChainConfig>?, val currentD
)
}
fun patch(patch: ChainsConfig) = ChainsConfig(
merge(this.chains, patch.chains),
merge(this.currentDefault!!, patch.currentDefault)
)
private fun merge(
current: RawChainConfig,
patch: RawChainConfig?
) = RawChainConfig(
syncingLagSize = patch?.syncingLagSize ?: current.syncingLagSize,
laggingLagSize = patch?.laggingLagSize ?: current.laggingLagSize
)
private fun merge(
current: Map<Chain, RawChainConfig>,
patch: Map<Chain, RawChainConfig>
): Map<Chain, RawChainConfig> {
val currentMut = current.toMutableMap()
for (k in patch) {
currentMut.merge(k.key, k.value) { v1, v2 -> merge(v1, v2) }
}
return currentMut.toMap()
}
fun panic(): Nothing = throw IllegalStateException("Chains settings state is illegal - default config is null")
}

View File

@@ -3,10 +3,24 @@ 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<ChainsConfig>() {
private val defaultConfig = this::class.java.getResourceAsStream("/chains.yaml")!!
override fun read(input: MappingNode?): ChainsConfig {
val default = readInternal(defaultConfig)
val current = readInternal(input)
return default.patch(current)
}
fun readInternal(input: InputStream): ChainsConfig {
val configNode = readNode(input)
return readInternal(configNode)
}
fun readInternal(input: MappingNode?): ChainsConfig {
return getMapping(input, "chain-settings")?.let {
val chains = getList<MappingNode>(it, "chains")?.let {
@@ -37,8 +51,8 @@ class ChainsConfigReader : YamlConfigReader<ChainsConfig>() {
private fun readChains(node: CollectionNode<MappingNode>): List<Pair<String, ChainsConfig.RawChainConfig>> {
return node.value.mapNotNull {
val key = getValueAsString(it, "name")
?: throw InvalidConfigYamlException(filename, it.startMark, "chain name required")
val key = getValueAsString(it, "id")
?: throw InvalidConfigYamlException(filename, it.startMark, "chain id required")
val value = readChain(it)
if (value != null) {
return@mapNotNull key to value

View File

@@ -16,17 +16,12 @@
package io.emeraldpay.dshackle.config
import io.emeraldpay.dshackle.FileResolver
import org.slf4j.LoggerFactory
import org.yaml.snakeyaml.nodes.MappingNode
class MainConfigReader(
fileResolver: FileResolver
) : YamlConfigReader<MainConfig>() {
companion object {
private val log = LoggerFactory.getLogger(MainConfigReader::class.java)
}
private val authConfigReader = AuthConfigReader()
private val proxyConfigReader = ProxyConfigReader()
private val upstreamsConfigReader = UpstreamsConfigReader(fileResolver)
@@ -39,7 +34,7 @@ class MainConfigReader(
private val compressionConfigReader = CompressionConfigReader()
private val chainsConfigReader = ChainsConfigReader()
override fun read(input: MappingNode?): MainConfig? {
override fun read(input: MappingNode?): MainConfig {
val config = MainConfig()
getValueAsString(input, "host")?.let {
config.host = it

View File

@@ -20,6 +20,7 @@ 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
@@ -38,6 +39,10 @@ class UpstreamsConfigReader(
}
}
fun readInternal(input: InputStream): UpstreamsConfig? {
val configNode = readNode(input)
return readInternal(configNode)
}
fun readInternal(input: MappingNode?): UpstreamsConfig {
val config = UpstreamsConfig()
@@ -55,7 +60,7 @@ class UpstreamsConfigReader(
getValueAsString(input, "include")?.let { path ->
fileResolver.resolve(path).let { file ->
if (file.exists() && file.isFile && file.canRead()) {
read(file.inputStream())?.let {
readInternal(file.inputStream())?.let {
it.upstreams.forEach { upstream -> config.upstreams.add(upstream) }
}
} else {
@@ -67,7 +72,7 @@ class UpstreamsConfigReader(
getListOfString(input, "include")?.forEach { path ->
fileResolver.resolve(path).let { file ->
if (file.exists() && file.isFile && file.canRead()) {
read(file.inputStream())?.let {
readInternal(file.inputStream())?.let {
it.upstreams.forEach { upstream -> config.upstreams.add(upstream) }
}
} else {

View File

@@ -10,7 +10,7 @@ chain-settings:
lags:
syncing: 6
lagging: 1
- name: polygon
- id: polygon
lags:
syncing: 20
lagging: 10