2 * Copyright (C) 2013 Red Hat, Inc.
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
8 * Authors : Madhu Venugopal, Brent Salisbury, Dave Tucker
11 package org.opendaylight.ovsdb.openstack.netvirt;
13 import java.util.Properties;
15 import org.apache.felix.dm.Component;
16 import org.opendaylight.controller.networkconfig.neutron.INeutronFirewallAware;
17 import org.opendaylight.controller.networkconfig.neutron.INeutronFirewallPolicyAware;
18 import org.opendaylight.controller.networkconfig.neutron.INeutronFirewallRuleAware;
19 import org.opendaylight.controller.networkconfig.neutron.INeutronFloatingIPAware;
20 import org.opendaylight.controller.networkconfig.neutron.INeutronLoadBalancerAware;
21 import org.opendaylight.controller.networkconfig.neutron.INeutronLoadBalancerCRUD;
22 import org.opendaylight.controller.networkconfig.neutron.INeutronLoadBalancerPoolAware;
23 import org.opendaylight.controller.networkconfig.neutron.INeutronLoadBalancerPoolCRUD;
24 import org.opendaylight.controller.networkconfig.neutron.INeutronLoadBalancerPoolMemberAware;
25 import org.opendaylight.controller.networkconfig.neutron.INeutronNetworkAware;
26 import org.opendaylight.controller.networkconfig.neutron.INeutronNetworkCRUD;
27 import org.opendaylight.controller.networkconfig.neutron.INeutronPortAware;
28 import org.opendaylight.controller.networkconfig.neutron.INeutronPortCRUD;
29 import org.opendaylight.controller.networkconfig.neutron.INeutronRouterAware;
30 import org.opendaylight.controller.networkconfig.neutron.INeutronSecurityGroupAware;
31 import org.opendaylight.controller.networkconfig.neutron.INeutronSecurityRuleAware;
32 import org.opendaylight.controller.networkconfig.neutron.INeutronSubnetAware;
33 import org.opendaylight.controller.networkconfig.neutron.INeutronSubnetCRUD;
34 import org.opendaylight.controller.sal.core.ComponentActivatorAbstractBase;
35 import org.opendaylight.controller.switchmanager.IInventoryListener;
36 import org.opendaylight.controller.switchmanager.ISwitchManager;
37 import org.opendaylight.ovsdb.openstack.netvirt.api.ArpProvider;
38 import org.opendaylight.ovsdb.openstack.netvirt.api.BridgeConfigurationManager;
39 import org.opendaylight.ovsdb.openstack.netvirt.api.Constants;
40 import org.opendaylight.ovsdb.openstack.netvirt.api.EventDispatcher;
41 import org.opendaylight.ovsdb.openstack.netvirt.api.InboundNatProvider;
42 import org.opendaylight.ovsdb.openstack.netvirt.api.L3ForwardingProvider;
43 import org.opendaylight.ovsdb.openstack.netvirt.api.LoadBalancerProvider;
44 import org.opendaylight.ovsdb.openstack.netvirt.api.MultiTenantAwareRouter;
45 import org.opendaylight.ovsdb.openstack.netvirt.api.NetworkingProvider;
46 import org.opendaylight.ovsdb.openstack.netvirt.api.NetworkingProviderManager;
47 import org.opendaylight.ovsdb.openstack.netvirt.api.OutboundNatProvider;
48 import org.opendaylight.ovsdb.openstack.netvirt.api.RoutingProvider;
49 import org.opendaylight.ovsdb.openstack.netvirt.api.SecurityServicesManager;
50 import org.opendaylight.ovsdb.openstack.netvirt.api.TenantNetworkManager;
51 import org.opendaylight.ovsdb.openstack.netvirt.api.VlanConfigurationCache;
52 import org.opendaylight.ovsdb.openstack.netvirt.impl.BridgeConfigurationManagerImpl;
53 import org.opendaylight.ovsdb.openstack.netvirt.impl.ConfigurationServiceImpl;
54 import org.opendaylight.ovsdb.openstack.netvirt.impl.EventDispatcherImpl;
55 import org.opendaylight.ovsdb.openstack.netvirt.impl.NeutronL3Adapter;
56 import org.opendaylight.ovsdb.openstack.netvirt.impl.OpenstackRouter;
57 import org.opendaylight.ovsdb.openstack.netvirt.impl.ProviderNetworkManagerImpl;
58 import org.opendaylight.ovsdb.openstack.netvirt.impl.SecurityServicesImpl;
59 import org.opendaylight.ovsdb.openstack.netvirt.impl.TenantNetworkManagerImpl;
60 import org.opendaylight.ovsdb.openstack.netvirt.impl.VlanConfigurationCacheImpl;
61 import org.opendaylight.ovsdb.plugin.api.OvsdbConfigurationService;
62 import org.opendaylight.ovsdb.plugin.api.OvsdbConnectionService;
63 import org.opendaylight.ovsdb.plugin.api.OvsdbInventoryListener;
66 * OSGi bundle activator for the OVSDB Neutron Interface.
68 public class Activator extends ComponentActivatorAbstractBase {
70 * Function called when the activator starts just after some
71 * initializations are done by the
72 * ComponentActivatorAbstractBase.
79 * Function called when the activator stops just before the
80 * cleanup done by ComponentActivatorAbstractBase.
84 public void destroy() {
88 * Function that is used to communicate to dependency manager the
89 * list of known implementations for services inside a container.
91 * @return An array containing all the CLASS objects that will be
92 * instantiated in order to get an fully working implementation
96 public Object[] getImplementations() {
97 Object[] res = {ConfigurationServiceImpl.class,
98 BridgeConfigurationManagerImpl.class,
99 TenantNetworkManagerImpl.class,
100 VlanConfigurationCacheImpl.class,
101 FloatingIPHandler.class,
102 NetworkHandler.class,
106 SouthboundHandler.class,
107 PortSecurityHandler.class,
108 ProviderNetworkManagerImpl.class,
109 EventDispatcherImpl.class,
112 LBaaSPoolHandler.class,
113 LBaaSPoolMemberHandler.class,
114 NeutronL3Adapter.class,
115 OpenstackRouter.class,
116 SecurityServicesImpl.class};
121 * Function that is called when configuration of the dependencies
124 * @param c dependency manager Component object, used for
125 * configuring the dependencies exported and imported
126 * @param imp Implementation class that is being configured,
127 * needed as long as the same routine can configure multiple
129 * @param containerName The containerName being configured, this allow
130 * also optional per-container different behavior if needed, usually
131 * should not be the case though.
134 public void configureInstance(Component c, Object imp,
135 String containerName) {
136 if (imp.equals(ConfigurationServiceImpl.class)) {
137 c.setInterface(org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService.class.getName(), null);
138 c.add(createServiceDependency().setService(OvsdbConfigurationService.class));
141 if (imp.equals(BridgeConfigurationManagerImpl.class)) {
142 c.setInterface(BridgeConfigurationManager.class.getName(), null);
143 c.add(createServiceDependency().setService(
144 org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService.class).setRequired(true));
145 c.add(createServiceDependency().setService(NetworkingProviderManager.class));
146 c.add(createServiceDependency().setService(OvsdbConfigurationService.class));
149 if (imp.equals(TenantNetworkManagerImpl.class)) {
150 c.setInterface(TenantNetworkManager.class.getName(), null);
151 c.add(createServiceDependency().setService(NetworkingProviderManager.class));
152 c.add(createServiceDependency().setService(OvsdbConfigurationService.class));
153 c.add(createServiceDependency().setService(OvsdbConnectionService.class));
154 c.add(createServiceDependency().
155 setService(INeutronNetworkCRUD.class).
157 c.add(createServiceDependency().
158 setService(INeutronPortCRUD.class).
160 c.add(createServiceDependency().setService(VlanConfigurationCache.class));
163 if (imp.equals(VlanConfigurationCacheImpl.class)) {
164 c.setInterface(VlanConfigurationCache.class.getName(), null);
165 c.add(createServiceDependency().setService(OvsdbConfigurationService.class));
166 c.add(createServiceDependency().setService(TenantNetworkManager.class));
169 if (imp.equals(FloatingIPHandler.class)) {
170 Properties floatingIPHandlerPorperties = new Properties();
171 floatingIPHandlerPorperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
172 AbstractEvent.HandlerType.NEUTRON_FLOATING_IP);
173 c.setInterface(new String[]{INeutronFloatingIPAware.class.getName(),
174 AbstractHandler.class.getName()},
175 floatingIPHandlerPorperties);
176 c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
177 c.add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true));
180 if (imp.equals(NetworkHandler.class)) {
181 Properties networkHandlerProperties = new Properties();
182 networkHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
183 AbstractEvent.HandlerType.NEUTRON_NETWORK);
184 c.setInterface(new String[]{INeutronNetworkAware.class.getName(),
185 AbstractHandler.class.getName()},
186 networkHandlerProperties);
187 c.add(createServiceDependency().setService(TenantNetworkManager.class).setRequired(true));
188 c.add(createServiceDependency().setService(BridgeConfigurationManager.class).setRequired(true));
189 c.add(createServiceDependency().setService(
190 org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService.class).setRequired(true));
191 c.add(createServiceDependency().setService(OvsdbConfigurationService.class).setRequired(true));
192 c.add(createServiceDependency().setService(OvsdbConnectionService.class).setRequired(true));
193 c.add(createServiceDependency().setService(INeutronNetworkCRUD.class).setRequired(true));
194 c.add(createServiceDependency().setService(OvsdbInventoryListener.class).setRequired(true));
195 c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
196 c.add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true));
199 if (imp.equals(SubnetHandler.class)) {
200 Properties subnetHandlerProperties = new Properties();
201 subnetHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.NEUTRON_SUBNET);
202 c.setInterface(new String[]{INeutronSubnetAware.class.getName(),
203 AbstractHandler.class.getName()},
204 subnetHandlerProperties);
205 c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
206 c.add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true));
209 if (imp.equals(PortHandler.class)) {
210 Properties portHandlerProperties = new Properties();
211 portHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.NEUTRON_PORT);
212 c.setInterface(new String[]{INeutronPortAware.class.getName(),
213 AbstractHandler.class.getName()},
214 portHandlerProperties);
215 c.add(createServiceDependency().setService(OvsdbConfigurationService.class).setRequired(true));
216 c.add(createServiceDependency().setService(OvsdbConnectionService.class).setRequired(true));
217 c.add(createServiceDependency().setService(OvsdbInventoryListener.class).setRequired(true));
218 c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
219 c.add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true));
222 if (imp.equals(RouterHandler.class)) {
223 Properties routerHandlerProperties = new Properties();
224 routerHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.NEUTRON_ROUTER);
225 c.setInterface(new String[]{INeutronRouterAware.class.getName(),
226 AbstractHandler.class.getName()},
227 routerHandlerProperties);
228 c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
229 c.add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true));
232 if (imp.equals(SouthboundHandler.class)) {
233 Properties southboundHandlerProperties = new Properties();
234 southboundHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.SOUTHBOUND);
235 c.setInterface(new String[]{OvsdbInventoryListener.class.getName(),
236 IInventoryListener.class.getName(),
237 AbstractHandler.class.getName()},
238 southboundHandlerProperties);
239 c.add(createServiceDependency().setService(
240 org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService.class).setRequired(true));
241 c.add(createServiceDependency().setService(BridgeConfigurationManager.class).setRequired(true));
242 c.add(createServiceDependency().setService(TenantNetworkManager.class).setRequired(true));
243 c.add(createServiceDependency().setService(NetworkingProviderManager.class).setRequired(true));
244 c.add(createServiceDependency().setService(OvsdbConfigurationService.class).setRequired(true));
245 c.add(createServiceDependency().setService(OvsdbConnectionService.class).setRequired(true));
246 c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
247 c.add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true));
250 if (imp.equals(LBaaSHandler.class)) {
251 Properties lbaasHandlerProperties = new Properties();
252 lbaasHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
253 AbstractEvent.HandlerType.NEUTRON_LOAD_BALANCER);
254 c.setInterface(new String[] {INeutronLoadBalancerAware.class.getName(),
255 IInventoryListener.class.getName(),
256 AbstractHandler.class.getName()},
257 lbaasHandlerProperties);
258 c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
259 c.add(createServiceDependency().setService(INeutronPortCRUD.class).setRequired(true));
260 c.add(createServiceDependency().setService(INeutronLoadBalancerCRUD.class).setRequired(true));
261 c.add(createServiceDependency().setService(INeutronLoadBalancerPoolCRUD.class).setRequired(true));
262 c.add(createServiceDependency().setService(LoadBalancerProvider.class).setRequired(true));
263 c.add(createServiceDependency().setService(ISwitchManager.class).setRequired(true));
264 c.add(createServiceDependency().setService(INeutronNetworkCRUD.class).setRequired(true));
265 c.add(createServiceDependency().setService(INeutronSubnetCRUD.class).setRequired(true));
268 if (imp.equals(LBaaSPoolHandler.class)) {
269 Properties lbaasPoolHandlerProperties = new Properties();
270 lbaasPoolHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
271 AbstractEvent.HandlerType.NEUTRON_LOAD_BALANCER_POOL);
272 c.setInterface(new String[] {INeutronLoadBalancerPoolAware.class.getName(),
273 AbstractHandler.class.getName()},
274 lbaasPoolHandlerProperties);
275 c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
276 c.add(createServiceDependency().setService(INeutronPortCRUD.class).setRequired(true));
277 c.add(createServiceDependency().setService(INeutronLoadBalancerCRUD.class).setRequired(true));
278 c.add(createServiceDependency().setService(LoadBalancerProvider.class).setRequired(true));
279 c.add(createServiceDependency().setService(ISwitchManager.class).setRequired(true));
280 c.add(createServiceDependency().setService(INeutronNetworkCRUD.class).setRequired(true));
281 c.add(createServiceDependency().setService(INeutronSubnetCRUD.class).setRequired(true));
284 if (imp.equals(LBaaSPoolMemberHandler.class)) {
285 Properties lbaasPoolMemberHandlerProperties = new Properties();
286 lbaasPoolMemberHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
287 AbstractEvent.HandlerType.NEUTRON_LOAD_BALANCER_POOL_MEMBER);
288 c.setInterface(new String[] {INeutronLoadBalancerPoolMemberAware.class.getName(),
289 AbstractHandler.class.getName()},
290 lbaasPoolMemberHandlerProperties);
291 c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
292 c.add(createServiceDependency().setService(INeutronPortCRUD.class).setRequired(true));
293 c.add(createServiceDependency().setService(INeutronLoadBalancerCRUD.class).setRequired(true));
294 c.add(createServiceDependency().setService(INeutronLoadBalancerPoolCRUD.class).setRequired(true));
295 c.add(createServiceDependency().setService(LoadBalancerProvider.class).setRequired(true));
296 c.add(createServiceDependency().setService(ISwitchManager.class).setRequired(true));
297 c.add(createServiceDependency().setService(INeutronNetworkCRUD.class).setRequired(true));
298 c.add(createServiceDependency().setService(INeutronSubnetCRUD.class).setRequired(true));
301 if (imp.equals(PortSecurityHandler.class)) {
302 Properties portSecurityHandlerProperties = new Properties();
303 portSecurityHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
304 AbstractEvent.HandlerType.NEUTRON_PORT_SECURITY);
305 c.setInterface(new String[]{INeutronSecurityRuleAware.class.getName(),
306 INeutronSecurityGroupAware.class.getName(),
307 AbstractHandler.class.getName()},
308 portSecurityHandlerProperties);
309 c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
310 c.add(createServiceDependency().setService(SecurityServicesManager.class).setRequired(true));
313 if (imp.equals(SecurityServicesImpl.class)) {
314 c.setInterface(new String[] {SecurityServicesManager.class.getName()}, null);
317 if (imp.equals(FWaasHandler.class)) {
318 Properties fWaasHandlerProperties = new Properties();
319 fWaasHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.NEUTRON_FWAAS);
320 c.setInterface(new String[] {INeutronFirewallAware.class.getName(),
321 INeutronFirewallRuleAware.class.getName(),
322 INeutronFirewallPolicyAware.class.getName(),
323 AbstractHandler.class.getName()},
324 fWaasHandlerProperties);
325 c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
328 if (imp.equals(ProviderNetworkManagerImpl.class)) {
329 c.setInterface(NetworkingProviderManager.class.getName(), null);
330 c.add(createServiceDependency()
331 .setService(org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService.class)
333 c.add(createServiceDependency()
334 .setService(NetworkingProvider.class)
335 .setCallbacks("providerAdded", "providerRemoved"));
338 if (imp.equals(EventDispatcherImpl.class)) {
339 c.setInterface(EventDispatcher.class.getName(), null);
340 c.add(createServiceDependency()
341 .setService(AbstractHandler.class)
342 .setCallbacks("eventHandlerAdded", "eventHandlerRemoved"));
345 if (imp.equals(NeutronL3Adapter.class)) {
346 c.setInterface(NeutronL3Adapter.class.getName(), null);
347 c.add(createServiceDependency()
348 .setService(org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService.class)
350 c.add(createServiceDependency().setService(TenantNetworkManager.class).setRequired(true));
351 c.add(createServiceDependency().setService(NetworkingProviderManager.class).setRequired(true));
352 c.add(createServiceDependency().setService(OvsdbConfigurationService.class).setRequired(true));
353 c.add(createServiceDependency().setService(OvsdbConnectionService.class).setRequired(true));
354 c.add(createServiceDependency().setService(INeutronNetworkCRUD.class).setRequired(true));
355 c.add(createServiceDependency().setService(INeutronSubnetCRUD.class).setRequired(true));
356 c.add(createServiceDependency().setService(INeutronPortCRUD.class).setRequired(true));
357 c.add(createServiceDependency().setService(MultiTenantAwareRouter.class).setRequired(true));
358 /* ToDo, we should probably just use the NetworkingProvider interface
359 * This should provide a way of getting service implementations
360 * Either that, or we should do service lookup at runtime based on getProvider().getName()
361 * This is a shortcut as for now there will only be one implementation of these classes.
363 c.add(createServiceDependency().setService(ArpProvider.class).setRequired(false));
364 c.add(createServiceDependency().setService(InboundNatProvider.class).setRequired(false));
365 c.add(createServiceDependency().setService(OutboundNatProvider.class).setRequired(false));
366 c.add(createServiceDependency().setService(RoutingProvider.class).setRequired(false));
367 c.add(createServiceDependency().setService(L3ForwardingProvider.class).setRequired(false));
370 if (imp.equals(OpenstackRouter.class)) {
371 c.setInterface(MultiTenantAwareRouter.class.getName(), null);