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