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