2 * Copyright (c) 2015 Red Hat, Inc. and others. All rights reserved.
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
9 package org.opendaylight.ovsdb.openstack.netvirt.providers;
11 import java.util.ArrayList;
12 import java.util.Dictionary;
13 import java.util.Hashtable;
14 import java.util.List;
16 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
17 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
18 import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
19 import org.opendaylight.ovsdb.openstack.netvirt.api.ArpProvider;
20 import org.opendaylight.ovsdb.openstack.netvirt.api.ClassifierProvider;
21 import org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService;
22 import org.opendaylight.ovsdb.openstack.netvirt.api.Constants;
23 import org.opendaylight.ovsdb.openstack.netvirt.api.EgressAclProvider;
24 import org.opendaylight.ovsdb.openstack.netvirt.api.GatewayMacResolver;
25 import org.opendaylight.ovsdb.openstack.netvirt.api.InboundNatProvider;
26 import org.opendaylight.ovsdb.openstack.netvirt.api.IngressAclProvider;
27 import org.opendaylight.ovsdb.openstack.netvirt.api.L2ForwardingProvider;
28 import org.opendaylight.ovsdb.openstack.netvirt.api.L2RewriteProvider;
29 import org.opendaylight.ovsdb.openstack.netvirt.api.L3ForwardingProvider;
30 import org.opendaylight.ovsdb.openstack.netvirt.api.LoadBalancerProvider;
31 import org.opendaylight.ovsdb.openstack.netvirt.api.NetworkingProvider;
32 import org.opendaylight.ovsdb.openstack.netvirt.api.NetworkingProviderManager;
33 import org.opendaylight.ovsdb.openstack.netvirt.api.NodeCacheListener;
34 import org.opendaylight.ovsdb.openstack.netvirt.api.NodeCacheManager;
35 import org.opendaylight.ovsdb.openstack.netvirt.api.OutboundNatProvider;
36 import org.opendaylight.ovsdb.openstack.netvirt.api.RoutingProvider;
37 import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.AbstractServiceInstance;
38 import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.OF13Provider;
39 import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.PipelineOrchestrator;
40 import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.PipelineOrchestratorImpl;
41 import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.Service;
42 import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.services.ArpResponderService;
43 import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.services.ClassifierService;
44 import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.services.EgressAclService;
45 import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.services.InboundNatService;
46 import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.services.IngressAclService;
47 import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.services.L2ForwardingService;
48 import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.services.L2RewriteService;
49 import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.services.L3ForwardingService;
50 import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.services.LoadBalancerService;
51 import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.services.OutboundNatService;
52 import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.services.RoutingService;
53 import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.services.arp.GatewayMacResolverService;
54 import org.osgi.framework.BundleActivator;
55 import org.osgi.framework.BundleContext;
56 import org.osgi.framework.ServiceReference;
57 import org.osgi.framework.ServiceRegistration;
58 import org.osgi.util.tracker.ServiceTracker;
59 import org.slf4j.Logger;
60 import org.slf4j.LoggerFactory;
62 public class ConfigActivator implements BundleActivator {
63 private static final Logger LOG = LoggerFactory.getLogger(ConfigActivator.class);
64 private List<ServiceRegistration<?>> registrations = new ArrayList<>();
65 private ProviderContext providerContext;
67 public ConfigActivator(ProviderContext providerContext) {
68 this.providerContext = providerContext;
72 public void start(BundleContext context) throws Exception {
73 LOG.info("ConfigActivator start:");
75 NetvirtProvidersConfigImpl netvirtProvidersConfig =
76 new NetvirtProvidersConfigImpl(providerContext.getSALService(DataBroker.class),
77 NetvirtProvidersProvider.getTableOffset());
78 registerService(context,
79 new String[] {NetvirtProvidersConfigImpl.class.getName()},
80 null, netvirtProvidersConfig);
82 PipelineOrchestratorImpl pipelineOrchestrator = new PipelineOrchestratorImpl();
83 registerService(context,
84 new String[] {PipelineOrchestrator.class.getName(),NodeCacheListener.class.getName()},
85 null, pipelineOrchestrator);
87 Dictionary<String, Object> of13ProviderProperties = new Hashtable<>();
88 of13ProviderProperties.put(Constants.SOUTHBOUND_PROTOCOL_PROPERTY, "ovsdb");
89 of13ProviderProperties.put(Constants.OPENFLOW_VERSION_PROPERTY, Constants.OPENFLOW13);
90 final OF13Provider of13Provider = new OF13Provider();
91 registerService(context,
92 new String[] {NetworkingProvider.class.getName()},
93 of13ProviderProperties, of13Provider);
95 ClassifierService classifierService = new ClassifierService();
96 registerService(context, ClassifierProvider.class.getName(),
97 classifierService, Service.CLASSIFIER);
99 ArpResponderService arpResponderService = new ArpResponderService();
100 registerService(context, ArpProvider.class.getName(),
101 arpResponderService, Service.ARP_RESPONDER);
103 InboundNatService inboundNatService = new InboundNatService();
104 registerService(context, InboundNatProvider.class.getName(),
105 inboundNatService, Service.INBOUND_NAT);
107 IngressAclService ingressAclService = new IngressAclService();
108 registerService(context, IngressAclProvider.class.getName(),
109 ingressAclService, Service.INGRESS_ACL);
111 LoadBalancerService loadBalancerService = new LoadBalancerService();
112 registerService(context, LoadBalancerProvider.class.getName(),
113 loadBalancerService, Service.LOAD_BALANCER);
115 RoutingService routingService = new RoutingService();
116 registerService(context, RoutingProvider.class.getName(),
117 routingService, Service.ROUTING);
119 L3ForwardingService l3ForwardingService = new L3ForwardingService();
120 registerService(context, L3ForwardingProvider.class.getName(),
121 l3ForwardingService, Service.L3_FORWARDING);
123 L2RewriteService l2RewriteService = new L2RewriteService();
124 registerService(context, L2RewriteProvider.class.getName(),
125 l2RewriteService, Service.L2_REWRITE);
127 L2ForwardingService l2ForwardingService = new L2ForwardingService();
128 registerService(context, L2ForwardingProvider.class.getName(),
129 l2ForwardingService, Service.L2_FORWARDING);
131 EgressAclService egressAclService = new EgressAclService();
132 registerService(context, EgressAclProvider.class.getName(),
133 egressAclService, Service.EGRESS_ACL);
135 OutboundNatService outboundNatService = new OutboundNatService();
136 registerService(context, OutboundNatProvider.class.getName(),
137 outboundNatService, Service.OUTBOUND_NAT);
139 final GatewayMacResolverService gatewayMacResolverService = new GatewayMacResolverService();
140 registerService(context, GatewayMacResolver.class.getName(),
141 gatewayMacResolverService, Service.GATEWAY_RESOLVER);
142 getNotificationProviderService().registerNotificationListener(gatewayMacResolverService);
144 netvirtProvidersConfig.setDependencies(context, null);
145 pipelineOrchestrator.setDependencies(context, null);
146 outboundNatService.setDependencies(context, null);
147 egressAclService.setDependencies(context, null);
148 l2ForwardingService.setDependencies(context, null);
149 l2RewriteService.setDependencies(context, null);
150 l3ForwardingService.setDependencies(context, null);
151 routingService.setDependencies(context, null);
152 loadBalancerService.setDependencies(context, null);
153 ingressAclService.setDependencies(context, null);
154 inboundNatService.setDependencies(context, null);
155 arpResponderService.setDependencies(context, null);
156 classifierService.setDependencies(context, null);
157 of13Provider.setDependencies(context, null);
158 gatewayMacResolverService.setDependencies(context, null);
160 @SuppressWarnings("unchecked")
161 ServiceTracker networkingProviderManagerTracker = new ServiceTracker(context,
162 NetworkingProviderManager.class, null) {
164 public Object addingService(ServiceReference reference) {
165 LOG.info("addingService NetworkingProviderManager");
166 NetworkingProviderManager service =
167 (NetworkingProviderManager) context.getService(reference);
168 if (service != null) {
169 of13Provider.setDependencies(service);
174 networkingProviderManagerTracker.open();
176 @SuppressWarnings("unchecked")
177 ServiceTracker ConfigurationServiceTracker = new ServiceTracker(context,
178 ConfigurationService.class, null) {
180 public Object addingService(ServiceReference reference) {
181 LOG.info("addingService ConfigurationService");
182 ConfigurationService service =
183 (ConfigurationService) context.getService(reference);
184 if (service != null) {
185 gatewayMacResolverService.setDependencies(service);
190 ConfigurationServiceTracker.open();
192 @SuppressWarnings("unchecked")
193 ServiceTracker NodeCacheManagerTracker = new ServiceTracker(context,
194 NodeCacheManager.class, null) {
196 public Object addingService(ServiceReference reference) {
197 LOG.info("addingService NodeCacheManager");
198 NodeCacheManager service =
199 (NodeCacheManager) context.getService(reference);
200 if (service != null) {
201 gatewayMacResolverService.setDependencies(service);
206 NodeCacheManagerTracker.open();
210 public void stop(BundleContext context) throws Exception {
211 LOG.info("ConfigActivator stop");
212 // ServiceTrackers and services are already released when bundle stops,
213 // so we don't need to close the trackers or unregister the services
216 private ServiceRegistration<?> registerService(BundleContext bundleContext, String[] interfaces,
217 Dictionary<String, Object> properties, Object impl) {
218 ServiceRegistration<?> serviceRegistration = bundleContext.registerService(interfaces, impl, properties);
219 if (serviceRegistration != null) {
220 registrations.add(serviceRegistration);
222 return serviceRegistration;
225 private ServiceRegistration<?> registerService(BundleContext bundleContext, String interfaceClassName,
226 Object impl, Object serviceProperty) {
227 Dictionary<String, Object> properties = new Hashtable<>();
228 properties.put(AbstractServiceInstance.SERVICE_PROPERTY, serviceProperty);
229 properties.put(Constants.PROVIDER_NAME_PROPERTY, OF13Provider.NAME);
230 return registerService(bundleContext,
231 new String[] {AbstractServiceInstance.class.getName(), interfaceClassName},
235 private NotificationProviderService getNotificationProviderService(){
236 return this.providerContext.getSALService(NotificationProviderService.class);