BUG-2383 : started effective RIB writer in RIBImpl 62/17062/15
authorDana Kutenicsova <dkutenic@cisco.com>
Tue, 24 Mar 2015 15:50:40 +0000 (16:50 +0100)
committerRobert Varga <nite@hq.sk>
Mon, 30 Mar 2015 17:20:11 +0000 (17:20 +0000)
- created a getYangRibId method in RIB to ease access
to YangInstanceIdentifier of the RIB

Change-Id: I623f0b5f904c3d0fb6d7205846da0569902447fd
Signed-off-by: Dana Kutenicsova <dkutenic@cisco.com>
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/AdjRibInWriter.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPPeer.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/EffectiveRibInWriter.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBImpl.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/RIB.java
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/ApplicationPeerTest.java

index efe687728240118f04535eae2fafca8a7a19d6d5..75f8e1579a5cb2faa5f3eda1f430efac08993599 100644 (file)
@@ -26,10 +26,8 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.PathAttributes;
 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.BgpRib;
 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.RibKey;
 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.rib.Tables;
@@ -112,13 +110,8 @@ final class AdjRibInWriter {
      * @param chain transaction chain
      * @return A fresh writer instance
      */
-    static AdjRibInWriter create(@Nonnull final RibKey key, @Nonnull final PeerRole role, @Nonnull final DOMTransactionChain chain) {
-        final InstanceIdentifierBuilder b = YangInstanceIdentifier.builder();
-        b.node(BgpRib.QNAME);
-        b.node(Rib.QNAME);
-        b.nodeWithKey(Rib.QNAME, RIB_ID_QNAME, key.getId().getValue());
-
-        return new AdjRibInWriter(b.build(), chain, roleString(role), null, Collections.<TablesKey, TableContext>emptyMap());
+    static AdjRibInWriter create(@Nonnull final YangInstanceIdentifier ribId, @Nonnull final PeerRole role, @Nonnull final DOMTransactionChain chain) {
+        return new AdjRibInWriter(ribId, chain, roleString(role), null, Collections.<TablesKey, TableContext>emptyMap());
     }
 
     /**
index f74878a23c8bcf8c8f4cdf78e5e635ba79c612e3..789e71bf4aff0ece70bb794208cf954367810773 100644 (file)
@@ -29,7 +29,6 @@ import org.opendaylight.controller.md.sal.common.api.data.AsyncTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionChain;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener;
 import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
-import org.opendaylight.protocol.bgp.rib.RibReference;
 import org.opendaylight.protocol.bgp.rib.impl.spi.AdjRIBsOutRegistration;
 import org.opendaylight.protocol.bgp.rib.impl.spi.BGPSessionStatistics;
 import org.opendaylight.protocol.bgp.rib.impl.spi.RIB;
@@ -97,7 +96,7 @@ public class BGPPeer implements ReusableBGPPeer, Peer, AutoCloseable, BGPPeerRun
         // FIXME: make this configurable
         final PeerRole role = PeerRole.Ibgp;
 
-        this.ribWriter = AdjRibInWriter.create(((RibReference)rib).getInstanceIdentifier().getKey(), role, chain);
+        this.ribWriter = AdjRibInWriter.create(rib.getYangRibId(), role, chain);
     }
 
     @Override
index 3143da98b16353cca6d1685566bb093f3fea5125..53f183b892c26a9dc8625c2b7aa65a4f07c024ca 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.protocol.bgp.rib.impl;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Verify;
 import java.util.Collection;
+import javax.annotation.Nonnull;
 import javax.annotation.concurrent.NotThreadSafe;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeListener;
@@ -128,9 +129,9 @@ final class EffectiveRibInWriter implements AutoCloseable {
         }
 
         private void processTableChildren(final DOMDataWriteTransaction tx, final RIBSupport ribSupport, final NodeIdentifierWithPredicates peerKey, final YangInstanceIdentifier tablePath, final Collection<DataTreeCandidateNode> children) {
-            final AbstractImportPolicy policy = peerPolicyTracker.policyFor(IdentifierUtils.peerId(peerKey));
+            final AbstractImportPolicy policy = EffectiveRibInWriter.this.peerPolicyTracker.policyFor(IdentifierUtils.peerId(peerKey));
 
-            for (DataTreeCandidateNode child : children) {
+            for (final DataTreeCandidateNode child : children) {
                 switch (child.getModificationType()) {
                 case DELETE:
                     tx.delete(LogicalDatastoreType.OPERATIONAL, tablePath.node(child.getIdentifier()));
@@ -149,7 +150,7 @@ final class EffectiveRibInWriter implements AutoCloseable {
                     // ensured that we have them in at target, so a subsequent delete will not fail :)
                     if (TABLE_ROUTES.equals(child.getIdentifier())) {
                         final YangInstanceIdentifier routesPath = tablePath.node(Routes.QNAME);
-                        for (DataTreeCandidateNode route : ribSupport.changedRoutes(child)) {
+                        for (final DataTreeCandidateNode route : ribSupport.changedRoutes(child)) {
                             processRoute(tx, ribSupport, policy, routesPath, route);
                         }
                     }
@@ -163,11 +164,11 @@ final class EffectiveRibInWriter implements AutoCloseable {
 
         private RIBSupportContext getRibSupport(final NodeIdentifierWithPredicates tableKey) {
             // FIXME: use codec to translate tableKey
-            return registry.getRIBSupportContext(null);
+            return this.registry.getRIBSupportContext(null);
         }
 
         private YangInstanceIdentifier effectiveTablePath(final NodeIdentifierWithPredicates peerKey, final NodeIdentifierWithPredicates tableKey) {
-            return ribId.node(peerKey).node(EffectiveRibIn.QNAME).node(tableKey);
+            return this.ribId.node(Peer.QNAME).node(peerKey).node(EffectiveRibIn.QNAME).node(tableKey);
         }
 
         private void modifyTable(final DOMDataWriteTransaction tx, final NodeIdentifierWithPredicates peerKey, final NodeIdentifierWithPredicates tableKey, final DataTreeCandidateNode table) {
@@ -189,9 +190,9 @@ final class EffectiveRibInWriter implements AutoCloseable {
 
         @Override
         public void onDataTreeChanged(final Collection<DataTreeCandidate> changes) {
-            final DOMDataWriteTransaction tx = chain.newWriteOnlyTransaction();
+            final DOMDataWriteTransaction tx = this.chain.newWriteOnlyTransaction();
 
-            for (DataTreeCandidate tc : changes) {
+            for (final DataTreeCandidate tc : changes) {
                 final YangInstanceIdentifier rootPath = tc.getRootPath();
 
                 // Obtain the peer's key
@@ -235,22 +236,28 @@ final class EffectiveRibInWriter implements AutoCloseable {
         @Override
         public void close() {
             // FIXME: wipe all effective routes?
-            reg.close();
+            this.reg.close();
         }
     }
 
     private final ImportPolicyPeerTracker peerPolicyTracker;
     private final AdjInTracker adjInTracker;
 
-    private EffectiveRibInWriter(final DOMDataTreeChangeService service, final DOMTransactionChain chain, final YangInstanceIdentifier ribId) {
-        // FIXME: proper arguments
-        this.peerPolicyTracker = new ImportPolicyPeerTracker(service, ribId, null);
-        this.adjInTracker = new AdjInTracker(service, null, chain, ribId);
+    static EffectiveRibInWriter create(@Nonnull final DOMDataTreeChangeService service, @Nonnull final DOMTransactionChain chain,
+        @Nonnull final YangInstanceIdentifier ribId, @Nonnull final PolicyDatabase pd, @Nonnull final RIBSupportContextRegistry registry) {
+        return new EffectiveRibInWriter(service, chain, ribId, pd, registry);
+    }
+
+    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);
     }
 
     @Override
     public void close() {
-        adjInTracker.close();
-        peerPolicyTracker.close();
+        this.adjInTracker.close();
+        this.peerPolicyTracker.close();
     }
 }
index 0a41cbfeabdf924a109c4dfc0fe57fb53ddc8b85..be7c6010d5797b7d3b91d2ed0173922da210dd88 100644 (file)
@@ -33,6 +33,8 @@ import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionChain;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener;
 import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataBrokerExtension;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeService;
 import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
 import org.opendaylight.protocol.bgp.rib.DefaultRibReference;
 import org.opendaylight.protocol.bgp.rib.impl.spi.AdjRIBsOut;
@@ -79,11 +81,14 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.rib.LocRibBuilder;
 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.types.rev130919.ClusterIdentifier;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
 import org.opendaylight.yangtools.binding.data.codec.api.BindingCodecTreeFactory;
 import org.opendaylight.yangtools.sal.binding.generator.impl.GeneratedClassLoadingStrategy;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.api.SchemaContextListener;
 import org.slf4j.Logger;
@@ -94,6 +99,7 @@ public final class RIBImpl extends DefaultRibReference implements AutoCloseable,
     private static final Logger LOG = LoggerFactory.getLogger(RIBImpl.class);
     private static final Update EOR = new UpdateBuilder().build();
     private static final TablesKey IPV4_UNICAST_TABLE = new TablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class);
+    private static final QName RIB_ID_QNAME = QName.cachedReference(QName.create(Rib.QNAME, "id"));
 
     /*
      * FIXME: performance: this needs to be turned into a Peer->offset map.
@@ -128,9 +134,8 @@ public final class RIBImpl extends DefaultRibReference implements AutoCloseable,
     private final DataBroker dataBroker;
     private final DOMDataBroker domDataBroker;
     private final RIBExtensionConsumerContext extensions;
-
+    private final YangInstanceIdentifier yangRibId;
     private final RIBSupportContextRegistryImpl ribContextRegistry;
-
     private final Runnable scheduler = new Runnable() {
         @Override
         public void run() {
@@ -180,11 +185,25 @@ public final class RIBImpl extends DefaultRibReference implements AutoCloseable,
         this.domDataBroker = Preconditions.checkNotNull(domDataBroker);
         this.extensions = Preconditions.checkNotNull(extensions);
         this.ribContextRegistry = RIBSupportContextRegistryImpl.create(extensions,codecFactory, classStrategy);
+        this.yangRibId = YangInstanceIdentifier.builder().node(BgpRib.QNAME).node(Rib.QNAME).nodeWithKey(Rib.QNAME, RIB_ID_QNAME, ribId.getValue()).build();
 
         LOG.debug("Instantiating RIB table {} at {}", ribId, getInstanceIdentifier());
 
         final WriteTransaction trans = this.chain.newWriteOnlyTransaction();
 
+        final PolicyDatabase pd  = new PolicyDatabase(localAs.getValue(), localBgpId, new ClusterIdentifier(localBgpId));
+        /*if (clusterId == null) {
+              clusterId is not present, fallback to bgpId
+            pd = new PolicyDatabase(localAs.getValue(), localBgpId, new ClusterIdentifier(localBgpId));
+        } else {
+            pd = new PolicyDatabase(as, bgpId, clusterId);
+        } */
+
+        final DOMDataBrokerExtension service = this.domDataBroker.getSupportedExtensions().get(DOMDataTreeChangeService.class);
+        final DOMTransactionChain domChain = this.createPeerChain(this);
+        // put clusterId
+        EffectiveRibInWriter.create((DOMDataTreeChangeService) service, domChain, getYangRibId(), pd, this.ribContextRegistry);
+
         // 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(
@@ -207,6 +226,7 @@ public final class RIBImpl extends DefaultRibReference implements AutoCloseable,
             public void onFailure(final Throwable t) {
                 LOG.error("Failed to initiate RIB {}", getInstanceIdentifier(), t);
             }
+
         });
     }
 
