blob: 04c4f1c11348653e06a57e54ae269643285c7432 [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;
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070024import org.onosproject.net.provider.AbstractListenerProviderRegistry;
Brian O'Connorabafb502014-12-02 22:26:20 -080025import org.onosproject.event.Event;
Brian O'Connorabafb502014-12-02 22:26:20 -080026import org.onosproject.net.ConnectPoint;
27import org.onosproject.net.DeviceId;
28import org.onosproject.net.Link;
29import org.onosproject.net.Path;
Brian O'Connorabafb502014-12-02 22:26:20 -080030import org.onosproject.net.provider.AbstractProviderService;
31import org.onosproject.net.topology.ClusterId;
32import org.onosproject.net.topology.GraphDescription;
33import org.onosproject.net.topology.LinkWeight;
34import org.onosproject.net.topology.Topology;
35import org.onosproject.net.topology.TopologyCluster;
36import org.onosproject.net.topology.TopologyEvent;
37import org.onosproject.net.topology.TopologyGraph;
38import org.onosproject.net.topology.TopologyListener;
39import org.onosproject.net.topology.TopologyProvider;
40import org.onosproject.net.topology.TopologyProviderRegistry;
41import org.onosproject.net.topology.TopologyProviderService;
42import org.onosproject.net.topology.TopologyService;
43import org.onosproject.net.topology.TopologyStore;
44import org.onosproject.net.topology.TopologyStoreDelegate;
tomcfde0622014-09-09 11:02:42 -070045import org.slf4j.Logger;
46
47import java.util.List;
48import java.util.Set;
49
50import static com.google.common.base.Preconditions.checkNotNull;
Changhoon Yoon541ef712015-05-23 17:18:34 +090051import static org.onosproject.security.AppGuard.checkPermission;
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070052import static org.slf4j.LoggerFactory.getLogger;
Changhoon Yoonb856b812015-08-10 03:47:19 +090053import static org.onosproject.security.AppPermission.Type.*;
54
tomcfde0622014-09-09 11:02:42 -070055
56/**
57 * Provides basic implementation of the topology SB & NB APIs.
58 */
59@Component(immediate = true)
60@Service
tom10262dd2014-09-19 10:51:19 -070061public class TopologyManager
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070062 extends AbstractListenerProviderRegistry<TopologyEvent, TopologyListener,
63 TopologyProvider, TopologyProviderService>
tomcfde0622014-09-09 11:02:42 -070064 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
tomc78acee2014-09-24 15:16:55 -070074 private TopologyStoreDelegate delegate = new InternalStoreDelegate();
75
tom10262dd2014-09-19 10:51:19 -070076 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
77 protected TopologyStore store;
tom0efbb1d2014-09-09 11:54:28 -070078
tomcfde0622014-09-09 11:02:42 -070079 @Activate
80 public void activate() {
tomc78acee2014-09-24 15:16:55 -070081 store.setDelegate(delegate);
tomcfde0622014-09-09 11:02:42 -070082 eventDispatcher.addSink(TopologyEvent.class, listenerRegistry);
83 log.info("Started");
84 }
85
86 @Deactivate
87 public void deactivate() {
tomc78acee2014-09-24 15:16:55 -070088 store.unsetDelegate(delegate);
tomcfde0622014-09-09 11:02:42 -070089 eventDispatcher.removeSink(TopologyEvent.class);
90 log.info("Stopped");
91 }
92
93 @Override
tomdc361b62014-09-09 20:36:52 -070094 public Topology currentTopology() {
Changhoon Yoonb856b812015-08-10 03:47:19 +090095 checkPermission(TOPOLOGY_READ);
tomdc361b62014-09-09 20:36:52 -070096 return store.currentTopology();
tomcfde0622014-09-09 11:02:42 -070097 }
98
99 @Override
tomdc361b62014-09-09 20:36:52 -0700100 public boolean isLatest(Topology topology) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900101 checkPermission(TOPOLOGY_READ);
tomdc361b62014-09-09 20:36:52 -0700102 checkNotNull(topology, TOPOLOGY_NULL);
tom10262dd2014-09-19 10:51:19 -0700103 return store.isLatest(topology);
tomcfde0622014-09-09 11:02:42 -0700104 }
105
106 @Override
107 public Set<TopologyCluster> getClusters(Topology topology) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900108 checkPermission(TOPOLOGY_READ);
tomcfde0622014-09-09 11:02:42 -0700109 checkNotNull(topology, TOPOLOGY_NULL);
tom10262dd2014-09-19 10:51:19 -0700110 return store.getClusters(topology);
tomcfde0622014-09-09 11:02:42 -0700111 }
112
113 @Override
tom13cb4852014-09-11 12:44:17 -0700114 public TopologyCluster getCluster(Topology topology, ClusterId clusterId) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900115 checkPermission(TOPOLOGY_READ);
tom13cb4852014-09-11 12:44:17 -0700116 checkNotNull(topology, TOPOLOGY_NULL);
117 checkNotNull(topology, CLUSTER_ID_NULL);
tom10262dd2014-09-19 10:51:19 -0700118 return store.getCluster(topology, clusterId);
tom13cb4852014-09-11 12:44:17 -0700119 }
120
121 @Override
122 public Set<DeviceId> getClusterDevices(Topology topology, TopologyCluster cluster) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900123 checkPermission(TOPOLOGY_READ);
tom13cb4852014-09-11 12:44:17 -0700124 checkNotNull(topology, TOPOLOGY_NULL);
125 checkNotNull(topology, CLUSTER_NULL);
tom10262dd2014-09-19 10:51:19 -0700126 return store.getClusterDevices(topology, cluster);
tom13cb4852014-09-11 12:44:17 -0700127 }
128
129 @Override
130 public Set<Link> getClusterLinks(Topology topology, TopologyCluster cluster) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900131 checkPermission(TOPOLOGY_READ);
tom13cb4852014-09-11 12:44:17 -0700132 checkNotNull(topology, TOPOLOGY_NULL);
133 checkNotNull(topology, CLUSTER_NULL);
tom10262dd2014-09-19 10:51:19 -0700134 return store.getClusterLinks(topology, cluster);
tom13cb4852014-09-11 12:44:17 -0700135 }
136
137 @Override
tom97937552014-09-11 10:48:42 -0700138 public TopologyGraph getGraph(Topology topology) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900139 checkPermission(TOPOLOGY_READ);
tomcfde0622014-09-09 11:02:42 -0700140 checkNotNull(topology, TOPOLOGY_NULL);
tom10262dd2014-09-19 10:51:19 -0700141 return store.getGraph(topology);
tomcfde0622014-09-09 11:02:42 -0700142 }
143
144 @Override
145 public Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900146 checkPermission(TOPOLOGY_READ);
tomcfde0622014-09-09 11:02:42 -0700147 checkNotNull(topology, TOPOLOGY_NULL);
148 checkNotNull(src, DEVICE_ID_NULL);
149 checkNotNull(dst, DEVICE_ID_NULL);
tom10262dd2014-09-19 10:51:19 -0700150 return store.getPaths(topology, src, dst);
tomcfde0622014-09-09 11:02:42 -0700151 }
152
153 @Override
154 public Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst, LinkWeight weight) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900155 checkPermission(TOPOLOGY_READ);
Changhoon Yoon541ef712015-05-23 17:18:34 +0900156
tomcfde0622014-09-09 11:02:42 -0700157 checkNotNull(topology, TOPOLOGY_NULL);
158 checkNotNull(src, DEVICE_ID_NULL);
159 checkNotNull(dst, DEVICE_ID_NULL);
160 checkNotNull(weight, "Link weight cannot be null");
tom10262dd2014-09-19 10:51:19 -0700161 return store.getPaths(topology, src, dst, weight);
tomcfde0622014-09-09 11:02:42 -0700162 }
163
164 @Override
165 public boolean isInfrastructure(Topology topology, ConnectPoint connectPoint) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900166 checkPermission(TOPOLOGY_READ);
tomcfde0622014-09-09 11:02:42 -0700167 checkNotNull(topology, TOPOLOGY_NULL);
168 checkNotNull(connectPoint, CONNECTION_POINT_NULL);
tom10262dd2014-09-19 10:51:19 -0700169 return store.isInfrastructure(topology, connectPoint);
tomcfde0622014-09-09 11:02:42 -0700170 }
171
172 @Override
tom4d0dd3a2014-09-14 23:12:28 -0700173 public boolean isBroadcastPoint(Topology topology, ConnectPoint connectPoint) {
Changhoon Yoonb856b812015-08-10 03:47:19 +0900174 checkPermission(TOPOLOGY_READ);
tomcfde0622014-09-09 11:02:42 -0700175 checkNotNull(topology, TOPOLOGY_NULL);
176 checkNotNull(connectPoint, CONNECTION_POINT_NULL);
tom10262dd2014-09-19 10:51:19 -0700177 return store.isBroadcastPoint(topology, connectPoint);
tomcfde0622014-09-09 11:02:42 -0700178 }
179
tomcfde0622014-09-09 11:02:42 -0700180 // Personalized host provider service issued to the supplied provider.
tomdc361b62014-09-09 20:36:52 -0700181 @Override
182 protected TopologyProviderService createProviderService(TopologyProvider provider) {
183 return new InternalTopologyProviderService(provider);
184 }
185
tomcfde0622014-09-09 11:02:42 -0700186 private class InternalTopologyProviderService
187 extends AbstractProviderService<TopologyProvider>
188 implements TopologyProviderService {
189
190 InternalTopologyProviderService(TopologyProvider provider) {
191 super(provider);
192 }
193
194 @Override
tom97937552014-09-11 10:48:42 -0700195 public void topologyChanged(GraphDescription topoDescription,
tomcfde0622014-09-09 11:02:42 -0700196 List<Event> reasons) {
197 checkNotNull(topoDescription, "Topology description cannot be null");
tomcbff9392014-09-10 00:45:23 -0700198
tome52ce702014-09-11 00:12:54 -0700199 TopologyEvent event = store.updateTopology(provider().id(),
200 topoDescription, reasons);
tomdc361b62014-09-09 20:36:52 -0700201 if (event != null) {
tom782a7cf2014-09-11 23:58:38 -0700202 log.info("Topology {} changed", event.subject());
Thomas Vachuska42e8cce2015-07-29 19:25:18 -0700203 post(event);
tomdc361b62014-09-09 20:36:52 -0700204 }
tomcfde0622014-09-09 11:02:42 -0700205 }
206 }
207
tomc78acee2014-09-24 15:16:55 -0700208 // Store delegate to re-post events emitted from the store.
209 private class InternalStoreDelegate implements TopologyStoreDelegate {
210 @Override
211 public void notify(TopologyEvent event) {
Thomas Vachuska42e8cce2015-07-29 19:25:18 -0700212 post(event);
tomc78acee2014-09-24 15:16:55 -0700213 }
214 }
tomcfde0622014-09-09 11:02:42 -0700215}