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