blob: d316388f2d7984dd805441ce2469a411add855f8 [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 */
Thomas Vachuskabf916ea2015-05-20 18:24:34 -070016package org.onosproject.incubator.net.tunnel.impl;
wei wei89ddc322015-03-22 16:29:04 -050017
wei wei89ddc322015-03-22 16:29:04 -050018import org.apache.felix.scr.annotations.Activate;
19import org.apache.felix.scr.annotations.Component;
20import org.apache.felix.scr.annotations.Deactivate;
21import org.apache.felix.scr.annotations.Reference;
22import org.apache.felix.scr.annotations.ReferenceCardinality;
23import org.apache.felix.scr.annotations.Service;
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070024import org.onosproject.net.provider.AbstractListenerProviderRegistry;
jcc4a20a5f2015-04-30 15:43:39 +080025import org.onosproject.core.ApplicationId;
Thomas Vachuskabf916ea2015-05-20 18:24:34 -070026import org.onosproject.incubator.net.tunnel.DefaultTunnel;
samuel7a5691a2015-05-23 00:36:32 +080027import org.onosproject.incubator.net.tunnel.Tunnel;
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070028import org.onosproject.incubator.net.tunnel.Tunnel.Type;
Thomas Vachuskabf916ea2015-05-20 18:24:34 -070029import org.onosproject.incubator.net.tunnel.TunnelAdminService;
30import org.onosproject.incubator.net.tunnel.TunnelDescription;
31import org.onosproject.incubator.net.tunnel.TunnelEndPoint;
32import org.onosproject.incubator.net.tunnel.TunnelEvent;
33import org.onosproject.incubator.net.tunnel.TunnelId;
34import org.onosproject.incubator.net.tunnel.TunnelListener;
35import org.onosproject.incubator.net.tunnel.TunnelName;
36import org.onosproject.incubator.net.tunnel.TunnelProvider;
37import org.onosproject.incubator.net.tunnel.TunnelProviderRegistry;
38import org.onosproject.incubator.net.tunnel.TunnelProviderService;
39import org.onosproject.incubator.net.tunnel.TunnelService;
40import org.onosproject.incubator.net.tunnel.TunnelStore;
41import org.onosproject.incubator.net.tunnel.TunnelStoreDelegate;
42import org.onosproject.incubator.net.tunnel.TunnelSubscription;
samuel7a5691a2015-05-23 00:36:32 +080043import org.onosproject.net.Annotations;
cheng fan35dc0f22015-06-10 06:02:47 +080044import org.onosproject.net.DeviceId;
samuel7a5691a2015-05-23 00:36:32 +080045import org.onosproject.net.Path;
samuel7a5691a2015-05-23 00:36:32 +080046import org.onosproject.net.provider.AbstractProviderService;
47import org.onosproject.net.provider.ProviderId;
wei wei89ddc322015-03-22 16:29:04 -050048import org.slf4j.Logger;
49
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070050import java.util.Collection;
51import java.util.Collections;
52import java.util.Set;
53
54import static com.google.common.base.Preconditions.checkNotNull;
55import static org.slf4j.LoggerFactory.getLogger;
56
wei wei89ddc322015-03-22 16:29:04 -050057/**
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
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070063 extends AbstractListenerProviderRegistry<TunnelEvent, TunnelListener,
64 TunnelProvider, TunnelProviderService>
wei wei89ddc322015-03-22 16:29:04 -050065 implements TunnelService, TunnelAdminService, TunnelProviderRegistry {
66
67 private static final String TUNNNEL_ID_NULL = "Tunnel ID cannot be null";
68
69 private final Logger log = getLogger(getClass());
70
wei wei89ddc322015-03-22 16:29:04 -050071 private final TunnelStoreDelegate delegate = new InternalStoreDelegate();
jccd8697232015-05-05 14:42:23 +080072
wei wei89ddc322015-03-22 16:29:04 -050073 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
74 protected TunnelStore store;
75
wei wei89ddc322015-03-22 16:29:04 -050076
wei wei89ddc322015-03-22 16:29:04 -050077 @Activate
78 public void activate() {
jccd8697232015-05-05 14:42:23 +080079 store.setDelegate(delegate);
80 eventDispatcher.addSink(TunnelEvent.class, listenerRegistry);
wei wei89ddc322015-03-22 16:29:04 -050081 log.info("Started");
82 }
83
84 @Deactivate
85 public void deactivate() {
jccd8697232015-05-05 14:42:23 +080086 store.unsetDelegate(delegate);
87 eventDispatcher.removeSink(TunnelEvent.class);
wei wei89ddc322015-03-22 16:29:04 -050088 log.info("Stopped");
89 }
90
91 @Override
jccd8697232015-05-05 14:42:23 +080092 public void removeTunnel(TunnelId tunnelId) {
93 checkNotNull(tunnelId, TUNNNEL_ID_NULL);
94 store.deleteTunnel(tunnelId);
95 Tunnel tunnel = store.queryTunnel(tunnelId);
96 if (tunnel.providerId() != null) {
97 TunnelProvider provider = getProvider(tunnel.providerId());
98 if (provider != null) {
99 provider.releaseTunnel(tunnel);
100 }
101 } else {
102 Set<ProviderId> ids = getProviders();
103 for (ProviderId providerId : ids) {
104 TunnelProvider provider = getProvider(providerId);
105 provider.releaseTunnel(tunnel);
106 }
107 }
108 }
109
110 @Override
111 public void updateTunnel(Tunnel tunnel, Path path) {
112 store.createOrUpdateTunnel(tunnel);
113 if (tunnel.providerId() != null) {
114 TunnelProvider provider = getProvider(tunnel.providerId());
115 if (provider != null) {
116 provider.updateTunnel(tunnel, path);
117 }
118 } else {
119 Set<ProviderId> ids = getProviders();
120 for (ProviderId providerId : ids) {
121 TunnelProvider provider = getProvider(providerId);
122 provider.updateTunnel(tunnel, path);
123 }
124 }
125 }
126
127 @Override
128 public void removeTunnels(TunnelEndPoint src, TunnelEndPoint dst,
129 ProviderId producerName) {
130 store.deleteTunnel(src, dst, producerName);
131 Collection<Tunnel> setTunnels = store.queryTunnel(src, dst);
132 for (Tunnel tunnel : setTunnels) {
133 if (producerName != null
134 && !tunnel.providerId().equals(producerName)) {
135 continue;
136 }
137 if (tunnel.providerId() != null) {
138 TunnelProvider provider = getProvider(tunnel.providerId());
139 if (provider != null) {
140 provider.releaseTunnel(tunnel);
141 }
142 } else {
143 Set<ProviderId> ids = getProviders();
144 for (ProviderId providerId : ids) {
145 TunnelProvider provider = getProvider(providerId);
146 provider.releaseTunnel(tunnel);
147 }
148 }
149 }
150 }
151
152 @Override
153 public void removeTunnels(TunnelEndPoint src, TunnelEndPoint dst, Type type,
154 ProviderId producerName) {
155 store.deleteTunnel(src, dst, type, producerName);
156 Collection<Tunnel> setTunnels = store.queryTunnel(src, dst);
157 for (Tunnel tunnel : setTunnels) {
158 if (producerName != null
159 && !tunnel.providerId().equals(producerName)
160 || !type.equals(tunnel.type())) {
161 continue;
162 }
163 if (tunnel.providerId() != null) {
164 TunnelProvider provider = getProvider(tunnel.providerId());
165 if (provider != null) {
166 provider.releaseTunnel(tunnel);
167 }
168 } else {
169 Set<ProviderId> ids = getProviders();
170 for (ProviderId providerId : ids) {
171 TunnelProvider provider = getProvider(providerId);
172 provider.releaseTunnel(tunnel);
173 }
174 }
175 }
176 }
177
178 @Override
179 public Tunnel borrowTunnel(ApplicationId consumerId, TunnelId tunnelId,
180 Annotations... annotations) {
181 return store.borrowTunnel(consumerId, tunnelId, annotations);
182 }
183
184 @Override
185 public Collection<Tunnel> borrowTunnel(ApplicationId consumerId,
186 TunnelName tunnelName,
187 Annotations... annotations) {
188 return store.borrowTunnel(consumerId, tunnelName, annotations);
189 }
190
191 @Override
192 public Collection<Tunnel> borrowTunnel(ApplicationId consumerId,
193 TunnelEndPoint src, TunnelEndPoint dst,
194 Annotations... annotations) {
195 Collection<Tunnel> tunnels = store.borrowTunnel(consumerId, src,
196 dst, annotations);
197 if (tunnels == null || tunnels.size() == 0) {
198 Tunnel tunnel = new DefaultTunnel(null, src, dst, null, null, null,
199 null, null, annotations);
200 Set<ProviderId> ids = getProviders();
201 for (ProviderId providerId : ids) {
202 TunnelProvider provider = getProvider(providerId);
203 provider.setupTunnel(tunnel, null);
204 }
205 }
206 return tunnels;
207 }
208
209 @Override
210 public Collection<Tunnel> borrowTunnel(ApplicationId consumerId,
211 TunnelEndPoint src, TunnelEndPoint dst,
212 Type type, Annotations... annotations) {
213 Collection<Tunnel> tunnels = store.borrowTunnel(consumerId, src,
214 dst, type,
215 annotations);
216 if (tunnels == null || tunnels.size() == 0) {
217 Tunnel tunnel = new DefaultTunnel(null, src, dst, type, null, null,
218 null, null, annotations);
219 Set<ProviderId> ids = getProviders();
220 for (ProviderId providerId : ids) {
221 TunnelProvider provider = getProvider(providerId);
222 provider.setupTunnel(tunnel, null);
223 }
224 }
225 return tunnels;
226 }
227
228 @Override
229 public boolean returnTunnel(ApplicationId consumerId,
230 TunnelId tunnelId, Annotations... annotations) {
231 return store.returnTunnel(consumerId, tunnelId, annotations);
232 }
233
234 @Override
235 public boolean returnTunnel(ApplicationId consumerId,
236 TunnelName tunnelName,
237 Annotations... annotations) {
238 return store.returnTunnel(consumerId, tunnelName, annotations);
239 }
240
241 @Override
242 public boolean returnTunnel(ApplicationId consumerId, TunnelEndPoint src,
243 TunnelEndPoint dst, Type type,
244 Annotations... annotations) {
245 return store.returnTunnel(consumerId, src, dst, type, annotations);
246 }
247
248 @Override
249 public boolean returnTunnel(ApplicationId consumerId, TunnelEndPoint src,
250 TunnelEndPoint dst, Annotations... annotations) {
251 return store.returnTunnel(consumerId, src, dst, annotations);
252 }
253
254 @Override
255 public Tunnel queryTunnel(TunnelId tunnelId) {
256 return store.queryTunnel(tunnelId);
257 }
258
259 @Override
260 public Collection<TunnelSubscription> queryTunnelSubscription(ApplicationId consumerId) {
261 return store.queryTunnelSubscription(consumerId);
262 }
263
264 @Override
265 public Collection<Tunnel> queryTunnel(Type type) {
266 return store.queryTunnel(type);
267 }
268
269 @Override
270 public Collection<Tunnel> queryTunnel(TunnelEndPoint src, TunnelEndPoint dst) {
271 return store.queryTunnel(src, dst);
272 }
273
samuel7a5691a2015-05-23 00:36:32 +0800274
275 @Override
276 public Collection<Tunnel> queryAllTunnels() {
277 return store.queryAllTunnels();
278 }
279
jccd8697232015-05-05 14:42:23 +0800280 @Override
281 public int tunnelCount() {
282 return store.tunnelCount();
283 }
284
285 @Override
wei wei89ddc322015-03-22 16:29:04 -0500286 protected TunnelProviderService createProviderService(TunnelProvider provider) {
wei wei89ddc322015-03-22 16:29:04 -0500287 return new InternalTunnelProviderService(provider);
288 }
289
wei wei89ddc322015-03-22 16:29:04 -0500290 private class InternalTunnelProviderService
291 extends AbstractProviderService<TunnelProvider>
292 implements TunnelProviderService {
293 protected InternalTunnelProviderService(TunnelProvider provider) {
294 super(provider);
wei wei89ddc322015-03-22 16:29:04 -0500295 }
296
jccd8697232015-05-05 14:42:23 +0800297
wei wei89ddc322015-03-22 16:29:04 -0500298 @Override
jcc4a20a5f2015-04-30 15:43:39 +0800299 public TunnelId tunnelAdded(TunnelDescription tunnel) {
jccd8697232015-05-05 14:42:23 +0800300 Tunnel storedTunnel = new DefaultTunnel(provider().id(),
301 tunnel.src(), tunnel.dst(),
302 tunnel.type(),
303 tunnel.groupId(),
304 tunnel.id(),
305 tunnel.tunnelName(),
samuel7a5691a2015-05-23 00:36:32 +0800306 tunnel.path(),
jccd8697232015-05-05 14:42:23 +0800307 tunnel.annotations());
308 return store.createOrUpdateTunnel(storedTunnel);
wei wei89ddc322015-03-22 16:29:04 -0500309 }
310
311 @Override
312 public void tunnelUpdated(TunnelDescription tunnel) {
jccd8697232015-05-05 14:42:23 +0800313 Tunnel storedTunnel = new DefaultTunnel(provider().id(),
314 tunnel.src(), tunnel.dst(),
315 tunnel.type(),
316 tunnel.groupId(),
317 tunnel.id(),
318 tunnel.tunnelName(),
samuel7a5691a2015-05-23 00:36:32 +0800319 tunnel.path(),
jccd8697232015-05-05 14:42:23 +0800320 tunnel.annotations());
321 store.createOrUpdateTunnel(storedTunnel);
wei wei89ddc322015-03-22 16:29:04 -0500322 }
323
324 @Override
325 public void tunnelRemoved(TunnelDescription tunnel) {
jccd8697232015-05-05 14:42:23 +0800326 if (tunnel.id() != null) {
327 store.deleteTunnel(tunnel.id());
samuel7a5691a2015-05-23 00:36:32 +0800328 return;
jccd8697232015-05-05 14:42:23 +0800329 }
330 if (tunnel.src() != null && tunnel.dst() != null
331 && tunnel.type() != null) {
332 store.deleteTunnel(tunnel.src(), tunnel.dst(), tunnel.type(),
333 provider().id());
samuel7a5691a2015-05-23 00:36:32 +0800334 return;
jccd8697232015-05-05 14:42:23 +0800335 }
336 if (tunnel.src() != null && tunnel.dst() != null
337 && tunnel.type() == null) {
338 store.deleteTunnel(tunnel.src(), tunnel.dst(), provider().id());
samuel7a5691a2015-05-23 00:36:32 +0800339 return;
jccd8697232015-05-05 14:42:23 +0800340 }
wei wei89ddc322015-03-22 16:29:04 -0500341 }
342
samuel7a5691a2015-05-23 00:36:32 +0800343
344 @Override
345 public Tunnel tunnelQueryById(TunnelId tunnelId) {
346 return store.queryTunnel(tunnelId);
347 }
348
349
wei wei89ddc322015-03-22 16:29:04 -0500350 }
351
352 private class InternalStoreDelegate implements TunnelStoreDelegate {
353 @Override
354 public void notify(TunnelEvent event) {
wei wei89ddc322015-03-22 16:29:04 -0500355 if (event != null) {
Thomas Vachuska42e8cce2015-07-29 19:25:18 -0700356 post(event);
wei wei89ddc322015-03-22 16:29:04 -0500357 }
358 }
359 }
samuel7a5691a2015-05-23 00:36:32 +0800360
cheng fan35dc0f22015-06-10 06:02:47 +0800361 @Override
362 public Iterable<Tunnel> getTunnels(DeviceId deviceId) {
363 return Collections.emptyList();
364 }
365
wei wei89ddc322015-03-22 16:29:04 -0500366}