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