BUG-2383 : wire LocRibWriter 76/17176/6
authorDana Kutenicsova <dkutenic@cisco.com>
Thu, 26 Mar 2015 16:07:55 +0000 (17:07 +0100)
committerRobert Varga <nite@hq.sk>
Mon, 30 Mar 2015 17:20:52 +0000 (17:20 +0000)
Change-Id: I327722a249c9f4aff66085428bcb70c73c575ed3
Signed-off-by: Dana Kutenicsova <dkutenic@cisco.com>
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/LocRibWriter.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBImpl.java

index 7c7b564f8e6e04c561280ec4f5a1a4c5df37a14b..db497f4c3e21f29ac2abbec03a10ac201f9e784c 100644 (file)
@@ -13,14 +13,19 @@ import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
+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;
+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.rib.spi.RIBSupport;
+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.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
@@ -39,19 +44,25 @@ final class LocRibWriter implements AutoCloseable, DOMDataTreeChangeListener {
     private final NodeIdentifier attributesIdentifier;
     private final Long ourAs;
 
-    LocRibWriter(final RIBSupport ribSupport, final DOMTransactionChain chain, final YangInstanceIdentifier target, final Long ourAs) {
+    LocRibWriter(final RIBSupport ribSupport, final DOMTransactionChain chain, final YangInstanceIdentifier target, final Long ourAs,
+        final DOMDataTreeChangeService service, final PolicyDatabase pd) {
         this.chain = Preconditions.checkNotNull(chain);
         this.target = Preconditions.checkNotNull(target);
         this.ourAs = Preconditions.checkNotNull(ourAs);
         this.attributesIdentifier = ribSupport.routeAttributesIdentifier();
+        this.peerPolicyTracker = new ExportPolicyPeerTracker(service, target, pd);
 
-        // FIXME: proper values
-        this.peerPolicyTracker = new ExportPolicyPeerTracker(null, null, null);
+        service.registerDataTreeChangeListener(new DOMDataTreeIdentifier(LogicalDatastoreType.OPERATIONAL, target.node(LocRib.QNAME)), this);
+    }
+
+    public static LocRibWriter create(@Nonnull final RIBSupport ribSupport, @Nonnull final DOMTransactionChain chain, @Nonnull final YangInstanceIdentifier target,
+        @Nonnull final AsNumber ourAs, @Nonnull final DOMDataTreeChangeService service, @Nonnull final PolicyDatabase pd) {
+        return new LocRibWriter(ribSupport, chain, target, ourAs.getValue(), service, pd);
     }
 
     @Override
     public void close() {
-        peerPolicyTracker.close();
+        this.peerPolicyTracker.close();
     }
 
     @Override
@@ -117,8 +128,8 @@ final class LocRibWriter implements AutoCloseable, DOMDataTreeChangeListener {
              * if we have two eBGP peers, for example, there is no reason why we should perform the translation
              * multiple times.
              */
-            for (PeerRole role : PeerRole.values()) {
-                final PeerExportGroup peerGroup = peerPolicyTracker.getPeerGroup(role);
+            for (final PeerRole role : PeerRole.values()) {
+                final PeerExportGroup peerGroup = this.peerPolicyTracker.getPeerGroup(role);
                 if (peerGroup != null) {
                     final ContainerNode attributes = null;
                     final PeerId peerId = e.getKey().getPeerId();
@@ -130,7 +141,7 @@ final class LocRibWriter implements AutoCloseable, DOMDataTreeChangeListener {
 
                         if (effectiveAttributes != null && value != null && !peerId.equals(pid.getKey())) {
                             tx.put(LogicalDatastoreType.OPERATIONAL, routeTarget, value);
-                            tx.put(LogicalDatastoreType.OPERATIONAL, routeTarget.node(attributesIdentifier), effectiveAttributes);
+                            tx.put(LogicalDatastoreType.OPERATIONAL, routeTarget.node(this.attributesIdentifier), effectiveAttributes);
                         } else {
                             tx.delete(LogicalDatastoreType.OPERATIONAL, routeTarget);
                         }
index be7c6010d5797b7d3b91d2ed0173922da210dd88..349a00f39972a99b55589703c427d4e473e71f4d 100644 (file)
@@ -214,6 +214,13 @@ public final class RIBImpl extends DefaultRibReference implements AutoCloseable,
             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>() {