blob: 6f8a7061454ebb9b3767a131199fb9ff4ed4bf12 [file] [log] [blame]
Simon Hunted804d52016-03-30 09:51:40 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2016-present Open Networking Foundation
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 Hunt7092cc42016-04-06 18:40:17 -070019import org.onosproject.cluster.ClusterEvent;
20import org.onosproject.cluster.ClusterEventListener;
21import org.onosproject.cluster.ClusterService;
Simon Hunt23fb1352016-04-11 12:15:19 -070022import org.onosproject.cluster.ControllerNode;
23import org.onosproject.cluster.RoleInfo;
Simon Huntcda9c032016-04-11 10:32:54 -070024import org.onosproject.event.AbstractListenerManager;
Thomas Vachuska52f2cd12018-11-08 21:20:04 -080025import org.onosproject.net.statistic.PortStatisticsService;
Simon Hunt7092cc42016-04-06 18:40:17 -070026import org.onosproject.mastership.MastershipEvent;
27import org.onosproject.mastership.MastershipListener;
28import org.onosproject.mastership.MastershipService;
Simon Huntcda9c032016-04-11 10:32:54 -070029import org.onosproject.net.Device;
Simon Hunt23fb1352016-04-11 12:15:19 -070030import org.onosproject.net.DeviceId;
31import org.onosproject.net.Host;
32import org.onosproject.net.Link;
Simon Hunt7092cc42016-04-06 18:40:17 -070033import org.onosproject.net.device.DeviceEvent;
34import org.onosproject.net.device.DeviceListener;
35import org.onosproject.net.device.DeviceService;
36import org.onosproject.net.flow.FlowRuleEvent;
37import org.onosproject.net.flow.FlowRuleListener;
38import org.onosproject.net.flow.FlowRuleService;
39import org.onosproject.net.host.HostEvent;
40import org.onosproject.net.host.HostListener;
41import org.onosproject.net.host.HostService;
42import org.onosproject.net.intent.IntentEvent;
43import org.onosproject.net.intent.IntentListener;
44import org.onosproject.net.intent.IntentService;
45import org.onosproject.net.link.LinkEvent;
46import org.onosproject.net.link.LinkListener;
47import org.onosproject.net.link.LinkService;
Simon Hunt23fb1352016-04-11 12:15:19 -070048import org.onosproject.net.region.Region;
Simon Hunt7092cc42016-04-06 18:40:17 -070049import org.onosproject.net.region.RegionEvent;
Simon Hunt977aa052016-07-20 17:08:29 -070050import org.onosproject.net.region.RegionId;
Simon Hunt7092cc42016-04-06 18:40:17 -070051import org.onosproject.net.region.RegionListener;
52import org.onosproject.net.region.RegionService;
53import org.onosproject.net.statistic.StatisticService;
54import org.onosproject.net.topology.TopologyService;
Simon Hunt4f4ffc32016-08-03 18:30:47 -070055import org.onosproject.ui.UiTopoLayoutService;
Simon Hunt8eac4ae2017-01-20 12:56:45 -080056import org.onosproject.ui.impl.topo.Topo2Jsonifier;
Simon Huntf679c4e2016-04-01 17:02:24 -070057import org.onosproject.ui.impl.topo.UiTopoSession;
Simon Hunt642bc452016-05-04 19:34:45 -070058import org.onosproject.ui.model.ServiceBundle;
Simon Huntd5b96732016-07-08 13:22:27 -070059import org.onosproject.ui.model.topo.UiClusterMember;
Simon Hunt4854f3d2016-08-02 18:13:15 -070060import org.onosproject.ui.model.topo.UiDevice;
Simon Huntc13082f2016-08-03 21:20:23 -070061import org.onosproject.ui.model.topo.UiDeviceLink;
Simon Hunt4854f3d2016-08-02 18:13:15 -070062import org.onosproject.ui.model.topo.UiHost;
Simon Hunt0e161092017-05-08 17:41:38 -070063import org.onosproject.ui.model.topo.UiLinkId;
Thomas Vachuska8c0b18a2017-04-14 16:27:33 -070064import org.onosproject.ui.model.topo.UiModelEvent;
Simon Huntd5b96732016-07-08 13:22:27 -070065import org.onosproject.ui.model.topo.UiRegion;
Simon Huntc13082f2016-08-03 21:20:23 -070066import org.onosproject.ui.model.topo.UiSynthLink;
Ray Milkeyd84f89b2018-08-17 14:54:17 -070067import org.osgi.service.component.annotations.Activate;
68import org.osgi.service.component.annotations.Component;
69import org.osgi.service.component.annotations.Deactivate;
70import org.osgi.service.component.annotations.Reference;
71import org.osgi.service.component.annotations.ReferenceCardinality;
Simon Hunted804d52016-03-30 09:51:40 -070072import org.slf4j.Logger;
73import org.slf4j.LoggerFactory;
74
Simon Huntd5b96732016-07-08 13:22:27 -070075import java.util.List;
Simon Hunt0e161092017-05-08 17:41:38 -070076import java.util.Map;
Simon Hunt10973dd2016-08-01 15:50:35 -070077import java.util.Set;
Simon Huntd5b96732016-07-08 13:22:27 -070078import java.util.concurrent.ExecutorService;
Simon Hunt8eac4ae2017-01-20 12:56:45 -080079
80import static java.util.concurrent.Executors.newSingleThreadExecutor;
81import static org.onlab.util.Tools.groupedThreads;
Simon Huntd5b96732016-07-08 13:22:27 -070082
Simon Hunted804d52016-03-30 09:51:40 -070083/**
Simon Huntcda9c032016-04-11 10:32:54 -070084 * Service that creates and maintains the UI-model of the network topology.
Simon Hunted804d52016-03-30 09:51:40 -070085 */
Ray Milkeyd84f89b2018-08-17 14:54:17 -070086@Component(immediate = true, service = UiSharedTopologyModel.class)
Simon Huntcda9c032016-04-11 10:32:54 -070087public final class UiSharedTopologyModel
88 extends AbstractListenerManager<UiModelEvent, UiModelListener> {
Simon Hunted804d52016-03-30 09:51:40 -070089
90 private static final Logger log =
91 LoggerFactory.getLogger(UiSharedTopologyModel.class);
92
Ray Milkeyd84f89b2018-08-17 14:54:17 -070093 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Simon Hunt4f4ffc32016-08-03 18:30:47 -070094 private UiTopoLayoutService layoutService;
95
Ray Milkeyd84f89b2018-08-17 14:54:17 -070096 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Simon Huntcda9c032016-04-11 10:32:54 -070097 private ClusterService clusterService;
Ray Milkeyd84f89b2018-08-17 14:54:17 -070098 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Simon Huntcda9c032016-04-11 10:32:54 -070099 private MastershipService mastershipService;
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700100 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Simon Huntcda9c032016-04-11 10:32:54 -0700101 private RegionService regionService;
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700102 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Simon Huntcda9c032016-04-11 10:32:54 -0700103 private DeviceService deviceService;
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700104 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Simon Huntcda9c032016-04-11 10:32:54 -0700105 private LinkService linkService;
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700106 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Simon Huntcda9c032016-04-11 10:32:54 -0700107 private HostService hostService;
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700108 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Simon Huntcda9c032016-04-11 10:32:54 -0700109 private IntentService intentService;
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700110 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Simon Huntcda9c032016-04-11 10:32:54 -0700111 private FlowRuleService flowService;
Simon Hunt7092cc42016-04-06 18:40:17 -0700112
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700113 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Simon Huntcda9c032016-04-11 10:32:54 -0700114 private StatisticService flowStatsService;
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700115 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Simon Huntcda9c032016-04-11 10:32:54 -0700116 private PortStatisticsService portStatsService;
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700117 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Simon Huntcda9c032016-04-11 10:32:54 -0700118 private TopologyService topologyService;
Simon Hunted804d52016-03-30 09:51:40 -0700119
Simon Huntcda9c032016-04-11 10:32:54 -0700120 private final ClusterEventListener clusterListener =
121 new InternalClusterListener();
122 private final MastershipListener mastershipListener =
123 new InternalMastershipListener();
124 private final RegionListener regionListener =
125 new InternalRegionListener();
126 private final DeviceListener deviceListener =
127 new InternalDeviceListener();
128 private final LinkListener linkListener =
129 new InternalLinkListener();
130 private final HostListener hostListener =
131 new InternalHostListener();
132 private final IntentListener intentListener =
133 new InternalIntentListener();
134 private final FlowRuleListener flowRuleListener =
135 new InternalFlowRuleListener();
Simon Hunt7092cc42016-04-06 18:40:17 -0700136
Madan Jampani492526a2016-06-06 17:24:04 -0700137 private ExecutorService eventHandler;
138
Simon Huntcda9c032016-04-11 10:32:54 -0700139
140 private ModelCache cache;
141
142
143 @Activate
Ray Milkey9c9cde42018-01-12 14:22:06 -0800144 void activate() {
Simon Hunt642bc452016-05-04 19:34:45 -0700145 cache = new ModelCache(new DefaultServiceBundle(), eventDispatcher);
Simon Hunt8eac4ae2017-01-20 12:56:45 -0800146 eventHandler = newSingleThreadExecutor(groupedThreads("onos/ui/topo", "event-handler", log));
Simon Huntcda9c032016-04-11 10:32:54 -0700147
148 eventDispatcher.addSink(UiModelEvent.class, listenerRegistry);
149
150 clusterService.addListener(clusterListener);
151 mastershipService.addListener(mastershipListener);
152 regionService.addListener(regionListener);
153 deviceService.addListener(deviceListener);
154 linkService.addListener(linkListener);
155 hostService.addListener(hostListener);
156 intentService.addListener(intentListener);
157 flowService.addListener(flowRuleListener);
158
159 cache.load();
160
161 log.info("Started");
Simon Hunted804d52016-03-30 09:51:40 -0700162 }
163
Simon Huntcda9c032016-04-11 10:32:54 -0700164 @Deactivate
Ray Milkey9c9cde42018-01-12 14:22:06 -0800165 void deactivate() {
Simon Huntcda9c032016-04-11 10:32:54 -0700166 eventDispatcher.removeSink(UiModelEvent.class);
167
168 clusterService.removeListener(clusterListener);
169 mastershipService.removeListener(mastershipListener);
170 regionService.removeListener(regionListener);
171 deviceService.removeListener(deviceListener);
172 linkService.removeListener(linkListener);
173 hostService.removeListener(hostListener);
174 intentService.removeListener(intentListener);
175 flowService.removeListener(flowRuleListener);
176
Madan Jampani492526a2016-06-06 17:24:04 -0700177 eventHandler.shutdown();
178
Simon Huntcda9c032016-04-11 10:32:54 -0700179 cache.clear();
180 cache = null;
181
182 log.info("Stopped");
183 }
184
Simon Hunt8eac4ae2017-01-20 12:56:45 -0800185 /**
186 * Injects an instance of the JSON-ifier (which has been bound to the
187 * services (link, host, device, ...)) to be passed on to the Model Cache,
188 * for use in forming UiModelEvent payloads.
189 *
190 * @param t2json JSONifier
191 */
192 public void injectJsonifier(Topo2Jsonifier t2json) {
193 cache.injectJsonifier(t2json);
194 }
195
Simon Huntcda9c032016-04-11 10:32:54 -0700196
Simon Huntf679c4e2016-04-01 17:02:24 -0700197 /**
198 * Registers a UI topology session with the topology model.
199 *
200 * @param session the session to register
201 */
202 public void register(UiTopoSession session) {
203 log.info("Registering topology session {}", session);
Simon Huntcda9c032016-04-11 10:32:54 -0700204 addListener(session);
Simon Hunted804d52016-03-30 09:51:40 -0700205 }
206
Simon Huntf679c4e2016-04-01 17:02:24 -0700207 /**
208 * Unregisters a UI topology session from the topology model.
209 *
210 * @param session the session to unregister
211 */
212 public void unregister(UiTopoSession session) {
213 log.info("Unregistering topology session {}", session);
Simon Huntcda9c032016-04-11 10:32:54 -0700214 removeListener(session);
Simon Huntf679c4e2016-04-01 17:02:24 -0700215 }
216
Simon Huntd5b96732016-07-08 13:22:27 -0700217
218 // =======================================================================
Simon Hunt10973dd2016-08-01 15:50:35 -0700219 // Methods for topo session (or CLI) to use to get information from us
Simon Huntd5b96732016-07-08 13:22:27 -0700220
221 /**
Thomas Vachuska1b1355d2018-02-06 16:53:58 -0800222 * Reloads the cache's internal state.
223 */
224 public void reload() {
225 cache.clear();
226 cache.load();
227 }
228
229 /**
Simon Hunt4854f3d2016-08-02 18:13:15 -0700230 * Refreshes the cache's internal state.
231 */
232 public void refresh() {
233 cache.refresh();
234 }
235
236 /**
237 * Returns the list of cluster members stored in the model cache.
Simon Huntd5b96732016-07-08 13:22:27 -0700238 *
239 * @return list of cluster members
240 */
241 public List<UiClusterMember> getClusterMembers() {
242 return cache.getAllClusterMembers();
243 }
244
Simon Huntd5b96732016-07-08 13:22:27 -0700245 /**
Simon Hunt4854f3d2016-08-02 18:13:15 -0700246 * Returns the set of regions stored in the model cache.
Simon Hunt10973dd2016-08-01 15:50:35 -0700247 *
248 * @return set of regions
249 */
250 public Set<UiRegion> getRegions() {
251 return cache.getAllRegions();
252 }
253
254 /**
Simon Hunt977aa052016-07-20 17:08:29 -0700255 * Returns the region for the given identifier.
Simon Huntd5b96732016-07-08 13:22:27 -0700256 *
Simon Hunt977aa052016-07-20 17:08:29 -0700257 * @param id region identifier
258 * @return the region
Simon Huntd5b96732016-07-08 13:22:27 -0700259 */
Simon Hunt977aa052016-07-20 17:08:29 -0700260 public UiRegion getRegion(RegionId id) {
261 return cache.accessRegion(id);
Simon Huntd5b96732016-07-08 13:22:27 -0700262 }
263
Simon Huntb1ce2602016-07-23 14:04:31 -0700264 /**
265 * Returns the null region.
266 *
267 * @return the null region
268 */
269 public UiRegion getNullRegion() {
270 return cache.nullRegion();
271 }
272
273 /**
Simon Hunt4854f3d2016-08-02 18:13:15 -0700274 * Returns the set of devices stored in the model cache.
275 *
276 * @return set of devices
Simon Huntb1ce2602016-07-23 14:04:31 -0700277 */
Simon Hunt4854f3d2016-08-02 18:13:15 -0700278 public Set<UiDevice> getDevices() {
279 return cache.getAllDevices();
280 }
281
282 /**
283 * Returns the set of hosts stored in the model cache.
284 *
285 * @return set of hosts
286 */
287 public Set<UiHost> getHosts() {
288 return cache.getAllHosts();
289 }
290
291 /**
Simon Huntc13082f2016-08-03 21:20:23 -0700292 * Returns the set of device links stored in the model cache.
Simon Hunt4854f3d2016-08-02 18:13:15 -0700293 *
Simon Huntc13082f2016-08-03 21:20:23 -0700294 * @return set of device links
Simon Hunt4854f3d2016-08-02 18:13:15 -0700295 */
Simon Huntc13082f2016-08-03 21:20:23 -0700296 public Set<UiDeviceLink> getDeviceLinks() {
297 return cache.getAllDeviceLinks();
298 }
299
300 /**
301 * Returns the synthetic links associated with the specified region.
302 *
303 * @param regionId region ID
304 * @return synthetic links for that region
305 */
306 public List<UiSynthLink> getSynthLinks(RegionId regionId) {
307 return cache.getSynthLinks(regionId);
Simon Huntb1ce2602016-07-23 14:04:31 -0700308 }
309
Simon Hunt0e161092017-05-08 17:41:38 -0700310 /**
311 * Returns the synthetic links associated with the specified region,
312 * mapped by original link id.
313 *
314 * @param regionId region ID
315 * @return map of synthetic links for that region
316 */
317 public Map<UiLinkId, UiSynthLink> relevantSynthLinks(RegionId regionId) {
318 return cache.relevantSynthLinks(regionId);
319 }
320
Simon Huntd5b96732016-07-08 13:22:27 -0700321 // =====================================================================
322
323
Simon Hunt642bc452016-05-04 19:34:45 -0700324 /**
325 * Default implementation of service bundle to return references to our
326 * dynamically injected services.
327 */
328 private class DefaultServiceBundle implements ServiceBundle {
329 @Override
Simon Hunt4f4ffc32016-08-03 18:30:47 -0700330 public UiTopoLayoutService layout() {
331 return layoutService;
332 }
333
334 @Override
Simon Hunt642bc452016-05-04 19:34:45 -0700335 public ClusterService cluster() {
336 return clusterService;
337 }
338
339 @Override
340 public MastershipService mastership() {
341 return mastershipService;
342 }
343
344 @Override
345 public RegionService region() {
346 return regionService;
347 }
348
349 @Override
350 public DeviceService device() {
351 return deviceService;
352 }
353
354 @Override
355 public LinkService link() {
356 return linkService;
357 }
358
359 @Override
360 public HostService host() {
361 return hostService;
362 }
363
364 @Override
365 public IntentService intent() {
366 return intentService;
367 }
368
369 @Override
370 public FlowRuleService flow() {
371 return flowService;
372 }
373 }
374
Simon Hunt7092cc42016-04-06 18:40:17 -0700375
Simon Huntcda9c032016-04-11 10:32:54 -0700376 private class InternalClusterListener implements ClusterEventListener {
377 @Override
378 public void event(ClusterEvent event) {
Madan Jampani492526a2016-06-06 17:24:04 -0700379 eventHandler.execute(() -> handleEvent(event));
380 }
381
382 private void handleEvent(ClusterEvent event) {
Simon Hunt23fb1352016-04-11 12:15:19 -0700383 ControllerNode cnode = event.subject();
384
385 switch (event.type()) {
386
387 case INSTANCE_ADDED:
388 case INSTANCE_ACTIVATED:
389 case INSTANCE_READY:
390 case INSTANCE_DEACTIVATED:
391 cache.addOrUpdateClusterMember(cnode);
392 break;
393
394 case INSTANCE_REMOVED:
395 cache.removeClusterMember(cnode);
396 break;
397
398 default:
399 break;
400 }
Simon Hunt7092cc42016-04-06 18:40:17 -0700401 }
Simon Huntcda9c032016-04-11 10:32:54 -0700402 }
Simon Hunt7092cc42016-04-06 18:40:17 -0700403
Simon Huntcda9c032016-04-11 10:32:54 -0700404 private class InternalMastershipListener implements MastershipListener {
405 @Override
406 public void event(MastershipEvent event) {
Simon Hunt23fb1352016-04-11 12:15:19 -0700407 DeviceId deviceId = event.subject();
408 RoleInfo roleInfo = event.roleInfo();
409
410 switch (event.type()) {
411 case MASTER_CHANGED:
412 case BACKUPS_CHANGED:
413 cache.updateMasterships(deviceId, roleInfo);
414 break;
415
416 default:
417 break;
418 }
Simon Hunt7092cc42016-04-06 18:40:17 -0700419 }
Simon Huntcda9c032016-04-11 10:32:54 -0700420 }
Simon Hunt7092cc42016-04-06 18:40:17 -0700421
Simon Huntcda9c032016-04-11 10:32:54 -0700422 private class InternalRegionListener implements RegionListener {
423 @Override
424 public void event(RegionEvent event) {
Simon Hunt23fb1352016-04-11 12:15:19 -0700425 Region region = event.subject();
426
427 switch (event.type()) {
428
429 case REGION_ADDED:
430 case REGION_UPDATED:
431 case REGION_MEMBERSHIP_CHANGED:
432 cache.addOrUpdateRegion(region);
433 break;
434
435 case REGION_REMOVED:
436 cache.removeRegion(region);
437 break;
438
439 default:
440 break;
441 }
Simon Hunt7092cc42016-04-06 18:40:17 -0700442 }
Simon Huntcda9c032016-04-11 10:32:54 -0700443 }
Simon Hunt7092cc42016-04-06 18:40:17 -0700444
Simon Huntcda9c032016-04-11 10:32:54 -0700445 private class InternalDeviceListener implements DeviceListener {
446 @Override
447 public void event(DeviceEvent event) {
Simon Huntcda9c032016-04-11 10:32:54 -0700448 Device device = event.subject();
Simon Hunt7092cc42016-04-06 18:40:17 -0700449
Simon Huntcda9c032016-04-11 10:32:54 -0700450 switch (event.type()) {
Simon Hunt7092cc42016-04-06 18:40:17 -0700451
Simon Huntcda9c032016-04-11 10:32:54 -0700452 case DEVICE_ADDED:
453 case DEVICE_UPDATED:
454 case DEVICE_AVAILABILITY_CHANGED:
455 case DEVICE_SUSPENDED:
456 cache.addOrUpdateDevice(device);
457 break;
Simon Hunt7092cc42016-04-06 18:40:17 -0700458
Simon Huntcda9c032016-04-11 10:32:54 -0700459 case DEVICE_REMOVED:
460 cache.removeDevice(device);
461 break;
Simon Hunt7092cc42016-04-06 18:40:17 -0700462
Simon Huntcda9c032016-04-11 10:32:54 -0700463 default:
464 break;
Simon Hunt7092cc42016-04-06 18:40:17 -0700465 }
466 }
467 }
468
Simon Huntcda9c032016-04-11 10:32:54 -0700469 private class InternalLinkListener implements LinkListener {
470 @Override
471 public void event(LinkEvent event) {
Simon Hunt23fb1352016-04-11 12:15:19 -0700472 Link link = event.subject();
473
474 switch (event.type()) {
475
476 case LINK_ADDED:
477 case LINK_UPDATED:
Simon Huntc13082f2016-08-03 21:20:23 -0700478 cache.addOrUpdateDeviceLink(link);
Simon Hunt23fb1352016-04-11 12:15:19 -0700479 break;
480
481 case LINK_REMOVED:
Simon Huntc13082f2016-08-03 21:20:23 -0700482 cache.removeDeviceLink(link);
Simon Hunt23fb1352016-04-11 12:15:19 -0700483 break;
484
485 default:
486 break;
487 }
Simon Huntcda9c032016-04-11 10:32:54 -0700488 }
Simon Hunted804d52016-03-30 09:51:40 -0700489 }
490
Simon Huntcda9c032016-04-11 10:32:54 -0700491 private class InternalHostListener implements HostListener {
492 @Override
493 public void event(HostEvent event) {
Simon Hunt23fb1352016-04-11 12:15:19 -0700494 Host host = event.subject();
495 Host prevHost = event.prevSubject();
496
497 switch (event.type()) {
498
499 case HOST_ADDED:
500 case HOST_UPDATED:
501 cache.addOrUpdateHost(host);
502 break;
503
504 case HOST_MOVED:
505 cache.moveHost(host, prevHost);
506 break;
507
508 case HOST_REMOVED:
509 cache.removeHost(host);
510 break;
511
512 default:
513 break;
514 }
Simon Huntcda9c032016-04-11 10:32:54 -0700515 }
Simon Hunted804d52016-03-30 09:51:40 -0700516 }
Simon Huntcda9c032016-04-11 10:32:54 -0700517
Simon Hunt23fb1352016-04-11 12:15:19 -0700518 // =======================================================================
519 // NOTE: Neither intents nor flows are modeled by the UiTopology.
520 // Rather, they are serviced directly from this class.
521 // Additionally, since we are only retrieving counts (in the current
522 // implementation), we'll fetch them on demand from the service.
523 // Thus, the following internal listeners are stubs only (for now).
524 // =======================================================================
525
Simon Huntcda9c032016-04-11 10:32:54 -0700526 private class InternalIntentListener implements IntentListener {
527 @Override
528 public void event(IntentEvent event) {
Simon Hunt23fb1352016-04-11 12:15:19 -0700529 // do nothing (for now)
Simon Huntcda9c032016-04-11 10:32:54 -0700530 }
531 }
532
533 private class InternalFlowRuleListener implements FlowRuleListener {
534 @Override
535 public void event(FlowRuleEvent event) {
Simon Hunt23fb1352016-04-11 12:15:19 -0700536 // do nothing (for now)
Simon Huntcda9c032016-04-11 10:32:54 -0700537 }
538 }
539
Simon Hunted804d52016-03-30 09:51:40 -0700540}