package org.opendaylight.netvirt.bgpmanager;
import com.google.common.base.Optional;
+import com.google.common.net.InetAddresses;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import io.netty.util.concurrent.GlobalEventExecutor;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.net.InetAddress;
+import java.net.InetSocketAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.ArrayList;
private volatile Bgp config;
private final BgpRouter bgpRouter;
private final BgpSyncHandle bgpSyncHandle = new BgpSyncHandle();
- private BgpThriftService updateServer;
+ private volatile BgpThriftService bgpThriftService = null;
private final CountDownLatch initer = new CountDownLatch(1);
String updatePort = getProperty(UPDATE_PORT, DEF_UPORT);
hostStartup = getProperty(CONFIG_HOST, DEF_CHOST);
portStartup = getProperty(CONFIG_PORT, DEF_CPORT);
- LOG.info("UpdateServer at localhost:{}, ConfigServer at {}:{}", updatePort, hostStartup, portStartup);
+ LOG.info("ConfigServer at {}:{}", hostStartup, portStartup);
VtyshCli.setHostAddr(hostStartup);
ClearBgpCli.setHostAddr(hostStartup);
bgpRouter = BgpRouter.newInstance(this::getConfig, this::isBGPEntityOwner);
final WaitingServiceTracker<IBgpManager> tracker = WaitingServiceTracker.create(
IBgpManager.class, bundleContext);
bgpManager = tracker.waitForService(WaitingServiceTracker.FIVE_MINUTES);
- updateServer = new BgpThriftService(Integer.parseInt(updatePort), bgpManager, this);
- updateServer.start();
+ if (InetAddresses.isInetAddress(getBgpSdncMipIp())) {
+ InetSocketAddress bgpThriftServerSocketAddr = new InetSocketAddress(getBgpSdncMipIp(),
+ Integer.parseInt(updatePort));
+ bgpThriftService = new BgpThriftService(bgpThriftServerSocketAddr, bgpManager, this);
+ if (isBGPEntityOwner()) {
+ //I am EoS owner of BGP, opening bgp thrift UPDATE-SERVER port.
+ LOG.info("BGP Configuration manager initialized: UPDATE-SERVER started");
+ bgpThriftService.start();
+ }
+ LOG.info("UPDATE server started :ip:port={}:{}", getBgpSdncMipIp(), updatePort);
+ } else {
+ LOG.error("Failed to init UPDATE server invalid ip:port={}:{}", getBgpSdncMipIp(), updatePort);
+ }
LOG.info("BgpConfigurationManager initialized. IBgpManager={}", bgpManager);
});
}
public void close() {
executor.shutdown();
- if (updateServer != null) {
- updateServer.stop();
+ if (bgpThriftService != null) {
+ bgpThriftService.stop();
+ bgpThriftService = null;
+ }
+
+ if (isBgpConnected()) {
+ //disconnect the CONFIG SERVER port (which was )opened during I was Owner
+ bgpRouter.disconnect();
}
if (candidateRegistration != null) {
if (ownershipChange.getState() == EntityOwnershipChangeState.LOCAL_OWNERSHIP_GRANTED) {
LOG.trace("This PL is the Owner");
- activateMIP();
+ if (bgpThriftService != null) {
+ //opening UPDATE-SERVER port.
+ bgpThriftService.start();
+ } else {
+ LOG.error("I am the owner of BGP entity, but bgpThriftService is not initialized yet");
+ }
bgpRestarted();
} else {
LOG.debug("Not owner: hasOwner: {}, isOwner: {}", ownershipChange.getState().hasOwner(),
ownershipChange.getState().isOwner());
+ if ((bgpThriftService != null) && (bgpThriftService.isBgpThriftServiceStarted())) {
+ //close the bgp Thrift Update-SERVER port opened on non-Entity Owner
+ bgpThriftService.stop();
+ bgpThriftService = null;
+ }
+ if (isBgpConnected()) {
+ //disconnect the CONFIG SERVER port (which was )opened during I was Owner
+ bgpRouter.disconnect();
+ }
}
});
}
package org.opendaylight.netvirt.bgpmanager.thrift.server;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
+import java.net.InetSocketAddress;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class BgpThriftService {
private static final Logger LOG = LoggerFactory.getLogger(BgpThriftService.class);
- private final int ourPort;
+ private final InetSocketAddress bgpThriftServerSocketAddr;
private final IBgpManager bgpManager;
private final BgpConfigurationManager bgpConfigManager;
private volatile TServer server;
private static ExecutorService threadPool = Executors.newFixedThreadPool(1, thriftServerThreadFactory);
private volatile Future ft;
- public BgpThriftService(int ourPort, IBgpManager bm, BgpConfigurationManager bgpConfigManager) {
- this.ourPort = ourPort;
+ public BgpThriftService(InetSocketAddress bgpThriftServerSocketAddr, IBgpManager bm,
+ BgpConfigurationManager bgpConfigManager) {
+ this.bgpThriftServerSocketAddr = bgpThriftServerSocketAddr;
bgpManager = bm;
this.bgpConfigManager = bgpConfigManager;
}
try {
BgpUpdater.Processor processor = new BgpUpdater.Processor(this);
- TNonblockingServerTransport trans = new TNonblockingServerSocket(ourPort);
+ TNonblockingServerTransport trans = new TNonblockingServerSocket(bgpThriftServerSocketAddr);
TThreadedSelectorServer.Args args = new TThreadedSelectorServer.Args(trans);
args.transportFactory(new TFramedTransport.Factory());
args.protocolFactory(new TBinaryProtocol.Factory());
ft = threadPool.submit(new BgpUpdateServer());
}
+ public boolean isBgpThriftServiceStarted() {
+ return ((ft == null) ? false : true);
+ }
+
public synchronized void stop() {
if (server != null) {
server.stop();
if (ft != null && !ft.isDone()) {
ft.cancel(true);
}
+ ft = null;
}
}