blob: e578ba800146aa689c6124a07bc13b003a57a0e0 [file] [log] [blame]
Paul Greyson740bdaf2013-03-18 16:10:48 -07001/*global d3*/
2
3function createTopologyView() {
Paul Greyson952ccb62013-03-18 22:22:08 -07004 return d3.select('#svg-container').append('svg:svg').attr('viewBox', '0 0 1000 1000').attr('preserveAspectRatio', 'none').
5 attr('id', 'viewbox').append('svg:g').attr('transform', 'translate(500 500)');
Paul Greyson740bdaf2013-03-18 16:10:48 -07006}
7
Paul Greyson740bdaf2013-03-18 16:10:48 -07008function drawHeader(model) {
9 d3.select('#lastUpdate').text(model.timestamp);
Paul Greyson952ccb62013-03-18 22:22:08 -070010 d3.select('#activeSwitches').text(model.edgeSwitches.length + model.aggregationSwitches.length + model.coreSwitches.length);
11 d3.select('#activeFlows').text(model.flows.length);
12}
13
14function toRadians (angle) {
15 return angle * (Math.PI / 180);
Paul Greyson740bdaf2013-03-18 16:10:48 -070016}
17
18function drawTopology(svg, model) {
19
20 var rings = [{
21 radius: 3,
Paul Greyson23b0cd32013-03-18 23:45:48 -070022 width: 4,
Paul Greyson952ccb62013-03-18 22:22:08 -070023 switches: model.edgeSwitches,
24 className: 'edge'
Paul Greyson740bdaf2013-03-18 16:10:48 -070025 }, {
26 radius: 1.5,
27 width: 32,
Paul Greyson952ccb62013-03-18 22:22:08 -070028 switches: model.aggregationSwitches,
29 className: 'aggregation'
Paul Greyson740bdaf2013-03-18 16:10:48 -070030 }, {
31 radius: 1,
32 width: 32,
Paul Greyson952ccb62013-03-18 22:22:08 -070033 switches: model.coreSwitches,
34 className: 'core'
Paul Greyson740bdaf2013-03-18 16:10:48 -070035 }];
36
37 function ringEnter(data, i) {
38 if (!data.switches.length) {
39 return;
40 }
41
42 var k = 360 / data.switches.length;
43
44 d3.select(this).selectAll("g")
45 .data(d3.range(data.switches.length).map(function() {
46 return data;
47 }))
48 .enter().append("svg:g")
Paul Greyson23b0cd32013-03-18 23:45:48 -070049 .attr("id", function (_, i) {
50 return data.className + i;
51 })
Paul Greyson740bdaf2013-03-18 16:10:48 -070052 .attr("transform", function(_, i) {
Paul Greysonf8f43172013-03-18 23:00:30 -070053 return "rotate(" + i * k + ")translate(" + data.radius * 150 + ")rotate(" + (-i * k) + ")";
54 })
Paul Greyson952ccb62013-03-18 22:22:08 -070055 .append("svg:circle")
56 .attr('class', data.className)
57 .attr("transform", function(_, i) {
58 var m = document.querySelector('svg').getTransformToElement().inverse();
Paul Greysonf8f43172013-03-18 23:00:30 -070059 if (data.scale) {
60 m = m.scale(data.scale);
61 }
62 return "matrix( " + m.a + " " + m.b + " " + m.c + " " + m.d + " " + m.e + " " + m.f + " )";
Paul Greyson952ccb62013-03-18 22:22:08 -070063 })
Paul Greyson740bdaf2013-03-18 16:10:48 -070064 .attr("x", -data.width / 2)
65 .attr("y", -data.width / 2)
Paul Greysonf8f43172013-03-18 23:00:30 -070066 // .attr("width", data.width)
67 // .attr("height", data.width)
68 .attr("r", data.width)
Paul Greyson740bdaf2013-03-18 16:10:48 -070069 }
70
71 var ring = svg.selectAll("g")
72 .data(rings)
73 .enter().append("svg:g")
74 .attr("class", "ring")
75 .each(ringEnter);
Paul Greysonf8f43172013-03-18 23:00:30 -070076
77 function zoom(d, i) {
78 model.edgeSwitches.forEach(function (s) {
79 s.scale = 1;
80 });
81 d.scale = 2;
82
83 svg.selectAll('.edge').data(model.edgeSwitches).transition().duration(100)
Paul Greyson23b0cd32013-03-18 23:45:48 -070084 // .attr("transform", function(data, i) {
85 // var m = document.querySelector('svg').getTransformToElement().inverse();
86 // m = m.scale(data.scale);
87 // return "matrix( " + m.a + " " + m.b + " " + m.c + " " + m.d + " " + m.e + " " + m.f + " )";
88 // })
89 .attr("r", function (data, i) {
90 return rings[0].width * data.scale;
Paul Greysonf8f43172013-03-18 23:00:30 -070091 })
92 }
93
94 svg.selectAll('.edge').on('mouseover', zoom);
95 svg.selectAll('.edge').on('mousedown', zoom);
Paul Greyson740bdaf2013-03-18 16:10:48 -070096}
97
98function sync(svg) {
Paul Greyson6f86d1e2013-03-18 14:40:39 -070099 updateModel(function (model) {
Paul Greyson740bdaf2013-03-18 16:10:48 -0700100
101 drawHeader(model);
102 drawTopology(svg, model);
103
104 // do it again in 1s
105 setTimeout(function () {
106 sync(svg)
Paul Greyson23b0cd32013-03-18 23:45:48 -0700107 }, 5000);
Paul Greyson6f86d1e2013-03-18 14:40:39 -0700108 });
109}
Paul Greyson740bdaf2013-03-18 16:10:48 -0700110
111sync(createTopologyView());