Provide edit functionality for Static Flows 16/1916/2
authorSapan Shah <sapshah@cisco.com>
Tue, 15 Oct 2013 19:27:25 +0000 (12:27 -0700)
committerGerrit Code Review <gerrit@opendaylight.org>
Wed, 16 Oct 2013 00:54:36 +0000 (00:54 +0000)
Change-Id: I345579c8b97addc4a335044a4f34d5fc694c63e5
Signed-off-by: Sapan Shah <sapshah@cisco.com>
opendaylight/web/flows/src/main/java/org/opendaylight/controller/flows/web/Flows.java
opendaylight/web/flows/src/main/resources/js/page.js

index a014528ded3ccfea19f47ea21ecae64ec83d513c..8a7c3983d1cae6e7c2260c00dbdeb8d1263065f2 100644 (file)
@@ -212,6 +212,7 @@ public class Flows implements IDaylightWeb {
         return nodes;
     }
 
+
     @RequestMapping(value = "/flow", method = RequestMethod.POST)
     @ResponseBody
     public String actionFlow(@RequestParam(required = true) String action, @RequestParam(required = false) String body,
@@ -243,6 +244,12 @@ public class Flows implements IDaylightWeb {
                 DaylightWebUtil.auditlog("Flow Entry", userName, "added", flow.getName() + " on Node "
                         + DaylightWebUtil.getNodeDesc(node, containerName, this), containerName);
             }
+        } else if (action.equals("edit")){
+            result = frm.modifyStaticFlow(flow);
+            if (result.isSuccess()) {
+                DaylightWebUtil.auditlog("Flow Entry", userName, "updated", flow.getName() + " on Node "
+                        + DaylightWebUtil.getNodeDesc(node, containerName, this), containerName);
+            }
         }
 
         return (result.isSuccess()) ? StatusCode.SUCCESS.toString() : result.getDescription();
index 8b8a0b45a7f5608418482e71803222af7ec1eaf6..094562fac07252b182e601774e79209d0a473e20 100644 (file)
@@ -49,6 +49,7 @@ one.f.address = {
         flows : "/node-flows",
         nodes : "/node-ports",
         flow : "/flow",
+        modifyFlow : "/modifyFlow",
         deleteFlows:"/flow/deleteFlows"
     }
 }
