hooking up switch up/down stuff
diff --git a/web/ons-demo/js/app.js b/web/ons-demo/js/app.js
index 8cb50ef..92dd37e 100644
--- a/web/ons-demo/js/app.js
+++ b/web/ons-demo/js/app.js
@@ -311,13 +311,10 @@
var dstDPID = link['dst-switch'];
var srcMap = linkMap[srcDPID] || {};
- var dstMap = linkMap[dstDPID] || {};
- srcMap[dstDPID] = true;
- dstMap[srcDPID] = true;
+ srcMap[dstDPID] = link;
linkMap[srcDPID] = srcMap;
- linkMap[dstDPID] = dstMap;
});
return linkMap;
}
@@ -330,7 +327,7 @@
var linkMap = createLinkMap(model);
// var flowMap = createFlowMap(model);
- function mouseOver(data) {
+ function mouseOverSwitch(data) {
if (data.highlighted) {
return;
}
@@ -370,7 +367,7 @@
node.moveToFront();
}
- function mouseOut(data) {
+ function mouseOutSwitch(data) {
if (data.mouseDown)
return;
@@ -381,11 +378,32 @@
data.target = false;
}
- function mouseDown(data) {
- mouseOver(data);
+ function mouseDownSwitch(data) {
+ mouseOverSwitch(data);
data.mouseDown = true;
}
+ function mouseUpSwitch(data) {
+ if (data.mouseDown) {
+ data.mouseDown = false;
+ d3.event.stopPropagation();
+ }
+ }
+
+ function doubleClickSwitch(data) {
+ if (data.state == 'ACTIVE') {
+ var prompt = 'Deactivate ' + data.dpid + '?';
+ if (confirm(prompt)) {
+ switchDown(data);
+ }
+ } else {
+ var prompt = 'Activate ' + data.dpid + '?';
+ if (confirm(prompt)) {
+ switchUp(data);
+ }
+ }
+ }
+
function ringEnter(data, i) {
if (!data.length) {
return;
@@ -424,9 +442,15 @@
});
// setup the mouseover behaviors
- nodes.on('mouseover', mouseOver);
- nodes.on('mouseout', mouseOut);
- nodes.on('mousedown', mouseDown)
+ nodes.on('mouseover', mouseOverSwitch);
+ nodes.on('mouseout', mouseOutSwitch);
+ nodes.on('mouseup', mouseUpSwitch);
+ nodes.on('mousedown', mouseDownSwitch);
+
+ // only do switch up/down for core switches
+ if (i == 2) {
+ nodes.on('dblclick', doubleClickSwitch);
+ }
}
// append switches
@@ -441,7 +465,7 @@
return data.dpid;
});
nodes.select('circle').attr('class', function (data, i) {
- if (data.state === 'ACTIVE') {
+ if (data.state === 'ACTIVE' && data.controller) {
return data.className + ' ' + controllerColorMap[data.controller];
} else {
return data.className + ' ' + 'colorInactive';
@@ -462,7 +486,7 @@
function clearHighlight() {
svg.selectAll('circle').each(function (data) {
data.mouseDown = false;
- mouseOut(data);
+ mouseOutSwitch(data);
})
};
@@ -493,12 +517,20 @@
if (map && map[dstData.dpid]) {
var prompt = 'Remove link between ' + srcData.dpid + ' and ' + dstData.dpid + '?';
if (confirm(prompt)) {
- linkDown(srcData, dstData);
+ linkDown(map[dstData.dpid]);
}
} else {
- var prompt = 'Create link between ' + srcData.dpid + ' and ' + dstData.dpid + '?';
- if (confirm(prompt)) {
- linkUp(srcData, dstData);
+ map = linkMap[dstData.dpid];
+ if (map && map[srcData.dpid]) {
+ var prompt = 'Remove link between ' + dstData.dpid + ' and ' + srcData.dpid + '?';
+ if (confirm(prompt)) {
+ linkDown(map[srcData.dpid]);
+ }
+ } else {
+ var prompt = 'Create link between ' + srcData.dpid + ' and ' + dstData.dpid + '?';
+ if (confirm(prompt)) {
+ linkUp(srcData, dstData);
+ }
}
}
}
@@ -654,7 +686,7 @@
// this should never be needed
// controllers.exit().remove();
- controllers.on('click', function (c, index) {
+ controllers.on('click', function (c) {
var allSelected = true;
for (var key in controllerColorMap) {
if (!d3.select(document.body).classed(controllerColorMap[key] + '-selected')) {
@@ -675,6 +707,8 @@
// var selected = d3.select(document.body).classed(controllerColorMap[c] + '-selected');
// d3.select(document.body).classed(controllerColorMap[c] + '-selected', !selected);
});
+
+
}
function sync(svg, selectedFlowsView) {
diff --git a/web/ons-demo/js/controller.js b/web/ons-demo/js/controller.js
index 86a7905..b61b2d4 100644
--- a/web/ons-demo/js/controller.js
+++ b/web/ons-demo/js/controller.js
@@ -1,26 +1,48 @@
-var controllerFunctions = {
- link: function (cmd, src, dst) {
- var url = '/proxy/gui/link/' + [cmd, src.dpid, 1, dst.dpid, 1].join('/');
- d3.json(url, function (error, result) {
- if (error) {
- alert(url + ' : ' + error.status);
- }
- });
- }
+/*global d3*/
+
+function callURL(url) {
+ d3.text(url, function (error, result) {
+ if (error) {
+ alert(url + ' : ' + error.status);
+ } else {
+ console.log(result);
+ }
+ });
}
+var controllerFunctions = {
+ l: function (cmd, link) {
+ var url = '/proxy/gui/link/' + [cmd, link['src-switch'], link['src-port'], link['dst-switch'], link['dst-port']].join('/');
+ callURL(url);
+
+ },
+ s: function (cmd, s) {
+ var url = '/proxy/gui/switch/' + [cmd, s.dpid].join('/');
+ callURL(url);
+ }
+};
+
+
// if (parseURLParameters().mock) {
// urls = mockURLs;
// }
-function linkUp(src, dst) {
- controllerFunctions.link('up', src, dst);
+function linkUp(link) {
+ controllerFunctions.l('up', link);
}
-function linkDown(src, dst) {
- controllerFunctions.link('down', src, dst);
+function linkDown(link) {
+ controllerFunctions.l('down', link);
+}
+
+function switchUp(s) {
+ controllerFunctions.s('up', s);
+}
+
+function switchDown(s) {
+ controllerFunctions.s('down', s);
}
function createFlow(src, dst) {
diff --git a/web/topology_rest.py b/web/topology_rest.py
index 4409893..3d0a6d3 100755
--- a/web/topology_rest.py
+++ b/web/topology_rest.py
@@ -74,12 +74,13 @@
## PROXY API (allows development where the webui is served from someplace other than the controller)##
ONOS_GUI3_HOST="http://gui3.onlab.us:8080"
+ONOS_GUI3_CONTROL_HOST="http://gui3.onlab.us:8081"
ONOS_LOCAL_HOST="http://localhost:8080" ;# for Amazon EC2
@app.route("/proxy/gui/link/<cmd>/<src_dpid>/<src_port>/<dst_dpid>/<dst_port>")
def proxy_link_change(cmd, src_dpid, src_port, dst_dpid, dst_port):
try:
- command = "curl -s %s/gui/link/%s/%s/%s/%s/%s" % (ONOS_GUI3_HOST, cmd, src_dpid, src_port, dst_dpid, dst_port)
+ command = "curl -s %s/gui/link/%s/%s/%s/%s/%s" % (ONOS_GUI3_CONTROL_HOST, cmd, src_dpid, src_port, dst_dpid, dst_port)
print command
result = os.popen(command).read()
except:
@@ -89,7 +90,18 @@
resp = Response(result, status=200, mimetype='application/json')
return resp
+@app.route("/proxy/gui/switch/<cmd>/<dpid>")
+def proxy_switch_status_change(cmd, dpid):
+ try:
+ command = "curl -s %s/gui/switch/%s/%s" % (ONOS_GUI3_CONTROL_HOST, cmd, dpid)
+ print command
+ result = os.popen(command).read()
+ except:
+ print "REST IF has issue"
+ exit
+ resp = Response(result, status=200, mimetype='application/json')
+ return resp
@app.route("/wm/core/topology/switches/all/json")
def switches():
@@ -118,7 +130,7 @@
try:
command = "curl -s %s/wm/core/topology/links/json" % (host)
-# print command
+ print command
result = os.popen(command).read()
except:
print "REST IF has issue"