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.ovsdb.openstack.netvirt.api.ArpProvider;
37 import org.opendaylight.ovsdb.openstack.netvirt.api.BridgeConfigurationManager;
38 import org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService;
39 import org.opendaylight.ovsdb.openstack.netvirt.api.Constants;
40 import org.opendaylight.ovsdb.openstack.netvirt.api.EventDispatcher;
41 import org.opendaylight.ovsdb.openstack.netvirt.api.InboundNatProvider;
42 import org.opendaylight.ovsdb.openstack.netvirt.api.L3ForwardingProvider;
43 import org.opendaylight.ovsdb.openstack.netvirt.api.LoadBalancerProvider;
44 import org.opendaylight.ovsdb.openstack.netvirt.api.MultiTenantAwareRouter;
45 import org.opendaylight.ovsdb.openstack.netvirt.api.NetworkingProvider;
46 import org.opendaylight.ovsdb.openstack.netvirt.api.NetworkingProviderManager;
47 import org.opendaylight.ovsdb.openstack.netvirt.api.NodeCacheListener;
48 import org.opendaylight.ovsdb.openstack.netvirt.api.NodeCacheManager;
49 import org.opendaylight.ovsdb.openstack.netvirt.api.OutboundNatProvider;
50 import org.opendaylight.ovsdb.openstack.netvirt.api.RoutingProvider;
51 import org.opendaylight.ovsdb.openstack.netvirt.api.SecurityServicesManager;
52 import org.opendaylight.ovsdb.openstack.netvirt.api.TenantNetworkManager;
53 import org.opendaylight.ovsdb.openstack.netvirt.api.VlanConfigurationCache;
54 import org.opendaylight.ovsdb.openstack.netvirt.impl.BridgeConfigurationManagerImpl;
55 import org.opendaylight.ovsdb.openstack.netvirt.impl.ConfigurationServiceImpl;
56 import org.opendaylight.ovsdb.openstack.netvirt.impl.EventDispatcherImpl;
57 import org.opendaylight.ovsdb.openstack.netvirt.impl.NeutronL3Adapter;
58 import org.opendaylight.ovsdb.openstack.netvirt.impl.NodeCacheManagerImpl;
59 import org.opendaylight.ovsdb.openstack.netvirt.impl.OpenstackRouter;
60 import org.opendaylight.ovsdb.openstack.netvirt.impl.ProviderNetworkManagerImpl;
61 import org.opendaylight.ovsdb.openstack.netvirt.impl.SecurityServicesImpl;
62 import org.opendaylight.ovsdb.openstack.netvirt.impl.TenantNetworkManagerImpl;
63 import org.opendaylight.ovsdb.openstack.netvirt.impl.VlanConfigurationCacheImpl;
64 import org.opendaylight.ovsdb.plugin.api.OvsdbConfigurationService;
65 import org.opendaylight.ovsdb.plugin.api.OvsdbConnectionService;
66 import org.opendaylight.ovsdb.plugin.api.OvsdbInventoryListener;
68 import org.osgi.framework.BundleContext;
71 * OSGi bundle activator for the OVSDB Neutron Interface.
73 public class Activator extends DependencyActivatorBase {
76 public void init(BundleContext context, DependencyManager manager) throws Exception {
78 manager.add(createComponent()
79 .setInterface(ConfigurationService.class.getName(), null)
80 .setImplementation(ConfigurationServiceImpl.class)
81 .add(createServiceDependency().setService(OvsdbConfigurationService.class)));
83 manager.add(createComponent()
84 .setInterface(BridgeConfigurationManager.class.getName(), null)
85 .setImplementation(BridgeConfigurationManagerImpl.class)
86 .add(createServiceDependency().setService(ConfigurationService.class).setRequired(true))
87 .add(createServiceDependency().setService(NetworkingProviderManager.class))
88 .add(createServiceDependency().setService(OvsdbConfigurationService.class)));
90 manager.add(createComponent()
91 .setInterface(TenantNetworkManager.class.getName(), null)
92 .setImplementation(TenantNetworkManagerImpl.class)
93 .add(createServiceDependency().setService(OvsdbConfigurationService.class))
94 .add(createServiceDependency().setService(OvsdbConnectionService.class))
95 .add(createServiceDependency().setService(INeutronNetworkCRUD.class).setRequired(true))
96 .add(createServiceDependency().setService(INeutronPortCRUD.class).setRequired(true))
97 .add(createServiceDependency().setService(VlanConfigurationCache.class)));
99 manager.add(createComponent()
100 .setInterface(VlanConfigurationCache.class.getName(), null)
101 .setImplementation(VlanConfigurationCacheImpl.class)
102 .add(createServiceDependency().setService(OvsdbConfigurationService.class))
103 .add(createServiceDependency().setService(TenantNetworkManager.class)));
105 Dictionary<String, Object> floatingIPHandlerPorperties = new Hashtable<>();
106 floatingIPHandlerPorperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
107 AbstractEvent.HandlerType.NEUTRON_FLOATING_IP);
109 manager.add(createComponent()
110 .setInterface(new String[]{INeutronFloatingIPAware.class.getName(), AbstractHandler.class.getName()},
111 floatingIPHandlerPorperties)
112 .setImplementation(FloatingIPHandler.class)
113 .add(createServiceDependency().setService(EventDispatcher.class).setRequired(true))
114 .add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true)));
116 Dictionary<String, Object> networkHandlerProperties = new Hashtable<>();
117 networkHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.NEUTRON_NETWORK);
119 manager.add(createComponent()
120 .setInterface(new String[]{INeutronNetworkAware.class.getName(), AbstractHandler.class.getName()},
121 networkHandlerProperties)
122 .setImplementation(NetworkHandler.class)
123 .add(createServiceDependency().setService(TenantNetworkManager.class).setRequired(true))
124 .add(createServiceDependency().setService(BridgeConfigurationManager.class).setRequired(true))
125 .add(createServiceDependency().setService(OvsdbConfigurationService.class).setRequired(true))
126 .add(createServiceDependency().setService(OvsdbConnectionService.class).setRequired(true))
127 .add(createServiceDependency().setService(INeutronNetworkCRUD.class).setRequired(true))
128 .add(createServiceDependency().setService(EventDispatcher.class).setRequired(true))
129 .add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true)));
131 Dictionary<String, Object> subnetHandlerProperties = new Hashtable<>();
132 subnetHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.NEUTRON_SUBNET);
134 manager.add(createComponent()
135 .setInterface(new String[]{INeutronSubnetAware.class.getName(), AbstractHandler.class.getName()},
136 subnetHandlerProperties)
137 .setImplementation(SubnetHandler.class)
138 .add(createServiceDependency().setService(EventDispatcher.class).setRequired(true))
139 .add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true)));
141 Dictionary<String, Object> portHandlerProperties = new Hashtable<>();
142 portHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.NEUTRON_PORT);
144 manager.add(createComponent()
145 .setInterface(new String[]{INeutronPortAware.class.getName(), AbstractHandler.class.getName()},
146 portHandlerProperties)
147 .setImplementation(PortHandler.class)
148 .add(createServiceDependency().setService(OvsdbConfigurationService.class).setRequired(true))
149 .add(createServiceDependency().setService(OvsdbConnectionService.class).setRequired(true))
150 .add(createServiceDependency().setService(EventDispatcher.class).setRequired(true))
151 .add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true)));
153 Dictionary<String, Object> routerHandlerProperties = new Hashtable<>();
154 routerHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.NEUTRON_ROUTER);
156 manager.add(createComponent()
157 .setInterface(new String[]{INeutronRouterAware.class.getName(), AbstractHandler.class.getName()},
158 routerHandlerProperties)
159 .setImplementation(RouterHandler.class)
160 .add(createServiceDependency().setService(EventDispatcher.class).setRequired(true))
161 .add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true)));
163 Dictionary<String, Object> southboundHandlerProperties = new Hashtable<>();
164 southboundHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.SOUTHBOUND);
166 manager.add(createComponent()
167 .setInterface(new String[]{OvsdbInventoryListener.class.getName(),
168 NodeCacheListener.class.getName(),
169 AbstractHandler.class.getName()},
170 southboundHandlerProperties)
171 .setImplementation(SouthboundHandler.class)
172 .add(createServiceDependency().setService(ConfigurationService.class).setRequired(true))
173 .add(createServiceDependency().setService(BridgeConfigurationManager.class).setRequired(true))
174 .add(createServiceDependency().setService(TenantNetworkManager.class).setRequired(true))
175 .add(createServiceDependency().setService(NetworkingProviderManager.class).setRequired(true))
176 .add(createServiceDependency().setService(OvsdbConfigurationService.class).setRequired(true))
177 .add(createServiceDependency().setService(OvsdbConnectionService.class).setRequired(true))
178 .add(createServiceDependency().setService(EventDispatcher.class).setRequired(true))
179 .add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true))
180 .add(createServiceDependency().setService(NodeCacheManager.class).setRequired(true)));
182 Dictionary<String, Object> lbaasHandlerProperties = new Hashtable<>();
183 lbaasHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
184 AbstractEvent.HandlerType.NEUTRON_LOAD_BALANCER);
186 manager.add(createComponent()
187 .setInterface(new String[]{INeutronLoadBalancerAware.class.getName(),
188 NodeCacheListener.class.getName(), AbstractHandler.class.getName()},
189 lbaasHandlerProperties)
190 .setImplementation(LBaaSHandler.class)
191 .add(createServiceDependency().setService(EventDispatcher.class).setRequired(true))
192 .add(createServiceDependency().setService(INeutronPortCRUD.class).setRequired(true))
193 .add(createServiceDependency().setService(INeutronLoadBalancerCRUD.class).setRequired(true))
194 .add(createServiceDependency().setService(INeutronLoadBalancerPoolCRUD.class).setRequired(true))
195 .add(createServiceDependency().setService(LoadBalancerProvider.class).setRequired(true))
196 .add(createServiceDependency().setService(INeutronNetworkCRUD.class).setRequired(true))
197 .add(createServiceDependency().setService(INeutronSubnetCRUD.class).setRequired(true))
198 .add(createServiceDependency().setService(NodeCacheManager.class).setRequired(true)));
200 Dictionary<String, Object> lbaasPoolHandlerProperties = new Hashtable<>();
201 lbaasPoolHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
202 AbstractEvent.HandlerType.NEUTRON_LOAD_BALANCER_POOL);
204 manager.add(createComponent()
205 .setInterface(new String[]{INeutronLoadBalancerPoolAware.class.getName(),
206 AbstractHandler.class.getName()}, lbaasPoolHandlerProperties)
207 .setImplementation(LBaaSPoolHandler.class)
208 .add(createServiceDependency().setService(EventDispatcher.class).setRequired(true))
209 .add(createServiceDependency().setService(INeutronPortCRUD.class).setRequired(true))
210 .add(createServiceDependency().setService(INeutronLoadBalancerCRUD.class).setRequired(true))
211 .add(createServiceDependency().setService(LoadBalancerProvider.class).setRequired(true))
212 .add(createServiceDependency().setService(INeutronNetworkCRUD.class).setRequired(true))
213 .add(createServiceDependency().setService(INeutronSubnetCRUD.class).setRequired(true))
214 .add(createServiceDependency().setService(NodeCacheManager.class).setRequired(true)));
216 Dictionary<String, Object> lbaasPoolMemberHandlerProperties = new Hashtable<>();
217 lbaasPoolMemberHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
218 AbstractEvent.HandlerType.NEUTRON_LOAD_BALANCER_POOL_MEMBER);
220 manager.add(createComponent()
221 .setInterface(new String[]{INeutronLoadBalancerPoolMemberAware.class.getName(),
222 AbstractHandler.class.getName()}, lbaasPoolMemberHandlerProperties)
223 .setImplementation(LBaaSPoolMemberHandler.class)
224 .add(createServiceDependency().setService(EventDispatcher.class).setRequired(true))
225 .add(createServiceDependency().setService(INeutronPortCRUD.class).setRequired(true))
226 .add(createServiceDependency().setService(INeutronLoadBalancerCRUD.class).setRequired(true))
227 .add(createServiceDependency().setService(INeutronLoadBalancerPoolCRUD.class).setRequired(true))
228 .add(createServiceDependency().setService(LoadBalancerProvider.class).setRequired(true))
229 .add(createServiceDependency().setService(INeutronNetworkCRUD.class).setRequired(true))
230 .add(createServiceDependency().setService(INeutronSubnetCRUD.class).setRequired(true))
231 .add(createServiceDependency().setService(NodeCacheManager.class).setRequired(true)));
233 Dictionary<String, Object> portSecurityHandlerProperties = new Hashtable<>();
234 portSecurityHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
235 AbstractEvent.HandlerType.NEUTRON_PORT_SECURITY);
237 manager.add(createComponent()
238 .setInterface(new String[]{INeutronSecurityRuleAware.class.getName(),
239 INeutronSecurityGroupAware.class.getName(), AbstractHandler.class.getName()},
240 portSecurityHandlerProperties)
241 .setImplementation(PortSecurityHandler.class)
242 .add(createServiceDependency().setService(EventDispatcher.class).setRequired(true)));
244 manager.add(createComponent()
245 .setInterface(new String[]{SecurityServicesManager.class.getName()}, null)
246 .setImplementation(SecurityServicesImpl.class)
247 .add(createServiceDependency().setService(INeutronPortCRUD.class).setRequired(true)));
249 Dictionary<String, Object> fWaasHandlerProperties = new Hashtable<>();
250 fWaasHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.NEUTRON_FWAAS);
252 manager.add(createComponent()
253 .setInterface(new String[] {INeutronFirewallAware.class.getName(),
254 INeutronFirewallRuleAware.class.getName(), INeutronFirewallPolicyAware.class.getName(),
255 AbstractHandler.class.getName()}, fWaasHandlerProperties)
256 .setImplementation(FWaasHandler.class)
257 .add(createServiceDependency().setService(EventDispatcher.class).setRequired(true)));
259 manager.add(createComponent()
260 .setInterface(NetworkingProviderManager.class.getName(), null)
261 .setImplementation(ProviderNetworkManagerImpl.class)
262 .add(createServiceDependency().setService(NetworkingProvider.class)
263 .setCallbacks("providerAdded", "providerRemoved")));
265 manager.add(createComponent()
266 .setInterface(EventDispatcher.class.getName(), null)
267 .setImplementation(EventDispatcherImpl.class)
268 .add(createServiceDependency()
269 .setService(AbstractHandler.class)
270 .setCallbacks("eventHandlerAdded", "eventHandlerRemoved")));
272 manager.add(createComponent()
273 .setInterface(NeutronL3Adapter.class.getName(), null)
274 .setImplementation(NeutronL3Adapter.class)
275 .add(createServiceDependency().setService(ConfigurationService.class).setRequired(true))
276 .add(createServiceDependency().setService(TenantNetworkManager.class).setRequired(true))
277 .add(createServiceDependency().setService(OvsdbConfigurationService.class).setRequired(true))
278 .add(createServiceDependency().setService(OvsdbConnectionService.class).setRequired(true))
279 .add(createServiceDependency().setService(INeutronNetworkCRUD.class).setRequired(true))
280 .add(createServiceDependency().setService(INeutronSubnetCRUD.class).setRequired(true))
281 .add(createServiceDependency().setService(INeutronPortCRUD.class).setRequired(true))
282 /* ToDo, we should probably just use the NetworkingProvider interface
283 * This should provide a way of getting service implementations
284 * Either that, or we should do service lookup at runtime based on getProvider().getName()
285 * This is a shortcut as for now there will only be one implementation of these classes.
287 .add(createServiceDependency().setService(ArpProvider.class).setRequired(false))
288 .add(createServiceDependency().setService(InboundNatProvider.class).setRequired(false))
289 .add(createServiceDependency().setService(OutboundNatProvider.class).setRequired(false))
290 .add(createServiceDependency().setService(RoutingProvider.class).setRequired(false))
291 .add(createServiceDependency().setService(L3ForwardingProvider.class).setRequired(false)));
293 manager.add(createComponent()
294 .setInterface(MultiTenantAwareRouter.class.getName(), null)
295 .setImplementation(OpenstackRouter.class));
297 Dictionary<String, Object> nodeCacheManagerProperties = new Hashtable<>();
298 nodeCacheManagerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.NODE);
299 manager.add(createComponent()
300 .setInterface(new String[]{NodeCacheManager.class.getName(), AbstractHandler.class.getName()},
301 nodeCacheManagerProperties)
302 .setImplementation(NodeCacheManagerImpl.class)
303 .add(createServiceDependency().setService(EventDispatcher.class).setRequired(true))
304 .add(createServiceDependency().setService(NodeCacheListener.class)
305 .setCallbacks("cacheListenerAdded", "cacheListenerRemoved")));
309 public void destroy(BundleContext context, DependencyManager manager) throws Exception {