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