@@ -458,6 +478,11 @@ public final class RIBImpl extends DefaultRibReference implements AutoCloseable,
         return 0;
     }
 
+    @Override
+    public YangInstanceIdentifier getYangRibId() {
+        return this.yangRibId;
+    }
+
     @Override
     public DOMTransactionChain createPeerChain(final TransactionChainListener listener) {
         return this.domDataBroker.createTransactionChain(listener);
index 5f1555b03f17ecba6a6c83796ec9589151d0af67..8009a1a499da6d9d0a05b2dfae74365649f33742 100644 (file)
@@ -19,6 +19,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.Update;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType;
 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;
 
 /**
  * Internal reference to a RIB instance.
@@ -68,4 +69,11 @@ public interface RIB {
     RIBExtensionConsumerContext getRibExtensions();
 
     RIBSupportContextRegistry getRibSupportContext();
+
+    /**
+     * Return YangInstanceIdentifier of BGP Rib with its RibId.
+     *
+     * @return YangInstanceIdentifier
+     */
+    YangInstanceIdentifier getYangRibId();
 }
index 8ad56c8514903e3e5f9b21efbfb52d912fd9fa07..e235eb2caf84f000ddc531a0d673531b48f91b19 100644 (file)
@@ -48,6 +48,10 @@ import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataBrokerExtension;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeListener;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeService;
+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.parser.BgpTableTypeImpl;
@@ -175,6 +179,9 @@ public class ApplicationPeerTest {
     @Mock
     Optional<Rib> o;
 
+    @Mock
+    DOMDataTreeChangeService service;
+
     BGPSessionImpl session;
 
     List<InstanceIdentifier<?>> routes;
@@ -214,6 +221,10 @@ public class ApplicationPeerTest {
         this.a2.startRIBExtensionProvider(context);
         Mockito.doReturn(this.chain).when(this.dps).createTransactionChain(Mockito.any(RIBImpl.class));
         Mockito.doReturn(this.domChain).when(this.dom).createTransactionChain(Mockito.any(BGPPeer.class));
+        final Map<Class<? extends DOMDataBrokerExtension>, DOMDataBrokerExtension> map = new HashMap<>();
+        map.put(DOMDataTreeChangeService.class, this.service);
+        Mockito.doReturn(null).when(this.service).registerDataTreeChangeListener(Mockito.any(DOMDataTreeIdentifier.class), Mockito.any(DOMDataTreeChangeListener.class));
+        Mockito.doReturn(map).when(this.dom).getSupportedExtensions();
         Mockito.doReturn(this.o).when(this.future).get();
         Mockito.doNothing().when(this.transWrite).put(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(InstanceIdentifier.class), Mockito.any(Rib.class));
         Mockito.doNothing().when(this.domTransWrite).put(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(YangInstanceIdentifier.class), Mockito.any(NormalizedNode.class));