config merge
This commit is contained in:
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -10,7 +10,7 @@ chain-settings:
|
||||
lags:
|
||||
syncing: 6
|
||||
lagging: 1
|
||||
- name: polygon
|
||||
- id: polygon
|
||||
lags:
|
||||
syncing: 20
|
||||
lagging: 10
|
||||
|
||||
Reference in New Issue
Block a user