import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.path.attributes.MpReachNlri;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.path.attributes.MpUnreachNlri;
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.bgp.rib.Rib;
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 org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.rib.peer.EffectiveRibIn;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.Tables;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.tables.Attributes;
private static final LeafNode<Boolean> ATTRIBUTES_UPTODATE_FALSE = ImmutableNodes.leafNode(QName.create(Attributes.QNAME, "uptodate"), Boolean.FALSE);
private static final LeafNode<Boolean> ATTRIBUTES_UPTODATE_TRUE = ImmutableNodes.leafNode(ATTRIBUTES_UPTODATE_FALSE.getNodeType(), Boolean.TRUE);
- private static final QName RIB_ID_QNAME = QName.cachedReference(QName.create(Rib.QNAME, "id"));
- private static final QName AFI_QNAME = QName.cachedReference(QName.create(Tables.QNAME, "afi"));
- private static final QName SAFI_QNAME = QName.cachedReference(QName.create(Tables.QNAME, "safi"));
private static final QName PEER_ID_QNAME = QName.cachedReference(QName.create(Peer.QNAME, "peer-id"));
private static final QName PEER_ROLE_QNAME = QName.cachedReference(QName.create(Peer.QNAME, "peer-role"));
private static final NodeIdentifier ADJRIBIN = new NodeIdentifier(AdjRibIn.QNAME);
+ private static final NodeIdentifier EFFRIBIN = new NodeIdentifier(EffectiveRibIn.QNAME);
private static final NodeIdentifier PEER_ID = new NodeIdentifier(PEER_ID_QNAME);
private static final NodeIdentifier PEER_ROLE = new NodeIdentifier(PEER_ROLE_QNAME);
private static final NodeIdentifier TABLES = new NodeIdentifier(Tables.QNAME);
// FIXME: is there a utility method to construct this?
private static final ContainerNode EMPTY_ADJRIBIN = Builders.containerBuilder().withNodeIdentifier(ADJRIBIN).addChild(ImmutableNodes.mapNodeBuilder(Tables.QNAME).build()).build();
+ private static final ContainerNode EMPTY_EFFRIBIN = Builders.containerBuilder().withNodeIdentifier(EFFRIBIN).addChild(ImmutableNodes.mapNodeBuilder(Tables.QNAME).build()).build();
private final Map<TablesKey, TableContext> tables;
private final YangInstanceIdentifier tablesRoot;
pb.withChild(ImmutableNodes.leafNode(PEER_ID, newPeerId.getValue()));
pb.withChild(ImmutableNodes.leafNode(PEER_ROLE, this.role));
pb.withChild(EMPTY_ADJRIBIN);
+ pb.withChild(EMPTY_EFFRIBIN);
tx.put(LogicalDatastoreType.OPERATIONAL, newPeerPath, pb.build());
LOG.debug("New peer {} structure installed.", newPeerPath);
} else {
tx.merge(LogicalDatastoreType.OPERATIONAL, ctx.getTableId().node(Attributes.QNAME).node(ATTRIBUTES_UPTODATE_FALSE.getNodeType()), ATTRIBUTES_UPTODATE_FALSE);
}
- LOG.debug("Created table instance {}", ctx);
+ LOG.debug("Created table instance {}", ctx.getTableId());
tb.put(k, ctx);
}
final DOMDataWriteTransaction tx = this.chain.newWriteOnlyTransaction();
ctx.writeRoutes(tx, nlri, attributes);
+ LOG.trace("Write routes {}", nlri);
tx.submit();
}
LOG.debug("No table for {}, not accepting NLRI {}", key, nlri);
return;
}
-
+ LOG.trace("Removing routes {}", nlri);
final DOMDataWriteTransaction tx = this.chain.newWriteOnlyTransaction();
ctx.removeRoutes(tx, nlri);
tx.submit();
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.RIBSupport;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.optional.capabilities.c.parameters.graceful.restart._case.graceful.restart.capability.Tables;
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 org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.rib.peer.EffectiveRibIn;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.Tables;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.tables.Routes;
import org.opendaylight.yangtools.concepts.ListenerRegistration;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
this.chain = Preconditions.checkNotNull(chain);
this.ribId = Preconditions.checkNotNull(ribId);
- final YangInstanceIdentifier tableId = ribId.node(Peer.QNAME).node(AdjRibIn.QNAME).node(Tables.QNAME);
+ final YangInstanceIdentifier tableId = ribId.node(Peer.QNAME).node(Peer.QNAME).node(AdjRibIn.QNAME).node(Tables.QNAME).node(Tables.QNAME);
final DOMDataTreeIdentifier treeId = new DOMDataTreeIdentifier(LogicalDatastoreType.OPERATIONAL, tableId);
+ LOG.debug("Registered Effective RIB on {}", tableId);
this.reg = service.registerDataTreeChangeListener(treeId, this);
}
case SUBTREE_MODIFIED:
case WRITE:
// Lookup per-table attributes from RIBSupport
- final ContainerNode adverisedAttrs = (ContainerNode) NormalizedNodes.findNode(route.getDataAfter(), ribSupport.routeAttributesIdentifier()).orNull();
+ final ContainerNode advertisedAttrs = (ContainerNode) NormalizedNodes.findNode(route.getDataAfter(), ribSupport.routeAttributesIdentifier()).orNull();
final ContainerNode effectiveAttrs;
- if (adverisedAttrs != null) {
- effectiveAttrs = policy.effectiveAttributes(adverisedAttrs);
+ if (advertisedAttrs != null) {
+ effectiveAttrs = policy.effectiveAttributes(advertisedAttrs);
/*
* Speed hack: if we determine that the policy has passed the attributes
* it may not be that common, in which case it does not make sense to pay
* the full equals price.
*/
- if (effectiveAttrs == adverisedAttrs) {
+ if (effectiveAttrs == advertisedAttrs) {
return;
}
} else {
if (effectiveAttrs != null) {
tx.put(LogicalDatastoreType.OPERATIONAL, routeId.node(ribSupport.routeAttributesIdentifier()), effectiveAttrs);
} else {
- LOG.warn("Route {} advertised empty attributes", route.getDataAfter());
+ LOG.warn("Route {} advertised empty attributes", routeId);
tx.delete(LogicalDatastoreType.OPERATIONAL, routeId);
}
break;
final AbstractImportPolicy policy = EffectiveRibInWriter.this.peerPolicyTracker.policyFor(IdentifierUtils.peerId(peerKey));
for (final DataTreeCandidateNode child : children) {
+ LOG.debug("Process table children {}", child);
switch (child.getModificationType()) {
case DELETE:
tx.delete(LogicalDatastoreType.OPERATIONAL, tablePath.node(child.getIdentifier()));
}
private YangInstanceIdentifier effectiveTablePath(final NodeIdentifierWithPredicates peerKey, final NodeIdentifierWithPredicates tableKey) {
- return this.ribId.node(Peer.QNAME).node(peerKey).node(EffectiveRibIn.QNAME).node(tableKey);
+ return this.ribId.node(Peer.QNAME).node(peerKey).node(EffectiveRibIn.QNAME).node(Tables.QNAME).node(tableKey);
}
private void modifyTable(final DOMDataWriteTransaction tx, final NodeIdentifierWithPredicates peerKey, final NodeIdentifierWithPredicates tableKey, final DataTreeCandidateNode table) {
private EffectiveRibInWriter(final DOMDataTreeChangeService service, final DOMTransactionChain chain, final YangInstanceIdentifier ribId,
final PolicyDatabase pd, final RIBSupportContextRegistry registry) {
-
this.peerPolicyTracker = new ImportPolicyPeerTracker(service, ribId, pd);
this.adjInTracker = new AdjInTracker(service, registry, chain, ribId);
}
private static final Predicate<PathArgument> IS_PEER = new Predicate<PathArgument>() {
@Override
public boolean apply(final PathArgument input) {
- return input.getNodeType().equals(Peer.QNAME);
+ return input instanceof NodeIdentifierWithPredicates && Peer.QNAME.equals(input.getNodeType());
}
};
private static final Predicate<PathArgument> IS_TABLES = new Predicate<PathArgument>() {
@Override
public boolean apply(final PathArgument input) {
- return input.getNodeType().equals(Tables.QNAME);
+ return Tables.QNAME.equals(input.getNodeType());
}
};
private static final QName PEER_ID = QName.cachedReference(QName.create(Peer.QNAME, "peer-id"));
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;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.rib.LocRib;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.rib.peer.EffectiveRibIn;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
this.attributesIdentifier = ribSupport.routeAttributesIdentifier();
this.peerPolicyTracker = new ExportPolicyPeerTracker(service, target, pd);
- service.registerDataTreeChangeListener(new DOMDataTreeIdentifier(LogicalDatastoreType.OPERATIONAL, target.node(LocRib.QNAME)), this);
+ service.registerDataTreeChangeListener(new DOMDataTreeIdentifier(LogicalDatastoreType.OPERATIONAL, target.node(EffectiveRibIn.QNAME)), this);
}
public static LocRibWriter create(@Nonnull final RIBSupport ribSupport, @Nonnull final DOMTransactionChain chain, @Nonnull final YangInstanceIdentifier target,
private final RIBExtensionConsumerContext extensions;
private final YangInstanceIdentifier yangRibId;
private final RIBSupportContextRegistryImpl ribContextRegistry;
+ private final EffectiveRibInWriter efWriter;
+
private final Runnable scheduler = new Runnable() {
@Override
public void run() {
final WriteTransaction trans = this.chain.newWriteOnlyTransaction();
- final PolicyDatabase pd = new PolicyDatabase(localAs.getValue(), localBgpId, this.clusterId);
-
- final DOMDataBrokerExtension service = this.domDataBroker.getSupportedExtensions().get(DOMDataTreeChangeService.class);
- final DOMTransactionChain domChain = this.createPeerChain(this);
- EffectiveRibInWriter.create((DOMDataTreeChangeService) service, domChain, getYangRibId(), pd, this.ribContextRegistry);
- LOG.debug("Effective RIB created.");
-
// put empty BgpRib if not exists
trans.put(LogicalDatastoreType.OPERATIONAL, getInstanceIdentifier(),
new RibBuilder().setKey(new RibKey(ribId)).setPeer(Collections.<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.rib.Peer> emptyList()).setId(ribId).setLocRib(
if (this.tables.create(trans, this, key) == null) {
LOG.debug("Did not create local table for unhandled table type {}", t);
}
-
- // reusing the for cycle
- // create locRibWriter for each table
- // FIXME: temporary create writer only for Ipv4
- if (key.getAfi().equals(Ipv4AddressFamily.class)) {
- LocRibWriter.create(this.ribContextRegistry.getRIBSupportContext(key).getRibSupport(), domChain, getYangRibId(), localAs, (DOMDataTreeChangeService) service, pd);
- }
}
Futures.addCallback(trans.submit(), new FutureCallback<Void>() {
}
});
+
+ final PolicyDatabase pd = new PolicyDatabase(localAs.getValue(), localBgpId, this.clusterId);
+
+ final DOMDataBrokerExtension service = this.domDataBroker.getSupportedExtensions().get(DOMDataTreeChangeService.class);
+ final DOMTransactionChain domChain = this.createPeerChain(this);
+ this.efWriter = EffectiveRibInWriter.create((DOMDataTreeChangeService) service, domChain, getYangRibId(), pd, this.ribContextRegistry);
+ LOG.debug("Effective RIB created.");
+
+ for (final BgpTableType t : localTables) {
+ final TablesKey key = new TablesKey(t.getAfi(), t.getSafi());
+ // create locRibWriter for each table
+ // FIXME: temporary create writer only for Ipv4
+ if (key.getAfi().equals(Ipv4AddressFamily.class)) {
+ //LocRibWriter.create(this.ribContextRegistry.getRIBSupportContext(key).getRibSupport(), domChain, getYangRibId(), localAs, (DOMDataTreeChangeService) service, pd);
+ }
+ }
}
synchronized void initTables(final byte[] remoteBgpId) {
protected static final NodeIdentifier ROUTES = new NodeIdentifier(Routes.QNAME);
private final NodeIdentifier routesContainerIdentifier;
+ private final NodeIdentifier routesListIdentifier;
private final NodeIdentifier routeAttributesIdentifier;
private final Class<? extends Routes> cazeClass;
private final Class<? extends DataObject> containerClass;
private final Class<? extends Route> listClass;
+
/**
* Default constructor. Requires the QName of the container augmented under the routes choice
* node in instantiations of the rib grouping. It is assumed that this container is defined by
this.cazeClass = Preconditions.checkNotNull(cazeClass);
this.containerClass = Preconditions.checkNotNull(containerClass);
this.listClass = Preconditions.checkNotNull(listClass);
+ this.routesListIdentifier = new NodeIdentifier(BindingReflections.findQName(listClass));
}
@Override
if (myRoutes == null) {
return Collections.emptySet();
}
-
+ final DataTreeCandidateNode routesMap = routes.getModifiedChild(this.routesListIdentifier);
+ if (routesMap == null) {
+ return Collections.emptySet();
+ }
// Well, given the remote possibility of augmentation, we should perform a filter here,
// to make sure the type matches what routeType() reports.
- return myRoutes.getChildNodes();
+ return routesMap.getChildNodes();
}
@Override
public final YangInstanceIdentifier routePath(final YangInstanceIdentifier routesPath, final PathArgument routeId) {
- return routesPath.node(this.routesContainerIdentifier).node(routeId);
+ return routesPath.node(this.routesContainerIdentifier).node(this.routesListIdentifier).node(routeId);
}
@Override
public void testRoutePath() {
final YangInstanceIdentifier routePath = YangInstanceIdentifier.of(Routes.QNAME);
final NodeIdentifier routeId = new NodeIdentifier(Ipv4Route.QNAME);
- final String result = "/(urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2013-09-25)routes/(urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=2015-03-05)ipv4-routes/ipv4-route";
+ final String result = "/(urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2013-09-25)routes/(urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=2015-03-05)ipv4-routes/ipv4-route/ipv4-route";
assertEquals(result, this.testSupport.routePath(routePath, routeId).toString());
}