def _check_drive_from_metadata_xml(self, data): desc = metadata.Descriptor() dom = FakeDomain.with_metadata(data.metadata_xml) desc.load(dom) attrs = common.get_drive_conf_identifying_attrs(data.conf) with desc.device(**attrs) as dev: self.assertEqual(dev, data.conf)
def _check_drive_to_metadata_xml(self, data): desc = metadata.Descriptor() attrs = common.get_drive_conf_identifying_attrs(data.conf) with desc.device(**attrs) as dev: dev.update(data.conf) dom = FakeDomain() desc.dump(dom) self.assertXMLEqual(list(dom.xml.values())[0], data.metadata_xml)
def dev_elems_from_xml(vm, xml): """ Return device instance building elements from provided XML. The XML must contain <devices> element with a single device subelement, the one to create the instance for. Depending on the device kind <metadata> element may be required to provide device metadata; the element may and needn't contain unrelated metadata. This function is used in device hot(un)plugs. Example `xml` value (top element tag may be arbitrary): <?xml version='1.0' encoding='UTF-8'?> <hotplug> <devices> <interface type="bridge"> <mac address="66:55:44:33:22:11"/> <model type="virtio" /> <source bridge="ovirtmgmt" /> <filterref filter="vdsm-no-mac-spoofing" /> <link state="up" /> <bandwidth /> </interface> </devices> <metadata xmlns:ns0="http://ovirt.org/vm/tune/1.0" xmlns:ovirt-vm="http://ovirt.org/vm/1.0"> <ovirt-vm:vm xmlns:ovirt-vm="http://ovirt.org/vm/1.0"> <ovirt-vm:device mac_address='66:55:44:33:22:11'> <ovirt-vm:network>test</ovirt-vm:network> <ovirt-vm:portMirroring> <ovirt-vm:network>network1</ovirt-vm:network> <ovirt-vm:network>network2</ovirt-vm:network> </ovirt-vm:portMirroring> </ovirt-vm:device> </ovirt-vm:vm> </metadata> </hotplug> :param xml: XML specifying the device as described above. :type xml: basestring :returns: Triplet (device_class, device_element, device_meta) where `device_class` is the class to be used to create the device instance; `device_element` and `device_meta` are objects to be passed as arguments to device_class `from_xml_tree` method. """ dom = xmlutils.fromstring(xml) devices = vmxml.find_first(dom, 'devices') dev_elem = next(vmxml.children(devices)) _dev_type, dev_class = identify_from_xml_elem(dev_elem) meta = vmxml.find_first(dom, 'metadata', None) if meta is None: md_desc = metadata.Descriptor() else: md_desc = metadata.Descriptor.from_xml(xmlutils.tostring(meta)) dev_meta = _get_metadata_from_elem_xml(vm.id, md_desc, dev_class, dev_elem) return dev_class, dev_elem, dev_meta
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 setUp(self): # empty descriptor self.md_desc = metadata.Descriptor() self.log = logging.getLogger('test')
def setUp(self): # empty descriptor self.md_desc = metadata.Descriptor()