Set vpn-id/router-id metadata so it would not to override split-horizon bit
[netvirt.git] / vpnservice / natservice / natservice-impl / src / main / java / org / opendaylight / netvirt / 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.netvirt.natservice.internal;
9
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;
29
30 import java.util.concurrent.ArrayBlockingQueue;
31 import java.util.concurrent.BlockingQueue;
32
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;
56
57     public NatServiceProvider(RpcProviderRegistry rpcProviderRegistry) {
58         this.rpcProviderRegistry = rpcProviderRegistry;
59     }
60
61     public void setNotificationService(NotificationService notificationService) {
62         this.notificationService = notificationService;
63     }
64
65     public void setMdsalManager(IMdsalApiManager mdsalManager) {
66         this.mdsalManager = mdsalManager;
67     }
68
69     public void setBgpManager(IBgpManager bgpManager) {
70         LOG.debug("BGP Manager reference initialized");
71         this.bgpManager = bgpManager;
72     }
73
74     public void setFibManager(IFibManager fibManager) {
75         LOG.debug("FIB Manager reference initialized");
76         this.fibManager = fibManager;
77     }
78
79     public void setInterfaceManager(IInterfaceManager interfaceManager) {
80         this.interfaceManager = interfaceManager;
81     }
82
83     @Override
84     public void close() throws Exception {
85         floatingIpListener.close();
86         extNwListener.close();
87         externalNetworksChangeListener.close();
88         externalRouterListener.close();
89         routerPortsListener.close();
90     }
91
92     @Override
93     public void onSessionInitiated(ProviderContext session) {
94         LOG.info("NAT Manager Provider Session Initiated");
95         try {
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);
103
104             //Instantiate FloatingIPListener and set the MdsalManager and OdlInterfaceRpcService in it.
105             floatingIpListener = new FloatingIPListener(dataBroker);
106             floatingIpListener.setInterfaceManager(interfaceService);
107             floatingIpListener.setMdsalManager(mdsalManager);
108
109             //Instantiate ExternalNetworkListener and set the MdsalManager in it.
110             extNwListener = new ExternalNetworkListener(dataBroker);
111             extNwListener.setMdsalManager(mdsalManager);
112
113             //Instantiate NaptManager and set the IdManagerService in it.
114             naptManager = new NaptManager(dataBroker);
115             naptManager.setIdManager(idManager);
116
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();
127
128             //Instantiate NaptPacketInHandler and register it in the notification service.
129             naptPacketInHandler = new NaptPacketInHandler(eventDispatcher);
130             notificationService.registerNotificationListener(naptPacketInHandler);
131
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);
141
142             //Instantiate NaptSwitchSelector and set the dataBroker in it.
143             naptSwitchSelector = new NAPTSwitchSelector( dataBroker );
144
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);
160
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);
173
174             //Instantiate NaptFlowRemovedHandler and register it in the notification service.
175             naptFlowRemovedEventHandler = new NaptFlowRemovedEventHandler(eventDispatcher, dataBroker, naptPacketInHandler, mdsalManager, naptManager);
176             notificationService.registerNotificationListener(naptFlowRemovedEventHandler);
177
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);
184
185             SNATDefaultRouteProgrammer defaultRouteProgrammer = new SNATDefaultRouteProgrammer(mdsalManager);
186
187             externalRouterListener.setDefaultProgrammer(defaultRouteProgrammer);
188
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);
198
199             natNodeEventListener = new NatNodeEventListener(dataBroker,naptSwitchHA);
200
201             routerPortsListener = new RouterPortsListener(dataBroker);
202
203             RouterDpnChangeListener routerDpnChangeListener = new RouterDpnChangeListener(dataBroker);
204             routerDpnChangeListener.setDefaultProgrammer(defaultRouteProgrammer);
205             routerDpnChangeListener.setIdManager(idManager);
206             routerDpnChangeListener.setMdsalManager(mdsalManager);
207             routerDpnChangeListener.setNaptSwitchHA(naptSwitchHA);
208
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);
216         }
217     }
218 }