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.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;
60 import java.util.Properties;
63 * OSGi bundle activator for the OVSDB Neutron Interface.
65 public class Activator extends ComponentActivatorAbstractBase {
67 * Function called when the activator starts just after some
68 * initializations are done by the
69 * ComponentActivatorAbstractBase.
76 * Function called when the activator stops just before the
77 * cleanup done by ComponentActivatorAbstractBase.
81 public void destroy() {
85 * Function that is used to communicate to dependency manager the
86 * list of known implementations for services inside a container.
88 * @return An array containing all the CLASS objects that will be
89 * instantiated in order to get an fully working implementation
93 public Object[] getImplementations() {
94 Object[] res = {ConfigurationServiceImpl.class,
95 BridgeConfigurationManagerImpl.class,
96 TenantNetworkManagerImpl.class,
97 VlanConfigurationCacheImpl.class,
98 FloatingIPHandler.class,
103 SouthboundHandler.class,
104 PortSecurityHandler.class,
105 ProviderNetworkManagerImpl.class,
106 EventDispatcherImpl.class,
109 NeutronL3Adapter.class,
110 OpenstackRouter.class};
115 * Function that is called when configuration of the dependencies
118 * @param c dependency manager Component object, used for
119 * configuring the dependencies exported and imported
120 * @param imp Implementation class that is being configured,
121 * needed as long as the same routine can configure multiple
123 * @param containerName The containerName being configured, this allow
124 * also optional per-container different behavior if needed, usually
125 * should not be the case though.
128 public void configureInstance(Component c, Object imp,
129 String containerName) {
130 if (imp.equals(ConfigurationServiceImpl.class)) {
131 c.setInterface(org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService.class.getName(), null);
132 c.add(createServiceDependency().setService(OvsdbConfigurationService.class));
135 if (imp.equals(BridgeConfigurationManagerImpl.class)) {
136 c.setInterface(BridgeConfigurationManager.class.getName(), null);
137 c.add(createServiceDependency().setService(
138 org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService.class).setRequired(true));
139 c.add(createServiceDependency().setService(NetworkingProviderManager.class));
140 c.add(createServiceDependency().setService(OvsdbConfigurationService.class));
143 if (imp.equals(TenantNetworkManagerImpl.class)) {
144 c.setInterface(TenantNetworkManager.class.getName(), null);
145 c.add(createServiceDependency().setService(NetworkingProviderManager.class));
146 c.add(createServiceDependency().setService(OvsdbConfigurationService.class));
147 c.add(createServiceDependency().setService(OvsdbConnectionService.class));
148 c.add(createServiceDependency().
149 setService(INeutronNetworkCRUD.class).
151 c.add(createServiceDependency().
152 setService(INeutronPortCRUD.class).
154 c.add(createServiceDependency().setService(VlanConfigurationCache.class));
157 if (imp.equals(VlanConfigurationCacheImpl.class)) {
158 c.setInterface(VlanConfigurationCache.class.getName(), null);
159 c.add(createServiceDependency().setService(OvsdbConfigurationService.class));
160 c.add(createServiceDependency().setService(TenantNetworkManager.class));
163 if (imp.equals(FloatingIPHandler.class)) {
164 Properties floatingIPHandlerPorperties = new Properties();
165 floatingIPHandlerPorperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
166 AbstractEvent.HandlerType.NEUTRON_FLOATING_IP);
167 c.setInterface(new String[]{INeutronFloatingIPAware.class.getName(),
168 AbstractHandler.class.getName()},
169 floatingIPHandlerPorperties);
170 c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
171 c.add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true));
174 if (imp.equals(NetworkHandler.class)) {
175 Properties networkHandlerProperties = new Properties();
176 networkHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
177 AbstractEvent.HandlerType.NEUTRON_NETWORK);
178 c.setInterface(new String[]{INeutronNetworkAware.class.getName(),
179 AbstractHandler.class.getName()},
180 networkHandlerProperties);
181 c.add(createServiceDependency().setService(TenantNetworkManager.class).setRequired(true));
182 c.add(createServiceDependency().setService(BridgeConfigurationManager.class).setRequired(true));
183 c.add(createServiceDependency().setService(
184 org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService.class).setRequired(true));
185 c.add(createServiceDependency().setService(OvsdbConfigurationService.class).setRequired(true));
186 c.add(createServiceDependency().setService(OvsdbConnectionService.class).setRequired(true));
187 c.add(createServiceDependency().setService(INeutronNetworkCRUD.class).setRequired(true));
188 c.add(createServiceDependency().setService(OvsdbInventoryListener.class).setRequired(true));
189 c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
190 c.add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true));
193 if (imp.equals(SubnetHandler.class)) {
194 Properties subnetHandlerProperties = new Properties();
195 subnetHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.NEUTRON_SUBNET);
196 c.setInterface(new String[]{INeutronSubnetAware.class.getName(),
197 AbstractHandler.class.getName()},
198 subnetHandlerProperties);
199 c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
200 c.add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true));
203 if (imp.equals(PortHandler.class)) {
204 Properties portHandlerProperties = new Properties();
205 portHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.NEUTRON_PORT);
206 c.setInterface(new String[]{INeutronPortAware.class.getName(),
207 AbstractHandler.class.getName()},
208 portHandlerProperties);
209 c.add(createServiceDependency().setService(OvsdbConfigurationService.class).setRequired(true));
210 c.add(createServiceDependency().setService(OvsdbConnectionService.class).setRequired(true));
211 c.add(createServiceDependency().setService(OvsdbInventoryListener.class).setRequired(true));
212 c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
213 c.add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true));
216 if (imp.equals(RouterHandler.class)) {
217 Properties routerHandlerProperties = new Properties();
218 routerHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.NEUTRON_ROUTER);
219 c.setInterface(new String[]{INeutronRouterAware.class.getName(),
220 AbstractHandler.class.getName()},
221 routerHandlerProperties);
222 c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
223 c.add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true));
226 if (imp.equals(SouthboundHandler.class)) {
227 Properties southboundHandlerProperties = new Properties();
228 southboundHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.SOUTHBOUND);
229 c.setInterface(new String[]{OvsdbInventoryListener.class.getName(),
230 IInventoryListener.class.getName(),
231 AbstractHandler.class.getName()},
232 southboundHandlerProperties);
233 c.add(createServiceDependency().setService(
234 org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService.class).setRequired(true));
235 c.add(createServiceDependency().setService(BridgeConfigurationManager.class).setRequired(true));
236 c.add(createServiceDependency().setService(TenantNetworkManager.class).setRequired(true));
237 c.add(createServiceDependency().setService(NetworkingProviderManager.class).setRequired(true));
238 c.add(createServiceDependency().setService(OvsdbConfigurationService.class).setRequired(true));
239 c.add(createServiceDependency().setService(OvsdbConnectionService.class).setRequired(true));
240 c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
241 c.add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true));
244 if (imp.equals(LBaaSHandler.class)) {
245 Properties lbaasHandlerProperties = new Properties();
246 lbaasHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
247 AbstractEvent.HandlerType.NEUTRON_LOAD_BALANCER);
248 c.setInterface(new String[] {INeutronLoadBalancerAware.class.getName()},
249 lbaasHandlerProperties);
250 c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
251 c.add(createServiceDependency().setService(INeutronPortCRUD.class).setRequired(true));
252 c.add(createServiceDependency().setService(INeutronLoadBalancerCRUD.class).setRequired(true));
253 c.add(createServiceDependency().setService(INeutronLoadBalancerPoolCRUD.class).setRequired(true));
254 c.add(createServiceDependency().setService(INeutronLoadBalancerPoolMemberCRUD.class).setRequired(true));
255 c.add(createServiceDependency().setService(LoadBalancerProvider.class).setRequired(true));
256 c.add(createServiceDependency().setService(ISwitchManager.class).setRequired(true));
259 if (imp.equals(PortSecurityHandler.class)) {
260 Properties portSecurityHandlerProperties = new Properties();
261 portSecurityHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
262 AbstractEvent.HandlerType.NEUTRON_PORT_SECURITY);
263 c.setInterface(new String[] {INeutronSecurityRuleAware.class.getName(),
264 INeutronSecurityGroupAware.class.getName(),
265 AbstractHandler.class.getName()},
266 portSecurityHandlerProperties);
267 c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
270 if (imp.equals(FWaasHandler.class)) {
271 Properties fWaasHandlerProperties = new Properties();
272 fWaasHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.NEUTRON_FWAAS);
273 c.setInterface(new String[] {INeutronFirewallAware.class.getName(),
274 INeutronFirewallRuleAware.class.getName(),
275 INeutronFirewallPolicyAware.class.getName(),
276 AbstractHandler.class.getName()},
277 fWaasHandlerProperties);
278 c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
281 if (imp.equals(ProviderNetworkManagerImpl.class)) {
282 c.setInterface(NetworkingProviderManager.class.getName(), null);
283 c.add(createServiceDependency()
284 .setService(org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService.class)
286 c.add(createServiceDependency()
287 .setService(NetworkingProvider.class)
288 .setCallbacks("providerAdded", "providerRemoved"));
291 if (imp.equals(EventDispatcherImpl.class)) {
292 c.setInterface(EventDispatcher.class.getName(), null);
293 c.add(createServiceDependency()
294 .setService(AbstractHandler.class)
295 .setCallbacks("eventHandlerAdded", "eventHandlerRemoved"));
298 if (imp.equals(NeutronL3Adapter.class)) {
299 c.setInterface(NeutronL3Adapter.class.getName(), null);
300 c.add(createServiceDependency()
301 .setService(org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService.class)
303 c.add(createServiceDependency().setService(TenantNetworkManager.class).setRequired(true));
304 c.add(createServiceDependency().setService(NetworkingProviderManager.class).setRequired(true));
305 c.add(createServiceDependency().setService(OvsdbConfigurationService.class).setRequired(true));
306 c.add(createServiceDependency().setService(OvsdbConnectionService.class).setRequired(true));
307 c.add(createServiceDependency().setService(INeutronNetworkCRUD.class).setRequired(true));
308 c.add(createServiceDependency().setService(INeutronSubnetCRUD.class).setRequired(true));
309 c.add(createServiceDependency().setService(INeutronPortCRUD.class).setRequired(true));
310 c.add(createServiceDependency().setService(MultiTenantAwareRouter.class).setRequired(true));
311 /* ToDo, we should probably just use the NetworkingProvider interface
312 * This should provide a way of getting service implementations
313 * Either that, or we should do service lookup at runtime based on getProvider().getName()
314 * This is a shortcut as for now there will only be one implementation of these classes.
316 c.add(createServiceDependency().setService(MultiTenantAwareRouter.class).setRequired(false));
317 c.add(createServiceDependency().setService(ArpProvider.class).setRequired(false));
318 c.add(createServiceDependency().setService(InboundNatProvider.class).setRequired(false));
319 c.add(createServiceDependency().setService(OutboundNatProvider.class).setRequired(false));
320 c.add(createServiceDependency().setService(RoutingProvider.class).setRequired(false));
321 c.add(createServiceDependency().setService(L3ForwardingProvider.class).setRequired(false));
324 if (imp.equals(OpenstackRouter.class)) {
325 c.setInterface(MultiTenantAwareRouter.class.getName(), null);