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