2 * Copyright (c) 2019 PANTHEON.tech, s.r.o. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.controller.cluster.datastore.config;
10 import static java.util.Objects.requireNonNull;
12 import com.typesafe.config.Config;
13 import com.typesafe.config.ConfigFactory;
14 import com.typesafe.config.ConfigObject;
16 import java.util.HashMap;
17 import java.util.List;
19 import java.util.stream.Collectors;
20 import org.opendaylight.controller.cluster.access.concepts.MemberName;
21 import org.opendaylight.controller.cluster.datastore.shardstrategy.ShardStrategyFactory;
22 import org.slf4j.Logger;
23 import org.slf4j.LoggerFactory;
25 abstract class AbstractModuleShardConfigProvider implements ModuleShardConfigProvider {
26 private static final Logger LOG = LoggerFactory.getLogger(AbstractModuleShardConfigProvider.class);
28 static final Config loadConfigFromPath(final String configPath) {
29 final File configFile = new File(configPath);
31 if (configFile.exists()) {
32 LOG.info("Config file exists - reading config from it");
33 config = ConfigFactory.parseFile(configFile);
35 LOG.warn("Reading Config from resource");
36 config = ConfigFactory.load(configPath);
41 static final void readModulesConfig(final Config modulesConfig,
42 final Map<String, ModuleConfig.Builder> moduleConfigMap, final Configuration configuration) {
43 for (final ConfigObject o : modulesConfig.getObjectList("modules")) {
44 final ConfigObjectWrapper wrapper = new ConfigObjectWrapper(o);
46 final String moduleName = wrapper.stringValue("name");
47 final ModuleConfig.Builder builder = moduleConfigMap.computeIfAbsent(moduleName, ModuleConfig::builder);
49 builder.nameSpace(wrapper.stringValue("namespace"));
50 builder.shardStrategy(ShardStrategyFactory.newShardStrategyInstance(moduleName,
51 wrapper.stringValue("shard-strategy"), configuration));
55 static final Map<String, ModuleConfig.Builder> readModuleShardsConfig(final Config moduleShardsConfig) {
56 final Map<String, ModuleConfig.Builder> moduleConfigMap = new HashMap<>();
57 for (final ConfigObject moduleShardConfigObject : moduleShardsConfig.getObjectList("module-shards")) {
58 final String moduleName = moduleShardConfigObject.get("name").unwrapped().toString();
59 final ModuleConfig.Builder builder = ModuleConfig.builder(moduleName);
61 for (final ConfigObject shard : moduleShardConfigObject.toConfig().getObjectList("shards")) {
62 final String shardName = shard.get("name").unwrapped().toString();
63 final List<MemberName> replicas = shard.toConfig().getStringList("replicas").stream()
64 .map(MemberName::forName).collect(Collectors.toList());
65 builder.shardConfig(shardName, replicas);
68 moduleConfigMap.put(moduleName, builder);
71 return moduleConfigMap;
74 private static final class ConfigObjectWrapper {
75 private final ConfigObject configObject;
77 ConfigObjectWrapper(final ConfigObject configObject) {
78 this.configObject = requireNonNull(configObject);
81 String stringValue(final String name) {
82 return configObject.get(name).unwrapped().toString();