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