blob: 47e53114ae995d7edaf0cbdac96c26aa7f0da8f1 [file] [log] [blame]
wei wei89ddc322015-03-22 16:29:04 -05001/*
2 * Copyright 2015 Open Networking Laboratory
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.onosproject.net.tunnel.impl;
17
jccd8697232015-05-05 14:42:23 +080018import static com.google.common.base.Preconditions.checkNotNull;
jcc4a20a5f2015-04-30 15:43:39 +080019import static org.slf4j.LoggerFactory.getLogger;
20
21import java.util.Collection;
22import java.util.Set;
jcc4a20a5f2015-04-30 15:43:39 +080023
wei wei89ddc322015-03-22 16:29:04 -050024import org.apache.felix.scr.annotations.Activate;
25import org.apache.felix.scr.annotations.Component;
26import org.apache.felix.scr.annotations.Deactivate;
27import org.apache.felix.scr.annotations.Reference;
28import org.apache.felix.scr.annotations.ReferenceCardinality;
29import org.apache.felix.scr.annotations.Service;
jcc4a20a5f2015-04-30 15:43:39 +080030import org.onosproject.core.ApplicationId;
wei wei89ddc322015-03-22 16:29:04 -050031import org.onosproject.event.EventDeliveryService;
Simon Huntff663742015-05-14 13:33:05 -070032import org.onosproject.event.ListenerRegistry;
jcc4a20a5f2015-04-30 15:43:39 +080033import org.onosproject.net.Annotations;
wei wei89ddc322015-03-22 16:29:04 -050034import org.onosproject.net.Path;
wei wei89ddc322015-03-22 16:29:04 -050035import org.onosproject.net.provider.AbstractProviderRegistry;
36import org.onosproject.net.provider.AbstractProviderService;
37import org.onosproject.net.provider.ProviderId;
jccd8697232015-05-05 14:42:23 +080038import org.onosproject.net.tunnel.DefaultTunnel;
wei wei89ddc322015-03-22 16:29:04 -050039import org.onosproject.net.tunnel.Tunnel;
Simon Huntff663742015-05-14 13:33:05 -070040import org.onosproject.net.tunnel.Tunnel.Type;
wei wei89ddc322015-03-22 16:29:04 -050041import org.onosproject.net.tunnel.TunnelAdminService;
42import org.onosproject.net.tunnel.TunnelDescription;
jcc4a20a5f2015-04-30 15:43:39 +080043import org.onosproject.net.tunnel.TunnelEndPoint;
wei wei89ddc322015-03-22 16:29:04 -050044import org.onosproject.net.tunnel.TunnelEvent;
45import org.onosproject.net.tunnel.TunnelId;
46import org.onosproject.net.tunnel.TunnelListener;
jcc4a20a5f2015-04-30 15:43:39 +080047import org.onosproject.net.tunnel.TunnelName;
wei wei89ddc322015-03-22 16:29:04 -050048import org.onosproject.net.tunnel.TunnelProvider;
49import org.onosproject.net.tunnel.TunnelProviderRegistry;
50import org.onosproject.net.tunnel.TunnelProviderService;
51import org.onosproject.net.tunnel.TunnelService;
52import org.onosproject.net.tunnel.TunnelStore;
53import org.onosproject.net.tunnel.TunnelStoreDelegate;
jcc4a20a5f2015-04-30 15:43:39 +080054import org.onosproject.net.tunnel.TunnelSubscription;
wei wei89ddc322015-03-22 16:29:04 -050055import org.slf4j.Logger;
56
57/**
58 * Provides implementation of the tunnel NB/SB APIs.
59 */
60@Component(immediate = true, enabled = true)
61@Service
jcc4a20a5f2015-04-30 15:43:39 +080062public class TunnelManager
63 extends AbstractProviderRegistry<TunnelProvider, TunnelProviderService>
wei wei89ddc322015-03-22 16:29:04 -050064 implements TunnelService, TunnelAdminService, TunnelProviderRegistry {
65
66 private static final String TUNNNEL_ID_NULL = "Tunnel ID cannot be null";
67
68 private final Logger log = getLogger(getClass());
69
Simon Huntff663742015-05-14 13:33:05 -070070 protected final ListenerRegistry<TunnelEvent, TunnelListener>
71 listenerRegistry = new ListenerRegistry<>();
wei wei89ddc322015-03-22 16:29:04 -050072
73 private final TunnelStoreDelegate delegate = new InternalStoreDelegate();
jccd8697232015-05-05 14:42:23 +080074
wei wei89ddc322015-03-22 16:29:04 -050075
76 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
77 protected TunnelStore store;
78
79 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
80 protected EventDeliveryService eventDispatcher;
81
wei wei89ddc322015-03-22 16:29:04 -050082 @Activate
83 public void activate() {
jccd8697232015-05-05 14:42:23 +080084 store.setDelegate(delegate);
85 eventDispatcher.addSink(TunnelEvent.class, listenerRegistry);
wei wei89ddc322015-03-22 16:29:04 -050086 log.info("Started");
87 }
88
89 @Deactivate
90 public void deactivate() {
jccd8697232015-05-05 14:42:23 +080091 store.unsetDelegate(delegate);
92 eventDispatcher.removeSink(TunnelEvent.class);
wei wei89ddc322015-03-22 16:29:04 -050093 log.info("Stopped");
94 }
95
96 @Override
jccd8697232015-05-05 14:42:23 +080097 public void removeTunnel(TunnelId tunnelId) {
98 checkNotNull(tunnelId, TUNNNEL_ID_NULL);
99 store.deleteTunnel(tunnelId);
100 Tunnel tunnel = store.queryTunnel(tunnelId);
101 if (tunnel.providerId() != null) {
102 TunnelProvider provider = getProvider(tunnel.providerId());
103 if (provider != null) {
104 provider.releaseTunnel(tunnel);
105 }
106 } else {
107 Set<ProviderId> ids = getProviders();
108 for (ProviderId providerId : ids) {
109 TunnelProvider provider = getProvider(providerId);
110 provider.releaseTunnel(tunnel);
111 }
112 }
113 }
114
115 @Override
116 public void updateTunnel(Tunnel tunnel, Path path) {
117 store.createOrUpdateTunnel(tunnel);
118 if (tunnel.providerId() != null) {
119 TunnelProvider provider = getProvider(tunnel.providerId());
120 if (provider != null) {
121 provider.updateTunnel(tunnel, path);
122 }
123 } else {
124 Set<ProviderId> ids = getProviders();
125 for (ProviderId providerId : ids) {
126 TunnelProvider provider = getProvider(providerId);
127 provider.updateTunnel(tunnel, path);
128 }
129 }
130 }
131
132 @Override
133 public void removeTunnels(TunnelEndPoint src, TunnelEndPoint dst,
134 ProviderId producerName) {
135 store.deleteTunnel(src, dst, producerName);
136 Collection<Tunnel> setTunnels = store.queryTunnel(src, dst);
137 for (Tunnel tunnel : setTunnels) {
138 if (producerName != null
139 && !tunnel.providerId().equals(producerName)) {
140 continue;
141 }
142 if (tunnel.providerId() != null) {
143 TunnelProvider provider = getProvider(tunnel.providerId());
144 if (provider != null) {
145 provider.releaseTunnel(tunnel);
146 }
147 } else {
148 Set<ProviderId> ids = getProviders();
149 for (ProviderId providerId : ids) {
150 TunnelProvider provider = getProvider(providerId);
151 provider.releaseTunnel(tunnel);
152 }
153 }
154 }
155 }
156
157 @Override
158 public void removeTunnels(TunnelEndPoint src, TunnelEndPoint dst, Type type,
159 ProviderId producerName) {
160 store.deleteTunnel(src, dst, type, producerName);
161 Collection<Tunnel> setTunnels = store.queryTunnel(src, dst);
162 for (Tunnel tunnel : setTunnels) {
163 if (producerName != null
164 && !tunnel.providerId().equals(producerName)
165 || !type.equals(tunnel.type())) {
166 continue;
167 }
168 if (tunnel.providerId() != null) {
169 TunnelProvider provider = getProvider(tunnel.providerId());
170 if (provider != null) {
171 provider.releaseTunnel(tunnel);
172 }
173 } else {
174 Set<ProviderId> ids = getProviders();
175 for (ProviderId providerId : ids) {
176 TunnelProvider provider = getProvider(providerId);
177 provider.releaseTunnel(tunnel);
178 }
179 }
180 }
181 }
182
183 @Override
184 public Tunnel borrowTunnel(ApplicationId consumerId, TunnelId tunnelId,
185 Annotations... annotations) {
186 return store.borrowTunnel(consumerId, tunnelId, annotations);
187 }
188
189 @Override
190 public Collection<Tunnel> borrowTunnel(ApplicationId consumerId,
191 TunnelName tunnelName,
192 Annotations... annotations) {
193 return store.borrowTunnel(consumerId, tunnelName, annotations);
194 }
195
196 @Override
197 public Collection<Tunnel> borrowTunnel(ApplicationId consumerId,
198 TunnelEndPoint src, TunnelEndPoint dst,
199 Annotations... annotations) {
200 Collection<Tunnel> tunnels = store.borrowTunnel(consumerId, src,
201 dst, annotations);
202 if (tunnels == null || tunnels.size() == 0) {
203 Tunnel tunnel = new DefaultTunnel(null, src, dst, null, null, null,
204 null, null, annotations);
205 Set<ProviderId> ids = getProviders();
206 for (ProviderId providerId : ids) {
207 TunnelProvider provider = getProvider(providerId);
208 provider.setupTunnel(tunnel, null);
209 }
210 }
211 return tunnels;
212 }
213
214 @Override
215 public Collection<Tunnel> borrowTunnel(ApplicationId consumerId,
216 TunnelEndPoint src, TunnelEndPoint dst,
217 Type type, Annotations... annotations) {
218 Collection<Tunnel> tunnels = store.borrowTunnel(consumerId, src,
219 dst, type,
220 annotations);
221 if (tunnels == null || tunnels.size() == 0) {
222 Tunnel tunnel = new DefaultTunnel(null, src, dst, type, null, null,
223 null, null, annotations);
224 Set<ProviderId> ids = getProviders();
225 for (ProviderId providerId : ids) {
226 TunnelProvider provider = getProvider(providerId);
227 provider.setupTunnel(tunnel, null);
228 }
229 }
230 return tunnels;
231 }
232
233 @Override
234 public boolean returnTunnel(ApplicationId consumerId,
235 TunnelId tunnelId, Annotations... annotations) {
236 return store.returnTunnel(consumerId, tunnelId, annotations);
237 }
238
239 @Override
240 public boolean returnTunnel(ApplicationId consumerId,
241 TunnelName tunnelName,
242 Annotations... annotations) {
243 return store.returnTunnel(consumerId, tunnelName, annotations);
244 }
245
246 @Override
247 public boolean returnTunnel(ApplicationId consumerId, TunnelEndPoint src,
248 TunnelEndPoint dst, Type type,
249 Annotations... annotations) {
250 return store.returnTunnel(consumerId, src, dst, type, annotations);
251 }
252
253 @Override
254 public boolean returnTunnel(ApplicationId consumerId, TunnelEndPoint src,
255 TunnelEndPoint dst, Annotations... annotations) {
256 return store.returnTunnel(consumerId, src, dst, annotations);
257 }
258
259 @Override
260 public Tunnel queryTunnel(TunnelId tunnelId) {
261 return store.queryTunnel(tunnelId);
262 }
263
264 @Override
265 public Collection<TunnelSubscription> queryTunnelSubscription(ApplicationId consumerId) {
266 return store.queryTunnelSubscription(consumerId);
267 }
268
269 @Override
270 public Collection<Tunnel> queryTunnel(Type type) {
271 return store.queryTunnel(type);
272 }
273
274 @Override
275 public Collection<Tunnel> queryTunnel(TunnelEndPoint src, TunnelEndPoint dst) {
276 return store.queryTunnel(src, dst);
277 }
278
279 @Override
280 public int tunnelCount() {
281 return store.tunnelCount();
282 }
283
284 @Override
wei wei89ddc322015-03-22 16:29:04 -0500285 protected TunnelProviderService createProviderService(TunnelProvider provider) {
wei wei89ddc322015-03-22 16:29:04 -0500286 return new InternalTunnelProviderService(provider);
287 }
288
289 @Override
wei wei89ddc322015-03-22 16:29:04 -0500290 public void addListener(TunnelListener listener) {
jccd8697232015-05-05 14:42:23 +0800291 listenerRegistry.addListener(listener);
wei wei89ddc322015-03-22 16:29:04 -0500292 }
293
294 @Override
295 public void removeListener(TunnelListener listener) {
jccd8697232015-05-05 14:42:23 +0800296 listenerRegistry.removeListener(listener);
wei wei89ddc322015-03-22 16:29:04 -0500297 }
298
299 private class InternalTunnelProviderService
300 extends AbstractProviderService<TunnelProvider>
301 implements TunnelProviderService {
302 protected InternalTunnelProviderService(TunnelProvider provider) {
303 super(provider);
wei wei89ddc322015-03-22 16:29:04 -0500304 }
305
jccd8697232015-05-05 14:42:23 +0800306
wei wei89ddc322015-03-22 16:29:04 -0500307 @Override
jcc4a20a5f2015-04-30 15:43:39 +0800308 public TunnelId tunnelAdded(TunnelDescription tunnel) {
jccd8697232015-05-05 14:42:23 +0800309 Tunnel storedTunnel = new DefaultTunnel(provider().id(),
310 tunnel.src(), tunnel.dst(),
311 tunnel.type(),
312 tunnel.groupId(),
313 tunnel.id(),
314 tunnel.tunnelName(),
315 tunnel.annotations());
316 return store.createOrUpdateTunnel(storedTunnel);
wei wei89ddc322015-03-22 16:29:04 -0500317 }
318
319 @Override
320 public void tunnelUpdated(TunnelDescription tunnel) {
jccd8697232015-05-05 14:42:23 +0800321 Tunnel storedTunnel = new DefaultTunnel(provider().id(),
322 tunnel.src(), tunnel.dst(),
323 tunnel.type(),
324 tunnel.groupId(),
325 tunnel.id(),
326 tunnel.tunnelName(),
327 tunnel.annotations());
328 store.createOrUpdateTunnel(storedTunnel);
wei wei89ddc322015-03-22 16:29:04 -0500329 }
330
331 @Override
332 public void tunnelRemoved(TunnelDescription tunnel) {
jccd8697232015-05-05 14:42:23 +0800333 if (tunnel.id() != null) {
334 store.deleteTunnel(tunnel.id());
335 }
336 if (tunnel.src() != null && tunnel.dst() != null
337 && tunnel.type() != null) {
338 store.deleteTunnel(tunnel.src(), tunnel.dst(), tunnel.type(),
339 provider().id());
340 }
341 if (tunnel.src() != null && tunnel.dst() != null
342 && tunnel.type() == null) {
343 store.deleteTunnel(tunnel.src(), tunnel.dst(), provider().id());
344 }
wei wei89ddc322015-03-22 16:29:04 -0500345 }
346
347 }
348
349 private class InternalStoreDelegate implements TunnelStoreDelegate {
350 @Override
351 public void notify(TunnelEvent event) {
wei wei89ddc322015-03-22 16:29:04 -0500352 if (event != null) {
353 eventDispatcher.post(event);
354 }
355 }
356 }
wei wei89ddc322015-03-22 16:29:04 -0500357}