Bump versions by 0.1.0 for next dev cycle
[vpnservice.git] / natservice / natservice-impl / src / main / java / org / opendaylight / vpnservice / natservice / internal / NatServiceProvider.java
1 /*
2  * Copyright (c) 2016 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.vpnservice.natservice.internal;
9
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;
27
28 import java.util.concurrent.ArrayBlockingQueue;
29 import java.util.concurrent.BlockingQueue;
30
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;
52
53     public NatServiceProvider(RpcProviderRegistry rpcProviderRegistry) {
54         this.rpcProviderRegistry = rpcProviderRegistry;
55     }
56
57     public void setNotificationService(NotificationService notificationService) {
58         this.notificationService = notificationService;
59     }
60
61     public void setMdsalManager(IMdsalApiManager mdsalManager) {
62         this.mdsalManager = mdsalManager;
63     }
64
65     public void setBgpManager(IBgpManager bgpManager) {
66         LOG.debug("BGP Manager reference initialized");
67         this.bgpManager = bgpManager;
68     }
69
70     @Override
71     public void close() throws Exception {
72         floatingIpListener.close();
73         extNwListener.close();
74         externalNetworksChangeListener.close();
75         externalRouterListener.close();
76         routerPortsListener.close();
77     }
78
79     @Override
80     public void onSessionInitiated(ProviderContext session) {
81         LOG.info("NAT Manager Provider Session Initiated");
82         try {
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);
90
91             //Instantiate FloatingIPListener and set the MdsalManager and OdlInterfaceRpcService in it.
92             floatingIpListener = new FloatingIPListener(dataBroker);
93             floatingIpListener.setInterfaceManager(interfaceService);
94             floatingIpListener.setMdsalManager(mdsalManager);
95
96             //Instantiate ExternalNetworkListener and set the MdsalManager in it.
97             extNwListener = new ExternalNetworkListener(dataBroker);
98             extNwListener.setMdsalManager(mdsalManager);
99
100             //Instantiate NaptManager and set the IdManagerService in it.
101             naptManager = new NaptManager(dataBroker);
102             naptManager.setIdManager(idManager);
103
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();
111
112             //Instantiate NaptPacketInHandler and register it in the notification service.
113             naptPacketInHandler = new NaptPacketInHandler(eventDispatcher);
114             notificationService.registerNotificationListener(naptPacketInHandler);
115
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);
124
125             //Instantiate NaptSwitchSelector and set the dataBroker in it.
126             naptSwitchSelector = new NAPTSwitchSelector( dataBroker );
127
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);
142
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);
155
156             //Instantiate NaptFlowRemovedHandler and register it in the notification service.
157             naptFlowRemovedEventHandler = new NaptFlowRemovedEventHandler(eventDispatcher, dataBroker, naptPacketInHandler, mdsalManager, naptManager);
158             notificationService.registerNotificationListener(naptFlowRemovedEventHandler);
159
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);
166
167             SNATDefaultRouteProgrammer defaultRouteProgrammer = new SNATDefaultRouteProgrammer(mdsalManager);
168             DpnInVpnListener dpnInVpnListener = new DpnInVpnListener(dataBroker);
169             dpnInVpnListener.setDefaultProgrammer(defaultRouteProgrammer);
170             notificationService.registerNotificationListener(dpnInVpnListener);
171
172             externalRouterListener.setDefaultProgrammer(defaultRouteProgrammer);
173
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);
183
184             natNodeEventListener = new NatNodeEventListener(dataBroker,naptSwitchHA);
185
186             dpnInVpnListener.setNaptSwitchHA(naptSwitchHA);
187             dpnInVpnListener.setMdsalManager(mdsalManager);
188             dpnInVpnListener.setIdManager(idManager);
189
190             routerPortsListener = new RouterPortsListener(dataBroker);
191
192             RouterDpnChangeListener routerDpnChangeListener = new RouterDpnChangeListener(dataBroker);
193             routerDpnChangeListener.setDefaultProgrammer(defaultRouteProgrammer);
194             routerDpnChangeListener.setIdManager(idManager);
195             routerDpnChangeListener.setMdsalManager(mdsalManager);
196             routerDpnChangeListener.setNaptSwitchHA(naptSwitchHA);
197
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);
205         }
206     }
207 }