-/*
- * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+/*
+ * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
dashlet : function($dashlet) {
var $h4 = one.lib.dashlet.header("Nodes");
$dashlet.append($h4);
-
+
// load body
one.f.nodes.ajax.dashlet(function($table) {
// total nodes count
dashlet : function(body, callback) {
var attributes = ['table-striped', 'table-bordered', 'table-hover', 'table-condensed'];
var $table = one.lib.dashlet.table.table(attributes);
-
+
var headers = ['Node', 'Flows'];
var $thead = one.lib.dashlet.table.header(headers);
$table.append($thead);
-
+
var $tbody = one.lib.dashlet.table.body(body);
$table.append($tbody);
-
+
return $table;
}
}
dashlet : function($dashlet, details) {
var $h4 = one.lib.dashlet.header("Flow Details");
$dashlet.append($h4);
-
+
// details
if (details == undefined) {
var $none = $(document.createElement('div'));
var $p = $(document.createElement('p'));
$p.text('Please select a flow');
$p.addClass('text-center').addClass('text-info');
-
+
$dashlet.append($none)
.append($p);
}
var body = [];
var tr = {};
var entry = [];
-
+ entry.push(data['flow']['ingressPort']);
entry.push(data['flow']['etherType']);
entry.push(data['flow']['vlanId']);
entry.push(data['flow']['vlanPriority']);
return $table;
},
description : function(body) {
- var header = ['Ethernet Type', 'VLAN ID', 'VLAN Priority', 'Source MAC', 'Dest MAC', 'Source IP', 'Dest IP', 'TOS', 'Source Port', 'Dest Port', 'Protocol', 'Cookie'];
+ var header = ['Input Port', 'Ethernet Type', 'VLAN ID', 'VLAN Priority', 'Source MAC', 'Dest MAC', 'Source IP', 'Dest IP', 'TOS', 'Source Port', 'Dest Port', 'Protocol', 'Cookie'];
var $thead = one.lib.dashlet.table.header(header);
var attributes = ['table-striped', 'table-bordered', 'table-condensed'];
var $table = one.lib.dashlet.table.table(attributes);
},
registry : {},
dashlet : function($dashlet, callback) {
- var $h4 = one.lib.dashlet.header("Flow Entries");
-
- if (one.role < 2) {
- var button = one.lib.dashlet.button.single("Add Flow Entry", one.f.flows.id.dashlet.add, "btn-primary", "btn-mini");
- var $button = one.lib.dashlet.button.button(button);
-
- $button.click(function() {
- var $modal = one.f.flows.modal.initialize();
- $modal.modal();
- });
- }
-
- $dashlet.append($h4);
- if (one.role < 2) $dashlet.append($button);
-
+
// load body
one.f.flows.ajax.dashlet(function($table) {
+
+ var $h4 = one.lib.dashlet.header("Flow Entries");
+
+ $dashlet.append($h4);
+ if (one.f.flows.registry.privilege === 'WRITE') {
+ var button = one.lib.dashlet.button.single("Add Flow Entry", one.f.flows.id.dashlet.add, "btn-primary", "btn-mini");
+ var $button = one.lib.dashlet.button.button(button);
+
+ $button.click(function() {
+ var $modal = one.f.flows.modal.initialize();
+ $modal.modal();
+ });
+ $dashlet.append($button);
+
+ }
+
+ // table bindings
+ $table.find('tbody').find('tr').click(function() {
+ var id = $($(this).find('td')[0]).text();
+ var node = $(this).data('id');
+ one.f.flows.detail(id, node);
+ });
+
// total flows
var flowCount = $table.find('tbody').find('tr').size();
// prompt output
$p = $(document.createElement('p'));
$p.append(out);
$dashlet.append($p);
- // table bindings
- $table.find('tbody').find('tr').click(function() {
- var id = $($(this).find('td')[0]).text();
- var node = $(this).data('id');
- one.f.flows.detail(id, node);
- });
- // add to dashlet
+ // add table to dashlet
$dashlet.append($table);
// details callback
if(callback != undefined) callback();
$detailDashlet.empty();
var $h4 = one.lib.dashlet.header("Flow Overview");
$detailDashlet.append($h4);
-
+
// details
var flows = one.f.flows.registry.flows;
var flow;
flow = value;
}
});
- if (one.role < 2) {
+ if (one.f.flows.registry.privilege === 'WRITE') {
// remove button
var button = one.lib.dashlet.button.single("Remove Flow", one.f.flows.id.dashlet.remove, "btn-danger", "btn-mini");
var $button = one.lib.dashlet.button.button(button);
}
});
});
+
+ $detailDashlet.append($button).append($toggle);
}
// append details
var body = one.f.detail.data.dashlet(flow);
var $body = one.f.detail.body.dashlet(body);
- if (one.role < 2) $detailDashlet.append($button).append($toggle);
$detailDashlet.append($body);
var body = one.f.detail.data.description(flow);
var $body = one.f.detail.body.description(body);
},
footer : function() {
var footer = [];
-
+
var removeButton = one.lib.dashlet.button.single("Remove Flow", one.f.flows.id.modal.dialog.remove, "btn-danger", "");
var $removeButton = one.lib.dashlet.button.button(removeButton);
footer.push($removeButton);
-
+
var closeButton = one.lib.dashlet.button.single("Cancel", one.f.flows.id.modal.dialog.close, "", "");
var $closeButton = one.lib.dashlet.button.button(closeButton);
footer.push($closeButton);
-
+
return footer;
},
body : function(id) {
var h3 = "Add Flow Entry";
var footer = one.f.flows.modal.footer();
var $modal = one.lib.modal.spawn(one.f.flows.id.modal.modal, h3, "", footer);
-
+
// bind close button
$('#'+one.f.flows.id.modal.close, $modal).click(function() {
$modal.modal('hide');
});
-
+
// bind add flow button
$('#'+one.f.flows.id.modal.add, $modal).click(function() {
one.f.flows.modal.add($modal, 'false');
$('#'+one.f.flows.id.modal.install, $modal).click(function() {
one.f.flows.modal.add($modal, 'true');
});
-
+
// inject body (nodePorts)
one.f.flows.modal.ajax.nodes(function(nodes, nodeports) {
var $body = one.f.flows.modal.body(nodes, nodeports);
one.lib.modal.inject.body($modal, $body);
});
-
+
return $modal;
},
add : function($modal, install) {
var result = {};
-
+
result['name'] = $('#'+one.f.flows.id.modal.form.name, $modal).val();
result['ingressPort'] = $('#'+one.f.flows.id.modal.form.port, $modal).val();
result['priority'] = $('#'+one.f.flows.id.modal.form.priority, $modal).val();
result['installInHw'] = install;
var nodeId = $('#'+one.f.flows.id.modal.form.nodes, $modal).val();
-
+
$.each(result, function(key, value) {
if (value == "") delete result[key];
});
-
+
var action = [];
var $table = $('#'+one.f.flows.id.modal.action.table, $modal);
$($table.find('tbody').find('tr')).each(function(index, value) {
}
});
result['actions'] = action;
-
+
// frontend validation
if (result['name'] == undefined) {
alert('Need flow name');
alert('Select node');
return;
}
- if (result['ingressPort'] == undefined) {
- alert('Select port');
- return;
- }
if (action.length == 0) {
alert('Please specify an action');
return;
}
-
+
// package for ajax call
var resource = {};
resource['body'] = JSON.stringify(result);
resource['action'] = 'add';
resource['nodeId'] = nodeId;
-
+
one.f.flows.modal.ajax.saveflow(resource, function(data) {
if (data == "Success") {
$modal.modal('hide');
var nodes = one.f.flows.modal.data.nodes(data);
var nodeports = data;
one.f.flows.registry['nodeports'] = nodeports;
-
+
successCallback(nodes, nodeports);
});
},
$fieldset.append($legend);
// name
var $label = one.lib.form.label("Name");
- var $input = one.lib.form.input("Match Name");
+ var $input = one.lib.form.input("Flow Name");
$input.attr('id', one.f.flows.id.modal.form.name);
$fieldset.append($label).append($input);
// node
one.lib.form.select.prepend($select, { '' : 'Please Select a Node' });
$select.val($select.find("option:first").val());
$select.attr('id', one.f.flows.id.modal.form.nodes);
-
+
// bind onchange
$select.change(function() {
// retrieve port value
one.f.flows.modal.action.parse(action.attr('value'));
$select[0].selectedIndex = 0;
});
-
+
$fieldset.append($select).append($table);
-
+
// return
$form.append($fieldset);
return $form;
var placeholder = "VLAN Identification Number";
var id = one.f.flows.id.modal.action.setVlanId;
var help = "Range: 0 - 4095";
- var action = 'setVlan';
+ var action = 'SET_VLAN_ID';
var name = "VLAN ID";
var body = function() {
return one.f.flows.modal.action.body.set(h3, placeholder, id, help);
var placeholder = "VLAN Priority";
var id = one.f.flows.id.modal.action.setVlanPriority;
var help = "Range: 0 - 7";
- var action = 'setVlanPcp';
+ var action = 'SET_VLAN_PCP';
var name = "VLAN Priority";
var body = function() {
return one.f.flows.modal.action.body.set(h3, placeholder, id, help);
break;
case "stripVlanHeader" :
var name = "Strip VLAN Header";
- var action = 'stripVlan';
+ var action = 'POP_VLAN';
one.f.flows.modal.action.add.add(name, action);
break;
case "modifyDatalayerSourceAddress" :
var placeholder = "Source MAC Address";
var id = one.f.flows.id.modal.action.modifyDatalayerSourceAddress;
var help = "Example: 00:11:22:aa:bb:cc";
- var action = 'setDlSrc';
+ var action = 'SET_DL_SRC';
var name = "Source MAC";
var body = function() {
return one.f.flows.modal.action.body.set(h3, placeholder, id, help);
var placeholder = "Destination MAC Address";
var id = one.f.flows.id.modal.action.modifyDatalayerDestinationAddress;
var help = "Example: 00:11:22:aa:bb:cc";
- var action = 'setDlDst';
+ var action = 'SET_DL_DST';
var name = "Destination MAC";
var body = function() {
return one.f.flows.modal.action.body.set(h3, placeholder, id, help);
var placeholder = "Source IP Address";
var id = one.f.flows.id.modal.action.modifyNetworkSourceAddress;
var help = "Example: 127.0.0.1";
- var action = 'setNwSrc';
+ var action = 'SET_NW_SRC';
var name = "Source IP";
var body = function() {
return one.f.flows.modal.action.body.set(h3, placeholder, id, help);
var placeholder = "Destination IP Address";
var id = one.f.flows.id.modal.action.modifyNetworkDestinationAddress;
var help = "Example: 127.0.0.1";
- var action = 'setNwDst';
+ var action = 'SET_NW_DST';
var name = "Destination IP";
var body = function() {
return one.f.flows.modal.action.body.set(h3, placeholder, id, help);
var placeholder = "IPv4 ToS";
var id = one.f.flows.id.modal.action.modifyTosBits;
var help = "Range: 0 - 63";
- var action = 'setNwTos';
+ var action = 'SET_NW_TOS';
var name = "TOS Bits";
var body = function() {
return one.f.flows.modal.action.body.set(h3, placeholder, id, help);
var placeholder = "Transport Source Port";
var id = one.f.flows.id.modal.action.modifyTransportSourcePort;
var help = "Range: 1 - 65535";
- var action = 'setTpSrc';
+ var action = 'SET_TP_SRC';
var name = "Source Port";
var body = function() {
return one.f.flows.modal.action.body.set(h3, placeholder, id, help);
var placeholder = "Transport Destination Port";
var id = one.f.flows.id.modal.action.modifyTransportDestinationPort;
var help = "Range: 1 - 65535";
- var action = 'setTpDst';
+ var action = 'SET_TP_DST';
var name = "Destination Port";
var body = function() {
return one.f.flows.modal.action.body.set(h3, placeholder, id, help);
break;
case "drop" :
var name = "Drop";
- var action = 'drop';
+ var action = 'DROP';
one.f.flows.modal.action.add.add(name, action);
break;
case "loopback" :
var name = "Loopback";
- var action = 'loopback';
+ var action = 'LOOPBACK';
one.f.flows.modal.action.add.add(name, action);
break;
case "flood" :
var name = "Flood";
- var action = 'flood';
+ var action = 'FLOOD';
one.f.flows.modal.action.add.add(name, action);
break;
case "softwarePath" :
var name = "Software Path";
- var action = 'software path';
+ var action = 'SW_PATH';
one.f.flows.modal.action.add.add(name, action);
break;
case "hardwarePath" :
var name = "Hardware Path";
- var action = 'hardware path';
+ var action = 'HW_PATH';
one.f.flows.modal.action.add.add(name, action);
break;
case "controller" :
var name = "Controller";
- var action = 'controller';
+ var action = 'CONTROLLER';
one.f.flows.modal.action.add.add(name, action);
break;
}
var addButton = one.lib.dashlet.button.single("Add Action", one.f.flows.id.modal.action.add, "btn-primary", "");
var $addButton = one.lib.dashlet.button.button(addButton);
footer.push($addButton);
-
+
var closeButton = one.lib.dashlet.button.single("Close", one.f.flows.id.modal.action.close, "", "");
var $closeButton = one.lib.dashlet.button.button(closeButton);
footer.push($closeButton);
-
+
return footer;
}
},
var installButton = one.lib.dashlet.button.single("Install Flow", one.f.flows.id.modal.install, "btn-success", "");
var $installButton = one.lib.dashlet.button.button(installButton);
footer.push($installButton);
-
+
var addButton = one.lib.dashlet.button.single("Save Flow", one.f.flows.id.modal.add, "btn-primary", "");
var $addButton = one.lib.dashlet.button.button(addButton);
footer.push($addButton);
-
+
var closeButton = one.lib.dashlet.button.single("Close", one.f.flows.id.modal.close, "", "");
var $closeButton = one.lib.dashlet.button.button(closeButton);
footer.push($closeButton);
-
+
return footer;
}
},
ajax : {
dashlet : function(callback) {
$.getJSON(one.f.address.root+one.f.address.flows.main, function(data) {
- one.f.flows.registry['flows'] = data;
- var body = one.f.flows.data.dashlet(data);
+ one.f.flows.registry['flows'] = data.flows;
+ one.f.flows.registry['privilege'] = data.privilege;
+ var body = one.f.flows.data.dashlet(data.flows);
var $body = one.f.flows.body.dashlet(body, callback);
callback($body);
});
tr['type'] = ['warning'];
tr['entry'] = entry;
tr['id'] = value['nodeId'];
-
+
body.push(tr);
});
return body;
dashlet : function(body, callback) {
var attributes = ['table-striped', 'table-bordered', 'table-hover', 'table-condensed', 'table-cursor'];
var $table = one.lib.dashlet.table.table(attributes);
-
+
var headers = ['Flow Name', 'Node'];
var $thead = one.lib.dashlet.table.header(headers);
$table.append($thead);
-
+
var $tbody = one.lib.dashlet.table.body(body);
$table.append($tbody);
-
+
return $table;
}
}