Merge "Unit test file for NeutronFloatingIPInterface."
[netvirt.git] / openstack / net-virt-providers / src / main / java / org / opendaylight / ovsdb / openstack / netvirt / providers / ConfigActivator.java
1 /*
2  * Copyright (c) 2015 Red Hat, Inc. and others. All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.ovsdb.openstack.netvirt.providers;
10
11 import java.util.ArrayList;
12 import java.util.Dictionary;
13 import java.util.Hashtable;
14 import java.util.List;
15
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;
61
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;
66
67     public ConfigActivator(ProviderContext providerContext) {
68         this.providerContext = providerContext;
69     }
70
71     @Override
72     public void start(BundleContext context) throws Exception {
73         LOG.info("ConfigActivator start:");
74
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);
81
82         PipelineOrchestratorImpl pipelineOrchestrator = new PipelineOrchestratorImpl();
83         registerService(context,
84                 new String[] {PipelineOrchestrator.class.getName(),NodeCacheListener.class.getName()},
85                 null, pipelineOrchestrator);
86
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);
94
95         ClassifierService classifierService = new ClassifierService();
96         registerService(context, ClassifierProvider.class.getName(),
97                 classifierService, Service.CLASSIFIER);
98
99         ArpResponderService arpResponderService = new ArpResponderService();
100         registerService(context, ArpProvider.class.getName(),
101                 arpResponderService, Service.ARP_RESPONDER);
102
103         InboundNatService inboundNatService = new InboundNatService();
104         registerService(context, InboundNatProvider.class.getName(),
105                 inboundNatService, Service.INBOUND_NAT);
106
107         IngressAclService ingressAclService = new IngressAclService();
108         registerService(context, IngressAclProvider.class.getName(),
109                 ingressAclService, Service.INGRESS_ACL);
110
111         LoadBalancerService loadBalancerService = new LoadBalancerService();
112         registerService(context, LoadBalancerProvider.class.getName(),
113                 loadBalancerService, Service.LOAD_BALANCER);
114
115         RoutingService routingService = new RoutingService();
116         registerService(context, RoutingProvider.class.getName(),
117                 routingService, Service.ROUTING);
118
119         L3ForwardingService l3ForwardingService = new L3ForwardingService();
120         registerService(context, L3ForwardingProvider.class.getName(),
121                 l3ForwardingService, Service.L3_FORWARDING);
122
123         L2RewriteService l2RewriteService = new L2RewriteService();
124         registerService(context, L2RewriteProvider.class.getName(),
125                 l2RewriteService, Service.L2_REWRITE);
126
127         L2ForwardingService l2ForwardingService = new L2ForwardingService();
128         registerService(context, L2ForwardingProvider.class.getName(),
129                 l2ForwardingService, Service.L2_FORWARDING);
130
131         EgressAclService egressAclService = new EgressAclService();
132         registerService(context, EgressAclProvider.class.getName(),
133                 egressAclService, Service.EGRESS_ACL);
134
135         OutboundNatService outboundNatService = new OutboundNatService();
136         registerService(context, OutboundNatProvider.class.getName(),
137                 outboundNatService, Service.OUTBOUND_NAT);
138
139         final GatewayMacResolverService gatewayMacResolverService = new GatewayMacResolverService();
140         registerService(context, GatewayMacResolver.class.getName(),
141                 gatewayMacResolverService, Service.GATEWAY_RESOLVER);
142         getNotificationProviderService().registerNotificationListener(gatewayMacResolverService);
143
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);
159
160         @SuppressWarnings("unchecked")
161         ServiceTracker networkingProviderManagerTracker = new ServiceTracker(context,
162                 NetworkingProviderManager.class, null) {
163             @Override
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);
170                 }
171                 return service;
172             }
173         };
174         networkingProviderManagerTracker.open();
175
176         @SuppressWarnings("unchecked")
177         ServiceTracker ConfigurationServiceTracker = new ServiceTracker(context,
178                 ConfigurationService.class, null) {
179             @Override
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);
186                 }
187                 return service;
188             }
189         };
190         ConfigurationServiceTracker.open();
191
192         @SuppressWarnings("unchecked")
193         ServiceTracker NodeCacheManagerTracker = new ServiceTracker(context,
194                 NodeCacheManager.class, null) {
195             @Override
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);
202                 }
203                 return service;
204             }
205         };
206         NodeCacheManagerTracker.open();
207     }
208
209     @Override
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
214     }
215
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);
221         }
222         return serviceRegistration;
223     }
224
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},
232                 properties, impl);
233     }
234
235     private NotificationProviderService getNotificationProviderService(){
236         return this.providerContext.getSALService(NotificationProviderService.class);
237     }
238 }