Libvirt instance parser
Added unit test and made small modifications to the actual parser. Change-Id: I005340712ca2b17b7ca5a0517aa88f3cec7ee288
This commit is contained in:
@@ -101,47 +101,58 @@ def get_bridge_entry(bridge):
|
|||||||
return bridges.get(bridge)
|
return bridges.get(bridge)
|
||||||
|
|
||||||
|
|
||||||
# Parser functions (for each command). Each function has the sample input
|
def libvirt_instance_parser(data):
|
||||||
# as a comment above it.
|
"""Parse instances from libvirt instance-*.xml files.
|
||||||
'''
|
|
||||||
<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'/>
|
|
||||||
'''
|
|
||||||
|
|
||||||
|
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']
|
vm_dict = info['vms']
|
||||||
|
|
||||||
uuid = None
|
uuid = None
|
||||||
name = None
|
name = None
|
||||||
src_bridge = 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:
|
if m:
|
||||||
uuid = m.group(1)
|
uuid = m.group(1)
|
||||||
continue
|
continue
|
||||||
m = re.search('<nova:name>(\S+)</nova:name>', line)
|
m = re.search(r'<nova:name>(.*)</nova:name>', line)
|
||||||
if m:
|
if m:
|
||||||
name = m.group(1)
|
name = m.group(1)
|
||||||
continue
|
continue
|
||||||
m = re.search('<source bridge=\'(\S+)\'/>', line)
|
m = re.search(r'<source bridge=(.*)/>', line)
|
||||||
if m:
|
if m:
|
||||||
src_bridge = m.group(1)
|
src_bridge = m.group(1)
|
||||||
|
|
||||||
if not vm_dict.has_key(name):
|
if not vm_dict.has_key(name):
|
||||||
vm_dict[name] = {}
|
vm_dict[name] = {}
|
||||||
|
|
||||||
vm_entry = vm_dict[name]
|
vm_dict[name]['uuid'] = uuid
|
||||||
vm_entry['uuid'] = uuid
|
if not vm_dict[name].has_key('src_bridge'):
|
||||||
if not vm_entry.has_key('src_bridge'):
|
vm_dict[name]['src_bridge'] = []
|
||||||
vm_entry['src_bridge'] = []
|
vm_dict[name]['tap_dev'] = []
|
||||||
vm_entry['tap_dev'] = []
|
vm_dict[name]['src_bridge'].append(src_bridge)
|
||||||
vm_entry['src_bridge'].append(src_bridge)
|
vm_dict[name]['tap_dev'].append(src_bridge.replace('qbr', 'tap'))
|
||||||
vm_entry['tap_dev'].append(src_bridge.replace('qbr', 'tap'))
|
|
||||||
|
return vm_dict
|
||||||
|
|
||||||
|
|
||||||
'''
|
'''
|
||||||
@@ -713,7 +724,7 @@ commands = {
|
|||||||
'order': 1,
|
'order': 1,
|
||||||
'parser': nova_list_parser,
|
'parser': nova_list_parser,
|
||||||
},
|
},
|
||||||
'cat_instance':
|
'libvirt_instance':
|
||||||
{
|
{
|
||||||
'cmd': 'cat /etc/libvirt/qemu/instance-*.xml | egrep -e "<uuid>" -e "nova:name" -e "source bridge"',
|
'cmd': 'cat /etc/libvirt/qemu/instance-*.xml | egrep -e "<uuid>" -e "nova:name" -e "source bridge"',
|
||||||
'help': 'Collect some info from the launched VMs',
|
'help': 'Collect some info from the launched VMs',
|
||||||
@@ -721,7 +732,7 @@ commands = {
|
|||||||
'shell': True,
|
'shell': True,
|
||||||
'output': None,
|
'output': None,
|
||||||
'order': 2,
|
'order': 2,
|
||||||
'parser': cat_instance_parser,
|
'parser': libvirt_instance_parser,
|
||||||
},
|
},
|
||||||
'neutron_port_list':
|
'neutron_port_list':
|
||||||
{
|
{
|
||||||
@@ -978,7 +989,7 @@ def main():
|
|||||||
if cmd.startswith('netns_'):
|
if cmd.startswith('netns_'):
|
||||||
commands[cmd]['output'] = exec_on_remote(
|
commands[cmd]['output'] = exec_on_remote(
|
||||||
commands[cmd]['cmd'])
|
commands[cmd]['cmd'])
|
||||||
if cmd == 'cat_instance':
|
if cmd == 'libvirt_instance':
|
||||||
commands[cmd][
|
commands[cmd][
|
||||||
'output'] = get_vm_info_from_compute(
|
'output'] = get_vm_info_from_compute(
|
||||||
commands[cmd]['cmd'], my_env)
|
commands[cmd]['cmd'], my_env)
|
||||||
|
@@ -69,3 +69,27 @@ class TestOvsCollector(base.TestCase):
|
|||||||
self.assertIsNone(collector.get_bridge_entry(false_bridge))
|
self.assertIsNone(collector.get_bridge_entry(false_bridge))
|
||||||
self.assertEqual(dict(ports={}),
|
self.assertEqual(dict(ports={}),
|
||||||
collector.get_bridge_entry(supported_bridge))
|
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'))
|
||||||
|
Reference in New Issue
Block a user