Simon Hunt
Committed by Gerrit Code Review

Implement navigate-to-region (topo2navRegion) event; update scaffolding view (topoX) to exercise.

Change-Id: Ib342f791854664b31bd1724a446008c960231784
...@@ -94,6 +94,26 @@ public class Topo2ViewMessageHandler extends UiMessageHandler { ...@@ -94,6 +94,26 @@ public class Topo2ViewMessageHandler extends UiMessageHandler {
94 // ================================================================== 94 // ==================================================================
95 95
96 96
97 + private ObjectNode mkLayoutMessage(UiTopoLayout currentLayout) {
98 + List<UiTopoLayout> crumbs = topoSession.breadCrumbs();
99 + return t2json.layout(currentLayout, crumbs);
100 + }
101 +
102 + private ObjectNode mkRegionMessage(UiTopoLayout currentLayout) {
103 + UiRegion region = topoSession.getRegion(currentLayout);
104 + Set<UiRegion> kids = topoSession.getSubRegions(currentLayout);
105 + List<UiSynthLink> links = topoSession.getLinks(currentLayout);
106 + return t2json.region(region, kids, links);
107 + }
108 +
109 + private ObjectNode mkPeersMessage(UiTopoLayout currentLayout) {
110 + Set<UiNode> peers = topoSession.getPeerNodes(currentLayout);
111 + ObjectNode peersPayload = objectNode();
112 + peersPayload.set("peers", t2json.closedNodes(peers));
113 + return peersPayload;
114 + }
115 +
116 +
97 private final class Topo2Start extends RequestHandler { 117 private final class Topo2Start extends RequestHandler {
98 private Topo2Start() { 118 private Topo2Start() {
99 super(START); 119 super(START);
...@@ -112,34 +132,26 @@ public class Topo2ViewMessageHandler extends UiMessageHandler { ...@@ -112,34 +132,26 @@ public class Topo2ViewMessageHandler extends UiMessageHandler {
112 // correctly 132 // correctly
113 topoSession.refreshModel(); 133 topoSession.refreshModel();
114 134
115 - // this is the list of ONOS cluster members 135 + // start with the list of ONOS cluster members
116 List<UiClusterMember> instances = topoSession.getAllInstances(); 136 List<UiClusterMember> instances = topoSession.getAllInstances();
117 sendMessage(ALL_INSTANCES, t2json.instances(instances)); 137 sendMessage(ALL_INSTANCES, t2json.instances(instances));
118 138
139 +
140 + // Send layout, region, peers data...
141 +
119 // this is the layout that the user has chosen to display 142 // this is the layout that the user has chosen to display
120 UiTopoLayout currentLayout = topoSession.currentLayout(); 143 UiTopoLayout currentLayout = topoSession.currentLayout();
121 - List<UiTopoLayout> crumbs = topoSession.breadCrumbs(); 144 + sendMessage(CURRENT_LAYOUT, mkLayoutMessage(currentLayout));
122 - sendMessage(CURRENT_LAYOUT, t2json.layout(currentLayout, crumbs));
123 145
124 // this is the region that is associated with the current layout 146 // this is the region that is associated with the current layout
125 // this message includes details of the sub-regions, devices, 147 // this message includes details of the sub-regions, devices,
126 // hosts, and links within the region 148 // hosts, and links within the region
127 // (as well as layer-order hints) 149 // (as well as layer-order hints)
128 - UiRegion region = topoSession.getRegion(currentLayout); 150 + sendMessage(CURRENT_REGION, mkRegionMessage(currentLayout));
129 - Set<UiRegion> kids = topoSession.getSubRegions(currentLayout);
130 - List<UiSynthLink> links = topoSession.getLinks(currentLayout);
131 - sendMessage(CURRENT_REGION, t2json.region(region, kids, links));
132 151
133 // these are the regions/devices that are siblings to this region 152 // these are the regions/devices that are siblings to this region
134 - Set<UiNode> peers = topoSession.getPeerNodes(currentLayout); 153 + sendMessage(PEER_REGIONS, mkPeersMessage(currentLayout));
135 - ObjectNode peersPayload = objectNode();
136 - peersPayload.set("peers", t2json.closedNodes(peers));
137 - sendMessage(PEER_REGIONS, peersPayload);
138 -
139 - // finally, tell the UI that we are done : TODO review / delete??
140 - sendMessage(TOPO_START_DONE, null);
141 } 154 }
142 -
143 } 155 }
144 156
145 private final class Topo2NavRegion extends RequestHandler { 157 private final class Topo2NavRegion extends RequestHandler {
...@@ -149,9 +161,19 @@ public class Topo2ViewMessageHandler extends UiMessageHandler { ...@@ -149,9 +161,19 @@ public class Topo2ViewMessageHandler extends UiMessageHandler {
149 161
150 @Override 162 @Override
151 public void process(long sid, ObjectNode payload) { 163 public void process(long sid, ObjectNode payload) {
152 - String dir = string(payload, "dir");
153 String rid = string(payload, "rid"); 164 String rid = string(payload, "rid");
154 - log.debug("NavRegion: dir={}, rid={}", dir, rid); 165 + log.debug("topo2navRegion: rid={}", rid);
166 +
167 + // NOTE: we are NOT re-issuing information about the cluster nodes
168 +
169 + // switch to the selected region...
170 + topoSession.navToRegion(rid);
171 +
172 + // re-send layout, region, peers data...
173 + UiTopoLayout currentLayout = topoSession.currentLayout();
174 + sendMessage(CURRENT_LAYOUT, mkLayoutMessage(currentLayout));
175 + sendMessage(CURRENT_REGION, mkRegionMessage(currentLayout));
176 + sendMessage(PEER_REGIONS, mkPeersMessage(currentLayout));
155 } 177 }
156 } 178 }
157 179
......
...@@ -250,4 +250,18 @@ public class UiTopoSession implements UiModelListener { ...@@ -250,4 +250,18 @@ public class UiTopoSession implements UiModelListener {
250 public void refreshModel() { 250 public void refreshModel() {
251 sharedModel.refresh(); 251 sharedModel.refresh();
252 } 252 }
253 +
254 + /**
255 + * Navigates to the specified region by setting the associated layout as
256 + * current.
257 + *
258 + * @param regionId region identifier
259 + */
260 + public void navToRegion(String regionId) {
261 + // 1. find the layout corresponding to the region ID
262 + // 2. set this layout to be "current"
263 + RegionId r = RegionId.regionId(regionId);
264 + UiTopoLayout layout = layoutService.getLayout(r);
265 + setCurrentLayout(layout);
266 + }
253 } 267 }
......
...@@ -27,18 +27,23 @@ ...@@ -27,18 +27,23 @@
27 } 27 }
28 28
29 #topoXtmp { 29 #topoXtmp {
30 - height: 600px; 30 + height: 700px;
31 width: 98%; 31 width: 98%;
32 overflow-y: scroll; 32 overflow-y: scroll;
33 } 33 }
34 34
35 #topoXtmp div { 35 #topoXtmp div {
36 - padding: 8px 24px; 36 + padding: 2px 24px;
37 - margin: 8px; 37 + margin: 6px;
38 background-color: #ddddff; 38 background-color: #ddddff;
39 } 39 }
40 #topoXtmp div div { 40 #topoXtmp div div {
41 - padding: 4px 10px; 41 + padding: 0 10px;
42 +}
43 +#topoXtmp div div span {
44 + color: purple;
45 + font-style: italic;
46 + font-weight: bold;
42 } 47 }
43 48
44 #topoXtmp h4 { 49 #topoXtmp h4 {
...@@ -54,4 +59,9 @@ ...@@ -54,4 +59,9 @@
54 font-weight: bold; 59 font-weight: bold;
55 text-decoration: underline; 60 text-decoration: underline;
56 cursor: pointer; 61 cursor: pointer;
62 + color: blue;
63 +}
64 +
65 +.subRegions div p {
66 + width: 40px;
57 } 67 }
......
...@@ -17,11 +17,33 @@ ...@@ -17,11 +17,33 @@
17 <!-- Topology View partial HTML --> 17 <!-- Topology View partial HTML -->
18 <div id="ov-topoX"> 18 <div id="ov-topoX">
19 <div id="topoXtmp"> 19 <div id="topoXtmp">
20 - <div class="parentRegion"> 20 + <div class="instances">
21 - Parent Region: <span> - </span> 21 + <h4>Instances</h4>
22 + <div></div>
23 + </div>
24 + <div class="layoutData">
25 +
26 + <h4>Layout Data</h4>
27 +
28 + <div class="l_id">
29 + Layout ID: <span> - </span>
30 + </div>
31 + <div class="l_parent">
32 + Layout Parent: <span> - </span>
33 + </div>
34 + <div class="l_region">
35 + Region ID: <span> - </span>
36 + </div>
37 + <div class="l_regionName">
38 + Region Name: <span> - </span>
39 + </div>
40 + <div class="l_crumbs">
41 + Breadcrumbs: <span> </span>
42 + </div>
43 +
22 </div> 44 </div>
23 <div class="thisRegion"> 45 <div class="thisRegion">
24 - This Region: <span> - </span> 46 + <b>This Region ID:</b> <span></span>
25 </div> 47 </div>
26 <div class="subRegions"> 48 <div class="subRegions">
27 <h4>Subregions</h4> 49 <h4>Subregions</h4>
......
...@@ -25,9 +25,13 @@ ...@@ -25,9 +25,13 @@
25 // injected refs 25 // injected refs
26 var $log, wss; 26 var $log, wss;
27 27
28 + // selected DOM refs
29 + var topdiv;
30 +
28 // ========================== Helper Functions 31 // ========================== Helper Functions
29 32
30 function init() { 33 function init() {
34 + topdiv = d3.select('#topoXtmp');
31 $log.debug('Initialize topo force layout'); 35 $log.debug('Initialize topo force layout');
32 } 36 }
33 37
...@@ -35,44 +39,82 @@ ...@@ -35,44 +39,82 @@
35 $log.debug('Destroy topo force layout'); 39 $log.debug('Destroy topo force layout');
36 } 40 }
37 41
38 - // ========================== Temporary Code (to be deleted later) 42 + function rmP(div) {
43 + div.selectAll('p').remove();
44 + }
39 45
40 - function request(dir, rid) { 46 + function navRequest(rid) {
41 wss.sendEvent('topo2navRegion', { 47 wss.sendEvent('topo2navRegion', {
42 - dir: dir,
43 rid: rid 48 rid: rid
44 }); 49 });
45 } 50 }
46 51
52 + function doTmpInstances(data) {
53 + var idiv = topdiv.select('.instances').select('div');
54 + data.members.forEach(function (m) {
55 + idiv.append('div').text(m.id);
56 + });
57 + }
58 +
47 function doTmpCurrentLayout(data) { 59 function doTmpCurrentLayout(data) {
48 - var topdiv = d3.select('#topoXtmp'); 60 + var ldDiv = topdiv.select('.layoutData'),
49 - var parentRegion = data.parent; 61 + bcs = ldDiv.select('.l_crumbs');
50 - var span = topdiv.select('.parentRegion').select('span'); 62 +
51 - span.text(parentRegion || '[no parent]'); 63 + function setSpan(v, val) {
52 - span.classed('nav-me', !!parentRegion); 64 + var cls = '.l_' + v,
65 + span = ldDiv.select(cls).select('span'),
66 + value = val || data[v];
67 + span.html(value);
68 + }
69 +
70 + setSpan('id');
71 + setSpan('parent');
72 + setSpan('region');
73 + setSpan('regionName');
74 +
75 + addCrumbNav(bcs, data.crumbs, data.region);
76 + }
77 +
78 + function addCrumbNav(span, array, id) {
79 + var rev = [];
80 +
81 + span.selectAll('span').remove();
82 +
83 + array.forEach(function (a) {
84 + rev.unshift(a.id);
85 + });
86 +
87 + rev.forEach(function (rid, idx) {
88 + if (idx) {
89 + span.append('span').text(' +++ ');
90 + }
91 + if (rid != id) {
92 + addNavigable(span, 'span', rid);
93 + } else {
94 + span.append('span').text(rid);
95 + }
96 + });
97 + }
98 +
99 + function addNavigable(span, what, rid) {
100 + span.append(what).classed('nav-me', true)
101 + .text(rid)
102 + .on('click', function () { navRequest(rid); });
53 } 103 }
54 104
55 function doTmpCurrentRegion(data) { 105 function doTmpCurrentRegion(data) {
56 - var topdiv = d3.select('#topoXtmp');
57 var span = topdiv.select('.thisRegion').select('span'); 106 var span = topdiv.select('.thisRegion').select('span');
58 var div; 107 var div;
59 -
60 span.text(data.id); 108 span.text(data.id);
61 109
62 div = topdiv.select('.subRegions').select('div'); 110 div = topdiv.select('.subRegions').select('div');
111 + rmP(div);
63 data.subregions.forEach(function (r) { 112 data.subregions.forEach(function (r) {
64 - 113 + addNavigable(div, 'p', r.id);
65 - function nav() {
66 - request('down', r.id);
67 - }
68 -
69 - div.append('p')
70 - .classed('nav-me', true)
71 - .text(r.id)
72 - .on('click', nav);
73 }); 114 });
74 115
75 div = topdiv.select('.devices').select('div'); 116 div = topdiv.select('.devices').select('div');
117 + rmP(div);
76 data.layerOrder.forEach(function (tag, idx) { 118 data.layerOrder.forEach(function (tag, idx) {
77 var devs = data.devices[idx]; 119 var devs = data.devices[idx];
78 devs.forEach(function (d) { 120 devs.forEach(function (d) {
...@@ -83,6 +125,7 @@ ...@@ -83,6 +125,7 @@
83 }); 125 });
84 126
85 div = topdiv.select('.hosts').select('div'); 127 div = topdiv.select('.hosts').select('div');
128 + rmP(div);
86 data.layerOrder.forEach(function (tag, idx) { 129 data.layerOrder.forEach(function (tag, idx) {
87 var hosts = data.hosts[idx]; 130 var hosts = data.hosts[idx];
88 hosts.forEach(function (h) { 131 hosts.forEach(function (h) {
...@@ -92,8 +135,8 @@ ...@@ -92,8 +135,8 @@
92 }); 135 });
93 136
94 div = topdiv.select('.links').select('div'); 137 div = topdiv.select('.links').select('div');
95 - var links = data.links; 138 + rmP(div);
96 - links.forEach(function (lnk) { 139 + data.links.forEach(function (lnk) {
97 div.append('p') 140 div.append('p')
98 .text(lnk.id); 141 .text(lnk.id);
99 }); 142 });
...@@ -106,26 +149,27 @@ ...@@ -106,26 +149,27 @@
106 // ========================== Event Handlers 149 // ========================== Event Handlers
107 150
108 function allInstances(data) { 151 function allInstances(data) {
109 - $log.debug('>> topo2AllInstances event:', data) 152 + $log.debug('>> topo2AllInstances event:', data);
110 - doTmpCurrentLayout(data); 153 + doTmpInstances(data);
111 } 154 }
112 155
113 function currentLayout(data) { 156 function currentLayout(data) {
114 - $log.debug('>> topo2CurrentLayout event:', data) 157 + $log.debug('>> topo2CurrentLayout event:', data);
158 + doTmpCurrentLayout(data);
115 } 159 }
116 160
117 function currentRegion(data) { 161 function currentRegion(data) {
118 - $log.debug('>> topo2CurrentRegion event:', data) 162 + $log.debug('>> topo2CurrentRegion event:', data);
119 doTmpCurrentRegion(data); 163 doTmpCurrentRegion(data);
120 } 164 }
121 165
122 function peerRegions(data) { 166 function peerRegions(data) {
123 - $log.debug('>> topo2PeerRegions event:', data) 167 + $log.debug('>> topo2PeerRegions event:', data);
124 doTmpPeerRegions(data); 168 doTmpPeerRegions(data);
125 } 169 }
126 170
127 function startDone(data) { 171 function startDone(data) {
128 - $log.debug('>> topo2StartDone event:', data) 172 + $log.debug('>> topo2StartDone event:', data);
129 } 173 }
130 174
131 // ========================== Main Service Definition 175 // ========================== Main Service Definition
......