2 * Copyright (c) 2015 Brocade Communications Systems, Inc. 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 com.typesafe.config.Config;
11 import com.typesafe.config.ConfigFactory;
12 import com.typesafe.config.ConfigObject;
14 import java.util.HashMap;
15 import java.util.List;
17 import java.util.stream.Collectors;
18 import org.opendaylight.controller.cluster.access.concepts.MemberName;
19 import org.opendaylight.controller.cluster.datastore.shardstrategy.ShardStrategyFactory;
20 import org.slf4j.Logger;
21 import org.slf4j.LoggerFactory;
24 * Implementation of ModuleShardConfigProvider that reads the module and shard configuration from files.
26 * @author Thomas Pantelis
28 public class FileModuleShardConfigProvider implements ModuleShardConfigProvider {
29 private static final Logger LOG = LoggerFactory.getLogger(FileModuleShardConfigProvider.class);
31 private final String moduleShardsConfigPath;
32 private final String modulesConfigPath;
34 public FileModuleShardConfigProvider(String moduleShardsConfigPath, String modulesConfigPath) {
35 this.moduleShardsConfigPath = moduleShardsConfigPath;
36 this.modulesConfigPath = modulesConfigPath;
40 public Map<String, ModuleConfig.Builder> retrieveModuleConfigs(Configuration configuration) {
41 File moduleShardsFile = new File("./configuration/initial/" + moduleShardsConfigPath);
42 File modulesFile = new File("./configuration/initial/" + modulesConfigPath);
44 Config moduleShardsConfig = null;
45 if (moduleShardsFile.exists()) {
46 LOG.info("module shards config file exists - reading config from it");
47 moduleShardsConfig = ConfigFactory.parseFile(moduleShardsFile);
49 LOG.warn("module shards configuration read from resource");
50 moduleShardsConfig = ConfigFactory.load(moduleShardsConfigPath);
53 Config modulesConfig = null;
54 if (modulesFile.exists()) {
55 LOG.info("modules config file exists - reading config from it");
56 modulesConfig = ConfigFactory.parseFile(modulesFile);
58 LOG.warn("modules configuration read from resource");
59 modulesConfig = ConfigFactory.load(modulesConfigPath);
62 Map<String, ModuleConfig.Builder> moduleConfigMap = readModuleShardsConfig(moduleShardsConfig);
63 readModulesConfig(modulesConfig, moduleConfigMap, configuration);
65 return moduleConfigMap;
68 private static void readModulesConfig(final Config modulesConfig, Map<String, ModuleConfig.Builder> moduleConfigMap,
69 Configuration configuration) {
70 List<? extends ConfigObject> modulesConfigObjectList = modulesConfig.getObjectList("modules");
72 for (ConfigObject o : modulesConfigObjectList) {
73 ConfigObjectWrapper wrapper = new ConfigObjectWrapper(o);
75 String moduleName = wrapper.stringValue("name");
76 ModuleConfig.Builder builder = moduleConfigMap.get(moduleName);
77 if (builder == null) {
78 builder = ModuleConfig.builder(moduleName);
79 moduleConfigMap.put(moduleName, builder);
82 builder.nameSpace(wrapper.stringValue("namespace"));
83 builder.shardStrategy(ShardStrategyFactory.newShardStrategyInstance(moduleName,
84 wrapper.stringValue("shard-strategy"), configuration));
88 private static Map<String, ModuleConfig.Builder> readModuleShardsConfig(final Config moduleShardsConfig) {
89 List<? extends ConfigObject> moduleShardsConfigObjectList =
90 moduleShardsConfig.getObjectList("module-shards");
92 Map<String, ModuleConfig.Builder> moduleConfigMap = new HashMap<>();
93 for (ConfigObject moduleShardConfigObject : moduleShardsConfigObjectList) {
94 String moduleName = moduleShardConfigObject.get("name").unwrapped().toString();
95 ModuleConfig.Builder builder = ModuleConfig.builder(moduleName);
97 List<? extends ConfigObject> shardsConfigObjectList =
98 moduleShardConfigObject.toConfig().getObjectList("shards");
100 for (ConfigObject shard : shardsConfigObjectList) {
101 String shardName = shard.get("name").unwrapped().toString();
102 List<MemberName> replicas = shard.toConfig().getStringList("replicas").stream()
103 .map(MemberName::forName).collect(Collectors.toList());
104 builder.shardConfig(shardName, replicas);
107 moduleConfigMap.put(moduleName, builder);
110 return moduleConfigMap;
113 private static class ConfigObjectWrapper {
115 private final ConfigObject configObject;
117 ConfigObjectWrapper(final ConfigObject configObject) {
118 this.configObject = configObject;
121 public String stringValue(final String name) {
122 return configObject.get(name).unwrapped().toString();