1 package org.opendaylight.ovsdb.openstack.netvirt;
3 import java.util.ArrayList;
4 import java.util.Dictionary;
5 import java.util.Hashtable;
7 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
8 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
9 import org.opendaylight.neutron.spi.*;
10 import org.opendaylight.ovsdb.openstack.netvirt.api.*;
11 import org.opendaylight.ovsdb.openstack.netvirt.impl.*;
12 import org.osgi.framework.BundleActivator;
13 import org.osgi.framework.BundleContext;
14 import org.osgi.framework.ServiceReference;
15 import org.osgi.framework.ServiceRegistration;
16 import org.osgi.util.tracker.ServiceTracker;
17 import org.slf4j.Logger;
18 import org.slf4j.LoggerFactory;
20 public class ConfigActivator implements BundleActivator {
21 private static final Logger LOG = LoggerFactory.getLogger(ConfigActivator.class);
22 private List<ServiceRegistration<?>> registrations = new ArrayList<ServiceRegistration<?>>();
23 private ProviderContext providerContext;
24 private ServiceTracker INeutronNetworkCRUDTracker;
25 private ServiceTracker INeutronPortCRUDTracker;
26 private ServiceTracker INeutronLoadBalancerCRUDTracker;
27 private ServiceTracker INeutronLoadBalancerPoolCRUDTracker;
28 private ServiceTracker INeutronSubnetCRUDTracker;
29 private ServiceTracker LoadBalancerProviderTracker;
30 private ServiceTracker ArpProviderTracker;
31 private ServiceTracker InboundNatProviderTracker;
32 private ServiceTracker OutboundNatProviderTracker;
33 private ServiceTracker RoutingProviderTracker;
34 private ServiceTracker L3ForwardingProviderTracker;
36 public ConfigActivator(ProviderContext providerContext) {
37 this.providerContext = providerContext;
41 public void start(BundleContext context) throws Exception {
42 LOG.info("ConfigActivator start:");
44 ConfigurationServiceImpl configurationService = new ConfigurationServiceImpl();
45 registerService(context, new String[] {ConfigurationService.class.getName()},
46 null, configurationService);
48 BridgeConfigurationManagerImpl bridgeConfigurationManager = new BridgeConfigurationManagerImpl();
49 registerService(context, new String[] {BridgeConfigurationManager.class.getName()},
50 null, bridgeConfigurationManager);
52 final TenantNetworkManagerImpl tenantNetworkManager = new TenantNetworkManagerImpl();
53 registerService(context, new String[] {TenantNetworkManager.class.getName()},
54 null, tenantNetworkManager);
56 VlanConfigurationCacheImpl vlanConfigurationCache = new VlanConfigurationCacheImpl();
57 registerService(context, new String[] {VlanConfigurationCache.class.getName()},
58 null, vlanConfigurationCache);
60 Dictionary<String, Object> floatingIPHandlerProperties = new Hashtable<>();
61 floatingIPHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
62 AbstractEvent.HandlerType.NEUTRON_FLOATING_IP);
63 FloatingIPHandler floatingIPHandler = new FloatingIPHandler();
64 registerService(context,
65 new String[] {INeutronFloatingIPAware.class.getName(), AbstractHandler.class.getName()},
66 floatingIPHandlerProperties, floatingIPHandler);
68 Dictionary<String, Object> networkHandlerProperties = new Hashtable<>();
69 networkHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.NEUTRON_NETWORK);
70 final NetworkHandler networkHandler = new NetworkHandler();
71 registerService(context,
72 new String[]{INeutronNetworkAware.class.getName(), AbstractHandler.class.getName()},
73 networkHandlerProperties, networkHandler);
75 Dictionary<String, Object> subnetHandlerProperties = new Hashtable<>();
76 subnetHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.NEUTRON_SUBNET);
77 SubnetHandler subnetHandler = new SubnetHandler();
78 registerService(context,
79 new String[] {INeutronSubnetAware.class.getName(), AbstractHandler.class.getName()},
80 subnetHandlerProperties, subnetHandler);
82 Dictionary<String, Object> portHandlerProperties = new Hashtable<>();
83 portHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.NEUTRON_PORT);
84 PortHandler portHandler = new PortHandler();
85 registerService(context,
86 new String[]{INeutronPortAware.class.getName(), AbstractHandler.class.getName()},
87 portHandlerProperties, portHandler);
89 Dictionary<String, Object> routerHandlerProperties = new Hashtable<>();
90 routerHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.NEUTRON_ROUTER);
91 RouterHandler routerHandler = new RouterHandler();
92 registerService(context,
93 new String[]{INeutronRouterAware.class.getName(), AbstractHandler.class.getName()},
94 routerHandlerProperties, routerHandler);
96 Dictionary<String, Object> southboundHandlerProperties = new Hashtable<>();
97 southboundHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.SOUTHBOUND);
98 SouthboundHandler southboundHandler = new SouthboundHandler();
99 registerService(context,
100 new String[]{OvsdbInventoryListener.class.getName(),
101 NodeCacheListener.class.getName(),
102 AbstractHandler.class.getName()},
103 southboundHandlerProperties, southboundHandler);
105 Dictionary<String, Object> lbaasHandlerProperties = new Hashtable<>();
106 lbaasHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
107 AbstractEvent.HandlerType.NEUTRON_LOAD_BALANCER);
108 final LBaaSHandler lBaaSHandler = new LBaaSHandler();
109 registerService(context,
110 new String[]{INeutronLoadBalancerAware.class.getName(),
111 NodeCacheListener.class.getName(), AbstractHandler.class.getName()},
112 lbaasHandlerProperties, lBaaSHandler);
114 Dictionary<String, Object> lbaasPoolHandlerProperties = new Hashtable<>();
115 lbaasPoolHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
116 AbstractEvent.HandlerType.NEUTRON_LOAD_BALANCER_POOL);
117 final LBaaSPoolHandler lBaaSPoolHandler = new LBaaSPoolHandler();
118 registerService(context,
119 new String[]{INeutronLoadBalancerPoolAware.class.getName(),
120 AbstractHandler.class.getName()}, lbaasPoolHandlerProperties, lBaaSPoolHandler);
122 Dictionary<String, Object> lbaasPoolMemberHandlerProperties = new Hashtable<>();
123 lbaasPoolMemberHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
124 AbstractEvent.HandlerType.NEUTRON_LOAD_BALANCER_POOL_MEMBER);
125 final LBaaSPoolMemberHandler lBaaSPoolMemberHandler = new LBaaSPoolMemberHandler();
126 registerService(context,
127 new String[]{INeutronLoadBalancerPoolMemberAware.class.getName(),
128 AbstractHandler.class.getName()}, lbaasPoolMemberHandlerProperties, lBaaSPoolMemberHandler);
130 Dictionary<String, Object> portSecurityHandlerProperties = new Hashtable<>();
131 portSecurityHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
132 AbstractEvent.HandlerType.NEUTRON_PORT_SECURITY);
133 PortSecurityHandler portSecurityHandler = new PortSecurityHandler();
134 registerService(context,
135 new String[]{INeutronSecurityRuleAware.class.getName(),
136 INeutronSecurityGroupAware.class.getName(), AbstractHandler.class.getName()},
137 portSecurityHandlerProperties, portSecurityHandler);
139 final SecurityServicesImpl securityServices = new SecurityServicesImpl();
140 registerService(context,
141 new String[]{SecurityServicesManager.class.getName()}, null, securityServices);
143 Dictionary<String, Object> fWaasHandlerProperties = new Hashtable<>();
144 fWaasHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.NEUTRON_FWAAS);
145 FWaasHandler fWaasHandler = new FWaasHandler();
146 registerService(context,
147 new String[]{INeutronFirewallAware.class.getName(),
148 INeutronFirewallRuleAware.class.getName(), INeutronFirewallPolicyAware.class.getName(),
149 AbstractHandler.class.getName()}, fWaasHandlerProperties, fWaasHandler);
151 ProviderNetworkManagerImpl providerNetworkManager = new ProviderNetworkManagerImpl();
152 registerService(context,
153 new String[]{NetworkingProviderManager.class.getName()}, null, providerNetworkManager);
155 EventDispatcherImpl eventDispatcher = new EventDispatcherImpl();
156 registerService(context,
157 new String[]{EventDispatcher.class.getName()}, null, eventDispatcher);
159 final NeutronL3Adapter neutronL3Adapter = new NeutronL3Adapter();
160 registerService(context,
161 new String[]{NeutronL3Adapter.class.getName()}, null, neutronL3Adapter);
163 OpenstackRouter openstackRouter = new OpenstackRouter();
164 registerService(context,
165 new String[]{MultiTenantAwareRouter.class.getName()}, null, openstackRouter);
167 Southbound southbound = new SouthboundImpl(providerContext.getSALService(DataBroker.class));
168 registerService(context,
169 new String[]{Southbound.class.getName()}, null, southbound);
171 Dictionary<String, Object> nodeCacheManagerProperties = new Hashtable<>();
172 nodeCacheManagerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.NODE);
173 NodeCacheManagerImpl nodeCacheManager = new NodeCacheManagerImpl();
174 registerService(context,
175 new String[]{NodeCacheManager.class.getName(), AbstractHandler.class.getName()},
176 nodeCacheManagerProperties, nodeCacheManager);
178 OvsdbInventoryServiceImpl ovsdbInventoryService = new OvsdbInventoryServiceImpl(providerContext);
179 registerService(context,
180 new String[] {OvsdbInventoryService.class.getName()}, null, ovsdbInventoryService);
182 ovsdbInventoryService.setDependencies(context, null);
183 nodeCacheManager.setDependencies(context, null);
184 openstackRouter.setDependencies(context, null);
185 neutronL3Adapter.setDependencies(context, null);
186 eventDispatcher.setDependencies(context, null);
187 providerNetworkManager.setDependencies(context, null);
188 fWaasHandler.setDependencies(context, null);
189 securityServices.setDependencies(context, null);
190 portSecurityHandler.setDependencies(context, null);
191 lBaaSPoolMemberHandler.setDependencies(context, null);
192 lBaaSPoolHandler.setDependencies(context, null);
193 lBaaSHandler.setDependencies(context, null);
194 southboundHandler.setDependencies(context, null);
195 routerHandler.setDependencies(context, null);
196 portHandler.setDependencies(context, null);
197 subnetHandler.setDependencies(context, null);
198 networkHandler.setDependencies(context, null);
199 floatingIPHandler.setDependencies(context, null);
200 vlanConfigurationCache.setDependencies(context, null);
201 tenantNetworkManager.setDependencies(context, null);
202 bridgeConfigurationManager.setDependencies(context, null);
203 configurationService.setDependencies(context, null);
205 // TODO check if services are already available and setDependencies
206 // addingService may not be called if the service is already available when the ServiceTracker
208 @SuppressWarnings("unchecked")
209 ServiceTracker INeutronNetworkCRUDTracker = new ServiceTracker(context, INeutronNetworkCRUD.class, null) {
211 public Object addingService(ServiceReference reference) {
212 LOG.info("addingService INeutronNetworkCRUD");
213 INeutronNetworkCRUD service = (INeutronNetworkCRUD)context.getService(reference);
214 if (service != null) {
215 tenantNetworkManager.setDependencies(service);
216 networkHandler.setDependencies(service);
217 lBaaSHandler.setDependencies(service);
218 lBaaSPoolHandler.setDependencies(service);
219 lBaaSPoolMemberHandler.setDependencies(service);
220 neutronL3Adapter.setDependencies(service);
226 public void modifiedService(ServiceReference reference, Object service) {
227 LOG.info("modifiedService INeutronNetworkCRUD");
228 if (service != null) {
229 tenantNetworkManager.setDependencies(service);
230 networkHandler.setDependencies(service);
231 lBaaSHandler.setDependencies(service);
232 lBaaSPoolHandler.setDependencies(service);
233 lBaaSPoolMemberHandler.setDependencies(service);
234 neutronL3Adapter.setDependencies(service);
239 INeutronNetworkCRUDTracker.open();
240 this.INeutronNetworkCRUDTracker = INeutronNetworkCRUDTracker;
242 @SuppressWarnings("unchecked")
243 ServiceTracker INeutronSubnetCRUDTracker = new ServiceTracker(context, INeutronSubnetCRUD.class, null) {
245 public Object addingService(ServiceReference reference) {
246 LOG.info("addingService INeutronSubnetCRUD");
247 INeutronSubnetCRUD service = (INeutronSubnetCRUD) context.getService(reference);
248 if (service != null) {
249 lBaaSHandler.setDependencies(service);
250 lBaaSPoolHandler.setDependencies(service);
251 lBaaSPoolMemberHandler.setDependencies(service);
252 neutronL3Adapter.setDependencies(service);
257 INeutronSubnetCRUDTracker.open();
258 this.INeutronSubnetCRUDTracker = INeutronSubnetCRUDTracker;
260 @SuppressWarnings("unchecked")
261 ServiceTracker INeutronPortCRUDTracker = new ServiceTracker(context, INeutronPortCRUD.class, null) {
263 public Object addingService(ServiceReference reference) {
264 LOG.info("addingService INeutronPortCRUD");
265 INeutronPortCRUD service = (INeutronPortCRUD) context.getService(reference);
266 if (service != null) {
267 tenantNetworkManager.setDependencies(service);
268 lBaaSHandler.setDependencies(service);
269 lBaaSPoolHandler.setDependencies(service);
270 lBaaSPoolMemberHandler.setDependencies(service);
271 securityServices.setDependencies(service);
272 neutronL3Adapter.setDependencies(service);
277 INeutronPortCRUDTracker.open();
278 this.INeutronPortCRUDTracker = INeutronPortCRUDTracker;
280 @SuppressWarnings("unchecked")
281 ServiceTracker INeutronLoadBalancerCRUDTracker = new ServiceTracker(context,
282 INeutronLoadBalancerCRUD.class, null) {
284 public Object addingService(ServiceReference reference) {
285 LOG.info("addingService INeutronLoadBalancerCRUD");
286 INeutronLoadBalancerCRUD service = (INeutronLoadBalancerCRUD) context.getService(reference);
287 if (service != null) {
288 lBaaSHandler.setDependencies(service);
289 lBaaSPoolHandler.setDependencies(service);
290 lBaaSPoolMemberHandler.setDependencies(service);
295 INeutronLoadBalancerCRUDTracker.open();
296 this.INeutronLoadBalancerCRUDTracker = INeutronLoadBalancerCRUDTracker;
298 @SuppressWarnings("unchecked")
299 ServiceTracker INeutronLoadBalancerPoolCRUDTracker = new ServiceTracker(context,
300 INeutronLoadBalancerPoolCRUD.class, null) {
302 public Object addingService(ServiceReference reference) {
303 LOG.info("addingService INeutronLoadBalancerPoolCRUD");
304 INeutronLoadBalancerPoolCRUD service =
305 (INeutronLoadBalancerPoolCRUD) context.getService(reference);
306 if (service != null) {
307 lBaaSHandler.setDependencies(service);
308 lBaaSPoolMemberHandler.setDependencies(service);
313 INeutronLoadBalancerPoolCRUDTracker.open();
314 this.INeutronLoadBalancerPoolCRUDTracker = INeutronLoadBalancerPoolCRUDTracker;
316 @SuppressWarnings("unchecked")
317 ServiceTracker LoadBalancerProviderTracker = new ServiceTracker(context,
318 LoadBalancerProvider.class, null) {
320 public Object addingService(ServiceReference reference) {
321 LOG.info("addingService LoadBalancerProvider");
322 LoadBalancerProvider service =
323 (LoadBalancerProvider) context.getService(reference);
324 if (service != null) {
325 lBaaSHandler.setDependencies(service);
326 lBaaSPoolHandler.setDependencies(service);
327 lBaaSPoolMemberHandler.setDependencies(service);
332 LoadBalancerProviderTracker.open();
333 this.LoadBalancerProviderTracker = LoadBalancerProviderTracker;
335 @SuppressWarnings("unchecked")
336 ServiceTracker ArpProviderTracker = new ServiceTracker(context,
337 ArpProvider.class, null) {
339 public Object addingService(ServiceReference reference) {
340 LOG.info("addingService ArpProvider");
341 ArpProvider service =
342 (ArpProvider) context.getService(reference);
343 if (service != null) {
344 neutronL3Adapter.setDependencies(service);
349 ArpProviderTracker.open();
350 this.ArpProviderTracker = ArpProviderTracker;
352 @SuppressWarnings("unchecked")
353 ServiceTracker InboundNatProviderTracker = new ServiceTracker(context,
354 InboundNatProvider.class, null) {
356 public Object addingService(ServiceReference reference) {
357 LOG.info("addingService InboundNatProvider");
358 InboundNatProvider service =
359 (InboundNatProvider) context.getService(reference);
360 if (service != null) {
361 neutronL3Adapter.setDependencies(service);
366 InboundNatProviderTracker.open();
367 this.InboundNatProviderTracker = InboundNatProviderTracker;
369 @SuppressWarnings("unchecked")
370 ServiceTracker OutboundNatProviderTracker = new ServiceTracker(context,
371 OutboundNatProvider.class, null) {
373 public Object addingService(ServiceReference reference) {
374 LOG.info("addingService OutboundNatProvider");
375 OutboundNatProvider service =
376 (OutboundNatProvider) context.getService(reference);
377 if (service != null) {
378 neutronL3Adapter.setDependencies(service);
383 OutboundNatProviderTracker.open();
384 this.OutboundNatProviderTracker = OutboundNatProviderTracker;
386 @SuppressWarnings("unchecked")
387 ServiceTracker RoutingProviderTracker = new ServiceTracker(context,
388 RoutingProvider.class, null) {
390 public Object addingService(ServiceReference reference) {
391 LOG.info("addingService RoutingProvider");
392 RoutingProvider service =
393 (RoutingProvider) context.getService(reference);
394 if (service != null) {
395 neutronL3Adapter.setDependencies(service);
400 RoutingProviderTracker.open();
401 this.RoutingProviderTracker = RoutingProviderTracker;
403 @SuppressWarnings("unchecked")
404 ServiceTracker L3ForwardingProviderTracker = new ServiceTracker(context,
405 L3ForwardingProvider.class, null) {
407 public Object addingService(ServiceReference reference) {
408 LOG.info("addingService L3ForwardingProvider");
409 L3ForwardingProvider service =
410 (L3ForwardingProvider) context.getService(reference);
411 if (service != null) {
412 neutronL3Adapter.setDependencies(service);
417 L3ForwardingProviderTracker.open();
418 this.L3ForwardingProviderTracker = L3ForwardingProviderTracker;
422 public void stop(BundleContext context) throws Exception {
423 LOG.info("ConfigActivator stop");
424 /* ServiceTrackers and services are already released when bundle stops
425 INeutronNetworkCRUDTracker.close();
426 INeutronPortCRUDTracker.close();
427 INeutronSubnetCRUDTracker.close();
428 INeutronLoadBalancerCRUDTracker.close();
429 INeutronLoadBalancerPoolCRUDTracker.close();
430 LoadBalancerProviderTracker.close();
432 for (ServiceRegistration registration : registrations) {
433 if (registration != null) {
434 registration.unregister();
439 private ServiceRegistration<?> registerService(BundleContext bundleContext, String[] interfaces,
440 Dictionary<String, Object> properties, Object impl) {
441 ServiceRegistration<?> serviceRegistration = bundleContext.registerService(interfaces, impl, properties);
442 if (serviceRegistration != null) {
443 registrations.add(serviceRegistration);
445 return serviceRegistration;