Merge "Bug 1806 - Null destination InetAddress in OF13Provider.handleInterfaceUpdate"
[ovsdb.git] / openstack / net-virt / src / main / java / org / opendaylight / ovsdb / openstack / netvirt / Activator.java
1 /*
2  * Copyright (C) 2013 Red Hat, Inc.
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  * Authors : Madhu Venugopal, Brent Salisbury, Dave Tucker
9  */
10
11 package org.opendaylight.ovsdb.openstack.netvirt;
12
13 import java.util.Properties;
14
15 import org.apache.felix.dm.Component;
16 import org.opendaylight.controller.networkconfig.neutron.INeutronFirewallAware;
17 import org.opendaylight.controller.networkconfig.neutron.INeutronFirewallPolicyAware;
18 import org.opendaylight.controller.networkconfig.neutron.INeutronFirewallRuleAware;
19 import org.opendaylight.controller.networkconfig.neutron.INeutronFloatingIPAware;
20 import org.opendaylight.controller.networkconfig.neutron.INeutronLoadBalancerAware;
21 import org.opendaylight.controller.networkconfig.neutron.INeutronLoadBalancerCRUD;
22 import org.opendaylight.controller.networkconfig.neutron.INeutronLoadBalancerPoolAware;
23 import org.opendaylight.controller.networkconfig.neutron.INeutronLoadBalancerPoolCRUD;
24 import org.opendaylight.controller.networkconfig.neutron.INeutronLoadBalancerPoolMemberAware;
25 import org.opendaylight.controller.networkconfig.neutron.INeutronNetworkAware;
26 import org.opendaylight.controller.networkconfig.neutron.INeutronNetworkCRUD;
27 import org.opendaylight.controller.networkconfig.neutron.INeutronPortAware;
28 import org.opendaylight.controller.networkconfig.neutron.INeutronPortCRUD;
29 import org.opendaylight.controller.networkconfig.neutron.INeutronRouterAware;
30 import org.opendaylight.controller.networkconfig.neutron.INeutronSecurityGroupAware;
31 import org.opendaylight.controller.networkconfig.neutron.INeutronSecurityRuleAware;
32 import org.opendaylight.controller.networkconfig.neutron.INeutronSubnetAware;
33 import org.opendaylight.controller.networkconfig.neutron.INeutronSubnetCRUD;
34 import org.opendaylight.controller.sal.core.ComponentActivatorAbstractBase;
35 import org.opendaylight.controller.switchmanager.IInventoryListener;
36 import org.opendaylight.controller.switchmanager.ISwitchManager;
37 import org.opendaylight.ovsdb.openstack.netvirt.api.ArpProvider;
38 import org.opendaylight.ovsdb.openstack.netvirt.api.BridgeConfigurationManager;
39 import org.opendaylight.ovsdb.openstack.netvirt.api.Constants;
40 import org.opendaylight.ovsdb.openstack.netvirt.api.EventDispatcher;
41 import org.opendaylight.ovsdb.openstack.netvirt.api.InboundNatProvider;
42 import org.opendaylight.ovsdb.openstack.netvirt.api.L3ForwardingProvider;
43 import org.opendaylight.ovsdb.openstack.netvirt.api.LoadBalancerProvider;
44 import org.opendaylight.ovsdb.openstack.netvirt.api.MultiTenantAwareRouter;
45 import org.opendaylight.ovsdb.openstack.netvirt.api.NetworkingProvider;
46 import org.opendaylight.ovsdb.openstack.netvirt.api.NetworkingProviderManager;
47 import org.opendaylight.ovsdb.openstack.netvirt.api.OutboundNatProvider;
48 import org.opendaylight.ovsdb.openstack.netvirt.api.RoutingProvider;
49 import org.opendaylight.ovsdb.openstack.netvirt.api.SecurityServicesManager;
50 import org.opendaylight.ovsdb.openstack.netvirt.api.TenantNetworkManager;
51 import org.opendaylight.ovsdb.openstack.netvirt.api.VlanConfigurationCache;
52 import org.opendaylight.ovsdb.openstack.netvirt.impl.BridgeConfigurationManagerImpl;
53 import org.opendaylight.ovsdb.openstack.netvirt.impl.ConfigurationServiceImpl;
54 import org.opendaylight.ovsdb.openstack.netvirt.impl.EventDispatcherImpl;
55 import org.opendaylight.ovsdb.openstack.netvirt.impl.NeutronL3Adapter;
56 import org.opendaylight.ovsdb.openstack.netvirt.impl.OpenstackRouter;
57 import org.opendaylight.ovsdb.openstack.netvirt.impl.ProviderNetworkManagerImpl;
58 import org.opendaylight.ovsdb.openstack.netvirt.impl.SecurityServicesImpl;
59 import org.opendaylight.ovsdb.openstack.netvirt.impl.TenantNetworkManagerImpl;
60 import org.opendaylight.ovsdb.openstack.netvirt.impl.VlanConfigurationCacheImpl;
61 import org.opendaylight.ovsdb.plugin.api.OvsdbConfigurationService;
62 import org.opendaylight.ovsdb.plugin.api.OvsdbConnectionService;
63 import org.opendaylight.ovsdb.plugin.api.OvsdbInventoryListener;
64
65 /**
66  * OSGi bundle activator for the OVSDB Neutron Interface.
67  */
68 public class Activator extends ComponentActivatorAbstractBase {
69     /**
70      * Function called when the activator starts just after some
71      * initializations are done by the
72      * ComponentActivatorAbstractBase.
73      */
74     @Override
75     public void init() {
76     }
77
78     /**
79      * Function called when the activator stops just before the
80      * cleanup done by ComponentActivatorAbstractBase.
81      *
82      */
83     @Override
84     public void destroy() {
85     }
86
87     /**
88      * Function that is used to communicate to dependency manager the
89      * list of known implementations for services inside a container.
90      *
91      * @return An array containing all the CLASS objects that will be
92      * instantiated in order to get an fully working implementation
93      * Object
94      */
95     @Override
96     public Object[] getImplementations() {
97         Object[] res = {ConfigurationServiceImpl.class,
98                         BridgeConfigurationManagerImpl.class,
99                         TenantNetworkManagerImpl.class,
100                         VlanConfigurationCacheImpl.class,
101                         FloatingIPHandler.class,
102                         NetworkHandler.class,
103                         SubnetHandler.class,
104                         PortHandler.class,
105                         RouterHandler.class,
106                         SouthboundHandler.class,
107                         PortSecurityHandler.class,
108                         ProviderNetworkManagerImpl.class,
109                         EventDispatcherImpl.class,
110                         FWaasHandler.class,
111                         LBaaSHandler.class,
112                         LBaaSPoolHandler.class,
113                         LBaaSPoolMemberHandler.class,
114                         NeutronL3Adapter.class,
115                         OpenstackRouter.class,
116                         SecurityServicesImpl.class};
117         return res;
118     }
119
120     /**
121      * Function that is called when configuration of the dependencies
122      * is required.
123      *
124      * @param c dependency manager Component object, used for
125      * configuring the dependencies exported and imported
126      * @param imp Implementation class that is being configured,
127      * needed as long as the same routine can configure multiple
128      * implementations
129      * @param containerName The containerName being configured, this allow
130      * also optional per-container different behavior if needed, usually
131      * should not be the case though.
132      */
133     @Override
134     public void configureInstance(Component c, Object imp,
135                                   String containerName) {
136         if (imp.equals(ConfigurationServiceImpl.class)) {
137             c.setInterface(org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService.class.getName(), null);
138             c.add(createServiceDependency().setService(OvsdbConfigurationService.class));
139         }
140
141         if (imp.equals(BridgeConfigurationManagerImpl.class)) {
142             c.setInterface(BridgeConfigurationManager.class.getName(), null);
143             c.add(createServiceDependency().setService(
144                     org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService.class).setRequired(true));
145             c.add(createServiceDependency().setService(NetworkingProviderManager.class));
146             c.add(createServiceDependency().setService(OvsdbConfigurationService.class));
147         }
148
149         if (imp.equals(TenantNetworkManagerImpl.class)) {
150             c.setInterface(TenantNetworkManager.class.getName(), null);
151             c.add(createServiceDependency().setService(NetworkingProviderManager.class));
152             c.add(createServiceDependency().setService(OvsdbConfigurationService.class));
153             c.add(createServiceDependency().setService(OvsdbConnectionService.class));
154             c.add(createServiceDependency().
155                     setService(INeutronNetworkCRUD.class).
156                     setRequired(true));
157             c.add(createServiceDependency().
158                     setService(INeutronPortCRUD.class).
159                     setRequired(true));
160             c.add(createServiceDependency().setService(VlanConfigurationCache.class));
161         }
162
163         if (imp.equals(VlanConfigurationCacheImpl.class)) {
164             c.setInterface(VlanConfigurationCache.class.getName(), null);
165             c.add(createServiceDependency().setService(OvsdbConfigurationService.class));
166             c.add(createServiceDependency().setService(TenantNetworkManager.class));
167         }
168
169         if (imp.equals(FloatingIPHandler.class)) {
170             Properties floatingIPHandlerPorperties = new Properties();
171             floatingIPHandlerPorperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
172                                             AbstractEvent.HandlerType.NEUTRON_FLOATING_IP);
173             c.setInterface(new String[]{INeutronFloatingIPAware.class.getName(),
174                                         AbstractHandler.class.getName()},
175                            floatingIPHandlerPorperties);
176             c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
177             c.add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true));
178         }
179
180         if (imp.equals(NetworkHandler.class)) {
181             Properties networkHandlerProperties = new Properties();
182             networkHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
183                                          AbstractEvent.HandlerType.NEUTRON_NETWORK);
184             c.setInterface(new String[]{INeutronNetworkAware.class.getName(),
185                                         AbstractHandler.class.getName()},
186                            networkHandlerProperties);
187             c.add(createServiceDependency().setService(TenantNetworkManager.class).setRequired(true));
188             c.add(createServiceDependency().setService(BridgeConfigurationManager.class).setRequired(true));
189             c.add(createServiceDependency().setService(
190                     org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService.class).setRequired(true));
191             c.add(createServiceDependency().setService(OvsdbConfigurationService.class).setRequired(true));
192             c.add(createServiceDependency().setService(OvsdbConnectionService.class).setRequired(true));
193             c.add(createServiceDependency().setService(INeutronNetworkCRUD.class).setRequired(true));
194             c.add(createServiceDependency().setService(OvsdbInventoryListener.class).setRequired(true));
195             c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
196             c.add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true));
197         }
198
199         if (imp.equals(SubnetHandler.class)) {
200             Properties subnetHandlerProperties = new Properties();
201             subnetHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.NEUTRON_SUBNET);
202             c.setInterface(new String[]{INeutronSubnetAware.class.getName(),
203                                         AbstractHandler.class.getName()},
204                            subnetHandlerProperties);
205             c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
206             c.add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true));
207         }
208
209         if (imp.equals(PortHandler.class)) {
210             Properties portHandlerProperties = new Properties();
211             portHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.NEUTRON_PORT);
212             c.setInterface(new String[]{INeutronPortAware.class.getName(),
213                                         AbstractHandler.class.getName()},
214                            portHandlerProperties);
215             c.add(createServiceDependency().setService(OvsdbConfigurationService.class).setRequired(true));
216             c.add(createServiceDependency().setService(OvsdbConnectionService.class).setRequired(true));
217             c.add(createServiceDependency().setService(OvsdbInventoryListener.class).setRequired(true));
218             c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
219             c.add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true));
220         }
221
222         if (imp.equals(RouterHandler.class)) {
223             Properties routerHandlerProperties = new Properties();
224             routerHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.NEUTRON_ROUTER);
225             c.setInterface(new String[]{INeutronRouterAware.class.getName(),
226                                         AbstractHandler.class.getName()},
227                            routerHandlerProperties);
228             c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
229             c.add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true));
230         }
231
232         if (imp.equals(SouthboundHandler.class)) {
233             Properties southboundHandlerProperties = new Properties();
234             southboundHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.SOUTHBOUND);
235             c.setInterface(new String[]{OvsdbInventoryListener.class.getName(),
236                                         IInventoryListener.class.getName(),
237                                         AbstractHandler.class.getName()},
238                            southboundHandlerProperties);
239             c.add(createServiceDependency().setService(
240                     org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService.class).setRequired(true));
241             c.add(createServiceDependency().setService(BridgeConfigurationManager.class).setRequired(true));
242             c.add(createServiceDependency().setService(TenantNetworkManager.class).setRequired(true));
243             c.add(createServiceDependency().setService(NetworkingProviderManager.class).setRequired(true));
244             c.add(createServiceDependency().setService(OvsdbConfigurationService.class).setRequired(true));
245             c.add(createServiceDependency().setService(OvsdbConnectionService.class).setRequired(true));
246             c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
247             c.add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true));
248         }
249
250         if (imp.equals(LBaaSHandler.class)) {
251             Properties lbaasHandlerProperties = new Properties();
252             lbaasHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
253                     AbstractEvent.HandlerType.NEUTRON_LOAD_BALANCER);
254             c.setInterface(new String[] {INeutronLoadBalancerAware.class.getName(),
255                     IInventoryListener.class.getName(),
256                     AbstractHandler.class.getName()},
257                     lbaasHandlerProperties);
258             c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
259             c.add(createServiceDependency().setService(INeutronPortCRUD.class).setRequired(true));
260             c.add(createServiceDependency().setService(INeutronLoadBalancerCRUD.class).setRequired(true));
261             c.add(createServiceDependency().setService(INeutronLoadBalancerPoolCRUD.class).setRequired(true));
262             c.add(createServiceDependency().setService(LoadBalancerProvider.class).setRequired(true));
263             c.add(createServiceDependency().setService(ISwitchManager.class).setRequired(true));
264             c.add(createServiceDependency().setService(INeutronNetworkCRUD.class).setRequired(true));
265             c.add(createServiceDependency().setService(INeutronSubnetCRUD.class).setRequired(true));
266         }
267
268         if (imp.equals(LBaaSPoolHandler.class)) {
269             Properties lbaasPoolHandlerProperties = new Properties();
270             lbaasPoolHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
271                     AbstractEvent.HandlerType.NEUTRON_LOAD_BALANCER_POOL);
272             c.setInterface(new String[] {INeutronLoadBalancerPoolAware.class.getName(),
273                     AbstractHandler.class.getName()},
274                     lbaasPoolHandlerProperties);
275             c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
276             c.add(createServiceDependency().setService(INeutronPortCRUD.class).setRequired(true));
277             c.add(createServiceDependency().setService(INeutronLoadBalancerCRUD.class).setRequired(true));
278             c.add(createServiceDependency().setService(LoadBalancerProvider.class).setRequired(true));
279             c.add(createServiceDependency().setService(ISwitchManager.class).setRequired(true));
280             c.add(createServiceDependency().setService(INeutronNetworkCRUD.class).setRequired(true));
281             c.add(createServiceDependency().setService(INeutronSubnetCRUD.class).setRequired(true));
282         }
283
284         if (imp.equals(LBaaSPoolMemberHandler.class)) {
285             Properties lbaasPoolMemberHandlerProperties = new Properties();
286             lbaasPoolMemberHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
287                     AbstractEvent.HandlerType.NEUTRON_LOAD_BALANCER_POOL_MEMBER);
288             c.setInterface(new String[] {INeutronLoadBalancerPoolMemberAware.class.getName(),
289                     AbstractHandler.class.getName()},
290                     lbaasPoolMemberHandlerProperties);
291             c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
292             c.add(createServiceDependency().setService(INeutronPortCRUD.class).setRequired(true));
293             c.add(createServiceDependency().setService(INeutronLoadBalancerCRUD.class).setRequired(true));
294             c.add(createServiceDependency().setService(INeutronLoadBalancerPoolCRUD.class).setRequired(true));
295             c.add(createServiceDependency().setService(LoadBalancerProvider.class).setRequired(true));
296             c.add(createServiceDependency().setService(ISwitchManager.class).setRequired(true));
297             c.add(createServiceDependency().setService(INeutronNetworkCRUD.class).setRequired(true));
298             c.add(createServiceDependency().setService(INeutronSubnetCRUD.class).setRequired(true));
299         }
300
301         if (imp.equals(PortSecurityHandler.class)) {
302             Properties portSecurityHandlerProperties = new Properties();
303             portSecurityHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
304                                               AbstractEvent.HandlerType.NEUTRON_PORT_SECURITY);
305             c.setInterface(new String[]{INeutronSecurityRuleAware.class.getName(),
306                                         INeutronSecurityGroupAware.class.getName(),
307                             AbstractHandler.class.getName()},
308                            portSecurityHandlerProperties);
309             c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
310             c.add(createServiceDependency().setService(SecurityServicesManager.class).setRequired(true));
311         }
312
313         if (imp.equals(SecurityServicesImpl.class)) {
314             c.setInterface(new String[] {SecurityServicesManager.class.getName()}, null);
315         }
316
317         if (imp.equals(FWaasHandler.class)) {
318             Properties fWaasHandlerProperties = new Properties();
319             fWaasHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.NEUTRON_FWAAS);
320             c.setInterface(new String[] {INeutronFirewallAware.class.getName(),
321                             INeutronFirewallRuleAware.class.getName(),
322                             INeutronFirewallPolicyAware.class.getName(),
323                             AbstractHandler.class.getName()},
324                     fWaasHandlerProperties);
325             c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
326         }
327
328         if (imp.equals(ProviderNetworkManagerImpl.class)) {
329             c.setInterface(NetworkingProviderManager.class.getName(), null);
330             c.add(createServiceDependency()
331                     .setService(org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService.class)
332                     .setRequired(true));
333             c.add(createServiceDependency()
334                     .setService(NetworkingProvider.class)
335                     .setCallbacks("providerAdded", "providerRemoved"));
336         }
337
338         if (imp.equals(EventDispatcherImpl.class)) {
339             c.setInterface(EventDispatcher.class.getName(), null);
340             c.add(createServiceDependency()
341                           .setService(AbstractHandler.class)
342                           .setCallbacks("eventHandlerAdded", "eventHandlerRemoved"));
343         }
344
345         if (imp.equals(NeutronL3Adapter.class)) {
346             c.setInterface(NeutronL3Adapter.class.getName(), null);
347             c.add(createServiceDependency()
348                           .setService(org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService.class)
349                           .setRequired(true));
350             c.add(createServiceDependency().setService(TenantNetworkManager.class).setRequired(true));
351             c.add(createServiceDependency().setService(NetworkingProviderManager.class).setRequired(true));
352             c.add(createServiceDependency().setService(OvsdbConfigurationService.class).setRequired(true));
353             c.add(createServiceDependency().setService(OvsdbConnectionService.class).setRequired(true));
354             c.add(createServiceDependency().setService(INeutronNetworkCRUD.class).setRequired(true));
355             c.add(createServiceDependency().setService(INeutronSubnetCRUD.class).setRequired(true));
356             c.add(createServiceDependency().setService(INeutronPortCRUD.class).setRequired(true));
357             c.add(createServiceDependency().setService(MultiTenantAwareRouter.class).setRequired(true));
358             /* ToDo, we should probably just use the NetworkingProvider interface
359              * This should provide a way of getting service implementations
360              * Either that, or we should do service lookup at runtime based on getProvider().getName()
361              * This is a shortcut as for now there will only be one implementation of these classes.
362              */
363             c.add(createServiceDependency().setService(ArpProvider.class).setRequired(false));
364             c.add(createServiceDependency().setService(InboundNatProvider.class).setRequired(false));
365             c.add(createServiceDependency().setService(OutboundNatProvider.class).setRequired(false));
366             c.add(createServiceDependency().setService(RoutingProvider.class).setRequired(false));
367             c.add(createServiceDependency().setService(L3ForwardingProvider.class).setRequired(false));
368         }
369
370         if (imp.equals(OpenstackRouter.class)) {
371             c.setInterface(MultiTenantAwareRouter.class.getName(), null);
372         }
373     }
374 }