NETVIRT-1134 : ModifiedNodeDoesNotExistException bgp/networks in CSIT
[netvirt.git] / bgpmanager / impl / src / main / java / org / opendaylight / netvirt / bgpmanager / BgpManager.java
index 86782ed0fb4e21b738193b508d71be4acbdad782..ff307276e78f3fa993aabf346df383170985b215 100644 (file)
@@ -7,17 +7,23 @@
  */
 package org.opendaylight.netvirt.bgpmanager;
 
+import com.google.common.base.Optional;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.apache.thrift.TException;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
 import org.opendaylight.netvirt.bgpmanager.oam.BgpAlarmErrorCodes;
 import org.opendaylight.netvirt.bgpmanager.oam.BgpConstants;
@@ -28,7 +34,10 @@ import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev1509
 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.Bgp;
 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.TcpMd5SignaturePasswordType;
 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.Neighbors;
+import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.Networks;
+import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.NetworksKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntry;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -38,12 +47,14 @@ public class BgpManager implements AutoCloseable, IBgpManager {
     private final BgpConfigurationManager bcm;
 
     private final FibDSWriter fibDSWriter;
+    private final DataBroker dataBroker;
     private volatile long qbgprestartTS = 0;
 
     @Inject
-    public BgpManager(final BgpConfigurationManager bcm, final FibDSWriter fibDSWriter) {
+    public BgpManager(final BgpConfigurationManager bcm, final FibDSWriter fibDSWriter, final DataBroker dataBroker) {
         this.bcm = bcm;
         this.fibDSWriter = fibDSWriter;
+        this.dataBroker = dataBroker;
     }
 
     @PostConstruct
@@ -53,7 +64,7 @@ public class BgpManager implements AutoCloseable, IBgpManager {
 
     @Override
     @PreDestroy
-    public void close() throws Exception {
+    public void close() {
         LOG.info("{} close", getClass().getSimpleName());
     }
 
@@ -61,38 +72,38 @@ public class BgpManager implements AutoCloseable, IBgpManager {
         return bcm;
     }
 
-    public void configureGR(int stalepathTime) throws TException {
+    public void configureGR(int stalepathTime) {
         bcm.addGracefulRestart(stalepathTime);
     }
 
-    public void delGracefulRestart() throws Exception {
+    public void delGracefulRestart() {
         bcm.delGracefulRestart();
     }
 
     public void addNeighbor(String ipAddress, long asNum,
-            @Nullable final TcpMd5SignaturePasswordType md5Password) throws TException {
+            @Nullable final TcpMd5SignaturePasswordType md5Password) {
         bcm.addNeighbor(ipAddress, asNum, md5Password);
     }
 
-    public void addEbgpMultihop(String ipAddress, int nhops) throws TException {
+    public void addEbgpMultihop(String ipAddress, int nhops) {
         bcm.addEbgpMultihop(ipAddress, nhops);
     }
 
-    public void addUpdateSource(String ipAddress, String srcIp) throws TException {
+    public void addUpdateSource(String ipAddress, String srcIp) {
         bcm.addUpdateSource(ipAddress, srcIp);
     }
 
-    public void addAddressFamily(String ipAddress, af_afi afi, af_safi safi) throws TException {
+    public void addAddressFamily(String ipAddress, af_afi afi, af_safi safi) {
         bcm.addAddressFamily(ipAddress, afi.getValue(), safi.getValue());
     }
 
-    public void deleteNeighbor(String ipAddress) throws TException {
+    public void deleteNeighbor(String ipAddress) {
         bcm.delNeighbor(ipAddress);
     }
 
     @Override
     public void addVrf(String rd, Collection<String> importRts, Collection<String> exportRts,
-            AddressFamily addressFamily) throws Exception {
+            AddressFamily addressFamily) {
         bcm.addVrf(rd, new ArrayList<>(importRts), new ArrayList<>(exportRts),  addressFamily);
     }
 
@@ -112,9 +123,8 @@ public class BgpManager implements AutoCloseable, IBgpManager {
     @Override
     public void addPrefix(String rd, String macAddress, String prefix, List<String> nextHopList,
                           VrfEntry.EncapType encapType, int vpnLabel, long l3vni,
-                          String gatewayMac, RouteOrigin origin)
-            throws Exception {
-        fibDSWriter.addFibEntryToDS(rd, macAddress, prefix, nextHopList,
+                          String gatewayMac, RouteOrigin origin) {
+        fibDSWriter.addFibEntryToDS(rd, prefix, nextHopList,
                 encapType, vpnLabel, l3vni, gatewayMac, origin);
         bcm.addPrefix(rd, macAddress, prefix, nextHopList,
                 encapType, vpnLabel, l3vni, 0 /*l2vni*/, gatewayMac);
@@ -122,7 +132,7 @@ public class BgpManager implements AutoCloseable, IBgpManager {
 
     @Override
     public void addPrefix(String rd, String macAddress, String prefix, String nextHop, VrfEntry.EncapType encapType,
-                          int vpnLabel, long l3vni, String gatewayMac, RouteOrigin origin) throws Exception {
+                          int vpnLabel, long l3vni, String gatewayMac, RouteOrigin origin) {
         addPrefix(rd, macAddress, prefix, Collections.singletonList(nextHop), encapType, vpnLabel, l3vni,
                 gatewayMac, origin);
     }
@@ -136,7 +146,7 @@ public class BgpManager implements AutoCloseable, IBgpManager {
     @Override
     public void advertisePrefix(String rd, String macAddress, String prefix, List<String> nextHopList,
                                 VrfEntry.EncapType encapType, long vpnLabel, long l3vni, long l2vni,
-                                String gatewayMac) throws Exception {
+                                String gatewayMac) {
         LOG.info("Advertise Prefix: Adding Prefix rd {} prefix {} label {} l3vni {} l2vni {}",
                 rd, prefix, vpnLabel, l3vni, l2vni);
         bcm.addPrefix(rd, macAddress, prefix, nextHopList,
@@ -148,7 +158,7 @@ public class BgpManager implements AutoCloseable, IBgpManager {
     @Override
     public void advertisePrefix(String rd, String macAddress, String prefix, String nextHop,
                                 VrfEntry.EncapType encapType, long vpnLabel, long l3vni, long l2vni,
-                                String gatewayMac) throws Exception {
+                                String gatewayMac) {
         LOG.info("ADVERTISE: Adding Prefix rd {} prefix {} nexthop {} label {} l3vni {} l2vni {}",
                 rd, prefix, nextHop, vpnLabel, l3vni, l2vni);
         bcm.addPrefix(rd, macAddress, prefix, Collections.singletonList(nextHop), encapType,
@@ -159,9 +169,32 @@ public class BgpManager implements AutoCloseable, IBgpManager {
 
     @Override
     public void withdrawPrefix(String rd, String prefix) {
-        LOG.info("WITHDRAW: Removing Prefix rd {} prefix {} afi {}", rd, prefix);
+        LOG.info("WITHDRAW: Removing Prefix rd {} prefix {}", rd, prefix);
         bcm.delPrefix(rd, prefix);
-        LOG.info("WITHDRAW: Removed Prefix rd {} prefix {} afi {}", rd, prefix);
+        LOG.info("WITHDRAW: Removed Prefix rd {} prefix {}", rd, prefix);
+    }
+
+    @Override
+    public void withdrawPrefixIfPresent(String rd, String prefix) {
+        InstanceIdentifier<Networks> networksId = InstanceIdentifier.builder(Bgp.class).child(Networks.class,
+                new NetworksKey(rd, prefix)).build();
+        try (ReadOnlyTransaction tx = dataBroker.newReadOnlyTransaction()) {
+            Futures.addCallback(tx.read(LogicalDatastoreType.OPERATIONAL, networksId),
+                new FutureCallback<Optional<Networks>>() {
+                    @Override
+                    public void onSuccess(@Nonnull Optional<Networks> networks) {
+                        if (networks.isPresent()) {
+                            withdrawPrefix(rd, prefix);
+                        }
+                    }
+
+                    @Override
+                    public void onFailure(Throwable throwable) {
+                        LOG.warn("withdrwaPrefixIfPresent: Failed to retrieve ebgp networks for rd {} prefix {}",
+                                rd, prefix, throwable);
+                    }
+                });
+        }
     }
 
     @Override
@@ -222,7 +255,7 @@ public class BgpManager implements AutoCloseable, IBgpManager {
     @Override
     // This method doesn't actually do any real work currently but may at some point so suppress FindBugs violation.
     @SuppressFBWarnings("UC_USELESS_VOID_METHOD")
-    public synchronized void sendNotificationEvent(String pfx, int code, int subcode) {
+    public synchronized void sendNotificationEvent(int code, int subcode) {
         if (code != BgpConstants.BGP_NOTIFY_CEASE_CODE) {
             // CEASE Notifications alone have to be reported to the CBA.
             // Silently return here. No need to log because tons