import org.opendaylight.controller.cluster.access.concepts.MemberName;
import org.opendaylight.controller.cluster.datastore.identifiers.ShardIdentifier;
import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
+import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* Utils for encoding prefix shard name.
*/
-public class ClusterUtils {
+public final class ClusterUtils {
+ private static final Logger LOG = LoggerFactory.getLogger(ClusterUtils.class);
+
+ // id for the shard used to store prefix configuration
+ public static final String PREFIX_CONFIG_SHARD_ID = "prefix-configuration-shard";
+
+ public static final QName PREFIX_SHARDS_QNAME =
+ QName.create("urn:opendaylight:params:xml:ns:yang:controller:md:sal:clustering:prefix-shard-configuration",
+ "2017-01-10", "prefix-shards").intern();
+ public static final QName SHARD_LIST_QNAME =
+ QName.create(PREFIX_SHARDS_QNAME, "shard").intern();
+ public static final QName SHARD_PREFIX_QNAME =
+ QName.create(PREFIX_SHARDS_QNAME, "prefix").intern();
+ public static final QName SHARD_REPLICAS_QNAME =
+ QName.create(PREFIX_SHARDS_QNAME, "replicas").intern();
+ public static final QName SHARD_REPLICA_QNAME =
+ QName.create(PREFIX_SHARDS_QNAME, "replica").intern();
+
+ public static final YangInstanceIdentifier PREFIX_SHARDS_PATH =
+ YangInstanceIdentifier.of(PREFIX_SHARDS_QNAME).toOptimized();
+ public static final YangInstanceIdentifier SHARD_LIST_PATH =
+ PREFIX_SHARDS_PATH.node(SHARD_LIST_QNAME).toOptimized();
+
+ private ClusterUtils() {
+ }
public static ShardIdentifier getShardIdentifier(final MemberName memberName, final DOMDataTreeIdentifier prefix) {
- return ShardIdentifier
- .create(getCleanShardName(prefix.getRootIdentifier()), memberName, prefix.getDatastoreType().name());
+ final String type;
+ switch (prefix.getDatastoreType()) {
+ case OPERATIONAL:
+ type = "operational";
+ break;
+ case CONFIGURATION:
+ type = "config";
+ break;
+ default:
+ type = prefix.getDatastoreType().name();
+ LOG.warn("Unknown data store type {}", type);
+ }
+
+ return ShardIdentifier.create(getCleanShardName(prefix.getRootIdentifier()), memberName, type);
}
/**
* @return encoded name that doesn't contain characters that cannot be in actor path.
*/
public static String getCleanShardName(final YangInstanceIdentifier path) {
+ if (path.isEmpty()) {
+ return "default";
+ }
+
final StringBuilder builder = new StringBuilder();
// TODO need a better mapping that includes namespace, but we'll need to cleanup the string beforehand
+ // we have to fight both javax and akka url path restrictions..
path.getPathArguments().forEach(p -> {
builder.append(p.getNodeType().getLocalName());
+ if (p instanceof NodeIdentifierWithPredicates) {
+ builder.append("-key_");
+ ((NodeIdentifierWithPredicates) p).getKeyValues().forEach((key, value) -> {
+ builder.append(key.getLocalName());
+ builder.append(value);
+ builder.append("-");
+ });
+ builder.append("_");
+ }
builder.append("!");
});
return builder.toString();