Improve segmented journal actor metrics
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / datastore / config / AbstractModuleShardConfigProvider.java
1 /*
2  * Copyright (c) 2019 PANTHEON.tech, s.r.o. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.controller.cluster.datastore.config;
9
10 import static java.util.Objects.requireNonNull;
11
12 import com.typesafe.config.Config;
13 import com.typesafe.config.ConfigFactory;
14 import com.typesafe.config.ConfigObject;
15 import java.io.File;
16 import java.util.HashMap;
17 import java.util.List;
18 import java.util.Map;
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;
24
25 abstract class AbstractModuleShardConfigProvider implements ModuleShardConfigProvider {
26     private static final Logger LOG = LoggerFactory.getLogger(AbstractModuleShardConfigProvider.class);
27
28     static final Config loadConfigFromPath(final String configPath) {
29         final File configFile = new File(configPath);
30         Config config = null;
31         if (configFile.exists()) {
32             LOG.info("Config file exists - reading config from it");
33             config = ConfigFactory.parseFile(configFile);
34         } else {
35             LOG.warn("Reading Config from resource");
36             config = ConfigFactory.load(configPath);
37         }
38         return config;
39     }
40
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);
45
46             final String moduleName = wrapper.stringValue("name");
47             final ModuleConfig.Builder builder = moduleConfigMap.computeIfAbsent(moduleName, ModuleConfig::builder);
48
49             builder.nameSpace(wrapper.stringValue("namespace"));
50             builder.shardStrategy(ShardStrategyFactory.newShardStrategyInstance(moduleName,
51                     wrapper.stringValue("shard-strategy"), configuration));
52         }
53     }
54
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);
60
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);
66             }
67
68             moduleConfigMap.put(moduleName, builder);
69         }
70
71         return moduleConfigMap;
72     }
73
74     private static final class ConfigObjectWrapper {
75         private final ConfigObject configObject;
76
77         ConfigObjectWrapper(final ConfigObject configObject) {
78             this.configObject = requireNonNull(configObject);
79         }
80
81         String stringValue(final String name) {
82             return configObject.get(name).unwrapped().toString();
83         }
84     }
85 }