blob: 718d75d015a8775ff31405fa2dc0e59af908c88c [file] [log] [blame]
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07001/*
2 * Copyright 2014 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 */
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;
Changhoon Yoon541ef712015-05-23 17:18:34 +090024import org.onosproject.core.Permission;
Simon Huntff663742015-05-14 13:33:05 -070025import org.onosproject.event.ListenerRegistry;
Brian O'Connorabafb502014-12-02 22:26:20 -080026import org.onosproject.event.Event;
27import org.onosproject.event.EventDeliveryService;
28import org.onosproject.net.ConnectPoint;
29import org.onosproject.net.DeviceId;
30import org.onosproject.net.Link;
31import org.onosproject.net.Path;
32import org.onosproject.net.provider.AbstractProviderRegistry;
33import org.onosproject.net.provider.AbstractProviderService;
34import org.onosproject.net.topology.ClusterId;
35import org.onosproject.net.topology.GraphDescription;
36import org.onosproject.net.topology.LinkWeight;
37import org.onosproject.net.topology.Topology;
38import org.onosproject.net.topology.TopologyCluster;
39import org.onosproject.net.topology.TopologyEvent;
40import org.onosproject.net.topology.TopologyGraph;
41import org.onosproject.net.topology.TopologyListener;
42import org.onosproject.net.topology.TopologyProvider;
43import org.onosproject.net.topology.TopologyProviderRegistry;
44import org.onosproject.net.topology.TopologyProviderService;
45import org.onosproject.net.topology.TopologyService;
46import org.onosproject.net.topology.TopologyStore;
47import org.onosproject.net.topology.TopologyStoreDelegate;
tomcfde0622014-09-09 11:02:42 -070048import org.slf4j.Logger;
49
50import java.util.List;
51import java.util.Set;
52
53import static com.google.common.base.Preconditions.checkNotNull;
54import static org.slf4j.LoggerFactory.getLogger;
Changhoon Yoon541ef712015-05-23 17:18:34 +090055import static org.onosproject.security.AppGuard.checkPermission;
tomcfde0622014-09-09 11:02:42 -070056
57/**
58 * Provides basic implementation of the topology SB & NB APIs.
59 */
60@Component(immediate = true)
61@Service
tom10262dd2014-09-19 10:51:19 -070062public class TopologyManager
tomcfde0622014-09-09 11:02:42 -070063 extends AbstractProviderRegistry<TopologyProvider, TopologyProviderService>
64 implements TopologyService, TopologyProviderRegistry {
65
66 public static final String TOPOLOGY_NULL = "Topology cannot be null";
67 private static final String DEVICE_ID_NULL = "Device ID cannot be null";
tom13cb4852014-09-11 12:44:17 -070068 private static final String CLUSTER_ID_NULL = "Cluster ID cannot be null";
69 private static final String CLUSTER_NULL = "Topology cluster cannot be null";
tomcfde0622014-09-09 11:02:42 -070070 public static final String CONNECTION_POINT_NULL = "Connection point cannot be null";
71
72 private final Logger log = getLogger(getClass());
73
Simon Huntff663742015-05-14 13:33:05 -070074 private final ListenerRegistry<TopologyEvent, TopologyListener>
75 listenerRegistry = new ListenerRegistry<>();
tomcfde0622014-09-09 11:02:42 -070076
tomc78acee2014-09-24 15:16:55 -070077 private TopologyStoreDelegate delegate = new InternalStoreDelegate();
78
tom10262dd2014-09-19 10:51:19 -070079 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
80 protected TopologyStore store;
tom0efbb1d2014-09-09 11:54:28 -070081
tomcfde0622014-09-09 11:02:42 -070082 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
tom4d0dd3a2014-09-14 23:12:28 -070083 protected EventDeliveryService eventDispatcher;
tomcfde0622014-09-09 11:02:42 -070084
85
86 @Activate
87 public void activate() {
tomc78acee2014-09-24 15:16:55 -070088 store.setDelegate(delegate);
tomcfde0622014-09-09 11:02:42 -070089 eventDispatcher.addSink(TopologyEvent.class, listenerRegistry);
90 log.info("Started");
91 }
92
93 @Deactivate
94 public void deactivate() {
tomc78acee2014-09-24 15:16:55 -070095 store.unsetDelegate(delegate);
tomcfde0622014-09-09 11:02:42 -070096 eventDispatcher.removeSink(TopologyEvent.class);
97 log.info("Stopped");
98 }
99
100 @Override
tomdc361b62014-09-09 20:36:52 -0700101 public Topology currentTopology() {
Changhoon Yoon541ef712015-05-23 17:18:34 +0900102 checkPermission(Permission.TOPOLOGY_READ);
103
tomdc361b62014-09-09 20:36:52 -0700104 return store.currentTopology();
tomcfde0622014-09-09 11:02:42 -0700105 }
106
107 @Override
tomdc361b62014-09-09 20:36:52 -0700108 public boolean isLatest(Topology topology) {
Changhoon Yoon541ef712015-05-23 17:18:34 +0900109 checkPermission(Permission.TOPOLOGY_READ);
110
tomdc361b62014-09-09 20:36:52 -0700111 checkNotNull(topology, TOPOLOGY_NULL);
tom10262dd2014-09-19 10:51:19 -0700112 return store.isLatest(topology);
tomcfde0622014-09-09 11:02:42 -0700113 }
114
115 @Override
116 public Set<TopologyCluster> getClusters(Topology topology) {
Changhoon Yoon541ef712015-05-23 17:18:34 +0900117 checkPermission(Permission.TOPOLOGY_READ);
118
tomcfde0622014-09-09 11:02:42 -0700119 checkNotNull(topology, TOPOLOGY_NULL);
tom10262dd2014-09-19 10:51:19 -0700120 return store.getClusters(topology);
tomcfde0622014-09-09 11:02:42 -0700121 }
122
123 @Override
tom13cb4852014-09-11 12:44:17 -0700124 public TopologyCluster getCluster(Topology topology, ClusterId clusterId) {
Changhoon Yoon541ef712015-05-23 17:18:34 +0900125 checkPermission(Permission.TOPOLOGY_READ);
126
tom13cb4852014-09-11 12:44:17 -0700127 checkNotNull(topology, TOPOLOGY_NULL);
128 checkNotNull(topology, CLUSTER_ID_NULL);
tom10262dd2014-09-19 10:51:19 -0700129 return store.getCluster(topology, clusterId);
tom13cb4852014-09-11 12:44:17 -0700130 }
131
132 @Override
133 public Set<DeviceId> getClusterDevices(Topology topology, TopologyCluster cluster) {
Changhoon Yoon541ef712015-05-23 17:18:34 +0900134 checkPermission(Permission.TOPOLOGY_READ);
135
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.getClusterDevices(topology, cluster);
tom13cb4852014-09-11 12:44:17 -0700139 }
140
141 @Override
142 public Set<Link> getClusterLinks(Topology topology, TopologyCluster cluster) {
Changhoon Yoon541ef712015-05-23 17:18:34 +0900143 checkPermission(Permission.TOPOLOGY_READ);
144
tom13cb4852014-09-11 12:44:17 -0700145 checkNotNull(topology, TOPOLOGY_NULL);
146 checkNotNull(topology, CLUSTER_NULL);
tom10262dd2014-09-19 10:51:19 -0700147 return store.getClusterLinks(topology, cluster);
tom13cb4852014-09-11 12:44:17 -0700148 }
149
150 @Override
tom97937552014-09-11 10:48:42 -0700151 public TopologyGraph getGraph(Topology topology) {
Changhoon Yoon541ef712015-05-23 17:18:34 +0900152 checkPermission(Permission.TOPOLOGY_READ);
153
tomcfde0622014-09-09 11:02:42 -0700154 checkNotNull(topology, TOPOLOGY_NULL);
tom10262dd2014-09-19 10:51:19 -0700155 return store.getGraph(topology);
tomcfde0622014-09-09 11:02:42 -0700156 }
157
158 @Override
159 public Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst) {
Changhoon Yoon541ef712015-05-23 17:18:34 +0900160 checkPermission(Permission.TOPOLOGY_READ);
161
tomcfde0622014-09-09 11:02:42 -0700162 checkNotNull(topology, TOPOLOGY_NULL);
163 checkNotNull(src, DEVICE_ID_NULL);
164 checkNotNull(dst, DEVICE_ID_NULL);
tom10262dd2014-09-19 10:51:19 -0700165 return store.getPaths(topology, src, dst);
tomcfde0622014-09-09 11:02:42 -0700166 }
167
168 @Override
169 public Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst, LinkWeight weight) {
Changhoon Yoon541ef712015-05-23 17:18:34 +0900170 checkPermission(Permission.TOPOLOGY_READ);
171
tomcfde0622014-09-09 11:02:42 -0700172 checkNotNull(topology, TOPOLOGY_NULL);
173 checkNotNull(src, DEVICE_ID_NULL);
174 checkNotNull(dst, DEVICE_ID_NULL);
175 checkNotNull(weight, "Link weight cannot be null");
tom10262dd2014-09-19 10:51:19 -0700176 return store.getPaths(topology, src, dst, weight);
tomcfde0622014-09-09 11:02:42 -0700177 }
178
179 @Override
180 public boolean isInfrastructure(Topology topology, ConnectPoint connectPoint) {
Changhoon Yoon541ef712015-05-23 17:18:34 +0900181 checkPermission(Permission.TOPOLOGY_READ);
182
tomcfde0622014-09-09 11:02:42 -0700183 checkNotNull(topology, TOPOLOGY_NULL);
184 checkNotNull(connectPoint, CONNECTION_POINT_NULL);
tom10262dd2014-09-19 10:51:19 -0700185 return store.isInfrastructure(topology, connectPoint);
tomcfde0622014-09-09 11:02:42 -0700186 }
187
188 @Override
tom4d0dd3a2014-09-14 23:12:28 -0700189 public boolean isBroadcastPoint(Topology topology, ConnectPoint connectPoint) {
Changhoon Yoon541ef712015-05-23 17:18:34 +0900190 checkPermission(Permission.TOPOLOGY_READ);
191
tomcfde0622014-09-09 11:02:42 -0700192 checkNotNull(topology, TOPOLOGY_NULL);
193 checkNotNull(connectPoint, CONNECTION_POINT_NULL);
tom10262dd2014-09-19 10:51:19 -0700194 return store.isBroadcastPoint(topology, connectPoint);
tomcfde0622014-09-09 11:02:42 -0700195 }
196
197 @Override
198 public void addListener(TopologyListener listener) {
Changhoon Yoon541ef712015-05-23 17:18:34 +0900199 checkPermission(Permission.TOPOLOGY_EVENT);
200
tomcfde0622014-09-09 11:02:42 -0700201 listenerRegistry.addListener(listener);
202 }
203
204 @Override
205 public void removeListener(TopologyListener listener) {
Changhoon Yoon541ef712015-05-23 17:18:34 +0900206 checkPermission(Permission.TOPOLOGY_EVENT);
207
tomcfde0622014-09-09 11:02:42 -0700208 listenerRegistry.removeListener(listener);
209 }
210
211 // Personalized host provider service issued to the supplied provider.
tomdc361b62014-09-09 20:36:52 -0700212 @Override
213 protected TopologyProviderService createProviderService(TopologyProvider provider) {
214 return new InternalTopologyProviderService(provider);
215 }
216
tomcfde0622014-09-09 11:02:42 -0700217 private class InternalTopologyProviderService
218 extends AbstractProviderService<TopologyProvider>
219 implements TopologyProviderService {
220
221 InternalTopologyProviderService(TopologyProvider provider) {
222 super(provider);
223 }
224
225 @Override
tom97937552014-09-11 10:48:42 -0700226 public void topologyChanged(GraphDescription topoDescription,
tomcfde0622014-09-09 11:02:42 -0700227 List<Event> reasons) {
228 checkNotNull(topoDescription, "Topology description cannot be null");
tomcbff9392014-09-10 00:45:23 -0700229
tome52ce702014-09-11 00:12:54 -0700230 TopologyEvent event = store.updateTopology(provider().id(),
231 topoDescription, reasons);
tomdc361b62014-09-09 20:36:52 -0700232 if (event != null) {
tom782a7cf2014-09-11 23:58:38 -0700233 log.info("Topology {} changed", event.subject());
tomdc361b62014-09-09 20:36:52 -0700234 eventDispatcher.post(event);
235 }
tomcfde0622014-09-09 11:02:42 -0700236 }
237 }
238
tomc78acee2014-09-24 15:16:55 -0700239 // Store delegate to re-post events emitted from the store.
240 private class InternalStoreDelegate implements TopologyStoreDelegate {
241 @Override
242 public void notify(TopologyEvent event) {
243 eventDispatcher.post(event);
244 }
245 }
tomcfde0622014-09-09 11:02:42 -0700246}