@@ -171,7 +172,7 @@ one.f.detail = {
             var body = [];
             var tr = {};
             var entry = [];
-                        entry.push(data['flow']['ingressPort']);
+            entry.push(data['flow']['ingressPort']);
             entry.push(data['flow']['etherType']);
             entry.push(data['flow']['vlanId']);
             entry.push(data['flow']['vlanPriority']);
@@ -193,10 +194,26 @@ one.f.detail = {
             var body = [];
             var tr = {};
             var entry = [];
-
             var actions = '';
+
             $(data['flow']['actions']).each(function(index, value) {
-                actions += value + ', ';
+                var locEqualTo = value.indexOf("=");
+                if ( locEqualTo == -1 ) {
+                    actions += value + ', ';
+                } else {
+                    var action = value.substr(0,locEqualTo);
+                    if( action == "OUTPUT") {
+                        var portIds = value.substr(locEqualTo+1).split(",");
+                        actions += action + "=";
+                        var allPorts = one.f.flows.registry.nodeports[one.f.flows.registry.selectedNode]['ports'];
+                        for(var i =0; i < portIds.length ; i++) {
+                            var portName = allPorts[portIds[i]];
+                            actions += portName + ", ";
+                        }
+                    } else {
+                        actions += value + ', ';
+                    }
+                }
             });
             actions = actions.slice(0,-2);
             entry.push(actions);
@@ -255,11 +272,13 @@ one.f.flows = {
             removeMultiple : "one_f_flows_id_dashlet_removeMultiple",
             remove : "one_f_flows_id_dashlet_remove",
             toggle : "one_f_flows_id_dashlet_toggle",
+            edit : "one_f_flows_id_dashlet_edit",
             datagrid : "one_f_flows_id_dashlet_datagrid",
             selectAllFlows : "one_f_flows_id_dashlet_selectAllFlows"
         },
         modal : {
             install : "one_f_flows_id_modal_install",
+            edit : "one_f_flows_id_modal_edit",
             add : "one_f_flows_id_modal_add",
             close : "one_f_flows_id_modal_close",
             modal : "one_f_flows_id_modal_modal",
@@ -418,6 +437,8 @@ one.f.flows = {
 
         // details
         var flows = one.f.flows.registry.flows;
+        one.f.flows.registry['selectedId'] = id;
+        one.f.flows.registry['selectedNode'] = node;
         var flow;
         $(flows).each(function(index, value) {
           if (value.name == id && value.nodeId == node) {
@@ -432,6 +453,16 @@ one.f.flows = {
                 var $modal = one.f.flows.modal.dialog.initialize(id, node);
                 $modal.modal();
             });
+            // edit button
+            var editButton = one.lib.dashlet.button.single("Edit Flow", one.f.flows.id.dashlet.edit, "btn-primary", "btn-mini");
+            var $editButton = one.lib.dashlet.button.button(editButton);
+            $editButton.click(function() {
+                var $modal = one.f.flows.modal.initialize(true);
+                $modal.modal().on('shown',function(){
+                    var $port = $('#'+one.f.flows.id.modal.form.port);
+                    $('#'+one.f.flows.id.modal.form.nodes).trigger("change");
+                });
+            });
             // toggle button
             var toggle;
             if (flow['flow']['installInHw'] == 'true' && flow['flow']['status'] == 'Success') {
@@ -461,7 +492,7 @@ one.f.flows = {
                 });
             });
 
-            $detailDashlet.append($button).append($toggle);
+            $detailDashlet.append($button).append($editButton).append($toggle);
         }
         // append details
         var body = one.f.detail.data.dashlet(flow);
@@ -519,9 +550,17 @@ one.f.flows = {
                 return $p;
             }
         },
-        initialize : function() {
-            var h3 = "Add Flow Entry";
-            var footer = one.f.flows.modal.footer();
+        initialize : function(edit) {
+            var h3;
+            if(edit) {
+                h3 = "Edit Flow Entry";
+                var footer = one.f.flows.modal.footerEdit();
+
+            } else {
+                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
@@ -529,25 +568,32 @@ one.f.flows = {
                 $modal.modal('hide');
             });
 
-            // bind add flow button
-            $('#'+one.f.flows.id.modal.add, $modal).click(function() {
-                one.f.flows.modal.add($modal, 'false');
-            });
+            if (edit) {
+                // bind edit flow button
+                $('#'+one.f.flows.id.modal.edit, $modal).click(function() {
+                    one.f.flows.modal.save($modal, 'true', true);
+                });
+            } else {
+                // bind add flow button
+                $('#'+one.f.flows.id.modal.add, $modal).click(function() {
+                    one.f.flows.modal.save($modal, 'false');
+                });
 
-            // bind install flow button
-            $('#'+one.f.flows.id.modal.install, $modal).click(function() {
-                one.f.flows.modal.add($modal, 'true');
-            });
+                // bind install flow button
+                $('#'+one.f.flows.id.modal.install, $modal).click(function() {
+                    one.f.flows.modal.save($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);
-            });
+
+            var nodes = one.f.flows.registry.nodes;
+            var nodeports = one.f.flows.registry.nodeports;
+            var $body = one.f.flows.modal.body(nodes, nodeports, edit);
+            one.lib.modal.inject.body($modal, $body,edit);
 
             return $modal;
         },
-        add : function($modal, install) {
+        save : function($modal, install, edit) {
             var result = {};
 
             result['name'] = $('#'+one.f.flows.id.modal.form.name, $modal).val();
@@ -567,7 +613,6 @@ one.f.flows = {
             result['tpSrc'] = $('#'+one.f.flows.id.modal.form.srcPort, $modal).val();
             result['tpDst'] = $('#'+one.f.flows.id.modal.form.dstPort, $modal).val();
             result['protocol'] = $('#'+one.f.flows.id.modal.form.protocol, $modal).val();
-
             result['installInHw'] = install;
 
             var nodeId = $('#'+one.f.flows.id.modal.form.nodes, $modal).val();
@@ -602,25 +647,46 @@ one.f.flows = {
             // package for ajax call
             var resource = {};
             resource['body'] = JSON.stringify(result);
-            resource['action'] = 'add';
+            if(edit){
+                resource['action'] = 'edit';
+            } else {
+                resource['action'] = 'add';
+            }
+
             resource['nodeId'] = nodeId;
 
-            one.f.flows.modal.ajax.saveflow(resource, function(data) {
-                if (data == "Success") {
-                    $modal.modal('hide');
-                    one.lib.alert('Flow Entry added');
-                    one.main.dashlet.left.top.empty();
-                    one.f.flows.dashlet(one.main.dashlet.left.top);
-                } else {
-                    alert('Could not add flow: '+data);
-                }
-            });
+            if (edit) {
+                    one.f.flows.modal.ajax.saveflow(resource, function(data) {
+                    if (data == "Success") {
+                        $modal.modal('hide').on('hidden', function () {
+                            one.f.flows.detail(result['name'], nodeId);
+                        });
+                        one.lib.alert('Flow Entry edited');
+                        one.main.dashlet.left.top.empty();
+                        one.f.flows.dashlet(one.main.dashlet.left.top);
+                    } else {
+                        alert('Could not edit flow: '+data);
+                    }
+                });
+            } else {
+                    one.f.flows.modal.ajax.saveflow(resource, function(data) {
+                    if (data == "Success") {
+                        $modal.modal('hide');
+                        one.lib.alert('Flow Entry added');
+                        one.main.dashlet.left.top.empty();
+                        one.f.flows.dashlet(one.main.dashlet.left.top);
+                    } else {
+                        alert('Could not add flow: '+data);
+                    }
+                });
+            }
         },
         ajax : {
             nodes : function(successCallback) {
                 $.getJSON(one.f.address.root+one.f.address.flows.nodes, function(data) {
                     var nodes = one.f.flows.modal.data.nodes(data);
                     var nodeports = data;
+                    one.f.flows.registry['nodes'] = nodes;
                     one.f.flows.registry['nodeports'] = nodeports;
 
                     successCallback(nodes, nodeports);
@@ -655,9 +721,10 @@ one.f.flows = {
                 return result;
             }
         },
-        body : function(nodes, nodeports) {
+        body : function(nodes, nodeports, edit) {
             var $form = $(document.createElement('form'));
             var $fieldset = $(document.createElement('fieldset'));
+            var existingFlow;
             // flow description
             var $legend = one.lib.form.legend("");
             $legend.css('visibility', 'hidden');
@@ -666,6 +733,17 @@ one.f.flows = {
             var $label = one.lib.form.label("Name");
             var $input = one.lib.form.input("Flow Name");
             $input.attr('id', one.f.flows.id.modal.form.name);
+            if(edit) {
+                $input.attr('disabled', 'disabled');
+                var flows = one.f.flows.registry.flows;
+                $(flows).each(function(index, value) {
+                  if (value.name == one.f.flows.registry.selectedId && value.nodeId == one.f.flows.registry.selectedNode) {
+                    existingFlow = value.flow;
+                  }
+                });
+                $input.val(existingFlow.name);
+            }
+
             $fieldset.append($label).append($input);
             // node
             var $label = one.lib.form.label("Node");
@@ -673,6 +751,10 @@ one.f.flows = {
             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);
+            if(edit) {
+                $select.attr('disabled', 'disabled');
+                $select.val(existingFlow.node.type + "|"+ existingFlow.node.nodeIDString);
+            }
 
             // bind onchange
             $select.change(function() {
@@ -688,12 +770,16 @@ one.f.flows = {
                 one.lib.form.select.inject($ports, ports);
                 one.lib.form.select.prepend($ports, { '' : 'Please Select a Port' });
                 $ports.val($ports.find("option:first").val());
+                if(edit) {
+                    $ports.val( existingFlow.ingressPort );
+                }
             });
 
             $fieldset.append($label).append($select);
             // input port
             var $label = one.lib.form.label("Input Port");
             var $select = one.lib.form.select.create();
+
             $select.attr('id', one.f.flows.id.modal.form.port);
             $fieldset.append($label).append($select);
             // priority
@@ -702,21 +788,35 @@ one.f.flows = {
             $input.attr('id', one.f.flows.id.modal.form.priority);
             $input.val('500');
             $fieldset.append($label).append($input);
+            if(edit) {
+                $input.val(existingFlow.priority);
+            }
             // hardTimeout
             var $label = one.lib.form.label("Hard Timeout");
             var $input = one.lib.form.input("Hard Timeout");
             $input.attr('id', one.f.flows.id.modal.form.hardTimeout);
+            if(edit) {
+                $input.val(existingFlow.hardTimeout);
+            }
             $fieldset.append($label).append($input);
+
             // idleTimeout
             var $label = one.lib.form.label("Idle Timeout");
             var $input = one.lib.form.input("Idle Timeout");
             $input.attr('id', one.f.flows.id.modal.form.idleTimeout);
             $fieldset.append($label).append($input);
+            if(edit) {
+                $input.val(existingFlow.idleTimeout);
+            }
             // cookie
             var $label = one.lib.form.label("Cookie");
             var $input = one.lib.form.input("Cookie");
             $input.attr('id', one.f.flows.id.modal.form.cookie);
             $fieldset.append($label).append($input);
+            if(edit) {
+                $input.val(existingFlow.cookie);
+            }
+
             // layer 2
             var $legend = one.lib.form.legend("Layer 2");
             $fieldset.append($legend);
@@ -726,47 +826,75 @@ one.f.flows = {
             $input.attr('id', one.f.flows.id.modal.form.etherType);
             $input.val('0x800');
             $fieldset.append($label).append($input);
+            if(edit) {
+                $input.val(existingFlow.etherType);
+            }
             // vlanId
             var $label = one.lib.form.label("VLAN Identification Number");
             var $input = one.lib.form.input("VLAN Identification Number");
             $input.attr('id', one.f.flows.id.modal.form.vlanId);
             var $help = one.lib.form.help("Range: 0 - 4095");
             $fieldset.append($label).append($input).append($help);
+            if(edit) {
+                $input.val(existingFlow.vlanId);
+            }
+
             // vlanPriority
             var $label = one.lib.form.label("VLAN Priority");
             var $input = one.lib.form.input("VLAN Priority");
             $input.attr('id', one.f.flows.id.modal.form.vlanPriority);
             var $help = one.lib.form.help("Range: 0 - 7");
             $fieldset.append($label).append($input).append($help);
+            if(edit) {
+                $input.val(existingFlow.vlanPriority);
+            }
+
             // srcMac
             var $label = one.lib.form.label("Source MAC Address");
             var $input = one.lib.form.input("3c:97:0e:75:c3:f7");
             $input.attr('id', one.f.flows.id.modal.form.srcMac);
             $fieldset.append($label).append($input);
+            if(edit) {
+                $input.val(existingFlow.srcMac);
+            }
             // dstMac
             var $label = one.lib.form.label("Destination MAC Address");
             var $input = one.lib.form.input("7c:d1:c3:e8:e6:99");
             $input.attr('id', one.f.flows.id.modal.form.dstMac);
             $fieldset.append($label).append($input);
+            if(edit) {
+                $input.val(existingFlow.dstMac);
+            }
             // layer 3
             var $legend = one.lib.form.legend("Layer 3");
             $fieldset.append($legend);
+
             // srcIp
             var $label = one.lib.form.label("Source IP Address");
             var $input = one.lib.form.input("192.168.3.128");
             $input.attr('id', one.f.flows.id.modal.form.srcIp);
             $fieldset.append($label).append($input);
+            if(edit) {
+                $input.val(existingFlow.srcIp);
+            }
             // dstIp
             var $label = one.lib.form.label("Destination IP Address");
             var $input = one.lib.form.input("2001:2334::0/32");
             $input.attr('id', one.f.flows.id.modal.form.dstIp);
             $fieldset.append($label).append($input);
+            if(edit) {
+                $input.val(existingFlow.dstIp);
+            }
             // tosBits
             var $label = one.lib.form.label("ToS Bits");
             var $input = one.lib.form.input("ToS Bits");
             $input.attr('id', one.f.flows.id.modal.form.tosBits);
             var $help = one.lib.form.help("Range: 0 - 63");
             $fieldset.append($label).append($input).append($help);
+            if(edit) {
+                $input.val(existingFlow.tosBits);
+            }
+
             // layer 4
             var $legend = one.lib.form.legend("Layer 4");
             $fieldset.append($legend);
@@ -776,17 +904,26 @@ one.f.flows = {
             $input.attr('id', one.f.flows.id.modal.form.srcPort);
             var $help = one.lib.form.help("Range: 0 - 65535");
             $fieldset.append($label).append($input).append($help);
+            if(edit) {
+                $input.val(existingFlow.srcPort);
+            }
             // dstPort
             var $label = one.lib.form.label("Destination Port");
             var $input = one.lib.form.input("Destination Port");
             $input.attr('id', one.f.flows.id.modal.form.dstPort);
             var $help = one.lib.form.help("Range: 0 - 65535");
             $fieldset.append($label).append($input).append($help);
+            if(edit) {
+                $input.val(existingFlow.dstPort);
+            }
             // protocol
             var $label = one.lib.form.label("Protocol");
             var $input = one.lib.form.input("Protocol");
             $input.attr('id', one.f.flows.id.modal.form.protocol);
             $fieldset.append($label).append($input);
+            if(edit) {
+                $input.val(existingFlow.protocol);
+            }
             // actions
             var $legend = one.lib.form.label("Actions");
             $fieldset.append($legend);
@@ -794,30 +931,30 @@ one.f.flows = {
             var tableAttributes = ["table-striped", "table-bordered", "table-condensed", "table-hover", "table-cursor"];
             var $table = one.lib.dashlet.table.table(tableAttributes);
             $table.attr('id', one.f.flows.id.modal.action.table);
-            var tableHeaders = ["Action", "Data", "Type"];
+            var tableHeaders = ["Action", "Data"];
             var $thead = one.lib.dashlet.table.header(tableHeaders);
             var $tbody = one.lib.dashlet.table.body("", tableHeaders);
             $table.append($thead).append($tbody);
             // actions
             var actions = {
                 "" : "Please Select an Action",
-                "drop" : "Drop",
-                "loopback" : "Loopback",
-                "flood" : "Flood",
-                "softwarePath" : "Software Path",
-                "hardwarePath" : "Hardware Path",
-                "controller" : "Controller",
-                "addOutputPorts" : "Add Output Ports",
-                "setVlanId" : "Set VLAN ID",
-                "setVlanPriority" : "Set VLAN Priority",
-                "stripVlanHeader" : "Strip VLAN Header",
-                "modifyDatalayerSourceAddress" : "Modify Datalayer Source Address",
-                "modifyDatalayerDestinationAddress" : "Modify Datalayer Destination Address",
-                "modifyNetworkSourceAddress" : "Modify Network Source Address",
-                "modifyNetworkDestinationAddress" :"Modify Network Destination Address",
-                "modifyTosBits" : "Modify ToS Bits",
-                "modifyTransportSourcePort" : "Modify Transport Source Port",
-                "modifyTransportDestinationPort" : "Modify Transport Destination Port"
+                "DROP" : "Drop",
+                "LOOPBACK" : "Loopback",
+                "FLOOD" : "Flood",
+                "SW_PATH" : "Software Path",
+                "HW_PATH" : "Hardware Path",
+                "CONTROLLER" : "Controller",
+                "OUTPUT" : "Add Output Ports",
+                "SET_VLAN_ID" : "Set VLAN ID",
+                "SET_VLAN_PCP" : "Set VLAN Priority",
+                "POP_VLAN" : "Strip VLAN Header",
+                "SET_DL_SRC" : "Modify Datalayer Source Address",
+                "SET_DL_DST" : "Modify Datalayer Destination Address",
+                "SET_NW_SRC" : "Modify Network Source Address",
+                "SET_NW_DST" :"Modify Network Destination Address",
+                "SET_NW_TOS" : "Modify ToS Bits",
+                "SET_TP_SRC" : "Modify Transport Source Port",
+                "SET_TP_DST" : "Modify Transport Destination Port"
             };
             var $select = one.lib.form.select.create(actions);
             // when selecting an action
@@ -827,6 +964,31 @@ one.f.flows = {
                 $select[0].selectedIndex = 0;
             });
 
+            if(edit) {
+                $(existingFlow.actions).each(function(index, value){
+                    setTimeout(function(){
+                        var locEqualTo = value.indexOf("=");
+                        if ( locEqualTo == -1 ) {
+                            one.f.flows.modal.action.add.add(actions[value], value);
+                        } else {
+                            var action = value.substr(0,locEqualTo);
+                            if( action == "OUTPUT") {
+                                var portIds = value.substr(locEqualTo+1).split(",");
+                                var ports = [];
+                                var allPorts = one.f.flows.registry.nodeports[one.f.flows.registry.currentNode]['ports'];
+                                for(var i =0; i < portIds.length ; i++) {
+                                    var portName = allPorts[portIds[i]];
+                                    ports.push(portName);
+                                }
+                                one.f.flows.modal.action.add.addPortsToTable(ports.join(", "), portIds.join(","));
+                            } else {
+                                var val = value.substr(locEqualTo+1);
+                                one.f.flows.modal.action.add.addDataToTable(actions[action], val, action)
+                            }
+                        }
+                    }, 1000)
+                });
+            }
             $fieldset.append($select).append($table);
 
             // return
@@ -836,12 +998,12 @@ one.f.flows = {
         action : {
             parse : function(option) {
                 switch (option) {
-                    case "addOutputPorts" :
+                    case "OUTPUT" :
                         var h3 = "Add Output Port";
                         var $modal = one.f.flows.modal.action.initialize(h3, one.f.flows.modal.action.body.addOutputPorts, one.f.flows.modal.action.add.addOutputPorts);
                         $modal.modal();
                         break;
-                    case "setVlanId" :
+                    case "SET_VLAN_ID" :
                         var h3 = "Set VLAN ID";
                         var placeholder = "VLAN Identification Number";
                         var id = one.f.flows.id.modal.action.setVlanId;
@@ -857,7 +1019,7 @@ one.f.flows = {
                         var $modal = one.f.flows.modal.action.initialize(h3, body, add);
                         $modal.modal();
                         break;
-                    case "setVlanPriority" :
+                    case "SET_VLAN_PCP" :
                         var h3 = "Set VLAN Priority";
                         var placeholder = "VLAN Priority";
                         var id = one.f.flows.id.modal.action.setVlanPriority;
@@ -873,12 +1035,12 @@ one.f.flows = {
                         var $modal = one.f.flows.modal.action.initialize(h3, body, add);
                         $modal.modal();
                         break;
-                    case "stripVlanHeader" :
+                    case "POP_VLAN" :
                         var name = "Strip VLAN Header";
                         var action = 'POP_VLAN';
                         one.f.flows.modal.action.add.add(name, action);
                         break;
-                    case "modifyDatalayerSourceAddress" :
+                    case "SET_DL_SRC" :
                         var h3 = "Set Source MAC Address";
                         var placeholder = "Source MAC Address";
                         var id = one.f.flows.id.modal.action.modifyDatalayerSourceAddress;
@@ -894,7 +1056,7 @@ one.f.flows = {
                         var $modal = one.f.flows.modal.action.initialize(h3, body, add);
                         $modal.modal();
                         break;
-                    case "modifyDatalayerDestinationAddress" :
+                    case "SET_DL_DST" :
                         var h3 = "Set Destination MAC Address";
                         var placeholder = "Destination MAC Address";
                         var id = one.f.flows.id.modal.action.modifyDatalayerDestinationAddress;
@@ -910,7 +1072,7 @@ one.f.flows = {
                         var $modal = one.f.flows.modal.action.initialize(h3, body, add);
                         $modal.modal();
                         break;
-                    case "modifyNetworkSourceAddress" :
+                    case "SET_NW_SRC" :
                         var h3 = "Set IP Source Address";
                         var placeholder = "Source IP Address";
                         var id = one.f.flows.id.modal.action.modifyNetworkSourceAddress;
@@ -926,7 +1088,7 @@ one.f.flows = {
                         var $modal = one.f.flows.modal.action.initialize(h3, body, add);
                         $modal.modal();
                         break;
-                    case "modifyNetworkDestinationAddress" :
+                    case "SET_NW_DST" :
                         var h3 = "Set IP Destination Address";
                         var placeholder = "Destination IP Address";
                         var id = one.f.flows.id.modal.action.modifyNetworkDestinationAddress;
@@ -942,7 +1104,7 @@ one.f.flows = {
                         var $modal = one.f.flows.modal.action.initialize(h3, body, add);
                         $modal.modal();
                         break;
-                    case "modifyTosBits" :
+                    case "SET_NW_TOS" :
                         var h3 = "Set IPv4 ToS";
                         var placeholder = "IPv4 ToS";
                         var id = one.f.flows.id.modal.action.modifyTosBits;
@@ -958,7 +1120,7 @@ one.f.flows = {
                         var $modal = one.f.flows.modal.action.initialize(h3, body, add);
                         $modal.modal();
                         break;
-                    case "modifyTransportSourcePort" :
+                    case "SET_TP_SRC" :
                         var h3 = "Set Transport Source Port";
                         var placeholder = "Transport Source Port";
                         var id = one.f.flows.id.modal.action.modifyTransportSourcePort;
@@ -974,7 +1136,7 @@ one.f.flows = {
                         var $modal = one.f.flows.modal.action.initialize(h3, body, add);
                         $modal.modal();
                         break;
-                    case "modifyTransportDestinationPort" :
+                    case "SET_TP_DST" :
                         var h3 = "Set Transport Destination Port";
                         var placeholder = "Transport Destination Port";
                         var id = one.f.flows.id.modal.action.modifyTransportDestinationPort;
@@ -990,32 +1152,32 @@ one.f.flows = {
                         var $modal = one.f.flows.modal.action.initialize(h3, body, add);
                         $modal.modal();
                         break;
-                    case "drop" :
+                    case "DROP" :
                         var name = "Drop";
                         var action = 'DROP';
                         one.f.flows.modal.action.add.add(name, action);
                         break;
-                    case "loopback" :
+                    case "LOOPBACK" :
                         var name = "Loopback";
                         var action = 'LOOPBACK';
                         one.f.flows.modal.action.add.add(name, action);
                         break;
-                    case "flood" :
+                    case "FLOOD" :
                         var name = "Flood";
                         var action = 'FLOOD';
                         one.f.flows.modal.action.add.add(name, action);
                         break;
-                    case "softwarePath" :
+                    case "SW_PATH" :
                         var name = "Software Path";
                         var action = 'SW_PATH';
                         one.f.flows.modal.action.add.add(name, action);
                         break;
-                    case "hardwarePath" :
+                    case "HW_PATH" :
                         var name = "Hardware Path";
                         var action = 'HW_PATH';
                         one.f.flows.modal.action.add.add(name, action);
                         break;
-                    case "controller" :
+                    case "CONTROLLER" :
                         var name = "Controller";
                         var action = 'CONTROLLER';
                         one.f.flows.modal.action.add.add(name, action);
@@ -1047,14 +1209,17 @@ one.f.flows = {
                     });
                     ports = ports.slice(0,-2);
                     pid = pid.slice(0,-1);
+                    one.f.flows.modal.action.add.addPortsToTable(ports, pid);
+                    $modal.modal('hide');
+                },
+                addPortsToTable : function(ports, pid){
                     var $tr = one.f.flows.modal.action.table.add("Add Output Ports", ports);
-                    $tr.attr('id', 'addOutputPorts');
+                    $tr.attr('id', 'OUTPUT');
                     $tr.data('action', 'OUTPUT='+pid);
                     $tr.click(function() {
                         one.f.flows.modal.action.add.modal.initialize(this);
                     });
                     one.f.flows.modal.action.table.append($tr);
-                    $modal.modal('hide');
                 },
                 add : function(name, action) {
                     var $tr = one.f.flows.modal.action.table.add(name);
@@ -1068,6 +1233,10 @@ one.f.flows = {
                 set : function(name, id, action, $modal) {
                     var $input = $('#'+id);
                     var value = $input.val();
+                    one.f.flows.modal.action.add.addDataToTable(name,value,action)
+                    $modal.modal('hide');
+                },
+                addDataToTable : function(name,value,action) {
                     var $tr = one.f.flows.modal.action.table.add(name, value);
                     $tr.attr('id', action);
                     $tr.data('action', action+'='+value);
@@ -1075,7 +1244,6 @@ one.f.flows = {
                         one.f.flows.modal.action.add.modal.initialize(this);
                     });
                     one.f.flows.modal.action.table.append($tr);
-                    $modal.modal('hide');
                 },
                 remove : function(that) {
                     $(that).remove();
@@ -1131,7 +1299,7 @@ one.f.flows = {
                 }
             },
             table : {
-                add : function(action, data, type) {
+                add : function(action, data) {
                     var $tr = $(document.createElement('tr'));
                     var $td = $(document.createElement('td'));
                     $td.append(action);
@@ -1139,9 +1307,6 @@ one.f.flows = {
                     var $td = $(document.createElement('td'));
                     if (data != undefined) $td.append(data);
                     $tr.append($td);
-                    var $td = $(document.createElement('td'));
-                    if (type != undefined) $td.append(type);
-                    $tr.append($td);
                     return $tr;
                 },
                 append : function($tr) {
@@ -1163,10 +1328,12 @@ one.f.flows = {
                     var $fieldset = common[1];
                     // output port
                     $label = one.lib.form.label("Select Output Ports");
+                    if (one.f.flows.registry.currentNode == undefined){
+                        return; //Selecting Output ports without selecting node throws an exception
+                    }
                     var ports = one.f.flows.registry.nodeports[one.f.flows.registry.currentNode]['ports'];
                     $select = one.lib.form.select.create(ports, true);
                     $select.attr('id', one.f.flows.id.modal.action.addOutputPorts);
-                    one.lib.form.select.prepend($select, {'':'Select a Port'});
                     $fieldset.append($label).append($select);
                     $form.append($fieldset);
                     return $form;
@@ -1216,6 +1383,19 @@ one.f.flows = {
 
             return footer;
         },
+        footerEdit : function() {
+            var footer = [];
+
+            var editButton = one.lib.dashlet.button.single("Save Flow", one.f.flows.id.modal.edit, "btn-success", "");
+            var $editButton = one.lib.dashlet.button.button(editButton);
+            footer.push($editButton);
+
+            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;
+        },
         removeMultiple: {
             dialog: function(flows) {
                 var h3 = 'Remove Flow Entry';
@@ -1283,6 +1463,8 @@ one.f.flows = {
             $.getJSON(one.f.address.root+one.f.address.flows.main, function(data) {
                 one.f.flows.registry['flows'] = data.flows;
                 one.f.flows.registry['privilege'] = data.privilege;
+                one.f.flows.modal.ajax.nodes(function(){/*Empty function. Do nothing. */})
+
                 callback(data);
             });
         }