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.Dictionary;
14 import java.util.Hashtable;
16 import org.apache.felix.dm.DependencyActivatorBase;
17 import org.apache.felix.dm.DependencyManager;
18 import org.opendaylight.neutron.spi.INeutronFirewallAware;
19 import org.opendaylight.neutron.spi.INeutronFirewallPolicyAware;
20 import org.opendaylight.neutron.spi.INeutronFirewallRuleAware;
21 import org.opendaylight.neutron.spi.INeutronFloatingIPAware;
22 import org.opendaylight.neutron.spi.INeutronLoadBalancerAware;
23 import org.opendaylight.neutron.spi.INeutronLoadBalancerCRUD;
24 import org.opendaylight.neutron.spi.INeutronLoadBalancerPoolAware;
25 import org.opendaylight.neutron.spi.INeutronLoadBalancerPoolCRUD;
26 import org.opendaylight.neutron.spi.INeutronLoadBalancerPoolMemberAware;
27 import org.opendaylight.neutron.spi.INeutronNetworkAware;
28 import org.opendaylight.neutron.spi.INeutronNetworkCRUD;
29 import org.opendaylight.neutron.spi.INeutronPortAware;
30 import org.opendaylight.neutron.spi.INeutronPortCRUD;
31 import org.opendaylight.neutron.spi.INeutronRouterAware;
32 import org.opendaylight.neutron.spi.INeutronSecurityGroupAware;
33 import org.opendaylight.neutron.spi.INeutronSecurityRuleAware;
34 import org.opendaylight.neutron.spi.INeutronSubnetAware;
35 import org.opendaylight.neutron.spi.INeutronSubnetCRUD;
36 import org.opendaylight.controller.switchmanager.IInventoryListener;
37 import org.opendaylight.controller.switchmanager.ISwitchManager;
38 import org.opendaylight.ovsdb.openstack.netvirt.api.ArpProvider;
39 import org.opendaylight.ovsdb.openstack.netvirt.api.BridgeConfigurationManager;
40 import org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService;
41 import org.opendaylight.ovsdb.openstack.netvirt.api.Constants;
42 import org.opendaylight.ovsdb.openstack.netvirt.api.EventDispatcher;
43 import org.opendaylight.ovsdb.openstack.netvirt.api.InboundNatProvider;
44 import org.opendaylight.ovsdb.openstack.netvirt.api.L3ForwardingProvider;
45 import org.opendaylight.ovsdb.openstack.netvirt.api.LoadBalancerProvider;
46 import org.opendaylight.ovsdb.openstack.netvirt.api.MultiTenantAwareRouter;
47 import org.opendaylight.ovsdb.openstack.netvirt.api.NetworkingProvider;
48 import org.opendaylight.ovsdb.openstack.netvirt.api.NetworkingProviderManager;
49 import org.opendaylight.ovsdb.openstack.netvirt.api.NodeCacheManager;
50 import org.opendaylight.ovsdb.openstack.netvirt.api.OutboundNatProvider;
51 import org.opendaylight.ovsdb.openstack.netvirt.api.RoutingProvider;
52 import org.opendaylight.ovsdb.openstack.netvirt.api.SecurityServicesManager;
53 import org.opendaylight.ovsdb.openstack.netvirt.api.TenantNetworkManager;
54 import org.opendaylight.ovsdb.openstack.netvirt.api.VlanConfigurationCache;
55 import org.opendaylight.ovsdb.openstack.netvirt.impl.BridgeConfigurationManagerImpl;
56 import org.opendaylight.ovsdb.openstack.netvirt.impl.ConfigurationServiceImpl;
57 import org.opendaylight.ovsdb.openstack.netvirt.impl.EventDispatcherImpl;
58 import org.opendaylight.ovsdb.openstack.netvirt.impl.NeutronL3Adapter;
59 import org.opendaylight.ovsdb.openstack.netvirt.impl.NodeCacheManagerImpl;
60 import org.opendaylight.ovsdb.openstack.netvirt.impl.OpenstackRouter;
61 import org.opendaylight.ovsdb.openstack.netvirt.impl.ProviderNetworkManagerImpl;
62 import org.opendaylight.ovsdb.openstack.netvirt.impl.SecurityServicesImpl;
63 import org.opendaylight.ovsdb.openstack.netvirt.impl.TenantNetworkManagerImpl;
64 import org.opendaylight.ovsdb.openstack.netvirt.impl.VlanConfigurationCacheImpl;
65 import org.opendaylight.ovsdb.plugin.api.OvsdbConfigurationService;
66 import org.opendaylight.ovsdb.plugin.api.OvsdbConnectionService;
67 import org.opendaylight.ovsdb.plugin.api.OvsdbInventoryListener;
69 import org.osgi.framework.BundleContext;
72 * OSGi bundle activator for the OVSDB Neutron Interface.
74 public class Activator extends DependencyActivatorBase {
77 public void init(BundleContext context, DependencyManager manager) throws Exception {
79 manager.add(createComponent()
80 .setInterface(ConfigurationService.class.getName(), null)
81 .setImplementation(ConfigurationServiceImpl.class)
82 .add(createServiceDependency().setService(OvsdbConfigurationService.class)));
84 manager.add(createComponent()
85 .setInterface(BridgeConfigurationManager.class.getName(), null)
86 .setImplementation(BridgeConfigurationManagerImpl.class)
87 .add(createServiceDependency().setService(ConfigurationService.class).setRequired(true))
88 .add(createServiceDependency().setService(NetworkingProviderManager.class))
89 .add(createServiceDependency().setService(OvsdbConfigurationService.class)));
91 manager.add(createComponent()
92 .setInterface(TenantNetworkManager.class.getName(), null)
93 .setImplementation(TenantNetworkManagerImpl.class)
94 .add(createServiceDependency().setService(NetworkingProviderManager.class))
95 .add(createServiceDependency().setService(OvsdbConfigurationService.class))
96 .add(createServiceDependency().setService(OvsdbConnectionService.class))
97 .add(createServiceDependency().setService(INeutronNetworkCRUD.class).setRequired(true))
98 .add(createServiceDependency().setService(INeutronPortCRUD.class).setRequired(true))
99 .add(createServiceDependency().setService(VlanConfigurationCache.class)));
101 manager.add(createComponent()
102 .setInterface(VlanConfigurationCache.class.getName(), null)
103 .setImplementation(VlanConfigurationCacheImpl.class)
104 .add(createServiceDependency().setService(OvsdbConfigurationService.class))
105 .add(createServiceDependency().setService(TenantNetworkManager.class)));
107 Dictionary<String, Object> floatingIPHandlerPorperties = new Hashtable<>();
108 floatingIPHandlerPorperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
109 AbstractEvent.HandlerType.NEUTRON_FLOATING_IP);
111 manager.add(createComponent()
112 .setInterface(new String[]{INeutronFloatingIPAware.class.getName(), AbstractHandler.class.getName()},
113 floatingIPHandlerPorperties)
114 .setImplementation(FloatingIPHandler.class)
115 .add(createServiceDependency().setService(EventDispatcher.class).setRequired(true))
116 .add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true)));
118 Dictionary<String, Object> networkHandlerProperties = new Hashtable<>();
119 networkHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.NEUTRON_NETWORK);
121 manager.add(createComponent()
122 .setInterface(new String[]{INeutronNetworkAware.class.getName(), AbstractHandler.class.getName()},
123 networkHandlerProperties)
124 .setImplementation(NetworkHandler.class)
125 .add(createServiceDependency().setService(TenantNetworkManager.class).setRequired(true))
126 .add(createServiceDependency().setService(BridgeConfigurationManager.class).setRequired(true))
127 .add(createServiceDependency().setService(ConfigurationService.class).setRequired(true))
128 .add(createServiceDependency().setService(OvsdbConfigurationService.class).setRequired(true))
129 .add(createServiceDependency().setService(OvsdbConnectionService.class).setRequired(true))
130 .add(createServiceDependency().setService(INeutronNetworkCRUD.class).setRequired(true))
131 .add(createServiceDependency().setService(OvsdbInventoryListener.class).setRequired(true))
132 .add(createServiceDependency().setService(EventDispatcher.class).setRequired(true))
133 .add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true)));
135 Dictionary<String, Object> subnetHandlerProperties = new Hashtable<>();
136 subnetHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.NEUTRON_SUBNET);
138 manager.add(createComponent()
139 .setInterface(new String[]{INeutronSubnetAware.class.getName(), AbstractHandler.class.getName()},
140 subnetHandlerProperties)
141 .setImplementation(SubnetHandler.class)
142 .add(createServiceDependency().setService(EventDispatcher.class).setRequired(true))
143 .add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true)));
145 Dictionary<String, Object> portHandlerProperties = new Hashtable<>();
146 portHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.NEUTRON_PORT);
148 manager.add(createComponent()
149 .setInterface(new String[]{INeutronPortAware.class.getName(), AbstractHandler.class.getName()},
150 portHandlerProperties)
151 .setImplementation(PortHandler.class)
152 .add(createServiceDependency().setService(OvsdbConfigurationService.class).setRequired(true))
153 .add(createServiceDependency().setService(OvsdbConnectionService.class).setRequired(true))
154 .add(createServiceDependency().setService(OvsdbInventoryListener.class).setRequired(true))
155 .add(createServiceDependency().setService(EventDispatcher.class).setRequired(true))
156 .add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true)));
158 Dictionary<String, Object> routerHandlerProperties = new Hashtable<>();
159 routerHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.NEUTRON_ROUTER);
161 manager.add(createComponent()
162 .setInterface(new String[]{INeutronRouterAware.class.getName(), AbstractHandler.class.getName()},
163 routerHandlerProperties)
164 .setImplementation(RouterHandler.class)
165 .add(createServiceDependency().setService(EventDispatcher.class).setRequired(true))
166 .add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true)));
168 Dictionary<String, Object> southboundHandlerProperties = new Hashtable<>();
169 southboundHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.SOUTHBOUND);
171 manager.add(createComponent()
172 .setInterface(new String[]{OvsdbInventoryListener.class.getName(),
173 AbstractHandler.class.getName()},
174 southboundHandlerProperties)
175 .setImplementation(SouthboundHandler.class)
176 .add(createServiceDependency().setService(ConfigurationService.class).setRequired(true))
177 .add(createServiceDependency().setService(BridgeConfigurationManager.class).setRequired(true))
178 .add(createServiceDependency().setService(TenantNetworkManager.class).setRequired(true))
179 .add(createServiceDependency().setService(NetworkingProviderManager.class).setRequired(true))
180 .add(createServiceDependency().setService(OvsdbConfigurationService.class).setRequired(true))
181 .add(createServiceDependency().setService(OvsdbConnectionService.class).setRequired(true))
182 .add(createServiceDependency().setService(EventDispatcher.class).setRequired(true))
183 .add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true)));
185 Dictionary<String, Object> lbaasHandlerProperties = new Hashtable<>();
186 lbaasHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
187 AbstractEvent.HandlerType.NEUTRON_LOAD_BALANCER);
189 manager.add(createComponent()
190 .setInterface(new String[]{INeutronLoadBalancerAware.class.getName(),
191 IInventoryListener.class.getName(), AbstractHandler.class.getName()},
192 lbaasHandlerProperties)
193 .setImplementation(LBaaSHandler.class)
194 .add(createServiceDependency().setService(EventDispatcher.class).setRequired(true))
195 .add(createServiceDependency().setService(INeutronPortCRUD.class).setRequired(true))
196 .add(createServiceDependency().setService(INeutronLoadBalancerCRUD.class).setRequired(true))
197 .add(createServiceDependency().setService(INeutronLoadBalancerPoolCRUD.class).setRequired(true))
198 .add(createServiceDependency().setService(LoadBalancerProvider.class).setRequired(true))
199 .add(createServiceDependency().setService(ISwitchManager.class).setRequired(true))
200 .add(createServiceDependency().setService(INeutronNetworkCRUD.class).setRequired(true))
201 .add(createServiceDependency().setService(INeutronSubnetCRUD.class).setRequired(true)));
203 Dictionary<String, Object> lbaasPoolHandlerProperties = new Hashtable<>();
204 lbaasPoolHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
205 AbstractEvent.HandlerType.NEUTRON_LOAD_BALANCER_POOL);
207 manager.add(createComponent()
208 .setInterface(new String[]{INeutronLoadBalancerPoolAware.class.getName(),
209 AbstractHandler.class.getName()}, lbaasPoolHandlerProperties)
210 .setImplementation(LBaaSPoolHandler.class)
211 .add(createServiceDependency().setService(EventDispatcher.class).setRequired(true))
212 .add(createServiceDependency().setService(INeutronPortCRUD.class).setRequired(true))
213 .add(createServiceDependency().setService(INeutronLoadBalancerCRUD.class).setRequired(true))
214 .add(createServiceDependency().setService(LoadBalancerProvider.class).setRequired(true))
215 .add(createServiceDependency().setService(ISwitchManager.class).setRequired(true))
216 .add(createServiceDependency().setService(INeutronNetworkCRUD.class).setRequired(true))
217 .add(createServiceDependency().setService(INeutronSubnetCRUD.class).setRequired(true)));
219 Dictionary<String, Object> lbaasPoolMemberHandlerProperties = new Hashtable<>();
220 lbaasPoolMemberHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
221 AbstractEvent.HandlerType.NEUTRON_LOAD_BALANCER_POOL_MEMBER);
223 manager.add(createComponent()
224 .setInterface(new String[] {INeutronLoadBalancerPoolMemberAware.class.getName(),
225 AbstractHandler.class.getName()}, lbaasPoolMemberHandlerProperties)
226 .setImplementation(LBaaSPoolMemberHandler.class)
227 .add(createServiceDependency().setService(EventDispatcher.class).setRequired(true))
228 .add(createServiceDependency().setService(INeutronPortCRUD.class).setRequired(true))
229 .add(createServiceDependency().setService(INeutronLoadBalancerCRUD.class).setRequired(true))
230 .add(createServiceDependency().setService(INeutronLoadBalancerPoolCRUD.class).setRequired(true))
231 .add(createServiceDependency().setService(LoadBalancerProvider.class).setRequired(true))
232 .add(createServiceDependency().setService(ISwitchManager.class).setRequired(true))
233 .add(createServiceDependency().setService(INeutronNetworkCRUD.class).setRequired(true))
234 .add(createServiceDependency().setService(INeutronSubnetCRUD.class).setRequired(true)));
236 Dictionary<String, Object> portSecurityHandlerProperties = new Hashtable<>();
237 portSecurityHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
238 AbstractEvent.HandlerType.NEUTRON_PORT_SECURITY);
240 manager.add(createComponent()
241 .setInterface(new String[]{INeutronSecurityRuleAware.class.getName(),
242 INeutronSecurityGroupAware.class.getName(), AbstractHandler.class.getName()},
243 portSecurityHandlerProperties)
244 .setImplementation(PortSecurityHandler.class)
245 .add(createServiceDependency().setService(EventDispatcher.class).setRequired(true))
246 .add(createServiceDependency().setService(SecurityServicesManager.class).setRequired(true)));
248 manager.add(createComponent()
249 .setInterface(new String[]{SecurityServicesManager.class.getName()}, null)
250 .setImplementation(SecurityServicesImpl.class)
251 .add(createServiceDependency().setService(INeutronPortCRUD.class).setRequired(true)));
253 Dictionary<String, Object> fWaasHandlerProperties = new Hashtable<>();
254 fWaasHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.NEUTRON_FWAAS);
256 manager.add(createComponent()
257 .setInterface(new String[] {INeutronFirewallAware.class.getName(),
258 INeutronFirewallRuleAware.class.getName(), INeutronFirewallPolicyAware.class.getName(),
259 AbstractHandler.class.getName()}, fWaasHandlerProperties)
260 .setImplementation(FWaasHandler.class)
261 .add(createServiceDependency().setService(EventDispatcher.class).setRequired(true)));
263 manager.add(createComponent()
264 .setInterface(NetworkingProviderManager.class.getName(), null)
265 .setImplementation(ProviderNetworkManagerImpl.class)
266 .add(createServiceDependency().setService(ConfigurationService.class).setRequired(true))
267 .add(createServiceDependency().setService(NetworkingProvider.class)
268 .setCallbacks("providerAdded", "providerRemoved")));
270 manager.add(createComponent()
271 .setInterface(EventDispatcher.class.getName(), null)
272 .setImplementation(EventDispatcherImpl.class)
273 .add(createServiceDependency()
274 .setService(AbstractHandler.class)
275 .setCallbacks("eventHandlerAdded", "eventHandlerRemoved")));
277 manager.add(createComponent()
278 .setInterface(NeutronL3Adapter.class.getName(), null)
279 .setImplementation(NeutronL3Adapter.class)
280 .add(createServiceDependency().setService(ConfigurationService.class).setRequired(true))
281 .add(createServiceDependency().setService(TenantNetworkManager.class).setRequired(true))
282 .add(createServiceDependency().setService(NetworkingProviderManager.class).setRequired(true))
283 .add(createServiceDependency().setService(OvsdbConfigurationService.class).setRequired(true))
284 .add(createServiceDependency().setService(OvsdbConnectionService.class).setRequired(true))
285 .add(createServiceDependency().setService(INeutronNetworkCRUD.class).setRequired(true))
286 .add(createServiceDependency().setService(INeutronSubnetCRUD.class).setRequired(true))
287 .add(createServiceDependency().setService(INeutronPortCRUD.class).setRequired(true))
288 .add(createServiceDependency().setService(MultiTenantAwareRouter.class).setRequired(true))
289 /* ToDo, we should probably just use the NetworkingProvider interface
290 * This should provide a way of getting service implementations
291 * Either that, or we should do service lookup at runtime based on getProvider().getName()
292 * This is a shortcut as for now there will only be one implementation of these classes.
294 .add(createServiceDependency().setService(ArpProvider.class).setRequired(false))
295 .add(createServiceDependency().setService(InboundNatProvider.class).setRequired(false))
296 .add(createServiceDependency().setService(OutboundNatProvider.class).setRequired(false))
297 .add(createServiceDependency().setService(RoutingProvider.class).setRequired(false))
298 .add(createServiceDependency().setService(L3ForwardingProvider.class).setRequired(false)));
300 manager.add(createComponent()
301 .setInterface(MultiTenantAwareRouter.class.getName(), null)
302 .setImplementation(OpenstackRouter.class));
304 Dictionary<String, Object> nodeCacheManagerProperties = new Hashtable<>();
305 nodeCacheManagerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.NODE);
306 manager.add(createComponent()
307 .setInterface(new String[]{NodeCacheManager.class.getName(), AbstractHandler.class.getName()},
308 nodeCacheManagerProperties)
309 .setImplementation(NodeCacheManagerImpl.class)
310 .add(createServiceDependency().setService(EventDispatcher.class).setRequired(true)));
314 public void destroy(BundleContext context, DependencyManager manager) throws Exception {