Merge "Combine ovssfc patches."
[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.INeutronLoadBalancerPoolCRUD;
23 import org.opendaylight.controller.networkconfig.neutron.INeutronLoadBalancerPoolMemberAware;
24 import org.opendaylight.controller.networkconfig.neutron.INeutronLoadBalancerPoolMemberCRUD;
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                         LBaaSPoolMemberHandler.class,
113                         NeutronL3Adapter.class,
114                         OpenstackRouter.class,
115                         SecurityServicesImpl.class};
116         return res;
117     }
118
119     /**
120      * Function that is called when configuration of the dependencies
121      * is required.
122      *
123      * @param c dependency manager Component object, used for
124      * configuring the dependencies exported and imported
125      * @param imp Implementation class that is being configured,
126      * needed as long as the same routine can configure multiple
127      * implementations
128      * @param containerName The containerName being configured, this allow
129      * also optional per-container different behavior if needed, usually
130      * should not be the case though.
131      */
132     @Override
133     public void configureInstance(Component c, Object imp,
134                                   String containerName) {
135         if (imp.equals(ConfigurationServiceImpl.class)) {
136             c.setInterface(org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService.class.getName(), null);
137             c.add(createServiceDependency().setService(OvsdbConfigurationService.class));
138         }
139
140         if (imp.equals(BridgeConfigurationManagerImpl.class)) {
141             c.setInterface(BridgeConfigurationManager.class.getName(), null);
142             c.add(createServiceDependency().setService(
143                     org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService.class).setRequired(true));
144             c.add(createServiceDependency().setService(NetworkingProviderManager.class));
145             c.add(createServiceDependency().setService(OvsdbConfigurationService.class));
146         }
147
148         if (imp.equals(TenantNetworkManagerImpl.class)) {
149             c.setInterface(TenantNetworkManager.class.getName(), null);
150             c.add(createServiceDependency().setService(NetworkingProviderManager.class));
151             c.add(createServiceDependency().setService(OvsdbConfigurationService.class));
152             c.add(createServiceDependency().setService(OvsdbConnectionService.class));
153             c.add(createServiceDependency().
154                     setService(INeutronNetworkCRUD.class).
155                     setRequired(true));
156             c.add(createServiceDependency().
157                     setService(INeutronPortCRUD.class).
158                     setRequired(true));
159             c.add(createServiceDependency().setService(VlanConfigurationCache.class));
160         }
161
162         if (imp.equals(VlanConfigurationCacheImpl.class)) {
163             c.setInterface(VlanConfigurationCache.class.getName(), null);
164             c.add(createServiceDependency().setService(OvsdbConfigurationService.class));
165             c.add(createServiceDependency().setService(TenantNetworkManager.class));
166         }
167
168         if (imp.equals(FloatingIPHandler.class)) {
169             Properties floatingIPHandlerPorperties = new Properties();
170             floatingIPHandlerPorperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
171                                             AbstractEvent.HandlerType.NEUTRON_FLOATING_IP);
172             c.setInterface(new String[]{INeutronFloatingIPAware.class.getName(),
173                                         AbstractHandler.class.getName()},
174                            floatingIPHandlerPorperties);
175             c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
176             c.add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true));
177         }
178
179         if (imp.equals(NetworkHandler.class)) {
180             Properties networkHandlerProperties = new Properties();
181             networkHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
182                                          AbstractEvent.HandlerType.NEUTRON_NETWORK);
183             c.setInterface(new String[]{INeutronNetworkAware.class.getName(),
184                                         AbstractHandler.class.getName()},
185                            networkHandlerProperties);
186             c.add(createServiceDependency().setService(TenantNetworkManager.class).setRequired(true));
187             c.add(createServiceDependency().setService(BridgeConfigurationManager.class).setRequired(true));
188             c.add(createServiceDependency().setService(
189                     org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService.class).setRequired(true));
190             c.add(createServiceDependency().setService(OvsdbConfigurationService.class).setRequired(true));
191             c.add(createServiceDependency().setService(OvsdbConnectionService.class).setRequired(true));
192             c.add(createServiceDependency().setService(INeutronNetworkCRUD.class).setRequired(true));
193             c.add(createServiceDependency().setService(OvsdbInventoryListener.class).setRequired(true));
194             c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
195             c.add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true));
196         }
197
198         if (imp.equals(SubnetHandler.class)) {
199             Properties subnetHandlerProperties = new Properties();
200             subnetHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.NEUTRON_SUBNET);
201             c.setInterface(new String[]{INeutronSubnetAware.class.getName(),
202                                         AbstractHandler.class.getName()},
203                            subnetHandlerProperties);
204             c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
205             c.add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true));
206         }
207
208         if (imp.equals(PortHandler.class)) {
209             Properties portHandlerProperties = new Properties();
210             portHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.NEUTRON_PORT);
211             c.setInterface(new String[]{INeutronPortAware.class.getName(),
212                                         AbstractHandler.class.getName()},
213                            portHandlerProperties);
214             c.add(createServiceDependency().setService(OvsdbConfigurationService.class).setRequired(true));
215             c.add(createServiceDependency().setService(OvsdbConnectionService.class).setRequired(true));
216             c.add(createServiceDependency().setService(OvsdbInventoryListener.class).setRequired(true));
217             c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
218             c.add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true));
219         }
220
221         if (imp.equals(RouterHandler.class)) {
222             Properties routerHandlerProperties = new Properties();
223             routerHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.NEUTRON_ROUTER);
224             c.setInterface(new String[]{INeutronRouterAware.class.getName(),
225                                         AbstractHandler.class.getName()},
226                            routerHandlerProperties);
227             c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
228             c.add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true));
229         }
230
231         if (imp.equals(SouthboundHandler.class)) {
232             Properties southboundHandlerProperties = new Properties();
233             southboundHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.SOUTHBOUND);
234             c.setInterface(new String[]{OvsdbInventoryListener.class.getName(),
235                                         IInventoryListener.class.getName(),
236                                         AbstractHandler.class.getName()},
237                            southboundHandlerProperties);
238             c.add(createServiceDependency().setService(
239                     org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService.class).setRequired(true));
240             c.add(createServiceDependency().setService(BridgeConfigurationManager.class).setRequired(true));
241             c.add(createServiceDependency().setService(TenantNetworkManager.class).setRequired(true));
242             c.add(createServiceDependency().setService(NetworkingProviderManager.class).setRequired(true));
243             c.add(createServiceDependency().setService(OvsdbConfigurationService.class).setRequired(true));
244             c.add(createServiceDependency().setService(OvsdbConnectionService.class).setRequired(true));
245             c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
246             c.add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true));
247         }
248
249         if (imp.equals(LBaaSHandler.class)) {
250             Properties lbaasHandlerProperties = new Properties();
251             lbaasHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
252                     AbstractEvent.HandlerType.NEUTRON_LOAD_BALANCER);
253             c.setInterface(new String[] {INeutronLoadBalancerAware.class.getName()},
254                                          lbaasHandlerProperties);
255             c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
256             c.add(createServiceDependency().setService(INeutronPortCRUD.class).setRequired(true));
257             c.add(createServiceDependency().setService(INeutronLoadBalancerCRUD.class).setRequired(true));
258             c.add(createServiceDependency().setService(INeutronLoadBalancerPoolCRUD.class).setRequired(true));
259             c.add(createServiceDependency().setService(INeutronLoadBalancerPoolMemberCRUD.class).setRequired(true));
260             c.add(createServiceDependency().setService(LoadBalancerProvider.class).setRequired(true));
261             c.add(createServiceDependency().setService(ISwitchManager.class).setRequired(true));
262         }
263
264         if (imp.equals(LBaaSPoolMemberHandler.class)) {
265             Properties lbaasPoolMemberHandlerProperties = new Properties();
266             lbaasPoolMemberHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
267                     AbstractEvent.HandlerType.NEUTRON_LOAD_BALANCER_POOL_MEMBER);
268             c.setInterface(new String[] {INeutronLoadBalancerPoolMemberAware.class.getName()},
269                                          lbaasPoolMemberHandlerProperties);
270             c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
271             c.add(createServiceDependency().setService(INeutronPortCRUD.class).setRequired(true));
272             c.add(createServiceDependency().setService(INeutronLoadBalancerCRUD.class).setRequired(true));
273             c.add(createServiceDependency().setService(INeutronLoadBalancerPoolCRUD.class).setRequired(true));
274             c.add(createServiceDependency().setService(LoadBalancerProvider.class).setRequired(true));
275             c.add(createServiceDependency().setService(ISwitchManager.class).setRequired(true));
276         }
277
278         if (imp.equals(PortSecurityHandler.class)) {
279             Properties portSecurityHandlerProperties = new Properties();
280             portSecurityHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
281                                               AbstractEvent.HandlerType.NEUTRON_PORT_SECURITY);
282             c.setInterface(new String[]{INeutronSecurityRuleAware.class.getName(),
283                                         INeutronSecurityGroupAware.class.getName(),
284                             AbstractHandler.class.getName()},
285                            portSecurityHandlerProperties);
286             c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
287             c.add(createServiceDependency().setService(SecurityServicesManager.class).setRequired(true));
288         }
289
290         if (imp.equals(SecurityServicesImpl.class)) {
291             c.setInterface(new String[] {SecurityServicesManager.class.getName()}, null);
292         }
293
294         if (imp.equals(FWaasHandler.class)) {
295             Properties fWaasHandlerProperties = new Properties();
296             fWaasHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.NEUTRON_FWAAS);
297             c.setInterface(new String[] {INeutronFirewallAware.class.getName(),
298                             INeutronFirewallRuleAware.class.getName(),
299                             INeutronFirewallPolicyAware.class.getName(),
300                             AbstractHandler.class.getName()},
301                     fWaasHandlerProperties);
302             c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
303         }
304
305         if (imp.equals(ProviderNetworkManagerImpl.class)) {
306             c.setInterface(NetworkingProviderManager.class.getName(), null);
307             c.add(createServiceDependency()
308                     .setService(org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService.class)
309                     .setRequired(true));
310             c.add(createServiceDependency()
311                     .setService(NetworkingProvider.class)
312                     .setCallbacks("providerAdded", "providerRemoved"));
313         }
314
315         if (imp.equals(EventDispatcherImpl.class)) {
316             c.setInterface(EventDispatcher.class.getName(), null);
317             c.add(createServiceDependency()
318                           .setService(AbstractHandler.class)
319                           .setCallbacks("eventHandlerAdded", "eventHandlerRemoved"));
320         }
321
322         if (imp.equals(NeutronL3Adapter.class)) {
323             c.setInterface(NeutronL3Adapter.class.getName(), null);
324             c.add(createServiceDependency()
325                           .setService(org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService.class)
326                           .setRequired(true));
327             c.add(createServiceDependency().setService(TenantNetworkManager.class).setRequired(true));
328             c.add(createServiceDependency().setService(NetworkingProviderManager.class).setRequired(true));
329             c.add(createServiceDependency().setService(OvsdbConfigurationService.class).setRequired(true));
330             c.add(createServiceDependency().setService(OvsdbConnectionService.class).setRequired(true));
331             c.add(createServiceDependency().setService(INeutronNetworkCRUD.class).setRequired(true));
332             c.add(createServiceDependency().setService(INeutronSubnetCRUD.class).setRequired(true));
333             c.add(createServiceDependency().setService(INeutronPortCRUD.class).setRequired(true));
334             c.add(createServiceDependency().setService(MultiTenantAwareRouter.class).setRequired(true));
335             /* ToDo, we should probably just use the NetworkingProvider interface
336              * This should provide a way of getting service implementations
337              * Either that, or we should do service lookup at runtime based on getProvider().getName()
338              * This is a shortcut as for now there will only be one implementation of these classes.
339              */
340             c.add(createServiceDependency().setService(ArpProvider.class).setRequired(false));
341             c.add(createServiceDependency().setService(InboundNatProvider.class).setRequired(false));
342             c.add(createServiceDependency().setService(OutboundNatProvider.class).setRequired(false));
343             c.add(createServiceDependency().setService(RoutingProvider.class).setRequired(false));
344             c.add(createServiceDependency().setService(L3ForwardingProvider.class).setRequired(false));
345         }
346
347         if (imp.equals(OpenstackRouter.class)) {
348             c.setInterface(MultiTenantAwareRouter.class.getName(), null);
349         }
350     }
351 }