Srikanth Vavilapalli
Committed by Gerrit Code Review

Segment Routing ONS demo:Traffic visualization fixes

Change-Id: Ib4960a0fe4666b8027614c8dd04df7883746b9b9
......@@ -80,11 +80,20 @@ public class PortStatisticsManager implements PortStatisticsService {
long now = System.currentTimeMillis();
if (c != null && p != null && (now - c.time < STALE_LIMIT)) {
if ((c.time > p.time + SECOND) &&
(c.stats.bytesSent() >= p.stats.bytesSent())) {
return new DefaultLoad(c.stats.bytesSent(), p.stats.bytesSent(),
if (c.time > p.time + SECOND) {
//Use max of either Tx or Rx load as the total load of a port
Load load = null;
if (c.stats.bytesSent() >= p.stats.bytesSent()) {
load = new DefaultLoad(c.stats.bytesSent(), p.stats.bytesSent(),
(int) (c.time - p.time) / SECOND);
}
if (c.stats.bytesReceived() >= p.stats.bytesReceived()) {
Load rcvLoad = new DefaultLoad(c.stats.bytesReceived(), p.stats.bytesReceived(),
(int) (c.time - p.time) / SECOND);
load = ((load == null) || (rcvLoad.rate() > load.rate())) ? rcvLoad : load;
}
return load;
}
}
return null;
}
......
......@@ -10,13 +10,15 @@
{ "uri": "of:00010001e88b27e3", "mac": "0001e88b27e3", "annotations": { "name": "s108", "latitude": 41.996877, "longitude": -84.169273 }}
],
"hosts": [
{ "id": "00:1f:29:e1:2c:36/-1", "mac": "00:1f:29:e1:2c:36", "vlan": -1, "location": "of:00010001e88b9368/46", "ip": "10.200.1.11", "annotations": { "name": "h1", "latitude": 34.384830, "longitude": -104.019262 }},
{ "id": "00:1e:0b:cb:9d:64/-1", "mac": "00:1e:0b:cb:9d:64", "vlan": -1, "location": "of:00010001e88b9368/45", "ip": "10.200.1.12", "annotations": { "name": "h2", "latitude": 34.384830, "longitude": -104.019262 }},
{ "id": "00:1c:c4:6b:d8:12/-1", "mac": "00:1c:c4:6b:d8:12", "vlan": -1, "location": "of:00010001e88b939b/46", "ip": "10.200.2.21", "annotations": { "name": "h3", "latitude": 34.133376, "longitude": -89.442032 }},
{ "id": "00:1e:0b:ca:90:44/-1", "mac": "00:1e:0b:ca:90:44", "vlan": -1, "location": "of:00010001e88b939b/45", "ip": "10.200.2.22", "annotations": { "name": "h4", "latitude": 34.133376, "longitude": -89.442032 }},
{ "id": "00:1e:0b:ca:e5:1a/-1", "mac": "00:1e:0b:ca:e5:1a", "vlan": -1, "location": "of:00010001e88b938c/46", "ip": "10.200.3.31", "annotations": { "name": "h5", "latitude": 34.166625, "longitude": -91.983293 }},
{ "id": "52:1C:5E:A5:8C:E0/-1", "mac": "52:1C:5E:A5:8C:E0", "vlan": -1, "location": "of:00010001e88b938c/45", "ip": "10.200.3.32", "annotations": { "name": "h6", "latitude": 34.166625, "longitude": -91.983293 }},
{ "id": "00:1e:0b:cb:3f:ac/-1", "mac": "00:1e:0b:cb:3f:ac", "vlan": -1, "location": "of:00010001e88b93ad/46", "ip": "10.200.4.41", "annotations": { "name": "h7", "latitude": 34.225065, "longitude": -97.492882 }},
{ "id": "EA:11:0C:F7:49:D8/-1", "mac": "EA:11:0C:F7:49:D8", "vlan": -1, "location": "of:00010001e88b93ad/45", "ip": "10.200.4.42", "annotations": { "name": "h8", "latitude": 34.249236, "longitude": -84.253025 }}
{ "id": "00:1f:29:e1:2c:36/-1", "mac": "00:1f:29:e1:2c:36", "vlan": -1, "location": "of:00010001e88b9368/46", "ip": "10.200.1.11", "annotations": { "name": "h11", "latitude": 34.384830, "longitude": -104.019262 }},
{ "id": "00:1e:0b:cb:9d:64/-1", "mac": "00:1e:0b:cb:9d:64", "vlan": -1, "location": "of:00010001e88b9368/45", "ip": "10.200.1.12", "annotations": { "name": "h12", "latitude": 34.384830, "longitude": -104.019262 }},
{ "id": "00:1c:c4:6b:d8:12/-1", "mac": "00:1c:c4:6b:d8:12", "vlan": -1, "location": "of:00010001e88b939b/46", "ip": "10.200.2.21", "annotations": { "name": "h21", "latitude": 34.133376, "longitude": -89.442032 }},
{ "id": "00:1e:0b:ca:90:44/-1", "mac": "00:1e:0b:ca:90:44", "vlan": -1, "location": "of:00010001e88b939b/45", "ip": "10.200.2.22", "annotations": { "name": "h22", "latitude": 34.133376, "longitude": -89.442032 }},
{ "id": "00:1e:0b:ca:e5:1a/-1", "mac": "00:1e:0b:ca:e5:1a", "vlan": -1, "location": "of:00010001e88b938c/46", "ip": "10.200.3.31", "annotations": { "name": "h31", "latitude": 34.166625, "longitude": -91.983293 }},
{ "id": "2c:44:fd:e0:90:40/-1", "mac": "2c:44:fd:e0:90:40", "vlan": -1, "location": "of:00010001e88b938c/45", "ip": "10.200.3.32", "annotations": { "name": "h32", "latitude": 34.166625, "longitude": -91.983293 }},
{ "id": "2c:44:fd:e0:90:44/-1", "mac": "2c:44:fd:e0:90:44", "vlan": -1, "location": "of:00010001e88b938c/47", "ip": "10.200.3.33", "annotations": { "name": "h33", "latitude": 34.166625, "longitude": -91.983293 }},
{ "id": "00:1e:0b:cb:3f:ac/-1", "mac": "00:1e:0b:cb:3f:ac", "vlan": -1, "location": "of:00010001e88b93ad/46", "ip": "10.200.4.41", "annotations": { "name": "h41", "latitude": 34.225065, "longitude": -97.492882 }},
{ "id": "c8:1f:66:e2:9b:d0/-1", "mac": "c8:1f:66:e2:9b:d0", "vlan": -1, "location": "of:00010001e88b93ad/45", "ip": "10.200.4.42", "annotations": { "name": "h42", "latitude": 34.249236, "longitude": -84.253025 }},
{ "id": "c8:1f:66:e2:9b:d2/-1", "mac": "c8:1f:66:e2:9b:d2", "vlan": -1, "location": "of:00010001e88b93ad/47", "ip": "10.200.4.43", "annotations": { "name": "h43", "latitude": 34.249236, "longitude": -84.253025 }}
]
}
......
......@@ -117,17 +117,20 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler {
new ProviderId("core", "org.onosproject.core", true);
private static final String COMPACT = "%s/%s-%s/%s";
private static final double KB = 1024;
private static final double MB = 1024 * KB;
private static final double GB = 1024 * MB;
// TODO: change GB to Gb (when we compute bits/second)
private static final String GB_UNIT = "GB";
private static final String MB_UNIT = "MB";
private static final String KB_UNIT = "KB";
private static final String B_UNIT = "B";
private static final double BPS_THRESHOLD = 4 * KB;
private static final double KILO = 1024;
private static final double MEGA = 1024 * KILO;
private static final double GIGA = 1024 * MEGA;
private static final String GBITS_UNIT = "Gb";
private static final String MBITS_UNIT = "Mb";
private static final String KBITS_UNIT = "Kb";
private static final String BITS_UNIT = "b";
private static final String GBYTES_UNIT = "GB";
private static final String MBYTES_UNIT = "MB";
private static final String KBYTES_UNIT = "KB";
private static final String BYTES_UNIT = "B";
//4 Kilo Bytes as threshold
private static final double BPS_THRESHOLD = 4 * KILO;
protected ServiceDirectory directory;
protected ClusterService clusterService;
......@@ -576,13 +579,17 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler {
link.addLoad(getLinkLoad(link.one));
link.addLoad(bi ? getLinkLoad(link.two) : null);
} else if (type == PORT) {
link.addLoad(portStatsService.load(link.one.src()), BPS_THRESHOLD);
link.addLoad(portStatsService.load(link.one.dst()), BPS_THRESHOLD);
//For a bi-directional traffic links, use
//the max link rate of either direction
link.addLoad(portStatsService.load(link.one.src()),
BPS_THRESHOLD,
portStatsService.load(link.one.dst()),
BPS_THRESHOLD);
}
if (link.hasTraffic) {
linksNodeT.add(compactLinkString(link.one));
labelsT.add(type == PORT ?
formatBytes(link.rate) + "ps" :
formatBitRate(link.rate) + "ps" :
formatBytes(link.bytes));
} else {
linksNodeN.add(compactLinkString(link.one));
......@@ -745,21 +752,43 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler {
// Poor-mans formatting to get the labels with byte counts looking nice.
private String formatBytes(long bytes) {
// TODO: multiply everything by 8 to compute bits/second
String unit;
double value;
if (bytes > GB) {
value = bytes / GB;
unit = GB_UNIT;
} else if (bytes > MB) {
value = bytes / MB;
unit = MB_UNIT;
} else if (bytes > KB) {
value = bytes / KB;
unit = KB_UNIT;
if (bytes > GIGA) {
value = bytes / GIGA;
unit = GBYTES_UNIT;
} else if (bytes > MEGA) {
value = bytes / MEGA;
unit = MBYTES_UNIT;
} else if (bytes > KILO) {
value = bytes / KILO;
unit = KBYTES_UNIT;
} else {
value = bytes;
unit = B_UNIT;
unit = BYTES_UNIT;
}
DecimalFormat format = new DecimalFormat("#,###.##");
return format.format(value) + " " + unit;
}
// Poor-mans formatting to get the labels with byte counts looking nice.
private String formatBitRate(long bytes) {
String unit;
double value;
//Convert to bits
long bits = bytes * 8;
if (bits > GIGA) {
value = bits / GIGA;
unit = GBITS_UNIT;
} else if (bits > MEGA) {
value = bits / MEGA;
unit = MBITS_UNIT;
} else if (bits > KILO) {
value = bits / KILO;
unit = KBITS_UNIT;
} else {
value = bits;
unit = BITS_UNIT;
}
DecimalFormat format = new DecimalFormat("#,###.##");
return format.format(value) + " " + unit;
......@@ -832,6 +861,26 @@ public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler {
}
}
void addLoad(Load srcLinkLoad,
double srcLinkThreshold,
Load dstLinkLoad,
double dstLinkThreshold) {
//use the max of link load at source or destination
if (srcLinkLoad != null) {
this.hasTraffic = hasTraffic || srcLinkLoad.rate() > srcLinkThreshold;
this.bytes = srcLinkLoad.latest();
this.rate = srcLinkLoad.rate();
}
if (dstLinkLoad != null) {
if (dstLinkLoad.rate() > this.rate) {
this.bytes = dstLinkLoad.latest();
this.rate = dstLinkLoad.rate();
this.hasTraffic = hasTraffic || dstLinkLoad.rate() > dstLinkThreshold;
}
}
}
void addClass(String trafficClass) {
classes.add(trafficClass);
}
......
......@@ -462,40 +462,40 @@ html[data-platform='iPad'] #topo-p-detail {
stroke: rgba(121,231,158,0.5);
}
/* Port traffic color visualization for KBps, MBps, and GBps */
/* Port traffic color visualization for Kbps, Mbps, and Gbps */
.light #ov-topo svg .link.secondary.port-traffic-KBps {
.light #ov-topo svg .link.secondary.port-traffic-Kbps {
stroke: rgb(0,153,51);
stroke-width: 5.0;
}
.dark #ov-topo svg .link.secondary.port-traffic-KBps {
.dark #ov-topo svg .link.secondary.port-traffic-Kbps {
stroke: rgb(98, 153, 118);
stroke-width: 5.0;
}
.light #ov-topo svg .link.secondary.port-traffic-MBps {
.light #ov-topo svg .link.secondary.port-traffic-Mbps {
stroke: rgb(128,145,27);
stroke-width: 6.5;
}
.dark #ov-topo svg .link.secondary.port-traffic-MBps {
.dark #ov-topo svg .link.secondary.port-traffic-Mbps {
stroke: rgb(91, 109, 54);
stroke-width: 6.5;
}
.light #ov-topo svg .link.secondary.port-traffic-GBps {
.light #ov-topo svg .link.secondary.port-traffic-Gbps {
stroke: rgb(255, 137, 3);
stroke-width: 8.0;
}
.dark #ov-topo svg .link.secondary.port-traffic-GBps {
.dark #ov-topo svg .link.secondary.port-traffic-Gbps {
stroke: rgb(174, 119, 55);
stroke-width: 8.0;
}
.light #ov-topo svg .link.secondary.port-traffic-GBps-choked {
.light #ov-topo svg .link.secondary.port-traffic-Gbps-choked {
stroke: rgb(183, 30, 21);
stroke-width: 8.0;
}
.dark #ov-topo svg .link.secondary.port-traffic-GBps-choked {
.dark #ov-topo svg .link.secondary.port-traffic-Gbps-choked {
stroke: rgb(127, 40, 39);
stroke-width: 8.0;
}
......
......@@ -69,8 +69,7 @@
ldata.el.classed(p.class, true);
ldata.label = lab;
// TODO: change this to 'bps' when we measure bits/sec
if (fs.endsWith(lab, 'Bps')) {
if (fs.endsWith(lab, 'bps')) {
// inject additional styling for port-based traffic
units = lab.substring(lab.length-4);
portcls = 'port-traffic-' + units;
......
......@@ -46,7 +46,7 @@
{ "id": "rack", "pos":[800,600], "class":"blue1" }
],
"labels": [
{ "pos":[550,80], "text":"Segment Routing Demo", "class":"blue1", "size":1.4 }
{ "pos":[550,80], "text":"", "class":"blue1", "size":1.4 }
]
}
}
......