Didn't review this one super closely. The approach looks fine. I assume you tested it.
Ethan On Tue, May 3, 2011 at 10:17, Ben Pfaff <[email protected]> wrote: > The format of "ovs-dpctl dump-flows" has completely changed since > ovsdbmonitor was written. It seems like no one has tried out ovsdbmonitor > since the rewrite, because it didn't work at all. This commit fixes the > parser. > --- > ovsdb/ovsdbmonitor/OVEFlowWindow.py | 6 ++- > ovsdb/ovsdbmonitor/OVEUtil.py | 76 ++++++++++++++++------------------ > 2 files changed, 40 insertions(+), 42 deletions(-) > > diff --git a/ovsdb/ovsdbmonitor/OVEFlowWindow.py > b/ovsdb/ovsdbmonitor/OVEFlowWindow.py > index ebcf466..e5a29a9 100644 > --- a/ovsdb/ovsdbmonitor/OVEFlowWindow.py > +++ b/ovsdb/ovsdbmonitor/OVEFlowWindow.py > @@ -1,3 +1,4 @@ > +# Copyright (c) 2011 Nicira Networks. > # Copyright (c) 2010 Citrix Systems, Inc. > # > # Licensed under the Apache License, Version 2.0 (the "License"); > @@ -22,6 +23,8 @@ from OVECommonWindow import * > > from Ui_FlowWindow import * > > +import re > + > class OVEFlowWindow(QtGui.QMainWindow, OVECommonWindow): > LOAD_KEY = 'FlowWindow/window' > COMMAND_OVS_DPCTL='/usr/bin/ovs-dpctl' > @@ -231,7 +234,6 @@ class OVEFlowWindow(QtGui.QMainWindow, OVECommonWindow): > colour = Qt.black > > for colNum, data in enumerate(flow): > - > item = None > try: > item = table.takeItem(rowNum, colNum) > @@ -245,7 +247,7 @@ class OVEFlowWindow(QtGui.QMainWindow, OVECommonWindow): > elif colNum == srcMacColumn or colNum == > destMacColumn: > cols = [int(x, 16) for x in data.split(':')] > > item.setBackground(QtGui.QColor(255-cols[2]*cols[3] % 192, > 255-cols[3]*cols[4] % 192, 255-cols[4]*cols[5] % 192)) > - elif colNum == srcIPColumn or colNum == destIPColumn: > + elif re.match(r'[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+', > str(data)): > cols = [int(x) for x in data.split('.')] > > item.setBackground(QtGui.QColor(255-cols[1]*cols[2] % 192, > 255-cols[2]*cols[3] % 192, 255-cols[3]*cols[0] % 192)) > else: > diff --git a/ovsdb/ovsdbmonitor/OVEUtil.py b/ovsdb/ovsdbmonitor/OVEUtil.py > index 340d9b1..774bed2 100644 > --- a/ovsdb/ovsdbmonitor/OVEUtil.py > +++ b/ovsdb/ovsdbmonitor/OVEUtil.py > @@ -1,3 +1,4 @@ > +# Copyright (c) 2011 Nicira Networks. > # Copyright (c) 2010 Citrix Systems, Inc. > # > # Licensed under the Apache License, Version 2.0 (the "License"); > @@ -15,6 +16,7 @@ > from OVEStandard import * > > from OVEConfig import * > +import re > > class OVEUtil: > UUID_RE = > re.compile(r'([a-f0-9]{8}-[a-f0-9]{2})[a-f0-9]{2}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}') > @@ -87,48 +89,42 @@ class OVEUtil: > @classmethod > def decodeFlows(cls, srcLines): > retVal = [] > - flowRe = re.compile( > - # To fix this regexp: > - # Comment out lines, starting from the bottom, until it works, > then fix the one you stopped at > - '^' + > - r'tunnel([^:]*):'+ # Tunnel: tunnel00000000 > - r'in_port([^:]+):' + # in_port: in_port0002 > - r'vlan([^:]+):' + #VLAN: vlan65535 > - r'([^ ]*) ' + # PCP: pcp0 > - r'mac(.{17})->' + # Source MAC: mac00:16:76:c8:1f:c9-> > - r'(.{17}) ' + # Dest MAC: mac00:16:76:c8:1f:c9 > - r'type([^ ]+) ' + #Type: type05ff > - r'proto([^ ]+) ' + #Proto: proto0 > - r'(tos[^ ]+) ' + #Tos: tos0 > - r'ip(\d+\.\d+\.\d+\.\d+)->' + # Source IP: ip1.2.3.4-> > - r'(\d+\.\d+\.\d+\.\d+) ' + # Dest IP: 1.2.3.4 > - r'port(\d+)->' + # Source port: port0-> > - r'(\d+),\s*' + # Dest port: 0 > - r'packets:(\d*),\s*' + # Packets: packets:3423, > - r'bytes:(\d*),\s*' + # Bytes: bytes:272024, > - r'used:([^,]+),\s*' + # Used: used:0.870s, > - r'actions:(\w+)\s*' + # Actions: actions:drop > - '' > - ) > for line in srcLines.split('\n'): > if line != '': > - match = flowRe.match(line) > - if not match: > - OVELog("Could not decode flow record '"+line+"'. > Abandoning") > - return retVal > - else: > - tunnel, inport, vlan, pcp, srcmac, destmac, type, proto, > tos, srcip, destip, srcport, destport, packets, bytes, used, actions = > match.groups() > - tunnel = int(tunnel) > - inport = int(inport) > - vlan = int(vlan) > - type = cls.ETHERTYPE_TRANS.get(type, type) > - proto = cls.ETHERPROTO_TRANS.get(proto, proto) > - srcport = int(srcport) > - destport = int(destport) > - packets = long(packets) > - bytes = long(bytes) > - # Order below needs to match that in flowDecodeHeadings > - retVal.append((type, proto, inport, vlan, srcmac, > destmac, srcip, destip, srcport, destport, packets, bytes, used, tos, pcp, > tunnel, actions)) > + fields = {} > + for name, val in re.findall(r'([a-zA-Z0-9_+]+)\(([^)]+)\)', > line): > + if '=' in val: > + for setting in val.split(','): > + k,v = setting.split('=') > + fields['%s.%s' % (name, k)] = v > + else: > + fields[name] = val > + for setting in re.split(', ', line)[1:]: > + if ':' in setting: > + k,v = setting.split(':') > + fields[k] = v > + > + tun_id = fields.get('tun_id', '') > + in_port = int(fields.get('in_port', 0)) > + eth_src = fields.get('eth.src', '') > + eth_dst = fields.get('eth.dst', '') > + vlan_vid = int(fields.get('vlan.vid', 0)) > + vlan_pcp = int(fields.get('vlan.pcp', 0)) > + eth_type = fields.get('eth_type', '') > + ip_src = fields.get('ipv4.src', fields.get('ipv6.src', '')) > + ip_dst = fields.get('ipv4.dst', fields.get('ipv6.dst', '')) > + ip_proto = fields.get('ipv4.proto', fields.get('ipv6.proto', > '')) > + ip_tos = fields.get('ipv4.tos', fields.get('ipv6.tos', '')) > + tp_src = fields.get('tcp.src', fields.get('udp.src', > fields.get('arp.sip', fields.get('icmp.type', fields.get('icmpv6.type', > ''))))) > + tp_dst = fields.get('tcp.dst', fields.get('udp.dst', > fields.get('arp.tip', fields.get('icmp.code', fields.get('icmpv6.code', > ''))))) > + > + packets = fields.get('packets', '') > + bytes = fields.get('bytes', '') > + actions = fields.get('actions', '') > + used = fields.get('used', '') > + > + # Order below needs to match that in flowDecodeHeadings > + retVal.append((eth_type, ip_proto, in_port, vlan_vid, > eth_src, eth_dst, ip_src, ip_dst, tp_src, tp_dst, packets, bytes, used, > ip_tos, vlan_pcp, tun_id, actions)) > > return retVal > > -- > 1.7.4.4 > > _______________________________________________ > dev mailing list > [email protected] > http://openvswitch.org/mailman/listinfo/dev > _______________________________________________ dev mailing list [email protected] http://openvswitch.org/mailman/listinfo/dev
