X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatastore%2Futils%2FClusterUtils.java;h=dea8320d0a020a634bd6f8937035efe92a37445a;hp=dba17611300e56898094fb0cf5a8b1342f907da5;hb=2d60632f7cf63712e8357a3cf3fc40d83366e5e6;hpb=5370e8be094b802caa732efb4da5a035c53dc9c6 diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/utils/ClusterUtils.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/utils/ClusterUtils.java index dba1761130..dea8320d0a 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/utils/ClusterUtils.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/utils/ClusterUtils.java @@ -11,16 +11,56 @@ package org.opendaylight.controller.cluster.datastore.utils; 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); } /** @@ -31,10 +71,24 @@ public class ClusterUtils { * @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();