import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
import org.opendaylight.protocol.bgp.rib.impl.spi.RIBSupportContext;
import org.opendaylight.protocol.bgp.rib.impl.spi.RIBSupportContextRegistry;
+import org.opendaylight.protocol.bgp.rib.spi.IdentifierUtils;
import org.opendaylight.protocol.bgp.rib.spi.RibSupportUtils;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpReachNlri;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpUnreachNlri;
import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeIdentifier;
import org.opendaylight.protocol.bgp.rib.impl.spi.Codecs;
import org.opendaylight.protocol.bgp.rib.impl.spi.CodecsRegistry;
+import org.opendaylight.protocol.bgp.rib.spi.IdentifierUtils;
import org.opendaylight.protocol.bgp.rib.spi.RIBSupport;
import org.opendaylight.protocol.bgp.rib.spi.RibSupportUtils;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
import org.opendaylight.protocol.bgp.openconfig.spi.BGPConfigModuleTracker;
+import org.opendaylight.protocol.bgp.rib.spi.IdentifierUtils;
+import org.opendaylight.protocol.bgp.rib.spi.RouterIds;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.ApplicationRibId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerRole;
import org.opendaylight.protocol.bgp.rib.spi.BGPSessionListener;
import org.opendaylight.protocol.bgp.rib.spi.BGPTerminationReason;
import org.opendaylight.protocol.bgp.rib.spi.Peer;
+import org.opendaylight.protocol.bgp.rib.spi.RouterIds;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv4.prefixes.DestinationIpv4Builder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv4.prefixes.destination.ipv4.Ipv4Prefixes;
import com.google.common.primitives.UnsignedInteger;
import java.util.Collection;
import javax.annotation.Nonnull;
+import org.opendaylight.protocol.bgp.rib.spi.RouterIds;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.OriginatorId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpOrigin;
import org.opendaylight.yangtools.yang.common.QName;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import java.util.concurrent.TimeUnit;
-import org.opendaylight.protocol.bgp.rib.impl.spi.CacheDisconnectedPeers;
+import org.opendaylight.protocol.bgp.rib.spi.CacheDisconnectedPeers;
+import org.opendaylight.protocol.bgp.rib.spi.RouterIds;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerId;
import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
import org.opendaylight.protocol.bgp.rib.impl.spi.RIBSupportContext;
import org.opendaylight.protocol.bgp.rib.impl.spi.RIBSupportContextRegistry;
+import org.opendaylight.protocol.bgp.rib.spi.IdentifierUtils;
import org.opendaylight.protocol.bgp.rib.spi.RIBSupport;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.rib.Peer;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.rib.peer.AdjRibIn;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
+import org.opendaylight.protocol.bgp.rib.spi.ExportPolicyPeerTracker;
+import org.opendaylight.protocol.bgp.rib.spi.IdentifierUtils;
+import org.opendaylight.protocol.bgp.rib.spi.PeerExportGroup;
import org.opendaylight.protocol.bgp.rib.spi.RibSupportUtils;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerRole;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-/**
- * Tracks peers for adj-rib-out writeout.
- */
-final class ExportPolicyPeerTracker extends AbstractPeerRoleTracker {
- private static final Logger LOG = LoggerFactory.getLogger(ExportPolicyPeerTracker.class);
+final class ExportPolicyPeerTrackerImpl extends AbstractPeerRoleTracker implements ExportPolicyPeerTracker {
+ private static final Logger LOG = LoggerFactory.getLogger(ExportPolicyPeerTrackerImpl.class);
private static final Function<YangInstanceIdentifier, Entry<PeerId, YangInstanceIdentifier>> GENERATE_PEERID = new Function<YangInstanceIdentifier, Entry<PeerId, YangInstanceIdentifier>>() {
@Override
public Entry<PeerId, YangInstanceIdentifier> apply(final YangInstanceIdentifier input) {
private volatile Map<PeerRole, PeerExportGroup> groups = Collections.emptyMap();
private final PolicyDatabase policyDatabase;
- ExportPolicyPeerTracker(final PolicyDatabase policyDatabase) {
+ ExportPolicyPeerTrackerImpl(final PolicyDatabase policyDatabase) {
this.policyDatabase = Preconditions.checkNotNull(policyDatabase);
}
final AbstractExportPolicy policy = this.policyDatabase.exportPolicyForRole(e.getKey());
final Collection<Entry<PeerId, YangInstanceIdentifier>> peers = ImmutableList.copyOf(Collections2.transform(e.getValue(), GENERATE_PEERID));
- ret.put(e.getKey(), new PeerExportGroup(peers, allPeerRoles, policy));
+ ret.put(e.getKey(), new PeerExportGroupImpl(peers, allPeerRoles, policy));
}
return ret;
}
}
- PeerExportGroup getPeerGroup(final PeerRole role) {
+ @Override
+ public PeerExportGroup getPeerGroup(final PeerRole role) {
return this.groups.get(Preconditions.checkNotNull(role));
}
- void onTablesChanged(final PeerId peerId, final DataTreeCandidateNode node) {
+ @Override
+ public void onTablesChanged(final PeerId peerId, final DataTreeCandidateNode node) {
if (node.getDataAfter().isPresent()) {
final NodeIdentifierWithPredicates value = (NodeIdentifierWithPredicates) node.getDataAfter().get().getIdentifier();
final boolean added = this.peerTables.put(peerId, value);
}
}
- boolean isTableSupported(final PeerId peerId, final TablesKey tablesKey) {
+ @Override
+ public boolean isTableSupported(final PeerId peerId, final TablesKey tablesKey) {
return this.peerTables.get(peerId).contains(RibSupportUtils.toYangKey(SupportedTables.QNAME, tablesKey));
}
import com.google.common.base.Preconditions;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import org.opendaylight.protocol.bgp.rib.spi.IdentifierUtils;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerRole;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeIdentifier;
import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
-import org.opendaylight.protocol.bgp.rib.impl.spi.CacheDisconnectedPeers;
import org.opendaylight.protocol.bgp.rib.impl.spi.RIBSupportContextRegistry;
+import org.opendaylight.protocol.bgp.rib.spi.CacheDisconnectedPeers;
+import org.opendaylight.protocol.bgp.rib.spi.ExportPolicyPeerTracker;
+import org.opendaylight.protocol.bgp.rib.spi.IdentifierUtils;
+import org.opendaylight.protocol.bgp.rib.spi.PeerExportGroup;
import org.opendaylight.protocol.bgp.rib.spi.RIBSupport;
import org.opendaylight.protocol.bgp.rib.spi.RibSupportUtils;
+import org.opendaylight.protocol.bgp.rib.spi.RouterIds;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerRole;
this.ourAs = Preconditions.checkNotNull(ourAs);
this.ribSupport = registry.getRIBSupportContext(tablesKey).getRibSupport();
this.attributesIdentifier = this.ribSupport.routeAttributesIdentifier();
- this.peerPolicyTracker = new ExportPolicyPeerTracker(pd);
+ this.peerPolicyTracker = new ExportPolicyPeerTrackerImpl(pd);
this.cacheDisconnectedPeers = cacheDisconnectedPeers;
final DOMDataWriteTransaction tx = this.chain.newWriteOnlyTransaction();
import java.util.Collection;
import java.util.Map;
import java.util.Map.Entry;
+import org.opendaylight.protocol.bgp.rib.spi.PeerExportGroup;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerRole;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
-/**
- * A collection of peers sharing the same export policy.
- */
-final class PeerExportGroup {
+final class PeerExportGroupImpl implements PeerExportGroup {
private final Collection<Entry<PeerId, YangInstanceIdentifier>> peers;
private final Map<PeerId, PeerRole> peerRoles;
private final AbstractExportPolicy policy;
- PeerExportGroup(final Collection<Entry<PeerId, YangInstanceIdentifier>> peers, final Map<PeerId, PeerRole> peerRoles, final AbstractExportPolicy policy) {
+ PeerExportGroupImpl(final Collection<Entry<PeerId, YangInstanceIdentifier>> peers, final Map<PeerId, PeerRole> peerRoles, final AbstractExportPolicy policy) {
this.peers = Preconditions.checkNotNull(peers);
this.peerRoles = Preconditions.checkNotNull(peerRoles);
this.policy = Preconditions.checkNotNull(policy);
}
- ContainerNode effectiveAttributes(final PeerId sourcePeerId, final ContainerNode attributes) {
+ @Override
+ public ContainerNode effectiveAttributes(final PeerId sourcePeerId, final ContainerNode attributes) {
final PeerRole peerRole = peerRoles.get(sourcePeerId);
return attributes == null || peerRole == null ? null : policy.effectiveAttributes(peerRole, attributes);
}
- Collection<Entry<PeerId, YangInstanceIdentifier>> getPeers() {
+ @Override
+ public Collection<Entry<PeerId, YangInstanceIdentifier>> getPeers() {
return peers;
}
}
\ No newline at end of file
import org.opendaylight.protocol.bgp.openconfig.spi.BGPOpenConfigProvider;
import org.opendaylight.protocol.bgp.rib.DefaultRibReference;
import org.opendaylight.protocol.bgp.rib.impl.spi.BGPDispatcher;
-import org.opendaylight.protocol.bgp.rib.impl.spi.CacheDisconnectedPeers;
import org.opendaylight.protocol.bgp.rib.impl.spi.CodecsRegistry;
import org.opendaylight.protocol.bgp.rib.impl.spi.RIB;
import org.opendaylight.protocol.bgp.rib.impl.spi.RIBSupportContextRegistry;
+import org.opendaylight.protocol.bgp.rib.spi.CacheDisconnectedPeers;
import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext;
import org.opendaylight.protocol.bgp.rib.spi.RibSupportUtils;
import org.opendaylight.protocol.framework.ReconnectStrategyFactory;
import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener;
import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
import org.opendaylight.protocol.bgp.openconfig.spi.BGPOpenConfigProvider;
+import org.opendaylight.protocol.bgp.rib.spi.CacheDisconnectedPeers;
import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext;
import org.opendaylight.protocol.framework.ReconnectStrategyFactory;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
package org.opendaylight.protocol.bgp.rib.impl;
import static org.junit.Assert.assertNotNull;
+
import com.google.common.collect.Sets;
import com.google.common.util.concurrent.CheckedFuture;
import java.util.Set;
import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
import org.opendaylight.protocol.bgp.rib.impl.spi.RIBSupportContext;
import org.opendaylight.protocol.bgp.rib.impl.spi.RIBSupportContextRegistry;
+import org.opendaylight.protocol.bgp.rib.spi.IdentifierUtils;
import org.opendaylight.protocol.bgp.rib.spi.RibSupportUtils;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerRole;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
+
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.google.common.primitives.UnsignedInteger;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
+import org.opendaylight.protocol.bgp.rib.spi.RouterIds;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.as.path.Segments;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.as.path.SegmentsBuilder;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
+import org.opendaylight.protocol.bgp.rib.spi.RouterIds;
public class OffsetMapTest {
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
-package org.opendaylight.protocol.bgp.rib.impl.spi;
+package org.opendaylight.protocol.bgp.rib.spi;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerId;
/**
* Check whether Peer is inside the cache List
+ *
+ * @param peerId of destination peer
* @return True if peer is contained on CacheList
*/
boolean isPeerDisconnected(PeerId peerId);
/**
* Remove Peer from cache in case of reconnection
+ *
+ * @param peerId of reconnected peer
*/
void reconnected(PeerId peerId);
/**
- * Insert disconnected peer to cache
+ * Add to cache list disconnected peer
+ *
+ * @param peerId of disconnected peer
*/
void insertDesconectedPeer(Ipv4Address peerId);
}
--- /dev/null
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.bgp.rib.spi;
+
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerRole;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidateNode;
+
+/**
+ * Tracks peers for adj-rib-out writeout.
+ */
+public interface ExportPolicyPeerTracker {
+ /**
+ * Update set with supported tables per peer
+ * @param peerId which receveid the change
+ * @param node data change
+ */
+ void onTablesChanged(PeerId peerId, DataTreeCandidateNode node);
+
+ /**
+ * returns PeerExportGroup per role
+ * @param role of desired PeerExportGroup
+ * @return PeerExportGroup
+ */
+ PeerExportGroup getPeerGroup(PeerRole role);
+
+ /**
+ * check whether the peer supports the table
+ * @param peerId of peer
+ * @param tablesKey to be checked
+ * @return true if peer supports table
+ */
+ boolean isTableSupported(PeerId peerId, TablesKey tablesKey);
+
+ /**
+ * @param peerId of peer
+ * @return Role of peer
+ */
+ PeerRole getRole(YangInstanceIdentifier peerId);
+
+ /**
+ * @param change data change
+ * @param peerPath YII of peer
+ */
+ void onDataTreeChanged(DataTreeCandidateNode change, YangInstanceIdentifier peerPath);
+}
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
-package org.opendaylight.protocol.bgp.rib.impl;
+package org.opendaylight.protocol.bgp.rib.spi;
import com.google.common.base.Preconditions;
import com.google.common.base.Predicate;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
-final class IdentifierUtils {
+public final class IdentifierUtils {
private static final Predicate<PathArgument> IS_PEER = new Predicate<PathArgument>() {
@Override
public boolean apply(final PathArgument input) {
return YangInstanceIdentifier.create(Iterables.limit(id.getPathArguments(), idx + 1));
}
- static YangInstanceIdentifier peerPath(final YangInstanceIdentifier id) {
+ public static YangInstanceIdentifier peerPath(final YangInstanceIdentifier id) {
return firstIdentifierOf(id, IS_PEER);
}
- static NodeIdentifierWithPredicates peerKey(final YangInstanceIdentifier id) {
+ public static NodeIdentifierWithPredicates peerKey(final YangInstanceIdentifier id) {
return firstKeyOf(id, IS_PEER);
}
- static PeerId peerId(final NodeIdentifierWithPredicates peerKey) {
+ public static PeerId peerId(final NodeIdentifierWithPredicates peerKey) {
// We could use a codec, but this is simple enough
return new PeerId((String) peerKey.getKeyValues().get(PEER_ID));
}
return firstKeyOf(id, IS_TABLES);
}
- static NodeIdentifierWithPredicates domPeerId(final PeerId peer) {
+ public static NodeIdentifierWithPredicates domPeerId(final PeerId peer) {
return new NodeIdentifierWithPredicates(Peer.QNAME, PEER_ID, peer.getValue());
}
}
--- /dev/null
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.bgp.rib.spi;
+
+import java.util.Collection;
+import java.util.Map;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerId;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
+
+/**
+ * A collection of peers sharing the same export policy.
+ */
+public interface PeerExportGroup {
+ /**
+ * Transform outgoing attributes according to policy per Peer
+ * @param sourcePeerId root Peer
+ * @param attributes attributes container
+ * @return return attributes container after apply policy
+ */
+ ContainerNode effectiveAttributes(PeerId sourcePeerId, ContainerNode attributes);
+
+ /**
+ *
+ * @return map of peer
+ */
+ Collection<Map.Entry<PeerId, YangInstanceIdentifier>> getPeers();
+}
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
-package org.opendaylight.protocol.bgp.rib.impl;
+package org.opendaylight.protocol.bgp.rib.spi;
import com.google.common.base.Preconditions;
import com.google.common.cache.CacheBuilder;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerId;
-final class RouterIds {
+public final class RouterIds {
private static final LoadingCache<String, UnsignedInteger> ROUTER_IDS = CacheBuilder.newBuilder().weakValues().build(new CacheLoader<String, UnsignedInteger>() {
@Override
public UnsignedInteger load(final String key) {