Merge "Better parsing of flow table in mininet"
diff --git a/TestON/drivers/common/cli/emulator/mininetclidriver.py b/TestON/drivers/common/cli/emulator/mininetclidriver.py
index 3c891fc..4d1262e 100644
--- a/TestON/drivers/common/cli/emulator/mininetclidriver.py
+++ b/TestON/drivers/common/cli/emulator/mininetclidriver.py
@@ -1911,7 +1911,7 @@
main.log.info( flow2 )
return main.FALSE
- def parseFlowTable( self, flows, debug=True ):
+ def parseFlowTable( self, flowTable, version="", debug=True ):
'''
Discription: Parses flows into json format.
NOTE: this can parse any string thats separated with commas
@@ -1923,30 +1923,74 @@
debug: prints out the final result
returns: A list of flows in json format
'''
- # Parse the flows
- jsonFlows = []
- for flow in flows:
- # split on the comma
- flow = flow.split(",")
- # get rid of empty elements
- flow = [f for f in flow if f != ""]
+ jsonFlowTable = []
+ for flow in flowTable:
jsonFlow = {}
- for f in flow:
- # separate the key and the value
- if "=" in f:
- f = f.split("=")
- key = f[0]
- # get rid of unwanted spaces
- if key[0] == " ": key = key[1:]
- val = f[1]
- jsonFlow.update( {key:val} )
- jsonFlows.append( jsonFlow )
+ # split up the fields of the flow
+ parsedFlow = flow.split(", ")
+ # get rid of any spaces in front of the field
+ for i in range( len(parsedFlow) ):
+ item = parsedFlow[i]
+ if item[0] == " ":
+ parsedFlow[i] = item[1:]
+ # grab the selector and treatment from the parsed flow
+ # the last element is the selector and the treatment
+ temp = parsedFlow.pop(-1)
+ # split up the selector and the treatment
+ temp = temp.split(" ")
+ index = 0
+ # parse the flags
+ # NOTE: This only parses one flag
+ flag = {}
+ if version == "1.3":
+ flag = {"flag":[temp[index]]}
+ index += 1
+ # the first element is the selector and split it up
+ sel = temp[index]
+ index += 1
+ sel = sel.split(",")
+ # the priority is stuck in the selecter so put it back
+ # in the flow
+ parsedFlow.append(sel.pop(0))
+ # parse selector
+ criteria = []
+ for item in sel:
+ # this is the type of the packet e.g. "arp"
+ if "=" not in item:
+ criteria.append( {"type":item} )
+ else:
+ field = item.split("=")
+ criteria.append( {field[0]:field[1]} )
+ selector = {"selector": {"criteria":criteria} }
+ treat = temp[index]
+ # get rid of the action part e.g. "action=output:2"
+ # we will add it back later
+ treat = treat.split("=")
+ treat.pop(0)
+ # parse treatment
+ action = []
+ for item in treat:
+ field = item.split(":")
+ action.append( {field[0]:field[1]} )
+ # create the treatment field and add the actions
+ treatment = {"treatment": {"action":action} }
+ # parse the rest of the flow
+ for item in parsedFlow:
+ field = item.split("=")
+ jsonFlow.update( {field[0]:field[1]} )
+ # add the treatment and the selector to the json flow
+ jsonFlow.update( selector )
+ jsonFlow.update( treatment )
+ jsonFlow.update( flag )
- if debug: print "jsonFlows:\n{}\n\n".format(jsonFlows)
+ if debug: main.log.debug( "\033[94mJson flow:\033[0m\n{}\n".format(jsonFlow) )
- return jsonFlows
+ # add the json flow to the json flow table
+ jsonFlowTable.append( jsonFlow )
- def getFlowTable( self, sw, version="1.3", debug=True):
+ return jsonFlowTable
+
+ def getFlowTable( self, sw, version="", debug=True):
'''
Discription: Returns the flow table(s) on a switch or switches in a list.
Each element is a flow.
@@ -1968,9 +2012,10 @@
for s in switches:
cmd = "sh ovs-ofctl dump-flows " + s
- if "1.3" in version:
+ if "1.0" == version:
+ cmd += " -F OpenFlow10-table_id"
+ elif "1.3" == version:
cmd += " -O OpenFlow13"
- else: cmd += " -F OpenFlow10-table_id"
main.log.info( "Sending: " + cmd )
self.handle.sendline( cmd )
@@ -1986,7 +2031,7 @@
if debug: print "Flows:\n{}\n\n".format(flows)
- return self.parseFlowTable( flows, debug )
+ return self.parseFlowTable( flows, version, debug )
except pexpect.TIMEOUT:
main.log.exception( self.name + ": Command timed out" )