Bug 1897 - Implementing NeutronLoadBalancerPoolAware interface
[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         }
265
266         if (imp.equals(LBaaSPoolHandler.class)) {
267             Properties lbaasPoolHandlerProperties = new Properties();
268             lbaasPoolHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
269                     AbstractEvent.HandlerType.NEUTRON_LOAD_BALANCER_POOL);
270             c.setInterface(new String[] {INeutronLoadBalancerPoolAware.class.getName(),
271                     AbstractHandler.class.getName()},
272                     lbaasPoolHandlerProperties);
273             c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
274             c.add(createServiceDependency().setService(INeutronPortCRUD.class).setRequired(true));
275             c.add(createServiceDependency().setService(INeutronLoadBalancerCRUD.class).setRequired(true));
276             c.add(createServiceDependency().setService(INeutronLoadBalancerPoolCRUD.class).setRequired(true));
277             c.add(createServiceDependency().setService(LoadBalancerProvider.class).setRequired(true));
278             c.add(createServiceDependency().setService(ISwitchManager.class).setRequired(true));
279         }
280
281         if (imp.equals(LBaaSPoolMemberHandler.class)) {
282             Properties lbaasPoolMemberHandlerProperties = new Properties();
283             lbaasPoolMemberHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
284                     AbstractEvent.HandlerType.NEUTRON_LOAD_BALANCER_POOL_MEMBER);
285             c.setInterface(new String[] {INeutronLoadBalancerPoolMemberAware.class.getName(),
286                     AbstractHandler.class.getName()},
287                     lbaasPoolMemberHandlerProperties);
288             c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
289             c.add(createServiceDependency().setService(INeutronPortCRUD.class).setRequired(true));
290             c.add(createServiceDependency().setService(INeutronLoadBalancerCRUD.class).setRequired(true));
291             c.add(createServiceDependency().setService(INeutronLoadBalancerPoolCRUD.class).setRequired(true));
292             c.add(createServiceDependency().setService(LoadBalancerProvider.class).setRequired(true));
293             c.add(createServiceDependency().setService(ISwitchManager.class).setRequired(true));
294         }
295
296         if (imp.equals(PortSecurityHandler.class)) {
297             Properties portSecurityHandlerProperties = new Properties();
298             portSecurityHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
299                                               AbstractEvent.HandlerType.NEUTRON_PORT_SECURITY);
300             c.setInterface(new String[]{INeutronSecurityRuleAware.class.getName(),
301                                         INeutronSecurityGroupAware.class.getName(),
302                             AbstractHandler.class.getName()},
303                            portSecurityHandlerProperties);
304             c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
305             c.add(createServiceDependency().setService(SecurityServicesManager.class).setRequired(true));
306         }
307
308         if (imp.equals(SecurityServicesImpl.class)) {
309             c.setInterface(new String[] {SecurityServicesManager.class.getName()}, null);
310         }
311
312         if (imp.equals(FWaasHandler.class)) {
313             Properties fWaasHandlerProperties = new Properties();
314             fWaasHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.NEUTRON_FWAAS);
315             c.setInterface(new String[] {INeutronFirewallAware.class.getName(),
316                             INeutronFirewallRuleAware.class.getName(),
317                             INeutronFirewallPolicyAware.class.getName(),
318                             AbstractHandler.class.getName()},
319                     fWaasHandlerProperties);
320             c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
321         }
322
323         if (imp.equals(ProviderNetworkManagerImpl.class)) {
324             c.setInterface(NetworkingProviderManager.class.getName(), null);
325             c.add(createServiceDependency()
326                     .setService(org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService.class)
327                     .setRequired(true));
328             c.add(createServiceDependency()
329                     .setService(NetworkingProvider.class)
330                     .setCallbacks("providerAdded", "providerRemoved"));
331         }
332
333         if (imp.equals(EventDispatcherImpl.class)) {
334             c.setInterface(EventDispatcher.class.getName(), null);
335             c.add(createServiceDependency()
336                           .setService(AbstractHandler.class)
337                           .setCallbacks("eventHandlerAdded", "eventHandlerRemoved"));
338         }
339
340         if (imp.equals(NeutronL3Adapter.class)) {
341             c.setInterface(NeutronL3Adapter.class.getName(), null);
342             c.add(createServiceDependency()
343                           .setService(org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService.class)
344                           .setRequired(true));
345             c.add(createServiceDependency().setService(TenantNetworkManager.class).setRequired(true));
346             c.add(createServiceDependency().setService(NetworkingProviderManager.class).setRequired(true));
347             c.add(createServiceDependency().setService(OvsdbConfigurationService.class).setRequired(true));
348             c.add(createServiceDependency().setService(OvsdbConnectionService.class).setRequired(true));
349             c.add(createServiceDependency().setService(INeutronNetworkCRUD.class).setRequired(true));
350             c.add(createServiceDependency().setService(INeutronSubnetCRUD.class).setRequired(true));
351             c.add(createServiceDependency().setService(INeutronPortCRUD.class).setRequired(true));
352             c.add(createServiceDependency().setService(MultiTenantAwareRouter.class).setRequired(true));
353             /* ToDo, we should probably just use the NetworkingProvider interface
354              * This should provide a way of getting service implementations
355              * Either that, or we should do service lookup at runtime based on getProvider().getName()
356              * This is a shortcut as for now there will only be one implementation of these classes.
357              */
358             c.add(createServiceDependency().setService(ArpProvider.class).setRequired(false));
359             c.add(createServiceDependency().setService(InboundNatProvider.class).setRequired(false));
360             c.add(createServiceDependency().setService(OutboundNatProvider.class).setRequired(false));
361             c.add(createServiceDependency().setService(RoutingProvider.class).setRequired(false));
362             c.add(createServiceDependency().setService(L3ForwardingProvider.class).setRequired(false));
363         }
364
365         if (imp.equals(OpenstackRouter.class)) {
366             c.setInterface(MultiTenantAwareRouter.class.getName(), null);
367         }
368     }
369 }