blob: 0688f45d2c33b26495ef9a0ccfdfe88701ae69f4 [file] [log] [blame]
Simon Hunted804d52016-03-30 09:51:40 -07001/*
2 * Copyright 2016 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 */
16
17package org.onosproject.ui.impl.topo.model;
18
Simon Hunt7092cc42016-04-06 18:40:17 -070019import org.onlab.osgi.DefaultServiceDirectory;
20import org.onlab.osgi.ServiceDirectory;
21import org.onosproject.cluster.ClusterEvent;
22import org.onosproject.cluster.ClusterEventListener;
23import org.onosproject.cluster.ClusterService;
24import org.onosproject.incubator.net.PortStatisticsService;
25import org.onosproject.incubator.net.tunnel.TunnelService;
26import org.onosproject.mastership.MastershipEvent;
27import org.onosproject.mastership.MastershipListener;
28import org.onosproject.mastership.MastershipService;
29import org.onosproject.net.device.DeviceEvent;
30import org.onosproject.net.device.DeviceListener;
31import org.onosproject.net.device.DeviceService;
32import org.onosproject.net.flow.FlowRuleEvent;
33import org.onosproject.net.flow.FlowRuleListener;
34import org.onosproject.net.flow.FlowRuleService;
35import org.onosproject.net.host.HostEvent;
36import org.onosproject.net.host.HostListener;
37import org.onosproject.net.host.HostService;
38import org.onosproject.net.intent.IntentEvent;
39import org.onosproject.net.intent.IntentListener;
40import org.onosproject.net.intent.IntentService;
41import org.onosproject.net.link.LinkEvent;
42import org.onosproject.net.link.LinkListener;
43import org.onosproject.net.link.LinkService;
44import org.onosproject.net.region.RegionEvent;
45import org.onosproject.net.region.RegionListener;
46import org.onosproject.net.region.RegionService;
47import org.onosproject.net.statistic.StatisticService;
48import org.onosproject.net.topology.TopologyService;
Simon Huntf679c4e2016-04-01 17:02:24 -070049import org.onosproject.ui.impl.topo.UiTopoSession;
Simon Hunted804d52016-03-30 09:51:40 -070050import org.slf4j.Logger;
51import org.slf4j.LoggerFactory;
52
Simon Hunt7092cc42016-04-06 18:40:17 -070053import java.util.HashSet;
54import java.util.Set;
55
Simon Hunted804d52016-03-30 09:51:40 -070056/**
57 * A lazily-initialized Singleton that creates and maintains the UI-model
58 * of the network topology.
59 */
60public final class UiSharedTopologyModel {
61
62 private static final Logger log =
63 LoggerFactory.getLogger(UiSharedTopologyModel.class);
64
Simon Hunt7092cc42016-04-06 18:40:17 -070065 private final ModelEventListener modelEventListener;
66
67 private final Set<UiTopoSession> sessions = new HashSet<>();
Simon Hunted804d52016-03-30 09:51:40 -070068
69 private UiSharedTopologyModel() {
Simon Hunt7092cc42016-04-06 18:40:17 -070070 modelEventListener = new ModelEventListener().init();
71
72 // TODO: build and maintain the state of the model
73 // (1) query model for current state
74 // (2) update state as model events arrive
Simon Hunted804d52016-03-30 09:51:40 -070075 }
76
Simon Huntf679c4e2016-04-01 17:02:24 -070077 /**
78 * Registers a UI topology session with the topology model.
79 *
80 * @param session the session to register
81 */
82 public void register(UiTopoSession session) {
83 log.info("Registering topology session {}", session);
Simon Hunt7092cc42016-04-06 18:40:17 -070084 sessions.add(session);
Simon Hunted804d52016-03-30 09:51:40 -070085 }
86
Simon Huntf679c4e2016-04-01 17:02:24 -070087 /**
88 * Unregisters a UI topology session from the topology model.
89 *
90 * @param session the session to unregister
91 */
92 public void unregister(UiTopoSession session) {
93 log.info("Unregistering topology session {}", session);
Simon Hunt7092cc42016-04-06 18:40:17 -070094 sessions.remove(session);
Simon Huntf679c4e2016-04-01 17:02:24 -070095 }
96
Simon Hunt7092cc42016-04-06 18:40:17 -070097
98 // TODO: notify registered sessions when changes happen to the model
99
100
101 // ----------
102
103 // inner class to encapsulate the model listeners
104 private final class ModelEventListener {
105
106 // TODO: Review - is this good enough? couldn't otherwise see how to inject
107 private final ServiceDirectory directory = new DefaultServiceDirectory();
108
109 private ClusterService clusterService;
110 private MastershipService mastershipService;
111 private RegionService regionService;
112 private DeviceService deviceService;
113 private LinkService linkService;
114 private HostService hostService;
115 private IntentService intentService;
116 private FlowRuleService flowService;
117
118 private StatisticService flowStatsService;
119 private PortStatisticsService portStatsService;
120 private TopologyService topologyService;
121 private TunnelService tunnelService;
122
123 private ModelEventListener init() {
124 clusterService = directory.get(ClusterService.class);
125 mastershipService = directory.get(MastershipService.class);
126 regionService = directory.get(RegionService.class);
127 deviceService = directory.get(DeviceService.class);
128 linkService = directory.get(LinkService.class);
129 hostService = directory.get(HostService.class);
130 intentService = directory.get(IntentService.class);
131 flowService = directory.get(FlowRuleService.class);
132
133 // passive services (?) to whom we are not listening...
134 flowStatsService = directory.get(StatisticService.class);
135 portStatsService = directory.get(PortStatisticsService.class);
136 topologyService = directory.get(TopologyService.class);
137 tunnelService = directory.get(TunnelService.class);
138
139 return this;
140 }
141
142 private class InternalClusterListener implements ClusterEventListener {
143 @Override
144 public void event(ClusterEvent event) {
145 // TODO: handle cluster event
146 // (1) emit cluster member event
147 }
148 }
149
150 private class InternalMastershipListener implements MastershipListener {
151 @Override
152 public void event(MastershipEvent event) {
153 // TODO: handle mastership event
154 // (1) emit cluster member update for all members
155 // (2) emit update device event for he whose mastership changed
156 }
157 }
158
159 private class InternalRegionListener implements RegionListener {
160 @Override
161 public void event(RegionEvent event) {
162 // TODO: handle region event
163 // (1) emit region event
164 }
165 }
166
167 private class InternalDeviceListener implements DeviceListener {
168 @Override
169 public void event(DeviceEvent event) {
170 // TODO: handle device event
171 // (1) emit device event
172 }
173 }
174
175 private class InternalLinkListener implements LinkListener {
176 @Override
177 public void event(LinkEvent event) {
178 // TODO: handle link event
179 // (1) consolidate infrastructure links -> UiLink (?)
180 // (2) emit link event
181 }
182 }
183
184 private class InternalHostListener implements HostListener {
185 @Override
186 public void event(HostEvent event) {
187 // TODO: handle host event
188 // (1) emit host event
189 }
190 }
191
192 private class InternalIntentListener implements IntentListener {
193 @Override
194 public void event(IntentEvent event) {
195 // TODO: handle intent event
196 // (1) update cache of intent counts?
197 }
198 }
199
200 private class InternalFlowRuleListener implements FlowRuleListener {
201 @Override
202 public void event(FlowRuleEvent event) {
203 // TODO: handle flowrule event
204 // (1) update cache of flow counts?
205 }
206 }
207 }
208
209 // ----------
210
Simon Huntf679c4e2016-04-01 17:02:24 -0700211 /**
212 * Bill Pugh Singleton pattern. INSTANCE won't be instantiated until the
213 * LazyHolder class is loaded via a call to the instance() method below.
214 */
215 private static class LazyHolder {
216 private static final UiSharedTopologyModel INSTANCE =
217 new UiSharedTopologyModel();
Simon Hunted804d52016-03-30 09:51:40 -0700218 }
219
220 /**
221 * Returns a reference to the Singleton UI network topology model.
222 *
223 * @return the singleton topology model
224 */
Simon Huntf679c4e2016-04-01 17:02:24 -0700225 public static UiSharedTopologyModel instance() {
226 return LazyHolder.INSTANCE;
Simon Hunted804d52016-03-30 09:51:40 -0700227 }
228}