blob: 0d156451ebea90bb6ca53db3f0ada13c2079ed40 [file] [log] [blame]
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2014-present Open Networking Foundation
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07003 *
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 */
Brian O'Connorabafb502014-12-02 22:26:20 -080016package org.onosproject.net.topology.impl;
tomcfde0622014-09-09 11:02:42 -070017
18import 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;
Brian O'Connorabafb502014-12-02 22:26:20 -080024import org.onosproject.event.Event;
Brian O'Connorabafb502014-12-02 22:26:20 -080025import org.onosproject.net.ConnectPoint;
26import org.onosproject.net.DeviceId;
Ray Milkey7483e1b2018-02-07 15:43:01 -080027import org.onosproject.net.DisjointPath;
Brian O'Connorabafb502014-12-02 22:26:20 -080028import org.onosproject.net.Link;
29import org.onosproject.net.Path;
Ray Milkey7483e1b2018-02-07 15:43:01 -080030import org.onosproject.net.provider.AbstractListenerProviderRegistry;
Brian O'Connorabafb502014-12-02 22:26:20 -080031import org.onosproject.net.provider.AbstractProviderService;
32import org.onosproject.net.topology.ClusterId;
33import org.onosproject.net.topology.GraphDescription;
Andrey Komarov2398d962016-09-26 15:11:23 +030034import org.onosproject.net.topology.LinkWeigher;
Brian O'Connorabafb502014-12-02 22:26:20 -080035import org.onosproject.net.topology.Topology;
36import org.onosproject.net.topology.TopologyCluster;
37import org.onosproject.net.topology.TopologyEvent;
38import org.onosproject.net.topology.TopologyGraph;
39import org.onosproject.net.topology.TopologyListener;
40import org.onosproject.net.topology.TopologyProvider;
41import org.onosproject.net.topology.TopologyProviderRegistry;
42import org.onosproject.net.topology.TopologyProviderService;
43import org.onosproject.net.topology.TopologyService;
44import org.onosproject.net.topology.TopologyStore;
45import org.onosproject.net.topology.TopologyStoreDelegate;
tomcfde0622014-09-09 11:02:42 -070046import org.slf4j.Logger;
47
48import java.util.List;
Ray Milkey7483e1b2018-02-07 15:43:01 -080049import java.util.Map;
tomcfde0622014-09-09 11:02:42 -070050import java.util.Set;
Yuta HIGUCHIac8b2292017-03-30 19:21:57 -070051import java.util.stream.Stream;
tomcfde0622014-09-09 11:02:42 -070052
53import static com.google.common.base.Preconditions.checkNotNull;
Changhoon Yoon541ef712015-05-23 17:18:34 +090054import static org.onosproject.security.AppGuard.checkPermission;
Ray Milkey7483e1b2018-02-07 15:43:01 -080055import static org.onosproject.security.AppPermission.Type.TOPOLOGY_READ;
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070056import static org.slf4j.LoggerFactory.getLogger;
Changhoon Yoonb856b812015-08-10 03:47:19 +090057
tomcfde0622014-09-09 11:02:42 -070058
59/**
60 * Provides basic implementation of the topology SB & NB APIs.
61 */
62@Component(immediate = true)
63@Service
tom10262dd2014-09-19 10:51:19 -070064public class TopologyManager
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070065 extends AbstractListenerProviderRegistry<TopologyEvent, TopologyListener,
Thomas Vachuska48e64e42015-09-22 15:32:55 -070066 TopologyProvider, TopologyProviderService>
tomcfde0622014-09-09 11:02:42 -070067 implements TopologyService, TopologyProviderRegistry {
68
Simon Hunt11a29282016-03-31 09:16:47 -070069 private static final String TOPOLOGY_NULL = "Topology cannot be null";
tomcfde0622014-09-09 11:02:42 -070070 private static final String DEVICE_ID_NULL = "Device ID cannot be null";
tom13cb4852014-09-11 12:44:17 -070071 private static final String CLUSTER_ID_NULL = "Cluster ID cannot be null";
72 private static final String CLUSTER_NULL = "Topology cluster cannot be null";
Simon Hunt11a29282016-03-31 09:16:47 -070073 private static final String CONNECTION_POINT_NULL = "Connection point cannot be null";
74 private static final String LINK_WEIGHT_NULL = "Link weight cannot be null";
tomcfde0622014-09-09 11:02:42 -070075
76 private final Logger log = getLogger(getClass());
77
tomc78acee2014-09-24 15:16:55 -070078 private TopologyStoreDelegate delegate = new InternalStoreDelegate();
79
tom10262dd2014-09-19 10:51:19 -070080 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
81 protected TopologyStore store;
tom0efbb1d2014-09-09 11:54:28 -070082
tomcfde0622014-09-09 11:02:42 -070083 @Activate
84 public void activate() {
tomc78acee2014-09-24 15:16:55 -070085 store.setDelegate(delegate);
tomcfde0622014-09-09 11:02:42 -070086 eventDispatcher.addSink(TopologyEvent.class, listenerRegistry);
87 log.info("Started");
88 }
89
90 @Deactivate
91 public void deactivate() {
tomc78acee2014-09-24 15:16:55 -070092 store.unsetDelegate(delegate);
tomcfde0622014-09-09 11:02:42 -070093 eventDispatcher.removeSink(TopologyEvent.class);
94 log.info("Stopped");
95 }
96
97 @Override
tomdc361b62014-09-09 20:36:52 -070098 public Topology currentTopology() {
Changhoon Yoonb856b812015-08-10 03:47:19 +090099 checkPermission(TOPOLOGY_READ);
tomdc361b62014-09-09 20:36:52 -0700100 return store.currentTopology();
tomcfde0622014-09-09 11:02:42 -0700101 }
102
103 @Override
tomdc361b62014-09-09 20:36:52 -0700104 public boolean isLatest(Topology topology) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900105 checkPermission(TOPOLOGY_READ);
tomdc361b62014-09-09 20:36:52 -0700106 checkNotNull(topology, TOPOLOGY_NULL);
tom10262dd2014-09-19 10:51:19 -0700107 return store.isLatest(topology);
tomcfde0622014-09-09 11:02:42 -0700108 }
109
110 @Override
111 public Set<TopologyCluster> getClusters(Topology topology) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900112 checkPermission(TOPOLOGY_READ);
tomcfde0622014-09-09 11:02:42 -0700113 checkNotNull(topology, TOPOLOGY_NULL);
tom10262dd2014-09-19 10:51:19 -0700114 return store.getClusters(topology);
tomcfde0622014-09-09 11:02:42 -0700115 }
116
117 @Override
tom13cb4852014-09-11 12:44:17 -0700118 public TopologyCluster getCluster(Topology topology, ClusterId clusterId) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900119 checkPermission(TOPOLOGY_READ);
tom13cb4852014-09-11 12:44:17 -0700120 checkNotNull(topology, TOPOLOGY_NULL);
121 checkNotNull(topology, CLUSTER_ID_NULL);
tom10262dd2014-09-19 10:51:19 -0700122 return store.getCluster(topology, clusterId);
tom13cb4852014-09-11 12:44:17 -0700123 }
124
125 @Override
126 public Set<DeviceId> getClusterDevices(Topology topology, TopologyCluster cluster) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900127 checkPermission(TOPOLOGY_READ);
tom13cb4852014-09-11 12:44:17 -0700128 checkNotNull(topology, TOPOLOGY_NULL);
129 checkNotNull(topology, CLUSTER_NULL);
tom10262dd2014-09-19 10:51:19 -0700130 return store.getClusterDevices(topology, cluster);
tom13cb4852014-09-11 12:44:17 -0700131 }
132
133 @Override
134 public Set<Link> getClusterLinks(Topology topology, TopologyCluster cluster) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900135 checkPermission(TOPOLOGY_READ);
tom13cb4852014-09-11 12:44:17 -0700136 checkNotNull(topology, TOPOLOGY_NULL);
137 checkNotNull(topology, CLUSTER_NULL);
tom10262dd2014-09-19 10:51:19 -0700138 return store.getClusterLinks(topology, cluster);
tom13cb4852014-09-11 12:44:17 -0700139 }
140
141 @Override
tom97937552014-09-11 10:48:42 -0700142 public TopologyGraph getGraph(Topology topology) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900143 checkPermission(TOPOLOGY_READ);
tomcfde0622014-09-09 11:02:42 -0700144 checkNotNull(topology, TOPOLOGY_NULL);
tom10262dd2014-09-19 10:51:19 -0700145 return store.getGraph(topology);
tomcfde0622014-09-09 11:02:42 -0700146 }
147
148 @Override
149 public Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900150 checkPermission(TOPOLOGY_READ);
tomcfde0622014-09-09 11:02:42 -0700151 checkNotNull(topology, TOPOLOGY_NULL);
152 checkNotNull(src, DEVICE_ID_NULL);
153 checkNotNull(dst, DEVICE_ID_NULL);
tom10262dd2014-09-19 10:51:19 -0700154 return store.getPaths(topology, src, dst);
tomcfde0622014-09-09 11:02:42 -0700155 }
156
157 @Override
Andrey Komarov2398d962016-09-26 15:11:23 +0300158 public Set<Path> getPaths(Topology topology, DeviceId src,
Andrey Komarov2398d962016-09-26 15:11:23 +0300159 DeviceId dst, LinkWeigher weigher) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900160 checkPermission(TOPOLOGY_READ);
Changhoon Yoon541ef712015-05-23 17:18:34 +0900161
tomcfde0622014-09-09 11:02:42 -0700162 checkNotNull(topology, TOPOLOGY_NULL);
163 checkNotNull(src, DEVICE_ID_NULL);
164 checkNotNull(dst, DEVICE_ID_NULL);
Yuta HIGUCHIac8b2292017-03-30 19:21:57 -0700165 checkNotNull(weigher, LINK_WEIGHT_NULL);
Andrey Komarov2398d962016-09-26 15:11:23 +0300166 return store.getPaths(topology, src, dst, weigher);
tomcfde0622014-09-09 11:02:42 -0700167 }
168
169 @Override
Yuta HIGUCHIac8b2292017-03-30 19:21:57 -0700170 public Set<Path> getKShortestPaths(Topology topology, DeviceId src,
171 DeviceId dst, LinkWeigher weigher,
172 int maxPaths) {
173 checkPermission(TOPOLOGY_READ);
174
175 checkNotNull(topology, TOPOLOGY_NULL);
176 checkNotNull(src, DEVICE_ID_NULL);
177 checkNotNull(dst, DEVICE_ID_NULL);
178 checkNotNull(weigher, LINK_WEIGHT_NULL);
179 return store.getKShortestPaths(topology, src, dst, weigher, maxPaths);
180 }
181
182 @Override
183 public Stream<Path> getKShortestPaths(Topology topology,
184 DeviceId src,
185 DeviceId dst,
186 LinkWeigher weigher) {
187 checkPermission(TOPOLOGY_READ);
188
189 checkNotNull(topology, TOPOLOGY_NULL);
190 checkNotNull(src, DEVICE_ID_NULL);
191 checkNotNull(dst, DEVICE_ID_NULL);
192 checkNotNull(weigher, LINK_WEIGHT_NULL);
193 return store.getKShortestPaths(topology, src, dst, weigher);
194 }
195
196 @Override
Andrey Komarov2398d962016-09-26 15:11:23 +0300197 public Set<DisjointPath> getDisjointPaths(Topology topology, DeviceId src,
198 DeviceId dst) {
Heedo Kang4a47a302016-02-29 17:40:23 +0900199 checkPermission(TOPOLOGY_READ);
Nikhil Cheerla2ec191f2015-07-09 12:34:54 -0700200 checkNotNull(topology, TOPOLOGY_NULL);
201 checkNotNull(src, DEVICE_ID_NULL);
202 checkNotNull(dst, DEVICE_ID_NULL);
203 return store.getDisjointPaths(topology, src, dst);
204 }
205
206 @Override
Thomas Vachuska48e64e42015-09-22 15:32:55 -0700207 public Set<DisjointPath> getDisjointPaths(Topology topology, DeviceId src,
Andrey Komarov2398d962016-09-26 15:11:23 +0300208 DeviceId dst,
Andrey Komarov2398d962016-09-26 15:11:23 +0300209 LinkWeigher weigher) {
Heedo Kang4a47a302016-02-29 17:40:23 +0900210 checkPermission(TOPOLOGY_READ);
Nikhil Cheerla2ec191f2015-07-09 12:34:54 -0700211 checkNotNull(topology, TOPOLOGY_NULL);
212 checkNotNull(src, DEVICE_ID_NULL);
213 checkNotNull(dst, DEVICE_ID_NULL);
Andrey Komarov2398d962016-09-26 15:11:23 +0300214 checkNotNull(weigher, LINK_WEIGHT_NULL);
215 return store.getDisjointPaths(topology, src, dst, weigher);
Nikhil Cheerla2ec191f2015-07-09 12:34:54 -0700216 }
217
218 @Override
Andrey Komarov2398d962016-09-26 15:11:23 +0300219 public Set<DisjointPath> getDisjointPaths(Topology topology, DeviceId src,
220 DeviceId dst,
Thomas Vachuska48e64e42015-09-22 15:32:55 -0700221 Map<Link, Object> riskProfile) {
Heedo Kang4a47a302016-02-29 17:40:23 +0900222 checkPermission(TOPOLOGY_READ);
Nikhil Cheerla2ec191f2015-07-09 12:34:54 -0700223 checkNotNull(topology, TOPOLOGY_NULL);
224 checkNotNull(src, DEVICE_ID_NULL);
225 checkNotNull(dst, DEVICE_ID_NULL);
Thomas Vachuska48e64e42015-09-22 15:32:55 -0700226 return store.getDisjointPaths(topology, src, dst, riskProfile);
Nikhil Cheerla2ec191f2015-07-09 12:34:54 -0700227 }
228
229 @Override
Thomas Vachuska48e64e42015-09-22 15:32:55 -0700230 public Set<DisjointPath> getDisjointPaths(Topology topology, DeviceId src,
Andrey Komarov2398d962016-09-26 15:11:23 +0300231 DeviceId dst,
232 LinkWeigher weigher,
233 Map<Link, Object> riskProfile) {
Heedo Kang4a47a302016-02-29 17:40:23 +0900234 checkPermission(TOPOLOGY_READ);
Nikhil Cheerla2ec191f2015-07-09 12:34:54 -0700235 checkNotNull(topology, TOPOLOGY_NULL);
236 checkNotNull(src, DEVICE_ID_NULL);
237 checkNotNull(dst, DEVICE_ID_NULL);
Andrey Komarov2398d962016-09-26 15:11:23 +0300238 checkNotNull(weigher, LINK_WEIGHT_NULL);
239 return store.getDisjointPaths(topology, src, dst, weigher, riskProfile);
Nikhil Cheerla2ec191f2015-07-09 12:34:54 -0700240 }
241
242 @Override
tomcfde0622014-09-09 11:02:42 -0700243 public boolean isInfrastructure(Topology topology, ConnectPoint connectPoint) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900244 checkPermission(TOPOLOGY_READ);
tomcfde0622014-09-09 11:02:42 -0700245 checkNotNull(topology, TOPOLOGY_NULL);
246 checkNotNull(connectPoint, CONNECTION_POINT_NULL);
tom10262dd2014-09-19 10:51:19 -0700247 return store.isInfrastructure(topology, connectPoint);
tomcfde0622014-09-09 11:02:42 -0700248 }
249
250 @Override
tom4d0dd3a2014-09-14 23:12:28 -0700251 public boolean isBroadcastPoint(Topology topology, ConnectPoint connectPoint) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900252 checkPermission(TOPOLOGY_READ);
tomcfde0622014-09-09 11:02:42 -0700253 checkNotNull(topology, TOPOLOGY_NULL);
254 checkNotNull(connectPoint, CONNECTION_POINT_NULL);
tom10262dd2014-09-19 10:51:19 -0700255 return store.isBroadcastPoint(topology, connectPoint);
tomcfde0622014-09-09 11:02:42 -0700256 }
257
tomcfde0622014-09-09 11:02:42 -0700258 // Personalized host provider service issued to the supplied provider.
tomdc361b62014-09-09 20:36:52 -0700259 @Override
260 protected TopologyProviderService createProviderService(TopologyProvider provider) {
261 return new InternalTopologyProviderService(provider);
262 }
263
tomcfde0622014-09-09 11:02:42 -0700264 private class InternalTopologyProviderService
265 extends AbstractProviderService<TopologyProvider>
266 implements TopologyProviderService {
267
268 InternalTopologyProviderService(TopologyProvider provider) {
269 super(provider);
270 }
271
272 @Override
tom97937552014-09-11 10:48:42 -0700273 public void topologyChanged(GraphDescription topoDescription,
tomcfde0622014-09-09 11:02:42 -0700274 List<Event> reasons) {
275 checkNotNull(topoDescription, "Topology description cannot be null");
tomcbff9392014-09-10 00:45:23 -0700276
tome52ce702014-09-11 00:12:54 -0700277 TopologyEvent event = store.updateTopology(provider().id(),
278 topoDescription, reasons);
tomdc361b62014-09-09 20:36:52 -0700279 if (event != null) {
tom782a7cf2014-09-11 23:58:38 -0700280 log.info("Topology {} changed", event.subject());
Thomas Vachuska42e8cce2015-07-29 19:25:18 -0700281 post(event);
tomdc361b62014-09-09 20:36:52 -0700282 }
tomcfde0622014-09-09 11:02:42 -0700283 }
284 }
285
tomc78acee2014-09-24 15:16:55 -0700286 // Store delegate to re-post events emitted from the store.
287 private class InternalStoreDelegate implements TopologyStoreDelegate {
288 @Override
289 public void notify(TopologyEvent event) {
Thomas Vachuska42e8cce2015-07-29 19:25:18 -0700290 post(event);
tomc78acee2014-09-24 15:16:55 -0700291 }
292 }
tomcfde0622014-09-09 11:02:42 -0700293}