blob: 7dca64e6d1b2aa9c8cecd07dab3f0550d69b6bb6 [file] [log] [blame]
Simon Hunted804d52016-03-30 09:51:40 -07001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2016-present Open Networking Laboratory
Simon Hunted804d52016-03-30 09:51:40 -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 */
16
17package org.onosproject.ui.impl.topo.model;
18
Simon Huntcda9c032016-04-11 10:32:54 -070019import org.apache.felix.scr.annotations.Activate;
20import org.apache.felix.scr.annotations.Component;
21import org.apache.felix.scr.annotations.Deactivate;
22import org.apache.felix.scr.annotations.Reference;
23import org.apache.felix.scr.annotations.ReferenceCardinality;
24import org.apache.felix.scr.annotations.Service;
Simon Hunt7092cc42016-04-06 18:40:17 -070025import org.onosproject.cluster.ClusterEvent;
26import org.onosproject.cluster.ClusterEventListener;
27import org.onosproject.cluster.ClusterService;
Simon Hunt23fb1352016-04-11 12:15:19 -070028import org.onosproject.cluster.ControllerNode;
29import org.onosproject.cluster.RoleInfo;
Simon Huntcda9c032016-04-11 10:32:54 -070030import org.onosproject.event.AbstractListenerManager;
Simon Hunt7092cc42016-04-06 18:40:17 -070031import org.onosproject.incubator.net.PortStatisticsService;
32import org.onosproject.incubator.net.tunnel.TunnelService;
33import org.onosproject.mastership.MastershipEvent;
34import org.onosproject.mastership.MastershipListener;
35import org.onosproject.mastership.MastershipService;
Simon Huntcda9c032016-04-11 10:32:54 -070036import org.onosproject.net.Device;
Simon Hunt23fb1352016-04-11 12:15:19 -070037import org.onosproject.net.DeviceId;
38import org.onosproject.net.Host;
39import org.onosproject.net.Link;
Simon Hunt7092cc42016-04-06 18:40:17 -070040import org.onosproject.net.device.DeviceEvent;
41import org.onosproject.net.device.DeviceListener;
42import org.onosproject.net.device.DeviceService;
43import org.onosproject.net.flow.FlowRuleEvent;
44import org.onosproject.net.flow.FlowRuleListener;
45import org.onosproject.net.flow.FlowRuleService;
46import org.onosproject.net.host.HostEvent;
47import org.onosproject.net.host.HostListener;
48import org.onosproject.net.host.HostService;
49import org.onosproject.net.intent.IntentEvent;
50import org.onosproject.net.intent.IntentListener;
51import org.onosproject.net.intent.IntentService;
52import org.onosproject.net.link.LinkEvent;
53import org.onosproject.net.link.LinkListener;
54import org.onosproject.net.link.LinkService;
Simon Hunt23fb1352016-04-11 12:15:19 -070055import org.onosproject.net.region.Region;
Simon Hunt7092cc42016-04-06 18:40:17 -070056import org.onosproject.net.region.RegionEvent;
57import org.onosproject.net.region.RegionListener;
58import org.onosproject.net.region.RegionService;
59import org.onosproject.net.statistic.StatisticService;
60import org.onosproject.net.topology.TopologyService;
Simon Huntf679c4e2016-04-01 17:02:24 -070061import org.onosproject.ui.impl.topo.UiTopoSession;
Simon Hunt642bc452016-05-04 19:34:45 -070062import org.onosproject.ui.model.ServiceBundle;
Simon Hunted804d52016-03-30 09:51:40 -070063import org.slf4j.Logger;
64import org.slf4j.LoggerFactory;
65
66/**
Simon Huntcda9c032016-04-11 10:32:54 -070067 * Service that creates and maintains the UI-model of the network topology.
Simon Hunted804d52016-03-30 09:51:40 -070068 */
Thomas Vachuska318cd582016-05-17 15:01:10 -070069@Component(immediate = true, enabled = false)
Simon Huntcda9c032016-04-11 10:32:54 -070070@Service(value = UiSharedTopologyModel.class)
71public final class UiSharedTopologyModel
72 extends AbstractListenerManager<UiModelEvent, UiModelListener> {
Simon Hunted804d52016-03-30 09:51:40 -070073
74 private static final Logger log =
75 LoggerFactory.getLogger(UiSharedTopologyModel.class);
76
Simon Huntcda9c032016-04-11 10:32:54 -070077 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
78 private ClusterService clusterService;
79 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
80 private MastershipService mastershipService;
81 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
82 private RegionService regionService;
83 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
84 private DeviceService deviceService;
85 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
86 private LinkService linkService;
87 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
88 private HostService hostService;
89 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
90 private IntentService intentService;
91 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
92 private FlowRuleService flowService;
Simon Hunt7092cc42016-04-06 18:40:17 -070093
Simon Huntcda9c032016-04-11 10:32:54 -070094 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
95 private StatisticService flowStatsService;
96 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
97 private PortStatisticsService portStatsService;
98 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
99 private TopologyService topologyService;
100 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
101 private TunnelService tunnelService;
Simon Hunted804d52016-03-30 09:51:40 -0700102
Simon Huntcda9c032016-04-11 10:32:54 -0700103 private final ClusterEventListener clusterListener =
104 new InternalClusterListener();
105 private final MastershipListener mastershipListener =
106 new InternalMastershipListener();
107 private final RegionListener regionListener =
108 new InternalRegionListener();
109 private final DeviceListener deviceListener =
110 new InternalDeviceListener();
111 private final LinkListener linkListener =
112 new InternalLinkListener();
113 private final HostListener hostListener =
114 new InternalHostListener();
115 private final IntentListener intentListener =
116 new InternalIntentListener();
117 private final FlowRuleListener flowRuleListener =
118 new InternalFlowRuleListener();
Simon Hunt7092cc42016-04-06 18:40:17 -0700119
Simon Huntcda9c032016-04-11 10:32:54 -0700120
121 private ModelCache cache;
122
123
124 @Activate
125 protected void activate() {
Simon Hunt642bc452016-05-04 19:34:45 -0700126 cache = new ModelCache(new DefaultServiceBundle(), eventDispatcher);
Simon Huntcda9c032016-04-11 10:32:54 -0700127
128 eventDispatcher.addSink(UiModelEvent.class, listenerRegistry);
129
130 clusterService.addListener(clusterListener);
131 mastershipService.addListener(mastershipListener);
132 regionService.addListener(regionListener);
133 deviceService.addListener(deviceListener);
134 linkService.addListener(linkListener);
135 hostService.addListener(hostListener);
136 intentService.addListener(intentListener);
137 flowService.addListener(flowRuleListener);
138
139 cache.load();
140
141 log.info("Started");
Simon Hunted804d52016-03-30 09:51:40 -0700142 }
143
Simon Huntcda9c032016-04-11 10:32:54 -0700144 @Deactivate
145 protected void deactivate() {
146 eventDispatcher.removeSink(UiModelEvent.class);
147
148 clusterService.removeListener(clusterListener);
149 mastershipService.removeListener(mastershipListener);
150 regionService.removeListener(regionListener);
151 deviceService.removeListener(deviceListener);
152 linkService.removeListener(linkListener);
153 hostService.removeListener(hostListener);
154 intentService.removeListener(intentListener);
155 flowService.removeListener(flowRuleListener);
156
157 cache.clear();
158 cache = null;
159
160 log.info("Stopped");
161 }
162
163
Simon Huntf679c4e2016-04-01 17:02:24 -0700164 /**
165 * Registers a UI topology session with the topology model.
166 *
167 * @param session the session to register
168 */
169 public void register(UiTopoSession session) {
170 log.info("Registering topology session {}", session);
Simon Huntcda9c032016-04-11 10:32:54 -0700171 addListener(session);
Simon Hunted804d52016-03-30 09:51:40 -0700172 }
173
Simon Huntf679c4e2016-04-01 17:02:24 -0700174 /**
175 * Unregisters a UI topology session from the topology model.
176 *
177 * @param session the session to unregister
178 */
179 public void unregister(UiTopoSession session) {
180 log.info("Unregistering topology session {}", session);
Simon Huntcda9c032016-04-11 10:32:54 -0700181 removeListener(session);
Simon Huntf679c4e2016-04-01 17:02:24 -0700182 }
183
Simon Hunt642bc452016-05-04 19:34:45 -0700184 /**
185 * Default implementation of service bundle to return references to our
186 * dynamically injected services.
187 */
188 private class DefaultServiceBundle implements ServiceBundle {
189 @Override
190 public ClusterService cluster() {
191 return clusterService;
192 }
193
194 @Override
195 public MastershipService mastership() {
196 return mastershipService;
197 }
198
199 @Override
200 public RegionService region() {
201 return regionService;
202 }
203
204 @Override
205 public DeviceService device() {
206 return deviceService;
207 }
208
209 @Override
210 public LinkService link() {
211 return linkService;
212 }
213
214 @Override
215 public HostService host() {
216 return hostService;
217 }
218
219 @Override
220 public IntentService intent() {
221 return intentService;
222 }
223
224 @Override
225 public FlowRuleService flow() {
226 return flowService;
227 }
228 }
229
Simon Hunt7092cc42016-04-06 18:40:17 -0700230
Simon Huntcda9c032016-04-11 10:32:54 -0700231 private class InternalClusterListener implements ClusterEventListener {
232 @Override
233 public void event(ClusterEvent event) {
Simon Hunt23fb1352016-04-11 12:15:19 -0700234 ControllerNode cnode = event.subject();
235
236 switch (event.type()) {
237
238 case INSTANCE_ADDED:
239 case INSTANCE_ACTIVATED:
240 case INSTANCE_READY:
241 case INSTANCE_DEACTIVATED:
242 cache.addOrUpdateClusterMember(cnode);
243 break;
244
245 case INSTANCE_REMOVED:
246 cache.removeClusterMember(cnode);
247 break;
248
249 default:
250 break;
251 }
Simon Hunt7092cc42016-04-06 18:40:17 -0700252 }
Simon Huntcda9c032016-04-11 10:32:54 -0700253 }
Simon Hunt7092cc42016-04-06 18:40:17 -0700254
Simon Huntcda9c032016-04-11 10:32:54 -0700255 private class InternalMastershipListener implements MastershipListener {
256 @Override
257 public void event(MastershipEvent event) {
Simon Hunt23fb1352016-04-11 12:15:19 -0700258 DeviceId deviceId = event.subject();
259 RoleInfo roleInfo = event.roleInfo();
260
261 switch (event.type()) {
262 case MASTER_CHANGED:
263 case BACKUPS_CHANGED:
264 cache.updateMasterships(deviceId, roleInfo);
265 break;
266
267 default:
268 break;
269 }
Simon Hunt7092cc42016-04-06 18:40:17 -0700270 }
Simon Huntcda9c032016-04-11 10:32:54 -0700271 }
Simon Hunt7092cc42016-04-06 18:40:17 -0700272
Simon Huntcda9c032016-04-11 10:32:54 -0700273 private class InternalRegionListener implements RegionListener {
274 @Override
275 public void event(RegionEvent event) {
Simon Hunt23fb1352016-04-11 12:15:19 -0700276 Region region = event.subject();
277
278 switch (event.type()) {
279
280 case REGION_ADDED:
281 case REGION_UPDATED:
282 case REGION_MEMBERSHIP_CHANGED:
283 cache.addOrUpdateRegion(region);
284 break;
285
286 case REGION_REMOVED:
287 cache.removeRegion(region);
288 break;
289
290 default:
291 break;
292 }
Simon Hunt7092cc42016-04-06 18:40:17 -0700293 }
Simon Huntcda9c032016-04-11 10:32:54 -0700294 }
Simon Hunt7092cc42016-04-06 18:40:17 -0700295
Simon Huntcda9c032016-04-11 10:32:54 -0700296 private class InternalDeviceListener implements DeviceListener {
297 @Override
298 public void event(DeviceEvent event) {
Simon Huntcda9c032016-04-11 10:32:54 -0700299 Device device = event.subject();
Simon Hunt7092cc42016-04-06 18:40:17 -0700300
Simon Huntcda9c032016-04-11 10:32:54 -0700301 switch (event.type()) {
Simon Hunt7092cc42016-04-06 18:40:17 -0700302
Simon Huntcda9c032016-04-11 10:32:54 -0700303 case DEVICE_ADDED:
304 case DEVICE_UPDATED:
305 case DEVICE_AVAILABILITY_CHANGED:
306 case DEVICE_SUSPENDED:
307 cache.addOrUpdateDevice(device);
308 break;
Simon Hunt7092cc42016-04-06 18:40:17 -0700309
Simon Huntcda9c032016-04-11 10:32:54 -0700310 case DEVICE_REMOVED:
311 cache.removeDevice(device);
312 break;
Simon Hunt7092cc42016-04-06 18:40:17 -0700313
Simon Huntcda9c032016-04-11 10:32:54 -0700314 default:
315 break;
Simon Hunt7092cc42016-04-06 18:40:17 -0700316 }
317 }
318 }
319
Simon Huntcda9c032016-04-11 10:32:54 -0700320 private class InternalLinkListener implements LinkListener {
321 @Override
322 public void event(LinkEvent event) {
Simon Hunt23fb1352016-04-11 12:15:19 -0700323 Link link = event.subject();
324
325 switch (event.type()) {
326
327 case LINK_ADDED:
328 case LINK_UPDATED:
329 cache.addOrUpdateLink(link);
330 break;
331
332 case LINK_REMOVED:
333 cache.removeLink(link);
334 break;
335
336 default:
337 break;
338 }
Simon Huntcda9c032016-04-11 10:32:54 -0700339 }
Simon Hunted804d52016-03-30 09:51:40 -0700340 }
341
Simon Huntcda9c032016-04-11 10:32:54 -0700342 private class InternalHostListener implements HostListener {
343 @Override
344 public void event(HostEvent event) {
Simon Hunt23fb1352016-04-11 12:15:19 -0700345 Host host = event.subject();
346 Host prevHost = event.prevSubject();
347
348 switch (event.type()) {
349
350 case HOST_ADDED:
351 case HOST_UPDATED:
352 cache.addOrUpdateHost(host);
353 break;
354
355 case HOST_MOVED:
356 cache.moveHost(host, prevHost);
357 break;
358
359 case HOST_REMOVED:
360 cache.removeHost(host);
361 break;
362
363 default:
364 break;
365 }
Simon Huntcda9c032016-04-11 10:32:54 -0700366 }
Simon Hunted804d52016-03-30 09:51:40 -0700367 }
Simon Huntcda9c032016-04-11 10:32:54 -0700368
Simon Hunt23fb1352016-04-11 12:15:19 -0700369 // =======================================================================
370 // NOTE: Neither intents nor flows are modeled by the UiTopology.
371 // Rather, they are serviced directly from this class.
372 // Additionally, since we are only retrieving counts (in the current
373 // implementation), we'll fetch them on demand from the service.
374 // Thus, the following internal listeners are stubs only (for now).
375 // =======================================================================
376
Simon Huntcda9c032016-04-11 10:32:54 -0700377 private class InternalIntentListener implements IntentListener {
378 @Override
379 public void event(IntentEvent event) {
Simon Hunt23fb1352016-04-11 12:15:19 -0700380 // do nothing (for now)
Simon Huntcda9c032016-04-11 10:32:54 -0700381 }
382 }
383
384 private class InternalFlowRuleListener implements FlowRuleListener {
385 @Override
386 public void event(FlowRuleEvent event) {
Simon Hunt23fb1352016-04-11 12:15:19 -0700387 // do nothing (for now)
Simon Huntcda9c032016-04-11 10:32:54 -0700388 }
389 }
390
Simon Hunted804d52016-03-30 09:51:40 -0700391}