From d3664d392b187f391ff9a0a5054717069593da80 Mon Sep 17 00:00:00 2001 From: Arie Date: Fri, 18 Nov 2016 12:47:39 +0200 Subject: [PATCH] Libvirt instance parser Added unit test and made small modifications to the actual parser. Change-Id: I005340712ca2b17b7ca5a0517aa88f3cec7ee288 --- openstack_dashboard/don/ovs/collector.py | 61 ++++++++++++--------- openstack_dashboard/tests/test_collector.py | 24 ++++++++ 2 files changed, 60 insertions(+), 25 deletions(-) diff --git a/openstack_dashboard/don/ovs/collector.py b/openstack_dashboard/don/ovs/collector.py index 0c64856..6a5c9d3 100644 --- a/openstack_dashboard/don/ovs/collector.py +++ b/openstack_dashboard/don/ovs/collector.py @@ -101,47 +101,58 @@ def get_bridge_entry(bridge): return bridges.get(bridge) -# Parser functions (for each command). Each function has the sample input -# as a comment above it. -''' - 31b1cfcc-ca85-48a9-a84a-8b222d377080 - VM1 - - f9743f1c-caeb-4892-af83-9dc0ac757545 - VM2 - -''' +def libvirt_instance_parser(data): + """Parse instances from libvirt instance-*.xml files. + Each block of instance data converted to a dictionary. + + Sample of data: + + 31b1cfcc-ca85-48a9-a84a-8b222d377080 + VM1 + + f9743f1c-caeb-4892-af83-9dc0ac757545 + VM2 + + + Result: + + 'VM1': {'uuid': '31b1cfcc-ca85-48a9-a84a-8b222d377080', + 'src_bridge': ['qbrb0f5cfc8-4d'], + 'tap_dev': ['qbrb0f5cfc8-4d'] + } + """ -def cat_instance_parser(parse_this): vm_dict = info['vms'] uuid = None name = None src_bridge = None - for line in parse_this: - m = re.search('(\S+)', line) + + for line in data: + m = re.search(r'(.*)', line) if m: uuid = m.group(1) continue - m = re.search('(\S+)', line) + m = re.search(r'(.*)', line) if m: name = m.group(1) continue - m = re.search('', line) + m = re.search(r'', line) if m: src_bridge = m.group(1) if not vm_dict.has_key(name): vm_dict[name] = {} - vm_entry = vm_dict[name] - vm_entry['uuid'] = uuid - if not vm_entry.has_key('src_bridge'): - vm_entry['src_bridge'] = [] - vm_entry['tap_dev'] = [] - vm_entry['src_bridge'].append(src_bridge) - vm_entry['tap_dev'].append(src_bridge.replace('qbr', 'tap')) + vm_dict[name]['uuid'] = uuid + if not vm_dict[name].has_key('src_bridge'): + vm_dict[name]['src_bridge'] = [] + vm_dict[name]['tap_dev'] = [] + vm_dict[name]['src_bridge'].append(src_bridge) + vm_dict[name]['tap_dev'].append(src_bridge.replace('qbr', 'tap')) + + return vm_dict ''' @@ -713,7 +724,7 @@ commands = { 'order': 1, 'parser': nova_list_parser, }, - 'cat_instance': + 'libvirt_instance': { 'cmd': 'cat /etc/libvirt/qemu/instance-*.xml | egrep -e "" -e "nova:name" -e "source bridge"', 'help': 'Collect some info from the launched VMs', @@ -721,7 +732,7 @@ commands = { 'shell': True, 'output': None, 'order': 2, - 'parser': cat_instance_parser, + 'parser': libvirt_instance_parser, }, 'neutron_port_list': { @@ -978,7 +989,7 @@ def main(): if cmd.startswith('netns_'): commands[cmd]['output'] = exec_on_remote( commands[cmd]['cmd']) - if cmd == 'cat_instance': + if cmd == 'libvirt_instance': commands[cmd][ 'output'] = get_vm_info_from_compute( commands[cmd]['cmd'], my_env) diff --git a/openstack_dashboard/tests/test_collector.py b/openstack_dashboard/tests/test_collector.py index f05c749..241eca4 100644 --- a/openstack_dashboard/tests/test_collector.py +++ b/openstack_dashboard/tests/test_collector.py @@ -69,3 +69,27 @@ class TestOvsCollector(base.TestCase): self.assertIsNone(collector.get_bridge_entry(false_bridge)) self.assertEqual(dict(ports={}), collector.get_bridge_entry(supported_bridge)) + + def test_libvirt_instance_parser(self): + + data = """ + 31b1cfcc-ca85-48a9-a84a-8b222d377080 + VM1 + + f9743f1c-caeb-4892-af83-9dc0ac757545 + VM2 + + """ + + parsed_data = collector.libvirt_instance_parser(data.split('\n')) + print parsed_data + + self.assertTrue(parsed_data.has_key('VM1')) + self.assertTrue(parsed_data['VM1'].has_key('uuid')) + self.assertTrue(parsed_data['VM1'].has_key('src_bridge')) + self.assertTrue(parsed_data['VM1'].has_key('tap_dev')) + + self.assertTrue(parsed_data.has_key('VM2')) + self.assertTrue(parsed_data['VM2'].has_key('uuid')) + self.assertTrue(parsed_data['VM2'].has_key('src_bridge')) + self.assertTrue(parsed_data['VM2'].has_key('tap_dev'))