2 * Copyright (c) 2014 Cisco 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
9 package org.opendaylight.controller.cluster.datastore.config;
11 import com.google.common.base.Optional;
12 import com.google.common.base.Preconditions;
13 import com.google.common.collect.ImmutableList;
14 import com.google.common.collect.ImmutableList.Builder;
15 import com.google.common.collect.ImmutableListMultimap;
16 import com.google.common.collect.ImmutableMap;
17 import com.google.common.collect.ImmutableSet;
18 import com.google.common.collect.ListMultimap;
19 import com.typesafe.config.Config;
20 import com.typesafe.config.ConfigFactory;
21 import com.typesafe.config.ConfigObject;
23 import java.util.ArrayList;
24 import java.util.Collection;
25 import java.util.Collections;
26 import java.util.HashMap;
27 import java.util.HashSet;
28 import java.util.List;
31 import org.opendaylight.controller.cluster.datastore.DistributedDataStore;
32 import org.opendaylight.controller.cluster.datastore.shardstrategy.DefaultShardStrategy;
33 import org.opendaylight.controller.cluster.datastore.shardstrategy.ModuleShardStrategy;
34 import org.opendaylight.controller.cluster.datastore.shardstrategy.ShardStrategy;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
38 public class ConfigurationImpl implements Configuration {
40 private final List<ModuleShard> moduleShards;
42 private final List<Module> modules;
44 private static final Logger
45 LOG = LoggerFactory.getLogger(DistributedDataStore.class);
47 // Look up maps to speed things up
49 // key = memberName, value = list of shardNames
50 private final Map<String, List<String>> memberShardNames = new HashMap<>();
52 // key = shardName, value = list of replicaNames (replicaNames are the same as memberNames)
53 private final Map<String, List<String>> shardReplicaNames = new HashMap<>();
55 private final ListMultimap<String, String> moduleNameToShardName;
56 private final Map<String, ShardStrategy> moduleNameToStrategy;
57 private final Map<String, String> namespaceToModuleName;
58 private final Set<String> allShardNames;
60 public ConfigurationImpl(final String moduleShardsConfigPath,
62 final String modulesConfigPath){
64 Preconditions.checkNotNull(moduleShardsConfigPath, "moduleShardsConfigPath should not be null");
65 Preconditions.checkNotNull(modulesConfigPath, "modulesConfigPath should not be null");
68 File moduleShardsFile = new File("./configuration/initial/" + moduleShardsConfigPath);
69 File modulesFile = new File("./configuration/initial/" + modulesConfigPath);
71 Config moduleShardsConfig = null;
72 if(moduleShardsFile.exists()) {
73 LOG.info("module shards config file exists - reading config from it");
74 moduleShardsConfig = ConfigFactory.parseFile(moduleShardsFile);
76 LOG.warn("module shards configuration read from resource");
77 moduleShardsConfig = ConfigFactory.load(moduleShardsConfigPath);
80 Config modulesConfig = null;
81 if(modulesFile.exists()) {
82 LOG.info("modules config file exists - reading config from it");
83 modulesConfig = ConfigFactory.parseFile(modulesFile);
85 LOG.warn("modules configuration read from resource");
86 modulesConfig = ConfigFactory.load(modulesConfigPath);
89 this.moduleShards = readModuleShards(moduleShardsConfig);
90 this.modules = readModules(modulesConfig);
92 this.allShardNames = createAllShardNames(moduleShards);
93 this.moduleNameToShardName = createModuleNameToShardName(moduleShards);
94 this.moduleNameToStrategy = createModuleNameToStrategy(modules);
95 this.namespaceToModuleName = createNamespaceToModuleName(modules);
98 private static Set<String> createAllShardNames(Iterable<ModuleShard> moduleShards) {
99 final com.google.common.collect.ImmutableSet.Builder<String> b = ImmutableSet.builder();
100 for(ModuleShard ms : moduleShards){
101 for(Shard s : ms.getShards()) {
108 private static Map<String, ShardStrategy> createModuleNameToStrategy(Iterable<Module> modules) {
109 final com.google.common.collect.ImmutableMap.Builder<String, ShardStrategy> b = ImmutableMap.builder();
110 for (Module m : modules) {
111 b.put(m.getName(), m.getShardStrategy());
116 private static Map<String, String> createNamespaceToModuleName(Iterable<Module> modules) {
117 final com.google.common.collect.ImmutableMap.Builder<String, String> b = ImmutableMap.builder();
118 for (Module m : modules) {
119 b.put(m.getNameSpace(), m.getName());
124 private static ListMultimap<String, String> createModuleNameToShardName(Iterable<ModuleShard> moduleShards) {
125 final com.google.common.collect.ImmutableListMultimap.Builder<String, String> b = ImmutableListMultimap.builder();
127 for (ModuleShard m : moduleShards) {
128 for (Shard s : m.getShards()) {
129 b.put(m.getModuleName(), s.getName());
136 @Override public List<String> getMemberShardNames(final String memberName){
138 Preconditions.checkNotNull(memberName, "memberName should not be null");
140 if(memberShardNames.containsKey(memberName)){
141 return memberShardNames.get(memberName);
144 List<String> shards = new ArrayList<>();
145 for(ModuleShard ms : moduleShards){
146 for(Shard s : ms.getShards()){
147 for(String m : s.getReplicas()){
148 if(memberName.equals(m)){
149 shards.add(s.getName());
155 memberShardNames.put(memberName, shards);
162 public Optional<String> getModuleNameFromNameSpace(final String nameSpace) {
163 Preconditions.checkNotNull(nameSpace, "nameSpace should not be null");
164 return Optional.fromNullable(namespaceToModuleName.get(nameSpace));
168 public Map<String, ShardStrategy> getModuleNameToShardStrategyMap() {
169 return moduleNameToStrategy;
173 public List<String> getShardNamesFromModuleName(final String moduleName) {
174 Preconditions.checkNotNull(moduleName, "moduleName should not be null");
175 return moduleNameToShardName.get(moduleName);
178 @Override public List<String> getMembersFromShardName(final String shardName) {
180 Preconditions.checkNotNull(shardName, "shardName should not be null");
182 if(shardReplicaNames.containsKey(shardName)){
183 return shardReplicaNames.get(shardName);
186 for(ModuleShard ms : moduleShards){
187 for(Shard s : ms.getShards()) {
188 if(s.getName().equals(shardName)){
189 List<String> replicas = s.getReplicas();
190 shardReplicaNames.put(shardName, replicas);
195 shardReplicaNames.put(shardName, Collections.<String>emptyList());
196 return Collections.emptyList();
200 public Set<String> getAllShardNames() {
201 return allShardNames;
205 public Collection<String> getUniqueMemberNamesForAllShards() {
206 Set<String> allNames = new HashSet<>();
207 for(String shardName: allShardNames) {
208 allNames.addAll(getMembersFromShardName(shardName));
214 private List<Module> readModules(final Config modulesConfig) {
215 List<? extends ConfigObject> modulesConfigObjectList =
216 modulesConfig.getObjectList("modules");
218 final Builder<Module> b = ImmutableList.builder();
219 for(ConfigObject o : modulesConfigObjectList){
220 ConfigObjectWrapper w = new ConfigObjectWrapper(o);
221 b.add(new Module(w.stringValue("name"), w.stringValue(
222 "namespace"), w.stringValue("shard-strategy")));
228 private static List<ModuleShard> readModuleShards(final Config moduleShardsConfig) {
229 List<? extends ConfigObject> moduleShardsConfigObjectList =
230 moduleShardsConfig.getObjectList("module-shards");
232 final Builder<ModuleShard> b = ImmutableList.builder();
233 for(ConfigObject moduleShardConfigObject : moduleShardsConfigObjectList){
235 String moduleName = moduleShardConfigObject.get("name").unwrapped().toString();
237 List<? extends ConfigObject> shardsConfigObjectList =
238 moduleShardConfigObject.toConfig().getObjectList("shards");
240 List<Shard> shards = new ArrayList<>();
242 for(ConfigObject shard : shardsConfigObjectList){
243 String shardName = shard.get("name").unwrapped().toString();
244 List<String> replicas = shard.toConfig().getStringList("replicas");
245 shards.add(new Shard(shardName, replicas));
248 b.add(new ModuleShard(moduleName, shards));
254 private static class ModuleShard {
255 private final String moduleName;
256 private final List<Shard> shards;
258 public ModuleShard(final String moduleName, final List<Shard> shards) {
259 this.moduleName = moduleName;
260 this.shards = shards;
263 public String getModuleName() {
267 public List<Shard> getShards() {
272 private static class Shard {
273 private final String name;
274 private final List<String> replicas;
276 Shard(final String name, final List<String> replicas) {
278 this.replicas = replicas;
281 public String getName() {
285 public List<String> getReplicas() {
290 private class Module {
292 private final String name;
293 private final String nameSpace;
294 private final ShardStrategy shardStrategy;
296 Module(final String name, final String nameSpace, final String shardStrategy) {
298 this.nameSpace = nameSpace;
299 if(ModuleShardStrategy.NAME.equals(shardStrategy)){
300 this.shardStrategy = new ModuleShardStrategy(name, ConfigurationImpl.this);
302 this.shardStrategy = DefaultShardStrategy.getInstance();
306 public String getName() {
310 public String getNameSpace() {
314 public ShardStrategy getShardStrategy() {
315 return shardStrategy;
320 private static class ConfigObjectWrapper{
322 private final ConfigObject configObject;
324 ConfigObjectWrapper(final ConfigObject configObject){
325 this.configObject = configObject;
328 public String stringValue(final String name){
329 return configObject.get(name).unwrapped().toString();