*/
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;
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;
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
@Override
@PreDestroy
- public void close() throws Exception {
+ public void close() {
LOG.info("{} close", getClass().getSimpleName());
}
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);
}
@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);
@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);
}
@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,
@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,
@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
@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