blob: 0a4ce995d63222f485162890320f18069d9cf0f7 [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 Hunted804d52016-03-30 09:51:40 -070062import org.slf4j.Logger;
63import org.slf4j.LoggerFactory;
64
65/**
Simon Huntcda9c032016-04-11 10:32:54 -070066 * Service that creates and maintains the UI-model of the network topology.
Simon Hunted804d52016-03-30 09:51:40 -070067 */
Simon Huntcda9c032016-04-11 10:32:54 -070068@Component(immediate = true)
69@Service(value = UiSharedTopologyModel.class)
70public final class UiSharedTopologyModel
71 extends AbstractListenerManager<UiModelEvent, UiModelListener> {
Simon Hunted804d52016-03-30 09:51:40 -070072
73 private static final Logger log =
74 LoggerFactory.getLogger(UiSharedTopologyModel.class);
75
Simon Huntcda9c032016-04-11 10:32:54 -070076 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
77 private ClusterService clusterService;
78 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
79 private MastershipService mastershipService;
80 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
81 private RegionService regionService;
82 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
83 private DeviceService deviceService;
84 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
85 private LinkService linkService;
86 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
87 private HostService hostService;
88 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
89 private IntentService intentService;
90 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
91 private FlowRuleService flowService;
Simon Hunt7092cc42016-04-06 18:40:17 -070092
Simon Huntcda9c032016-04-11 10:32:54 -070093 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
94 private StatisticService flowStatsService;
95 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
96 private PortStatisticsService portStatsService;
97 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
98 private TopologyService topologyService;
99 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
100 private TunnelService tunnelService;
Simon Hunted804d52016-03-30 09:51:40 -0700101
Simon Huntcda9c032016-04-11 10:32:54 -0700102 private final ClusterEventListener clusterListener =
103 new InternalClusterListener();
104 private final MastershipListener mastershipListener =
105 new InternalMastershipListener();
106 private final RegionListener regionListener =
107 new InternalRegionListener();
108 private final DeviceListener deviceListener =
109 new InternalDeviceListener();
110 private final LinkListener linkListener =
111 new InternalLinkListener();
112 private final HostListener hostListener =
113 new InternalHostListener();
114 private final IntentListener intentListener =
115 new InternalIntentListener();
116 private final FlowRuleListener flowRuleListener =
117 new InternalFlowRuleListener();
Simon Hunt7092cc42016-04-06 18:40:17 -0700118
Simon Huntcda9c032016-04-11 10:32:54 -0700119
120 private ModelCache cache;
121
122
123 @Activate
124 protected void activate() {
125 cache = new ModelCache(eventDispatcher);
126
127 eventDispatcher.addSink(UiModelEvent.class, listenerRegistry);
128
129 clusterService.addListener(clusterListener);
130 mastershipService.addListener(mastershipListener);
131 regionService.addListener(regionListener);
132 deviceService.addListener(deviceListener);
133 linkService.addListener(linkListener);
134 hostService.addListener(hostListener);
135 intentService.addListener(intentListener);
136 flowService.addListener(flowRuleListener);
137
138 cache.load();
139
140 log.info("Started");
Simon Hunted804d52016-03-30 09:51:40 -0700141 }
142
Simon Huntcda9c032016-04-11 10:32:54 -0700143 @Deactivate
144 protected void deactivate() {
145 eventDispatcher.removeSink(UiModelEvent.class);
146
147 clusterService.removeListener(clusterListener);
148 mastershipService.removeListener(mastershipListener);
149 regionService.removeListener(regionListener);
150 deviceService.removeListener(deviceListener);
151 linkService.removeListener(linkListener);
152 hostService.removeListener(hostListener);
153 intentService.removeListener(intentListener);
154 flowService.removeListener(flowRuleListener);
155
156 cache.clear();
157 cache = null;
158
159 log.info("Stopped");
160 }
161
162
Simon Huntf679c4e2016-04-01 17:02:24 -0700163 /**
164 * Registers a UI topology session with the topology model.
165 *
166 * @param session the session to register
167 */
168 public void register(UiTopoSession session) {
169 log.info("Registering topology session {}", session);
Simon Huntcda9c032016-04-11 10:32:54 -0700170 addListener(session);
Simon Hunted804d52016-03-30 09:51:40 -0700171 }
172
Simon Huntf679c4e2016-04-01 17:02:24 -0700173 /**
174 * Unregisters a UI topology session from the topology model.
175 *
176 * @param session the session to unregister
177 */
178 public void unregister(UiTopoSession session) {
179 log.info("Unregistering topology session {}", session);
Simon Huntcda9c032016-04-11 10:32:54 -0700180 removeListener(session);
Simon Huntf679c4e2016-04-01 17:02:24 -0700181 }
182
Simon Hunt7092cc42016-04-06 18:40:17 -0700183
Simon Huntcda9c032016-04-11 10:32:54 -0700184 private class InternalClusterListener implements ClusterEventListener {
185 @Override
186 public void event(ClusterEvent event) {
Simon Hunt23fb1352016-04-11 12:15:19 -0700187 ControllerNode cnode = event.subject();
188
189 switch (event.type()) {
190
191 case INSTANCE_ADDED:
192 case INSTANCE_ACTIVATED:
193 case INSTANCE_READY:
194 case INSTANCE_DEACTIVATED:
195 cache.addOrUpdateClusterMember(cnode);
196 break;
197
198 case INSTANCE_REMOVED:
199 cache.removeClusterMember(cnode);
200 break;
201
202 default:
203 break;
204 }
Simon Hunt7092cc42016-04-06 18:40:17 -0700205 }
Simon Huntcda9c032016-04-11 10:32:54 -0700206 }
Simon Hunt7092cc42016-04-06 18:40:17 -0700207
Simon Huntcda9c032016-04-11 10:32:54 -0700208 private class InternalMastershipListener implements MastershipListener {
209 @Override
210 public void event(MastershipEvent event) {
Simon Hunt23fb1352016-04-11 12:15:19 -0700211 DeviceId deviceId = event.subject();
212 RoleInfo roleInfo = event.roleInfo();
213
214 switch (event.type()) {
215 case MASTER_CHANGED:
216 case BACKUPS_CHANGED:
217 cache.updateMasterships(deviceId, roleInfo);
218 break;
219
220 default:
221 break;
222 }
Simon Hunt7092cc42016-04-06 18:40:17 -0700223 }
Simon Huntcda9c032016-04-11 10:32:54 -0700224 }
Simon Hunt7092cc42016-04-06 18:40:17 -0700225
Simon Huntcda9c032016-04-11 10:32:54 -0700226 private class InternalRegionListener implements RegionListener {
227 @Override
228 public void event(RegionEvent event) {
Simon Hunt23fb1352016-04-11 12:15:19 -0700229 Region region = event.subject();
230
231 switch (event.type()) {
232
233 case REGION_ADDED:
234 case REGION_UPDATED:
235 case REGION_MEMBERSHIP_CHANGED:
236 cache.addOrUpdateRegion(region);
237 break;
238
239 case REGION_REMOVED:
240 cache.removeRegion(region);
241 break;
242
243 default:
244 break;
245 }
Simon Hunt7092cc42016-04-06 18:40:17 -0700246 }
Simon Huntcda9c032016-04-11 10:32:54 -0700247 }
Simon Hunt7092cc42016-04-06 18:40:17 -0700248
Simon Huntcda9c032016-04-11 10:32:54 -0700249 private class InternalDeviceListener implements DeviceListener {
250 @Override
251 public void event(DeviceEvent event) {
Simon Huntcda9c032016-04-11 10:32:54 -0700252 Device device = event.subject();
Simon Hunt7092cc42016-04-06 18:40:17 -0700253
Simon Huntcda9c032016-04-11 10:32:54 -0700254 switch (event.type()) {
Simon Hunt7092cc42016-04-06 18:40:17 -0700255
Simon Huntcda9c032016-04-11 10:32:54 -0700256 case DEVICE_ADDED:
257 case DEVICE_UPDATED:
258 case DEVICE_AVAILABILITY_CHANGED:
259 case DEVICE_SUSPENDED:
260 cache.addOrUpdateDevice(device);
261 break;
Simon Hunt7092cc42016-04-06 18:40:17 -0700262
Simon Huntcda9c032016-04-11 10:32:54 -0700263 case DEVICE_REMOVED:
264 cache.removeDevice(device);
265 break;
Simon Hunt7092cc42016-04-06 18:40:17 -0700266
Simon Huntcda9c032016-04-11 10:32:54 -0700267 default:
268 break;
Simon Hunt7092cc42016-04-06 18:40:17 -0700269 }
270 }
271 }
272
Simon Huntcda9c032016-04-11 10:32:54 -0700273 private class InternalLinkListener implements LinkListener {
274 @Override
275 public void event(LinkEvent event) {
Simon Hunt23fb1352016-04-11 12:15:19 -0700276 Link link = event.subject();
277
278 switch (event.type()) {
279
280 case LINK_ADDED:
281 case LINK_UPDATED:
282 cache.addOrUpdateLink(link);
283 break;
284
285 case LINK_REMOVED:
286 cache.removeLink(link);
287 break;
288
289 default:
290 break;
291 }
Simon Huntcda9c032016-04-11 10:32:54 -0700292 }
Simon Hunted804d52016-03-30 09:51:40 -0700293 }
294
Simon Huntcda9c032016-04-11 10:32:54 -0700295 private class InternalHostListener implements HostListener {
296 @Override
297 public void event(HostEvent event) {
Simon Hunt23fb1352016-04-11 12:15:19 -0700298 Host host = event.subject();
299 Host prevHost = event.prevSubject();
300
301 switch (event.type()) {
302
303 case HOST_ADDED:
304 case HOST_UPDATED:
305 cache.addOrUpdateHost(host);
306 break;
307
308 case HOST_MOVED:
309 cache.moveHost(host, prevHost);
310 break;
311
312 case HOST_REMOVED:
313 cache.removeHost(host);
314 break;
315
316 default:
317 break;
318 }
Simon Huntcda9c032016-04-11 10:32:54 -0700319 }
Simon Hunted804d52016-03-30 09:51:40 -0700320 }
Simon Huntcda9c032016-04-11 10:32:54 -0700321
Simon Hunt23fb1352016-04-11 12:15:19 -0700322 // =======================================================================
323 // NOTE: Neither intents nor flows are modeled by the UiTopology.
324 // Rather, they are serviced directly from this class.
325 // Additionally, since we are only retrieving counts (in the current
326 // implementation), we'll fetch them on demand from the service.
327 // Thus, the following internal listeners are stubs only (for now).
328 // =======================================================================
329
Simon Huntcda9c032016-04-11 10:32:54 -0700330 private class InternalIntentListener implements IntentListener {
331 @Override
332 public void event(IntentEvent event) {
Simon Hunt23fb1352016-04-11 12:15:19 -0700333 // do nothing (for now)
Simon Huntcda9c032016-04-11 10:32:54 -0700334 }
335 }
336
337 private class InternalFlowRuleListener implements FlowRuleListener {
338 @Override
339 public void event(FlowRuleEvent event) {
Simon Hunt23fb1352016-04-11 12:15:19 -0700340 // do nothing (for now)
Simon Huntcda9c032016-04-11 10:32:54 -0700341 }
342 }
343
Simon Hunted804d52016-03-30 09:51:40 -0700344}