def test_context_creates_missing_element(self): # libvirt takes care of namespace massaging expected_xml = u'''<vm />''' dom = FakeDomain() self.md_desc.dump(dom) self.assertXMLEqual(dom.xml.get(xmlconstants.METADATA_VM_VDSM_URI), expected_xml)
def test_lookup_fail(self): dom_xml = u'''<vm> <device id='alias0' type='fancydev'> <mode type="int">42</mode> </device> </vm>''' dom = FakeDomain.with_metadata(dom_xml) self.md_desc.load(dom) with self.md_desc.device(id='alias999', type='fancydev') as dev: self.assertEqual(dev, {})
def test_lookup_partial_attributes(self): dom_xml = u'''<vm> <device id='alias0' type='fancydev'> <mode type="int">42</mode> </device> <device id='alias1'> <mode type="int">33</mode> </device> </vm>''' dom = FakeDomain.with_metadata(dom_xml) self.md_desc.load(dom) with self.md_desc.device(type='fancydev') as dev: self.assertEqual(dev, {'mode': 42})
def test_deeply_nested_metadata_preserved(self): conf = { 'device': 'cdrom', 'iface': 'ide', 'index': '3', 'path': '', 'readonly': 'true', 'specParams': { 'vmPayload': { 'file': { 'openstack/content/0000': 'something', 'openstack/latest/meta_data.json': 'something', 'openstack/latest/user_data': 'something', }, 'volId': 'config-2', } }, 'type': 'disk', } expected_xml = """<?xml version='1.0' encoding='UTF-8'?> <vm> <device name="hdd" devtype="disk"> <device>cdrom</device> <iface>ide</iface> <index>3</index> <path /> <readonly>true</readonly> <type>disk</type> <specParams> <vmPayload> <volId>config-2</volId> <file path='openstack/content/0000'>something</file> <file path='openstack/latest/meta_data.json'>something</file> <file path='openstack/latest/user_data'>something</file> </vmPayload> </specParams> </device> </vm>""" desc = metadata.Descriptor() with desc.device(devtype=conf['type'], name=drivename.make(conf['iface'], conf['index'])) as dev: dev.update(conf) dom = FakeDomain() desc.dump(dom) # the first dump() used to -wrongly- modify the supplied data desc.dump(dom) for produced_xml in dom.xml.values(): self.assertXMLEqual(produced_xml, expected_xml)
def test_lookup_ambiguous_raises(self): dom_xml = u'''<vm> <device type='fancydev'> <mode type="int">1</mode> </device> <device type='fancydev'> <mode type="int">2</mode> </device> </vm>''' dom = FakeDomain.with_metadata(dom_xml) self.md_desc.load(dom) with self.assertRaises(metadata.MissingDevice): with self.md_desc.device(type='fancydev'): pass
def test_lookup_multiple_devices(self): dom_xml = u'''<vm> <device id='alias0' type='devA' addr='pci_0000_00_1a_0'> <mode type="int">1200</mode> </device> <device id='alias1' type='devA' addr='pci_0000_00_02_0'> <mode type="int">900</mode> </device> <device id='alias2' type='devC' addr='pci_0000_00_1f_2'> <mode type="int">1440</mode> </device> </vm>''' dom = FakeDomain.with_metadata(dom_xml) self.md_desc.load(dom) with self.md_desc.device(addr='pci_0000_00_02_0') as dev: self.assertEqual(dev, {'mode': 900})
def test_clear(self): dom_xml = u'''<vm> <device id='alias0'> <mode>12</mode> </device> </vm>''' expected_xml = u'''<vm/>''' dom = FakeDomain.with_metadata(dom_xml) self.md_desc.load(dom) with self.md_desc.device(id='alias0') as dev: dev.clear() self.md_desc.dump(dom) produced_xml = dom.metadata(libvirt.VIR_DOMAIN_METADATA_ELEMENT, xmlconstants.METADATA_VM_VDSM_URI, 0) self.assertXMLEqual(produced_xml, expected_xml)
def test_all_devices(self): dom_xml = u'''<vm> <device type='fancydev'> <mode type="int">1</mode> </device> <device class='otherdev' foo='1'> <mode type="float">0.333</mode> </device> <device type='fancydev' extra='ignored'> <mode type="int">2</mode> </device> </vm>''' dom = FakeDomain.with_metadata(dom_xml) self.md_desc.load(dom) assert list(self.md_desc.all_devices(type='fancydev')) == \ [{'mode': 1}, {'mode': 2}]
def test_all_devices_copy_data(self): dom_xml = u'''<vm> <device type='fancydev'> <mode type="int">1</mode> </device> <device type='fancydev' extra='ignored'> <mode type="int">2</mode> </device> </vm>''' dom = FakeDomain.with_metadata(dom_xml) self.md_desc.load(dom) for dev in self.md_desc.all_devices(type='fancydev'): dev['mode'] = 3 assert list(self.md_desc.all_devices(type='fancydev')) == \ [{'mode': 1}, {'mode': 2}]
def test_update_domain(self): # libvirt takes care of namespace massaging base_xml = u'''<vm> <foobar type="int">21</foobar> </vm>''' expected_xml = u'''<vm> <beer>cold</beer> <foobar type="int">42</foobar> </vm>''' dom = FakeDomain() dom.xml[xmlconstants.METADATA_VM_VDSM_URI] = base_xml self.md_desc.load(dom) with self.md_desc.values() as vals: vals['foobar'] = 42 vals['beer'] = 'cold' self.md_desc.dump(dom) self.assertXMLEqual(dom.xml.get(xmlconstants.METADATA_VM_VDSM_URI), expected_xml)
def test_load_overwrites_content(self): test_xml = u"""<?xml version="1.0" encoding="utf-8"?> <domain type="kvm" xmlns:ovirt-vm="http://ovirt.org/vm/1.0"> <uuid>68c1f97c-9336-4e7a-a8a9-b4f052ababf1</uuid> <metadata> <ovirt-vm:vm> <ovirt-vm:version type="float">4.2</ovirt-vm:version> <ovirt-vm:custom> <ovirt-vm:foo>bar</ovirt-vm:foo> </ovirt-vm:custom> </ovirt-vm:vm> </metadata> </domain>""" md_desc = metadata.Descriptor.from_xml(test_xml) dom = FakeDomain() md_desc.load(dom) with md_desc.values() as vals: self.assertEqual(vals, {}) self.assertEqual(md_desc.custom, {})
def test_update_device(self, dom_xml): expected_res = { 'flag': True, 'mode': 42, } dom = FakeDomain.with_metadata(dom_xml) self.md_desc.load(dom) with self.md_desc.device(id='alias0') as dev: dev['mode'] = 42 dev['flag'] = True dev.pop('removeme', None) self.md_desc.dump(dom) # troubleshooting helper should the test fail print( dom.metadata(libvirt.VIR_DOMAIN_METADATA_ELEMENT, xmlconstants.METADATA_VM_VDSM_URI, 0)) # our assertXMLEqual consider the order of XML attributes # significant, while according to XML spec is not. with self.md_desc.device(id='alias0') as dev: self.assertEqual(dev, expected_res)
def test_get_device(self, dom_xml, expected_dev): dom = FakeDomain.with_metadata(dom_xml) self.md_desc.load(dom) with self.md_desc.device(id='alias0') as dev: self.assertEqual(dev, expected_dev)
def test_empty_get(self): dom = FakeDomain() self.md_desc.load(dom) with self.md_desc.values() as vals: self.assertEqual(vals, {})
def test_empty_get(self): dom = FakeDomain() self.md_desc.load(dom) with self.md_desc.values() as vals: assert vals == {}