+
+ @Override
+ public boolean isShardConfigured(final String shardName) {
+ checkNotNullShardName(shardName);
+ return allShardNames.contains(shardName);
+ }
+
+ @Override
+ public void addMemberReplicaForShard(final String shardName, final MemberName newMemberName) {
+ checkNotNullShardName(shardName);
+ requireNonNull(newMemberName, "MemberName should not be null");
+
+ for (ModuleConfig moduleConfig: moduleConfigMap.values()) {
+ ShardConfig shardConfig = moduleConfig.getShardConfig(shardName);
+ if (shardConfig != null) {
+ Set<MemberName> replicas = new HashSet<>(shardConfig.getReplicas());
+ replicas.add(newMemberName);
+ updateModuleConfigMap(ModuleConfig.builder(moduleConfig).shardConfig(shardName, replicas).build());
+ return;
+ }
+ }
+ }
+
+ @Override
+ public void removeMemberReplicaForShard(final String shardName, final MemberName newMemberName) {
+ checkNotNullShardName(shardName);
+ requireNonNull(newMemberName, "MemberName should not be null");
+
+ for (ModuleConfig moduleConfig: moduleConfigMap.values()) {
+ ShardConfig shardConfig = moduleConfig.getShardConfig(shardName);
+ if (shardConfig != null) {
+ Set<MemberName> replicas = new HashSet<>(shardConfig.getReplicas());
+ replicas.remove(newMemberName);
+ updateModuleConfigMap(ModuleConfig.builder(moduleConfig).shardConfig(shardName, replicas).build());
+ return;
+ }
+ }
+ }
+
+ @Override
+ public ShardStrategy getStrategyForPrefix(final DOMDataTreeIdentifier prefix) {
+ requireNonNull(prefix, "Prefix cannot be null");
+ // FIXME using prefix tables like in mdsal will be better
+ Entry<DOMDataTreeIdentifier, PrefixShardConfiguration> bestMatchEntry = new SimpleEntry<>(
+ new DOMDataTreeIdentifier(prefix.getDatastoreType(), YangInstanceIdentifier.empty()), null);
+
+ for (Entry<DOMDataTreeIdentifier, PrefixShardConfiguration> entry : prefixConfigMap.entrySet()) {
+ if (entry.getKey().contains(prefix) && entry.getKey().getRootIdentifier().getPathArguments().size()
+ > bestMatchEntry.getKey().getRootIdentifier().getPathArguments().size()) {
+ bestMatchEntry = entry;
+ }
+ }
+
+ if (bestMatchEntry.getValue() == null) {
+ return null;
+ }
+ return new PrefixShardStrategy(ClusterUtils
+ .getCleanShardName(bestMatchEntry.getKey().getRootIdentifier()),
+ bestMatchEntry.getKey().getRootIdentifier());
+ }
+
+ private void updateModuleConfigMap(final ModuleConfig moduleConfig) {
+ final Map<String, ModuleConfig> newModuleConfigMap = new HashMap<>(moduleConfigMap);
+ newModuleConfigMap.put(moduleConfig.getName(), moduleConfig);
+ moduleConfigMap = ImmutableMap.copyOf(newModuleConfigMap);
+ }