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