Libvirt instance parser

Added unit test and made small modifications to the actual parser.

Change-Id: I005340712ca2b17b7ca5a0517aa88f3cec7ee288
This commit is contained in:
Arie 2016-11-18 12:47:39 +02:00
parent 7655ba63c7
commit d3664d392b
2 changed files with 60 additions and 25 deletions

View File

@ -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.
'''
<uuid>31b1cfcc-ca85-48a9-a84a-8b222d377080</uuid>
<nova:name>VM1</nova:name>
<source bridge='qbrb0f5cfc8-4d'/>
<uuid>f9743f1c-caeb-4892-af83-9dc0ac757545</uuid>
<nova:name>VM2</nova:name>
<source bridge='qbr6ce314cb-a5'/>
'''
def libvirt_instance_parser(data):
"""Parse instances from libvirt instance-*.xml files.
Each block of instance data converted to a dictionary.
Sample of data:
<uuid>31b1cfcc-ca85-48a9-a84a-8b222d377080</uuid>
<nova:name>VM1</nova:name>
<source bridge='qbrb0f5cfc8-4d'/>
<uuid>f9743f1c-caeb-4892-af83-9dc0ac757545</uuid>
<nova:name>VM2</nova:name>
<source bridge='qbr6ce314cb-a5'/>
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('<uuid>(\S+)</uuid>', line)
for line in data:
m = re.search(r'<uuid>(.*)</uuid>', line)
if m:
uuid = m.group(1)
continue
m = re.search('<nova:name>(\S+)</nova:name>', line)
m = re.search(r'<nova:name>(.*)</nova:name>', line)
if m:
name = m.group(1)
continue
m = re.search('<source bridge=\'(\S+)\'/>', line)
m = re.search(r'<source bridge=(.*)/>', 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 "<uuid>" -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)

View File

@ -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 = """
<uuid>31b1cfcc-ca85-48a9-a84a-8b222d377080</uuid>
<nova:name>VM1</nova:name>
<source bridge='qbrb0f5cfc8-4d'/>
<uuid>f9743f1c-caeb-4892-af83-9dc0ac757545</uuid>
<nova:name>VM2</nova:name>
<source bridge='qbr6ce314cb-a5'/>
"""
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'))