blob: d70ecf651a606903f25b3702e5b317ef032ddd78 [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;
Simon Hunt7092cc42016-04-06 18:40:17 -070025import org.onosproject.incubator.net.PortStatisticsService;
26import org.onosproject.incubator.net.tunnel.TunnelService;
27import org.onosproject.mastership.MastershipEvent;
28import org.onosproject.mastership.MastershipListener;
29import org.onosproject.mastership.MastershipService;
Simon Huntcda9c032016-04-11 10:32:54 -070030import org.onosproject.net.Device;
Simon Hunt23fb1352016-04-11 12:15:19 -070031import org.onosproject.net.DeviceId;
32import org.onosproject.net.Host;
33import org.onosproject.net.Link;
Simon Hunt7092cc42016-04-06 18:40:17 -070034import org.onosproject.net.device.DeviceEvent;
35import org.onosproject.net.device.DeviceListener;
36import org.onosproject.net.device.DeviceService;
37import org.onosproject.net.flow.FlowRuleEvent;
38import org.onosproject.net.flow.FlowRuleListener;
39import org.onosproject.net.flow.FlowRuleService;
40import org.onosproject.net.host.HostEvent;
41import org.onosproject.net.host.HostListener;
42import org.onosproject.net.host.HostService;
43import org.onosproject.net.intent.IntentEvent;
44import org.onosproject.net.intent.IntentListener;
45import org.onosproject.net.intent.IntentService;
46import org.onosproject.net.link.LinkEvent;
47import org.onosproject.net.link.LinkListener;
48import org.onosproject.net.link.LinkService;
Simon Hunt23fb1352016-04-11 12:15:19 -070049import org.onosproject.net.region.Region;
Simon Hunt7092cc42016-04-06 18:40:17 -070050import org.onosproject.net.region.RegionEvent;
Simon Hunt977aa052016-07-20 17:08:29 -070051import org.onosproject.net.region.RegionId;
Simon Hunt7092cc42016-04-06 18:40:17 -070052import org.onosproject.net.region.RegionListener;
53import org.onosproject.net.region.RegionService;
54import org.onosproject.net.statistic.StatisticService;
55import org.onosproject.net.topology.TopologyService;
Simon Hunt4f4ffc32016-08-03 18:30:47 -070056import org.onosproject.ui.UiTopoLayoutService;
Simon Hunt8eac4ae2017-01-20 12:56:45 -080057import org.onosproject.ui.impl.topo.Topo2Jsonifier;
Simon Huntf679c4e2016-04-01 17:02:24 -070058import org.onosproject.ui.impl.topo.UiTopoSession;
Simon Hunt642bc452016-05-04 19:34:45 -070059import org.onosproject.ui.model.ServiceBundle;
Simon Huntd5b96732016-07-08 13:22:27 -070060import org.onosproject.ui.model.topo.UiClusterMember;
Simon Hunt4854f3d2016-08-02 18:13:15 -070061import org.onosproject.ui.model.topo.UiDevice;
Simon Huntc13082f2016-08-03 21:20:23 -070062import org.onosproject.ui.model.topo.UiDeviceLink;
Simon Hunt4854f3d2016-08-02 18:13:15 -070063import org.onosproject.ui.model.topo.UiHost;
Simon Hunt0e161092017-05-08 17:41:38 -070064import org.onosproject.ui.model.topo.UiLinkId;
Thomas Vachuska8c0b18a2017-04-14 16:27:33 -070065import org.onosproject.ui.model.topo.UiModelEvent;
Simon Huntd5b96732016-07-08 13:22:27 -070066import org.onosproject.ui.model.topo.UiRegion;
Simon Huntc13082f2016-08-03 21:20:23 -070067import org.onosproject.ui.model.topo.UiSynthLink;
Ray Milkeyd84f89b2018-08-17 14:54:17 -070068import org.osgi.service.component.annotations.Activate;
69import org.osgi.service.component.annotations.Component;
70import org.osgi.service.component.annotations.Deactivate;
71import org.osgi.service.component.annotations.Reference;
72import org.osgi.service.component.annotations.ReferenceCardinality;
Simon Hunted804d52016-03-30 09:51:40 -070073import org.slf4j.Logger;
74import org.slf4j.LoggerFactory;
75
Simon Huntd5b96732016-07-08 13:22:27 -070076import java.util.List;
Simon Hunt0e161092017-05-08 17:41:38 -070077import java.util.Map;
Simon Hunt10973dd2016-08-01 15:50:35 -070078import java.util.Set;
Simon Huntd5b96732016-07-08 13:22:27 -070079import java.util.concurrent.ExecutorService;
Simon Hunt8eac4ae2017-01-20 12:56:45 -080080
81import static java.util.concurrent.Executors.newSingleThreadExecutor;
82import static org.onlab.util.Tools.groupedThreads;
Simon Huntd5b96732016-07-08 13:22:27 -070083
Simon Hunted804d52016-03-30 09:51:40 -070084/**
Simon Huntcda9c032016-04-11 10:32:54 -070085 * Service that creates and maintains the UI-model of the network topology.
Simon Hunted804d52016-03-30 09:51:40 -070086 */
Ray Milkeyd84f89b2018-08-17 14:54:17 -070087@Component(immediate = true, service = UiSharedTopologyModel.class)
Simon Huntcda9c032016-04-11 10:32:54 -070088public final class UiSharedTopologyModel
89 extends AbstractListenerManager<UiModelEvent, UiModelListener> {
Simon Hunted804d52016-03-30 09:51:40 -070090
91 private static final Logger log =
92 LoggerFactory.getLogger(UiSharedTopologyModel.class);
93
Ray Milkeyd84f89b2018-08-17 14:54:17 -070094 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Simon Hunt4f4ffc32016-08-03 18:30:47 -070095 private UiTopoLayoutService layoutService;
96
Ray Milkeyd84f89b2018-08-17 14:54:17 -070097 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Simon Huntcda9c032016-04-11 10:32:54 -070098 private ClusterService clusterService;
Ray Milkeyd84f89b2018-08-17 14:54:17 -070099 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Simon Huntcda9c032016-04-11 10:32:54 -0700100 private MastershipService mastershipService;
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700101 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Simon Huntcda9c032016-04-11 10:32:54 -0700102 private RegionService regionService;
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700103 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Simon Huntcda9c032016-04-11 10:32:54 -0700104 private DeviceService deviceService;
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700105 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Simon Huntcda9c032016-04-11 10:32:54 -0700106 private LinkService linkService;
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700107 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Simon Huntcda9c032016-04-11 10:32:54 -0700108 private HostService hostService;
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700109 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Simon Huntcda9c032016-04-11 10:32:54 -0700110 private IntentService intentService;
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700111 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Simon Huntcda9c032016-04-11 10:32:54 -0700112 private FlowRuleService flowService;
Simon Hunt7092cc42016-04-06 18:40:17 -0700113
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700114 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Simon Huntcda9c032016-04-11 10:32:54 -0700115 private StatisticService flowStatsService;
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700116 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Simon Huntcda9c032016-04-11 10:32:54 -0700117 private PortStatisticsService portStatsService;
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700118 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Simon Huntcda9c032016-04-11 10:32:54 -0700119 private TopologyService topologyService;
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700120 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Simon Huntcda9c032016-04-11 10:32:54 -0700121 private TunnelService tunnelService;
Simon Hunted804d52016-03-30 09:51:40 -0700122
Simon Huntcda9c032016-04-11 10:32:54 -0700123 private final ClusterEventListener clusterListener =
124 new InternalClusterListener();
125 private final MastershipListener mastershipListener =
126 new InternalMastershipListener();
127 private final RegionListener regionListener =
128 new InternalRegionListener();
129 private final DeviceListener deviceListener =
130 new InternalDeviceListener();
131 private final LinkListener linkListener =
132 new InternalLinkListener();
133 private final HostListener hostListener =
134 new InternalHostListener();
135 private final IntentListener intentListener =
136 new InternalIntentListener();
137 private final FlowRuleListener flowRuleListener =
138 new InternalFlowRuleListener();
Simon Hunt7092cc42016-04-06 18:40:17 -0700139
Madan Jampani492526a2016-06-06 17:24:04 -0700140 private ExecutorService eventHandler;
141
Simon Huntcda9c032016-04-11 10:32:54 -0700142
143 private ModelCache cache;
144
145
146 @Activate
Ray Milkey9c9cde42018-01-12 14:22:06 -0800147 void activate() {
Simon Hunt642bc452016-05-04 19:34:45 -0700148 cache = new ModelCache(new DefaultServiceBundle(), eventDispatcher);
Simon Hunt8eac4ae2017-01-20 12:56:45 -0800149 eventHandler = newSingleThreadExecutor(groupedThreads("onos/ui/topo", "event-handler", log));
Simon Huntcda9c032016-04-11 10:32:54 -0700150
151 eventDispatcher.addSink(UiModelEvent.class, listenerRegistry);
152
153 clusterService.addListener(clusterListener);
154 mastershipService.addListener(mastershipListener);
155 regionService.addListener(regionListener);
156 deviceService.addListener(deviceListener);
157 linkService.addListener(linkListener);
158 hostService.addListener(hostListener);
159 intentService.addListener(intentListener);
160 flowService.addListener(flowRuleListener);
161
162 cache.load();
163
164 log.info("Started");
Simon Hunted804d52016-03-30 09:51:40 -0700165 }
166
Simon Huntcda9c032016-04-11 10:32:54 -0700167 @Deactivate
Ray Milkey9c9cde42018-01-12 14:22:06 -0800168 void deactivate() {
Simon Huntcda9c032016-04-11 10:32:54 -0700169 eventDispatcher.removeSink(UiModelEvent.class);
170
171 clusterService.removeListener(clusterListener);
172 mastershipService.removeListener(mastershipListener);
173 regionService.removeListener(regionListener);
174 deviceService.removeListener(deviceListener);
175 linkService.removeListener(linkListener);
176 hostService.removeListener(hostListener);
177 intentService.removeListener(intentListener);
178 flowService.removeListener(flowRuleListener);
179
Madan Jampani492526a2016-06-06 17:24:04 -0700180 eventHandler.shutdown();
181
Simon Huntcda9c032016-04-11 10:32:54 -0700182 cache.clear();
183 cache = null;
184
185 log.info("Stopped");
186 }
187
Simon Hunt8eac4ae2017-01-20 12:56:45 -0800188 /**
189 * Injects an instance of the JSON-ifier (which has been bound to the
190 * services (link, host, device, ...)) to be passed on to the Model Cache,
191 * for use in forming UiModelEvent payloads.
192 *
193 * @param t2json JSONifier
194 */
195 public void injectJsonifier(Topo2Jsonifier t2json) {
196 cache.injectJsonifier(t2json);
197 }
198
Simon Huntcda9c032016-04-11 10:32:54 -0700199
Simon Huntf679c4e2016-04-01 17:02:24 -0700200 /**
201 * Registers a UI topology session with the topology model.
202 *
203 * @param session the session to register
204 */
205 public void register(UiTopoSession session) {
206 log.info("Registering topology session {}", session);
Simon Huntcda9c032016-04-11 10:32:54 -0700207 addListener(session);
Simon Hunted804d52016-03-30 09:51:40 -0700208 }
209
Simon Huntf679c4e2016-04-01 17:02:24 -0700210 /**
211 * Unregisters a UI topology session from the topology model.
212 *
213 * @param session the session to unregister
214 */
215 public void unregister(UiTopoSession session) {
216 log.info("Unregistering topology session {}", session);
Simon Huntcda9c032016-04-11 10:32:54 -0700217 removeListener(session);
Simon Huntf679c4e2016-04-01 17:02:24 -0700218 }
219
Simon Huntd5b96732016-07-08 13:22:27 -0700220
221 // =======================================================================
Simon Hunt10973dd2016-08-01 15:50:35 -0700222 // Methods for topo session (or CLI) to use to get information from us
Simon Huntd5b96732016-07-08 13:22:27 -0700223
224 /**
Thomas Vachuska1b1355d2018-02-06 16:53:58 -0800225 * Reloads the cache's internal state.
226 */
227 public void reload() {
228 cache.clear();
229 cache.load();
230 }
231
232 /**
Simon Hunt4854f3d2016-08-02 18:13:15 -0700233 * Refreshes the cache's internal state.
234 */
235 public void refresh() {
236 cache.refresh();
237 }
238
239 /**
240 * Returns the list of cluster members stored in the model cache.
Simon Huntd5b96732016-07-08 13:22:27 -0700241 *
242 * @return list of cluster members
243 */
244 public List<UiClusterMember> getClusterMembers() {
245 return cache.getAllClusterMembers();
246 }
247
Simon Huntd5b96732016-07-08 13:22:27 -0700248 /**
Simon Hunt4854f3d2016-08-02 18:13:15 -0700249 * Returns the set of regions stored in the model cache.
Simon Hunt10973dd2016-08-01 15:50:35 -0700250 *
251 * @return set of regions
252 */
253 public Set<UiRegion> getRegions() {
254 return cache.getAllRegions();
255 }
256
257 /**
Simon Hunt977aa052016-07-20 17:08:29 -0700258 * Returns the region for the given identifier.
Simon Huntd5b96732016-07-08 13:22:27 -0700259 *
Simon Hunt977aa052016-07-20 17:08:29 -0700260 * @param id region identifier
261 * @return the region
Simon Huntd5b96732016-07-08 13:22:27 -0700262 */
Simon Hunt977aa052016-07-20 17:08:29 -0700263 public UiRegion getRegion(RegionId id) {
264 return cache.accessRegion(id);
Simon Huntd5b96732016-07-08 13:22:27 -0700265 }
266
Simon Huntb1ce2602016-07-23 14:04:31 -0700267 /**
268 * Returns the null region.
269 *
270 * @return the null region
271 */
272 public UiRegion getNullRegion() {
273 return cache.nullRegion();
274 }
275
276 /**
Simon Hunt4854f3d2016-08-02 18:13:15 -0700277 * Returns the set of devices stored in the model cache.
278 *
279 * @return set of devices
Simon Huntb1ce2602016-07-23 14:04:31 -0700280 */
Simon Hunt4854f3d2016-08-02 18:13:15 -0700281 public Set<UiDevice> getDevices() {
282 return cache.getAllDevices();
283 }
284
285 /**
286 * Returns the set of hosts stored in the model cache.
287 *
288 * @return set of hosts
289 */
290 public Set<UiHost> getHosts() {
291 return cache.getAllHosts();
292 }
293
294 /**
Simon Huntc13082f2016-08-03 21:20:23 -0700295 * Returns the set of device links stored in the model cache.
Simon Hunt4854f3d2016-08-02 18:13:15 -0700296 *
Simon Huntc13082f2016-08-03 21:20:23 -0700297 * @return set of device links
Simon Hunt4854f3d2016-08-02 18:13:15 -0700298 */
Simon Huntc13082f2016-08-03 21:20:23 -0700299 public Set<UiDeviceLink> getDeviceLinks() {
300 return cache.getAllDeviceLinks();
301 }
302
303 /**
304 * Returns the synthetic links associated with the specified region.
305 *
306 * @param regionId region ID
307 * @return synthetic links for that region
308 */
309 public List<UiSynthLink> getSynthLinks(RegionId regionId) {
310 return cache.getSynthLinks(regionId);
Simon Huntb1ce2602016-07-23 14:04:31 -0700311 }
312
Simon Hunt0e161092017-05-08 17:41:38 -0700313 /**
314 * Returns the synthetic links associated with the specified region,
315 * mapped by original link id.
316 *
317 * @param regionId region ID
318 * @return map of synthetic links for that region
319 */
320 public Map<UiLinkId, UiSynthLink> relevantSynthLinks(RegionId regionId) {
321 return cache.relevantSynthLinks(regionId);
322 }
323
Simon Huntd5b96732016-07-08 13:22:27 -0700324 // =====================================================================
325
326
Simon Hunt642bc452016-05-04 19:34:45 -0700327 /**
328 * Default implementation of service bundle to return references to our
329 * dynamically injected services.
330 */
331 private class DefaultServiceBundle implements ServiceBundle {
332 @Override
Simon Hunt4f4ffc32016-08-03 18:30:47 -0700333 public UiTopoLayoutService layout() {
334 return layoutService;
335 }
336
337 @Override
Simon Hunt642bc452016-05-04 19:34:45 -0700338 public ClusterService cluster() {
339 return clusterService;
340 }
341
342 @Override
343 public MastershipService mastership() {
344 return mastershipService;
345 }
346
347 @Override
348 public RegionService region() {
349 return regionService;
350 }
351
352 @Override
353 public DeviceService device() {
354 return deviceService;
355 }
356
357 @Override
358 public LinkService link() {
359 return linkService;
360 }
361
362 @Override
363 public HostService host() {
364 return hostService;
365 }
366
367 @Override
368 public IntentService intent() {
369 return intentService;
370 }
371
372 @Override
373 public FlowRuleService flow() {
374 return flowService;
375 }
376 }
377
Simon Hunt7092cc42016-04-06 18:40:17 -0700378
Simon Huntcda9c032016-04-11 10:32:54 -0700379 private class InternalClusterListener implements ClusterEventListener {
380 @Override
381 public void event(ClusterEvent event) {
Madan Jampani492526a2016-06-06 17:24:04 -0700382 eventHandler.execute(() -> handleEvent(event));
383 }
384
385 private void handleEvent(ClusterEvent event) {
Simon Hunt23fb1352016-04-11 12:15:19 -0700386 ControllerNode cnode = event.subject();
387
388 switch (event.type()) {
389
390 case INSTANCE_ADDED:
391 case INSTANCE_ACTIVATED:
392 case INSTANCE_READY:
393 case INSTANCE_DEACTIVATED:
394 cache.addOrUpdateClusterMember(cnode);
395 break;
396
397 case INSTANCE_REMOVED:
398 cache.removeClusterMember(cnode);
399 break;
400
401 default:
402 break;
403 }
Simon Hunt7092cc42016-04-06 18:40:17 -0700404 }
Simon Huntcda9c032016-04-11 10:32:54 -0700405 }
Simon Hunt7092cc42016-04-06 18:40:17 -0700406
Simon Huntcda9c032016-04-11 10:32:54 -0700407 private class InternalMastershipListener implements MastershipListener {
408 @Override
409 public void event(MastershipEvent event) {
Simon Hunt23fb1352016-04-11 12:15:19 -0700410 DeviceId deviceId = event.subject();
411 RoleInfo roleInfo = event.roleInfo();
412
413 switch (event.type()) {
414 case MASTER_CHANGED:
415 case BACKUPS_CHANGED:
416 cache.updateMasterships(deviceId, roleInfo);
417 break;
418
419 default:
420 break;
421 }
Simon Hunt7092cc42016-04-06 18:40:17 -0700422 }
Simon Huntcda9c032016-04-11 10:32:54 -0700423 }
Simon Hunt7092cc42016-04-06 18:40:17 -0700424
Simon Huntcda9c032016-04-11 10:32:54 -0700425 private class InternalRegionListener implements RegionListener {
426 @Override
427 public void event(RegionEvent event) {
Simon Hunt23fb1352016-04-11 12:15:19 -0700428 Region region = event.subject();
429
430 switch (event.type()) {
431
432 case REGION_ADDED:
433 case REGION_UPDATED:
434 case REGION_MEMBERSHIP_CHANGED:
435 cache.addOrUpdateRegion(region);
436 break;
437
438 case REGION_REMOVED:
439 cache.removeRegion(region);
440 break;
441
442 default:
443 break;
444 }
Simon Hunt7092cc42016-04-06 18:40:17 -0700445 }
Simon Huntcda9c032016-04-11 10:32:54 -0700446 }
Simon Hunt7092cc42016-04-06 18:40:17 -0700447
Simon Huntcda9c032016-04-11 10:32:54 -0700448 private class InternalDeviceListener implements DeviceListener {
449 @Override
450 public void event(DeviceEvent event) {
Simon Huntcda9c032016-04-11 10:32:54 -0700451 Device device = event.subject();
Simon Hunt7092cc42016-04-06 18:40:17 -0700452
Simon Huntcda9c032016-04-11 10:32:54 -0700453 switch (event.type()) {
Simon Hunt7092cc42016-04-06 18:40:17 -0700454
Simon Huntcda9c032016-04-11 10:32:54 -0700455 case DEVICE_ADDED:
456 case DEVICE_UPDATED:
457 case DEVICE_AVAILABILITY_CHANGED:
458 case DEVICE_SUSPENDED:
459 cache.addOrUpdateDevice(device);
460 break;
Simon Hunt7092cc42016-04-06 18:40:17 -0700461
Simon Huntcda9c032016-04-11 10:32:54 -0700462 case DEVICE_REMOVED:
463 cache.removeDevice(device);
464 break;
Simon Hunt7092cc42016-04-06 18:40:17 -0700465
Simon Huntcda9c032016-04-11 10:32:54 -0700466 default:
467 break;
Simon Hunt7092cc42016-04-06 18:40:17 -0700468 }
469 }
470 }
471
Simon Huntcda9c032016-04-11 10:32:54 -0700472 private class InternalLinkListener implements LinkListener {
473 @Override
474 public void event(LinkEvent event) {
Simon Hunt23fb1352016-04-11 12:15:19 -0700475 Link link = event.subject();
476
477 switch (event.type()) {
478
479 case LINK_ADDED:
480 case LINK_UPDATED:
Simon Huntc13082f2016-08-03 21:20:23 -0700481 cache.addOrUpdateDeviceLink(link);
Simon Hunt23fb1352016-04-11 12:15:19 -0700482 break;
483
484 case LINK_REMOVED:
Simon Huntc13082f2016-08-03 21:20:23 -0700485 cache.removeDeviceLink(link);
Simon Hunt23fb1352016-04-11 12:15:19 -0700486 break;
487
488 default:
489 break;
490 }
Simon Huntcda9c032016-04-11 10:32:54 -0700491 }
Simon Hunted804d52016-03-30 09:51:40 -0700492 }
493
Simon Huntcda9c032016-04-11 10:32:54 -0700494 private class InternalHostListener implements HostListener {
495 @Override
496 public void event(HostEvent event) {
Simon Hunt23fb1352016-04-11 12:15:19 -0700497 Host host = event.subject();
498 Host prevHost = event.prevSubject();
499
500 switch (event.type()) {
501
502 case HOST_ADDED:
503 case HOST_UPDATED:
504 cache.addOrUpdateHost(host);
505 break;
506
507 case HOST_MOVED:
508 cache.moveHost(host, prevHost);
509 break;
510
511 case HOST_REMOVED:
512 cache.removeHost(host);
513 break;
514
515 default:
516 break;
517 }
Simon Huntcda9c032016-04-11 10:32:54 -0700518 }
Simon Hunted804d52016-03-30 09:51:40 -0700519 }
Simon Huntcda9c032016-04-11 10:32:54 -0700520
Simon Hunt23fb1352016-04-11 12:15:19 -0700521 // =======================================================================
522 // NOTE: Neither intents nor flows are modeled by the UiTopology.
523 // Rather, they are serviced directly from this class.
524 // Additionally, since we are only retrieving counts (in the current
525 // implementation), we'll fetch them on demand from the service.
526 // Thus, the following internal listeners are stubs only (for now).
527 // =======================================================================
528
Simon Huntcda9c032016-04-11 10:32:54 -0700529 private class InternalIntentListener implements IntentListener {
530 @Override
531 public void event(IntentEvent event) {
Simon Hunt23fb1352016-04-11 12:15:19 -0700532 // do nothing (for now)
Simon Huntcda9c032016-04-11 10:32:54 -0700533 }
534 }
535
536 private class InternalFlowRuleListener implements FlowRuleListener {
537 @Override
538 public void event(FlowRuleEvent event) {
Simon Hunt23fb1352016-04-11 12:15:19 -0700539 // do nothing (for now)
Simon Huntcda9c032016-04-11 10:32:54 -0700540 }
541 }
542
Simon Hunted804d52016-03-30 09:51:40 -0700543}