2 * Copyright (c) 2016 Ericsson India Global Services Pvt Ltd. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.vpnservice.natservice.internal;
10 import org.opendaylight.bgpmanager.api.IBgpManager;
11 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
12 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
13 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
14 import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;
15 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
16 import org.opendaylight.controller.md.sal.binding.api.NotificationService;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.IdManagerService;
18 import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rpcs.rev151003.OdlInterfaceRpcService;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fib.rpc.rev160121.FibRpcService;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.NeutronvpnService;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.vpn.rpc.rev160201.VpnRpcService;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingService;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rpcs.rev151217.ItmRpcService;
25 import org.slf4j.Logger;
26 import org.slf4j.LoggerFactory;
28 import java.util.concurrent.ArrayBlockingQueue;
29 import java.util.concurrent.BlockingQueue;
31 public class NatServiceProvider implements BindingAwareProvider, AutoCloseable {
32 private static final Logger LOG = LoggerFactory.getLogger(NatServiceProvider.class);
33 private IMdsalApiManager mdsalManager;
34 private RpcProviderRegistry rpcProviderRegistry;
35 private NotificationService notificationService;
36 private ItmRpcService itmManager;
37 private FloatingIPListener floatingIpListener;
38 private ExternalNetworkListener extNwListener;
39 private NaptManager naptManager;
40 private NaptEventHandler naptEventHandler;
41 private BlockingQueue<NAPTEntryEvent> naptEventQueue;
42 private ExternalNetworksChangeListener externalNetworksChangeListener;
43 private ExternalRoutersListener externalRouterListener;
44 private NaptPacketInHandler naptPacketInHandler;
45 private EventDispatcher eventDispatcher;
46 private IBgpManager bgpManager;
47 private NaptFlowRemovedEventHandler naptFlowRemovedEventHandler;
48 private InterfaceStateEventListener interfaceStateEventListener;
49 private NatNodeEventListener natNodeEventListener;
50 private NAPTSwitchSelector naptSwitchSelector;
51 private RouterPortsListener routerPortsListener;
53 public NatServiceProvider(RpcProviderRegistry rpcProviderRegistry) {
54 this.rpcProviderRegistry = rpcProviderRegistry;
57 public void setNotificationService(NotificationService notificationService) {
58 this.notificationService = notificationService;
61 public void setMdsalManager(IMdsalApiManager mdsalManager) {
62 this.mdsalManager = mdsalManager;
65 public void setBgpManager(IBgpManager bgpManager) {
66 LOG.debug("BGP Manager reference initialized");
67 this.bgpManager = bgpManager;
71 public void close() throws Exception {
72 floatingIpListener.close();
73 extNwListener.close();
74 externalNetworksChangeListener.close();
75 externalRouterListener.close();
76 routerPortsListener.close();
80 public void onSessionInitiated(ProviderContext session) {
81 LOG.info("NAT Manager Provider Session Initiated");
83 //Get the DataBroker, PacketProcessingService, IdManagerService and the OdlInterfaceRpcService instances
84 final DataBroker dataBroker = session.getSALService(DataBroker.class);
85 PacketProcessingService pktProcessingService = session.getRpcService(PacketProcessingService.class);
86 IdManagerService idManager = rpcProviderRegistry.getRpcService(IdManagerService.class);
87 OdlInterfaceRpcService interfaceService = rpcProviderRegistry.getRpcService(OdlInterfaceRpcService.class);
88 NeutronvpnService neutronvpnService = rpcProviderRegistry.getRpcService(NeutronvpnService.class);
89 itmManager = rpcProviderRegistry.getRpcService(ItmRpcService.class);
91 //Instantiate FloatingIPListener and set the MdsalManager and OdlInterfaceRpcService in it.
92 floatingIpListener = new FloatingIPListener(dataBroker);
93 floatingIpListener.setInterfaceManager(interfaceService);
94 floatingIpListener.setMdsalManager(mdsalManager);
96 //Instantiate ExternalNetworkListener and set the MdsalManager in it.
97 extNwListener = new ExternalNetworkListener(dataBroker);
98 extNwListener.setMdsalManager(mdsalManager);
100 //Instantiate NaptManager and set the IdManagerService in it.
101 naptManager = new NaptManager(dataBroker);
102 naptManager.setIdManager(idManager);
104 //Instantiate NaptEventHandler and start it as a Thread.
105 naptEventHandler = new NaptEventHandler(dataBroker);
106 naptEventHandler.setMdsalManager(mdsalManager);
107 naptEventHandler.setNaptManager(naptManager);
108 naptEventQueue = new ArrayBlockingQueue<>(NatConstants.EVENT_QUEUE_LENGTH);
109 eventDispatcher = new EventDispatcher(naptEventQueue, naptEventHandler);
110 new Thread(eventDispatcher).start();
112 //Instantiate NaptPacketInHandler and register it in the notification service.
113 naptPacketInHandler = new NaptPacketInHandler(eventDispatcher);
114 notificationService.registerNotificationListener(naptPacketInHandler);
116 //Floating ip Handler
117 VpnRpcService vpnService = rpcProviderRegistry.getRpcService(VpnRpcService.class);
118 FibRpcService fibService = rpcProviderRegistry.getRpcService(FibRpcService.class);
119 VpnFloatingIpHandler handler = new VpnFloatingIpHandler(vpnService, bgpManager, fibService);
120 handler.setBroker(dataBroker);
121 handler.setMdsalManager(mdsalManager);
122 handler.setListener(floatingIpListener);
123 floatingIpListener.setFloatingIpHandler(handler);
125 //Instantiate NaptSwitchSelector and set the dataBroker in it.
126 naptSwitchSelector = new NAPTSwitchSelector( dataBroker );
128 //Instantiate ExternalRouterListener and set the dataBroker in it.
129 externalRouterListener = new ExternalRoutersListener( dataBroker );
130 externalRouterListener.registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker );
131 externalRouterListener.setMdsalManager(mdsalManager);
132 externalRouterListener.setItmManager(itmManager);
133 externalRouterListener.setInterfaceManager(interfaceService);
134 externalRouterListener.setIdManager(idManager);
135 externalRouterListener.setNaptManager(naptManager);
136 externalRouterListener.setBgpManager(bgpManager);
137 externalRouterListener.setFibService(fibService);
138 externalRouterListener.setVpnService(vpnService);
139 externalRouterListener.setNaptSwitchSelector(naptSwitchSelector);
140 externalRouterListener.setNaptEventHandler(naptEventHandler);
141 externalRouterListener.setNaptPacketInHandler(naptPacketInHandler);
143 //Instantiate ExternalNetworksChangeListener and set the dataBroker in it.
144 externalNetworksChangeListener = new ExternalNetworksChangeListener( dataBroker );
145 externalNetworksChangeListener.registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
146 externalNetworksChangeListener.setMdsalManager(mdsalManager);
147 externalNetworksChangeListener.setInterfaceManager(interfaceService);
148 externalNetworksChangeListener.setFloatingIpListener(floatingIpListener);
149 externalNetworksChangeListener.setBgpManager(bgpManager);
150 externalNetworksChangeListener.setFibService(fibService);
151 externalNetworksChangeListener.setVpnService(vpnService);
152 externalNetworksChangeListener.setExternalRoutersListener(externalRouterListener);
153 externalNetworksChangeListener.setNaptManager(naptManager);
154 externalNetworksChangeListener.setExternalRoutersListener(externalRouterListener);
156 //Instantiate NaptFlowRemovedHandler and register it in the notification service.
157 naptFlowRemovedEventHandler = new NaptFlowRemovedEventHandler(eventDispatcher, dataBroker, naptPacketInHandler, mdsalManager, naptManager);
158 notificationService.registerNotificationListener(naptFlowRemovedEventHandler);
160 //Instantiate interfaceStateEventListener and set the MdsalManager in it.
161 interfaceStateEventListener = new InterfaceStateEventListener(dataBroker);
162 interfaceStateEventListener.setMdsalManager(mdsalManager);
163 interfaceStateEventListener.setFloatingIpListener(floatingIpListener);
164 interfaceStateEventListener.setNeutronVpnService(neutronvpnService);
165 interfaceStateEventListener.setNaptManager(naptManager);
167 SNATDefaultRouteProgrammer defaultRouteProgrammer = new SNATDefaultRouteProgrammer(mdsalManager);
168 DpnInVpnListener dpnInVpnListener = new DpnInVpnListener(dataBroker);
169 dpnInVpnListener.setDefaultProgrammer(defaultRouteProgrammer);
170 notificationService.registerNotificationListener(dpnInVpnListener);
172 externalRouterListener.setDefaultProgrammer(defaultRouteProgrammer);
174 NaptSwitchHA naptSwitchHA = new NaptSwitchHA(dataBroker,naptSwitchSelector);
175 naptSwitchHA.setIdManager(idManager);
176 naptSwitchHA.setInterfaceManager(interfaceService);
177 naptSwitchHA.setMdsalManager(mdsalManager);
178 naptSwitchHA.setItmManager(itmManager);
179 naptSwitchHA.setBgpManager(bgpManager);
180 naptSwitchHA.setFibService(fibService);
181 naptSwitchHA.setVpnService(vpnService);
182 naptSwitchHA.setExternalRoutersListener(externalRouterListener);
184 natNodeEventListener = new NatNodeEventListener(dataBroker,naptSwitchHA);
186 dpnInVpnListener.setNaptSwitchHA(naptSwitchHA);
187 dpnInVpnListener.setMdsalManager(mdsalManager);
188 dpnInVpnListener.setIdManager(idManager);
190 routerPortsListener = new RouterPortsListener(dataBroker);
192 RouterDpnChangeListener routerDpnChangeListener = new RouterDpnChangeListener(dataBroker);
193 routerDpnChangeListener.setDefaultProgrammer(defaultRouteProgrammer);
194 routerDpnChangeListener.setIdManager(idManager);
195 routerDpnChangeListener.setMdsalManager(mdsalManager);
196 routerDpnChangeListener.setNaptSwitchHA(naptSwitchHA);
198 RouterToVpnListener routerToVpnListener = new RouterToVpnListener(dataBroker);
199 routerToVpnListener.setFloatingIpListener(floatingIpListener);
200 routerToVpnListener.setInterfaceManager(interfaceService);
201 routerToVpnListener.setExternalRoutersListener(externalRouterListener);
202 notificationService.registerNotificationListener(routerToVpnListener);
203 } catch (Exception e) {
204 LOG.error("Error initializing NAT Manager service", e);