blob: de72c526da490efe975288728a9b27f8d3714f7b [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 */
tombe988312014-09-19 18:38:47 -070016package org.onlab.onos.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;
tomcfde0622014-09-09 11:02:42 -070024import org.onlab.onos.event.AbstractListenerRegistry;
25import org.onlab.onos.event.Event;
26import org.onlab.onos.event.EventDeliveryService;
27import org.onlab.onos.net.ConnectPoint;
28import org.onlab.onos.net.DeviceId;
tom13cb4852014-09-11 12:44:17 -070029import org.onlab.onos.net.Link;
tomcfde0622014-09-09 11:02:42 -070030import org.onlab.onos.net.Path;
31import org.onlab.onos.net.provider.AbstractProviderRegistry;
32import org.onlab.onos.net.provider.AbstractProviderService;
tom13cb4852014-09-11 12:44:17 -070033import org.onlab.onos.net.topology.ClusterId;
tom97937552014-09-11 10:48:42 -070034import org.onlab.onos.net.topology.GraphDescription;
tomcfde0622014-09-09 11:02:42 -070035import org.onlab.onos.net.topology.LinkWeight;
tomcfde0622014-09-09 11:02:42 -070036import org.onlab.onos.net.topology.Topology;
37import org.onlab.onos.net.topology.TopologyCluster;
tomcfde0622014-09-09 11:02:42 -070038import org.onlab.onos.net.topology.TopologyEvent;
tom97937552014-09-11 10:48:42 -070039import org.onlab.onos.net.topology.TopologyGraph;
tomcfde0622014-09-09 11:02:42 -070040import org.onlab.onos.net.topology.TopologyListener;
41import org.onlab.onos.net.topology.TopologyProvider;
42import org.onlab.onos.net.topology.TopologyProviderRegistry;
43import org.onlab.onos.net.topology.TopologyProviderService;
44import org.onlab.onos.net.topology.TopologyService;
tom10262dd2014-09-19 10:51:19 -070045import org.onlab.onos.net.topology.TopologyStore;
tomc78acee2014-09-24 15:16:55 -070046import org.onlab.onos.net.topology.TopologyStoreDelegate;
tomcfde0622014-09-09 11:02:42 -070047import org.slf4j.Logger;
48
49import java.util.List;
50import java.util.Set;
51
52import static com.google.common.base.Preconditions.checkNotNull;
53import static org.slf4j.LoggerFactory.getLogger;
54
55/**
56 * Provides basic implementation of the topology SB & NB APIs.
57 */
58@Component(immediate = true)
59@Service
tom10262dd2014-09-19 10:51:19 -070060public class TopologyManager
tomcfde0622014-09-09 11:02:42 -070061 extends AbstractProviderRegistry<TopologyProvider, TopologyProviderService>
62 implements TopologyService, TopologyProviderRegistry {
63
64 public static final String TOPOLOGY_NULL = "Topology cannot be null";
65 private static final String DEVICE_ID_NULL = "Device ID cannot be null";
tom13cb4852014-09-11 12:44:17 -070066 private static final String CLUSTER_ID_NULL = "Cluster ID cannot be null";
67 private static final String CLUSTER_NULL = "Topology cluster cannot be null";
tomcfde0622014-09-09 11:02:42 -070068 public static final String CONNECTION_POINT_NULL = "Connection point cannot be null";
69
70 private final Logger log = getLogger(getClass());
71
72 private final AbstractListenerRegistry<TopologyEvent, TopologyListener>
73 listenerRegistry = new AbstractListenerRegistry<>();
74
tomc78acee2014-09-24 15:16:55 -070075 private TopologyStoreDelegate delegate = new InternalStoreDelegate();
76
tom10262dd2014-09-19 10:51:19 -070077 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
78 protected TopologyStore store;
tom0efbb1d2014-09-09 11:54:28 -070079
tomcfde0622014-09-09 11:02:42 -070080 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
tom4d0dd3a2014-09-14 23:12:28 -070081 protected EventDeliveryService eventDispatcher;
tomcfde0622014-09-09 11:02:42 -070082
83
84 @Activate
85 public void activate() {
tomc78acee2014-09-24 15:16:55 -070086 store.setDelegate(delegate);
tomcfde0622014-09-09 11:02:42 -070087 eventDispatcher.addSink(TopologyEvent.class, listenerRegistry);
88 log.info("Started");
89 }
90
91 @Deactivate
92 public void deactivate() {
tomc78acee2014-09-24 15:16:55 -070093 store.unsetDelegate(delegate);
tomcfde0622014-09-09 11:02:42 -070094 eventDispatcher.removeSink(TopologyEvent.class);
95 log.info("Stopped");
96 }
97
98 @Override
tomdc361b62014-09-09 20:36:52 -070099 public Topology currentTopology() {
100 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) {
105 checkNotNull(topology, TOPOLOGY_NULL);
tom10262dd2014-09-19 10:51:19 -0700106 return store.isLatest(topology);
tomcfde0622014-09-09 11:02:42 -0700107 }
108
109 @Override
110 public Set<TopologyCluster> getClusters(Topology topology) {
111 checkNotNull(topology, TOPOLOGY_NULL);
tom10262dd2014-09-19 10:51:19 -0700112 return store.getClusters(topology);
tomcfde0622014-09-09 11:02:42 -0700113 }
114
115 @Override
tom13cb4852014-09-11 12:44:17 -0700116 public TopologyCluster getCluster(Topology topology, ClusterId clusterId) {
117 checkNotNull(topology, TOPOLOGY_NULL);
118 checkNotNull(topology, CLUSTER_ID_NULL);
tom10262dd2014-09-19 10:51:19 -0700119 return store.getCluster(topology, clusterId);
tom13cb4852014-09-11 12:44:17 -0700120 }
121
122 @Override
123 public Set<DeviceId> getClusterDevices(Topology topology, TopologyCluster cluster) {
124 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) {
131 checkNotNull(topology, TOPOLOGY_NULL);
132 checkNotNull(topology, CLUSTER_NULL);
tom10262dd2014-09-19 10:51:19 -0700133 return store.getClusterLinks(topology, cluster);
tom13cb4852014-09-11 12:44:17 -0700134 }
135
136 @Override
tom97937552014-09-11 10:48:42 -0700137 public TopologyGraph getGraph(Topology topology) {
tomcfde0622014-09-09 11:02:42 -0700138 checkNotNull(topology, TOPOLOGY_NULL);
tom10262dd2014-09-19 10:51:19 -0700139 return store.getGraph(topology);
tomcfde0622014-09-09 11:02:42 -0700140 }
141
142 @Override
143 public Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst) {
144 checkNotNull(topology, TOPOLOGY_NULL);
145 checkNotNull(src, DEVICE_ID_NULL);
146 checkNotNull(dst, DEVICE_ID_NULL);
tom10262dd2014-09-19 10:51:19 -0700147 return store.getPaths(topology, src, dst);
tomcfde0622014-09-09 11:02:42 -0700148 }
149
150 @Override
151 public Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst, LinkWeight weight) {
152 checkNotNull(topology, TOPOLOGY_NULL);
153 checkNotNull(src, DEVICE_ID_NULL);
154 checkNotNull(dst, DEVICE_ID_NULL);
155 checkNotNull(weight, "Link weight cannot be null");
tom10262dd2014-09-19 10:51:19 -0700156 return store.getPaths(topology, src, dst, weight);
tomcfde0622014-09-09 11:02:42 -0700157 }
158
159 @Override
160 public boolean isInfrastructure(Topology topology, ConnectPoint connectPoint) {
161 checkNotNull(topology, TOPOLOGY_NULL);
162 checkNotNull(connectPoint, CONNECTION_POINT_NULL);
tom10262dd2014-09-19 10:51:19 -0700163 return store.isInfrastructure(topology, connectPoint);
tomcfde0622014-09-09 11:02:42 -0700164 }
165
166 @Override
tom4d0dd3a2014-09-14 23:12:28 -0700167 public boolean isBroadcastPoint(Topology topology, ConnectPoint connectPoint) {
tomcfde0622014-09-09 11:02:42 -0700168 checkNotNull(topology, TOPOLOGY_NULL);
169 checkNotNull(connectPoint, CONNECTION_POINT_NULL);
tom10262dd2014-09-19 10:51:19 -0700170 return store.isBroadcastPoint(topology, connectPoint);
tomcfde0622014-09-09 11:02:42 -0700171 }
172
173 @Override
174 public void addListener(TopologyListener listener) {
175 listenerRegistry.addListener(listener);
176 }
177
178 @Override
179 public void removeListener(TopologyListener listener) {
180 listenerRegistry.removeListener(listener);
181 }
182
183 // Personalized host provider service issued to the supplied provider.
tomdc361b62014-09-09 20:36:52 -0700184 @Override
185 protected TopologyProviderService createProviderService(TopologyProvider provider) {
186 return new InternalTopologyProviderService(provider);
187 }
188
tomcfde0622014-09-09 11:02:42 -0700189 private class InternalTopologyProviderService
190 extends AbstractProviderService<TopologyProvider>
191 implements TopologyProviderService {
192
193 InternalTopologyProviderService(TopologyProvider provider) {
194 super(provider);
195 }
196
197 @Override
tom97937552014-09-11 10:48:42 -0700198 public void topologyChanged(GraphDescription topoDescription,
tomcfde0622014-09-09 11:02:42 -0700199 List<Event> reasons) {
200 checkNotNull(topoDescription, "Topology description cannot be null");
tomcbff9392014-09-10 00:45:23 -0700201
tome52ce702014-09-11 00:12:54 -0700202 TopologyEvent event = store.updateTopology(provider().id(),
203 topoDescription, reasons);
tomdc361b62014-09-09 20:36:52 -0700204 if (event != null) {
tom782a7cf2014-09-11 23:58:38 -0700205 log.info("Topology {} changed", event.subject());
tomdc361b62014-09-09 20:36:52 -0700206 eventDispatcher.post(event);
207 }
tomcfde0622014-09-09 11:02:42 -0700208 }
209 }
210
tomc78acee2014-09-24 15:16:55 -0700211 // Store delegate to re-post events emitted from the store.
212 private class InternalStoreDelegate implements TopologyStoreDelegate {
213 @Override
214 public void notify(TopologyEvent event) {
215 eventDispatcher.post(event);
216 }
217 }
tomcfde0622014-09-09 11:02:42 -0700218}