2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-28 21:07:47 +00:00
ovs/tests/ovsdb-monitor-sort.py
Ben Pfaff d4cd4d301b tests: Convert ovsdb-monitor-sort utility from Perl to Python.
Perl is unfashionable and Python is more widely available and understood,
so this commit converts one of the OVS uses of Perl into Python.

Signed-off-by: Ben Pfaff <blp@ovn.org>
Acked-by: Aaron Conole <aconole@redhat.com>
2017-11-26 16:08:01 -08:00

86 lines
1.9 KiB
Python
Executable File

#! /usr/bin/env python
# Breaks lines read from stdin into groups using blank lines as
# group separators, then sorts lines within the groups for
# reproducibility.
import re
import sys
# This is copied out of the Python Sorting HOWTO at
# https://docs.python.org/3/howto/sorting.html#sortinghowto
def cmp_to_key(mycmp):
'Convert a cmp= function into a key= function'
class K(object):
def __init__(self, obj, *args):
self.obj = obj
def __lt__(self, other):
return mycmp(self.obj, other.obj) < 0
def __gt__(self, other):
return mycmp(self.obj, other.obj) > 0
def __eq__(self, other):
return mycmp(self.obj, other.obj) == 0
def __le__(self, other):
return mycmp(self.obj, other.obj) <= 0
def __ge__(self, other):
return mycmp(self.obj, other.obj) >= 0
def __ne__(self, other):
return mycmp(self.obj, other.obj) != 0
return K
u = '[0-9a-fA-F]'
uuid_re = re.compile(r'%s{8}-%s{4}-%s{4}-%s{4}-%s{12}' % ((u,) * 5))
def cmp(a, b):
return (a > b) - (a < b)
def compare_lines(a, b):
if uuid_re.match(a):
if uuid_re.match(b):
return cmp(a[36:], b[36:])
else:
return 1
elif uuid_re.match(b):
return -1
else:
return cmp(a, b)
def output_group(group, dst):
for x in sorted(group, key=cmp_to_key(compare_lines)):
dst.write(x)
def ovsdb_monitor_sort(src, dst):
group = []
while True:
line = src.readline()
if not line:
break
if line.rstrip() == '':
output_group(group, dst)
group = []
dst.write(line)
elif line.startswith(',') and group:
group[len(group) - 1] += line
else:
group.append(line)
if group:
output_group(group, dst)
if __name__ == '__main__':
ovsdb_monitor_sort(sys.stdin, sys.stdout)