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.netvirt.natservice.internal;
10 import org.opendaylight.netvirt.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.netvirt.fibmanager.api.IFibManager;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
19 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
20 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fib.rpc.rev160121.FibRpcService;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.NeutronvpnService;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.vpn.rpc.rev160201.VpnRpcService;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingService;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.ItmRpcService;
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
30 import java.util.concurrent.ArrayBlockingQueue;
31 import java.util.concurrent.BlockingQueue;
33 public class NatServiceProvider implements BindingAwareProvider, AutoCloseable {
34 private static final Logger LOG = LoggerFactory.getLogger(NatServiceProvider.class);
35 private IMdsalApiManager mdsalManager;
36 private RpcProviderRegistry rpcProviderRegistry;
37 private NotificationService notificationService;
38 private ItmRpcService itmManager;
39 private FloatingIPListener floatingIpListener;
40 private ExternalNetworkListener extNwListener;
41 private NaptManager naptManager;
42 private NaptEventHandler naptEventHandler;
43 private BlockingQueue<NAPTEntryEvent> naptEventQueue;
44 private ExternalNetworksChangeListener externalNetworksChangeListener;
45 private ExternalRoutersListener externalRouterListener;
46 private NaptPacketInHandler naptPacketInHandler;
47 private EventDispatcher eventDispatcher;
48 private IBgpManager bgpManager;
49 private NaptFlowRemovedEventHandler naptFlowRemovedEventHandler;
50 private InterfaceStateEventListener interfaceStateEventListener;
51 private NatNodeEventListener natNodeEventListener;
52 private NAPTSwitchSelector naptSwitchSelector;
53 private RouterPortsListener routerPortsListener;
54 private IInterfaceManager interfaceManager;
55 private IFibManager fibManager;
57 public NatServiceProvider(RpcProviderRegistry rpcProviderRegistry) {
58 this.rpcProviderRegistry = rpcProviderRegistry;
61 public void setNotificationService(NotificationService notificationService) {
62 this.notificationService = notificationService;
65 public void setMdsalManager(IMdsalApiManager mdsalManager) {
66 this.mdsalManager = mdsalManager;
69 public void setBgpManager(IBgpManager bgpManager) {
70 LOG.debug("BGP Manager reference initialized");
71 this.bgpManager = bgpManager;
74 public void setFibManager(IFibManager fibManager) {
75 LOG.debug("FIB Manager reference initialized");
76 this.fibManager = fibManager;
79 public void setInterfaceManager(IInterfaceManager interfaceManager) {
80 this.interfaceManager = interfaceManager;
84 public void close() throws Exception {
85 floatingIpListener.close();
86 extNwListener.close();
87 externalNetworksChangeListener.close();
88 externalRouterListener.close();
89 routerPortsListener.close();
93 public void onSessionInitiated(ProviderContext session) {
94 LOG.info("NAT Manager Provider Session Initiated");
96 //Get the DataBroker, PacketProcessingService, IdManagerService and the OdlInterfaceRpcService instances
97 final DataBroker dataBroker = session.getSALService(DataBroker.class);
98 PacketProcessingService pktProcessingService = session.getRpcService(PacketProcessingService.class);
99 IdManagerService idManager = rpcProviderRegistry.getRpcService(IdManagerService.class);
100 OdlInterfaceRpcService interfaceService = rpcProviderRegistry.getRpcService(OdlInterfaceRpcService.class);
101 NeutronvpnService neutronvpnService = rpcProviderRegistry.getRpcService(NeutronvpnService.class);
102 itmManager = rpcProviderRegistry.getRpcService(ItmRpcService.class);
104 //Instantiate FloatingIPListener and set the MdsalManager and OdlInterfaceRpcService in it.
105 floatingIpListener = new FloatingIPListener(dataBroker);
106 floatingIpListener.setInterfaceManager(interfaceService);
107 floatingIpListener.setMdsalManager(mdsalManager);
109 //Instantiate ExternalNetworkListener and set the MdsalManager in it.
110 extNwListener = new ExternalNetworkListener(dataBroker);
111 extNwListener.setMdsalManager(mdsalManager);
113 //Instantiate NaptManager and set the IdManagerService in it.
114 naptManager = new NaptManager(dataBroker);
115 naptManager.setIdManager(idManager);
117 //Instantiate NaptEventHandler and start it as a Thread.
118 naptEventHandler = new NaptEventHandler(dataBroker);
119 naptEventHandler.setMdsalManager(mdsalManager);
120 naptEventHandler.setNaptManager(naptManager);
121 naptEventHandler.setPacketProcessingService(pktProcessingService);
122 naptEventHandler.setInterfaceManagerRpc(interfaceService);
123 naptEventHandler.setInterfaceManager(interfaceManager);
124 naptEventQueue = new ArrayBlockingQueue<>(NatConstants.EVENT_QUEUE_LENGTH);
125 eventDispatcher = new EventDispatcher(naptEventQueue, naptEventHandler);
126 new Thread(eventDispatcher, "NaptEvents").start();
128 //Instantiate NaptPacketInHandler and register it in the notification service.
129 naptPacketInHandler = new NaptPacketInHandler(eventDispatcher);
130 notificationService.registerNotificationListener(naptPacketInHandler);
132 //Floating ip Handler
133 VpnRpcService vpnService = rpcProviderRegistry.getRpcService(VpnRpcService.class);
134 FibRpcService fibService = rpcProviderRegistry.getRpcService(FibRpcService.class);
135 VpnFloatingIpHandler handler = new VpnFloatingIpHandler(vpnService, bgpManager, fibService);
136 handler.setBroker(dataBroker);
137 handler.setMdsalManager(mdsalManager);
138 handler.setFibManager(fibManager);
139 handler.setListener(floatingIpListener);
140 floatingIpListener.setFloatingIpHandler(handler);
142 //Instantiate NaptSwitchSelector and set the dataBroker in it.
143 naptSwitchSelector = new NAPTSwitchSelector( dataBroker );
145 //Instantiate ExternalRouterListener and set the dataBroker in it.
146 externalRouterListener = new ExternalRoutersListener( dataBroker );
147 externalRouterListener.registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker );
148 externalRouterListener.setMdsalManager(mdsalManager);
149 externalRouterListener.setItmManager(itmManager);
150 externalRouterListener.setInterfaceManager(interfaceService);
151 externalRouterListener.setIdManager(idManager);
152 externalRouterListener.setNaptManager(naptManager);
153 externalRouterListener.setBgpManager(bgpManager);
154 externalRouterListener.setFibService(fibService);
155 externalRouterListener.setVpnService(vpnService);
156 externalRouterListener.setNaptSwitchSelector(naptSwitchSelector);
157 externalRouterListener.setNaptEventHandler(naptEventHandler);
158 externalRouterListener.setNaptPacketInHandler(naptPacketInHandler);
159 externalRouterListener.setFibManager(fibManager);
161 //Instantiate ExternalNetworksChangeListener and set the dataBroker in it.
162 externalNetworksChangeListener = new ExternalNetworksChangeListener( dataBroker );
163 externalNetworksChangeListener.registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
164 externalNetworksChangeListener.setMdsalManager(mdsalManager);
165 externalNetworksChangeListener.setInterfaceManager(interfaceService);
166 externalNetworksChangeListener.setFloatingIpListener(floatingIpListener);
167 externalNetworksChangeListener.setBgpManager(bgpManager);
168 externalNetworksChangeListener.setFibService(fibService);
169 externalNetworksChangeListener.setVpnService(vpnService);
170 externalNetworksChangeListener.setExternalRoutersListener(externalRouterListener);
171 externalNetworksChangeListener.setNaptManager(naptManager);
172 externalNetworksChangeListener.setExternalRoutersListener(externalRouterListener);
174 //Instantiate NaptFlowRemovedHandler and register it in the notification service.
175 naptFlowRemovedEventHandler = new NaptFlowRemovedEventHandler(eventDispatcher, dataBroker, naptPacketInHandler, mdsalManager, naptManager);
176 notificationService.registerNotificationListener(naptFlowRemovedEventHandler);
178 //Instantiate interfaceStateEventListener and set the MdsalManager in it.
179 interfaceStateEventListener = new InterfaceStateEventListener(dataBroker);
180 interfaceStateEventListener.setMdsalManager(mdsalManager);
181 interfaceStateEventListener.setFloatingIpListener(floatingIpListener);
182 interfaceStateEventListener.setNeutronVpnService(neutronvpnService);
183 interfaceStateEventListener.setNaptManager(naptManager);
185 SNATDefaultRouteProgrammer defaultRouteProgrammer = new SNATDefaultRouteProgrammer(mdsalManager);
187 externalRouterListener.setDefaultProgrammer(defaultRouteProgrammer);
189 NaptSwitchHA naptSwitchHA = new NaptSwitchHA(dataBroker,naptSwitchSelector);
190 naptSwitchHA.setIdManager(idManager);
191 naptSwitchHA.setInterfaceManager(interfaceService);
192 naptSwitchHA.setMdsalManager(mdsalManager);
193 naptSwitchHA.setItmManager(itmManager);
194 naptSwitchHA.setBgpManager(bgpManager);
195 naptSwitchHA.setFibService(fibService);
196 naptSwitchHA.setVpnService(vpnService);
197 naptSwitchHA.setExternalRoutersListener(externalRouterListener);
199 natNodeEventListener = new NatNodeEventListener(dataBroker,naptSwitchHA);
201 routerPortsListener = new RouterPortsListener(dataBroker);
203 RouterDpnChangeListener routerDpnChangeListener = new RouterDpnChangeListener(dataBroker);
204 routerDpnChangeListener.setDefaultProgrammer(defaultRouteProgrammer);
205 routerDpnChangeListener.setIdManager(idManager);
206 routerDpnChangeListener.setMdsalManager(mdsalManager);
207 routerDpnChangeListener.setNaptSwitchHA(naptSwitchHA);
209 RouterToVpnListener routerToVpnListener = new RouterToVpnListener(dataBroker);
210 routerToVpnListener.setFloatingIpListener(floatingIpListener);
211 routerToVpnListener.setInterfaceManager(interfaceService);
212 routerToVpnListener.setExternalRoutersListener(externalRouterListener);
213 notificationService.registerNotificationListener(routerToVpnListener);
214 } catch (Exception e) {
215 LOG.error("Error initializing NAT Manager service", e);