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