def from_xml_tree(cls, log, dev, meta): params = parse_device_params(dev) target = vmxml.find_first(dev, 'target') params['size'] = (int(vmxml.text(vmxml.find_first(target, 'size'))) / 1024) params['node'] = vmxml.text(vmxml.find_first(target, 'node')) return cls(log, **params)
def update_device_info(cls, vm, device_conf): conf_aliases = frozenset([getattr(conf, 'alias') for conf in device_conf if hasattr(conf, 'alias')]) dev_aliases = frozenset([dev['alias'] for dev in vm.conf['devices'] if 'alias' in dev]) for element in vm.domain.get_device_elements('memory'): address = find_device_guest_address(element) alias = find_device_alias(element) node = int(vmxml.text(vmxml.find_first(element, 'node'))) size = int(vmxml.text(vmxml.find_first(element, 'size'))) if alias not in conf_aliases: for conf in device_conf: if not hasattr(conf, 'alias') and \ conf.node == node and \ conf.size == size: conf.address = address conf.alias = alias break if alias not in dev_aliases: for dev in vm.conf['devices']: if dev['type'] == hwclass.MEMORY and \ dev.get('alias') is None and \ dev.get('node') == node and \ dev.get('size', 0) * 1024 == size: dev['address'] = address dev['alias'] = alias break
def update_device_info(cls, vm, device_conf): conf_aliases = frozenset([getattr(conf, 'alias') for conf in device_conf if hasattr(conf, 'alias')]) dev_aliases = frozenset([dev['alias'] for dev in vm.conf['devices'] if 'alias' in dev]) for element in vm.domain.get_device_elements('memory'): address, alias = parse_device_ident(element) node = int(vmxml.text(vmxml.find_first(element, 'node'))) size = int(vmxml.text(vmxml.find_first(element, 'size'))) if alias not in conf_aliases: for conf in device_conf: if not hasattr(conf, 'alias') and \ conf.node == node and \ conf.size == size: conf.address = address conf.alias = alias break if alias not in dev_aliases: for dev in vm.conf['devices']: if dev['type'] == hwclass.MEMORY and \ dev.get('alias') is None and \ dev.get('node') == node and \ dev.get('size', 0) * 1024 == size: dev['address'] = address dev['alias'] = alias break
def from_xml_tree(cls, log, dev, meta): params = { 'lease_id': vmxml.text(vmxml.find_first(dev, 'key')), 'sd_id': vmxml.text(vmxml.find_first(dev, 'lockspace')), 'path': vmxml.find_attr(dev, 'target', 'path'), 'offset': vmxml.find_attr(dev, 'target', 'offset'), } return cls(log, **params)
def from_xml_tree(cls, log, dev, meta): params = { 'lease_id': vmxml.text(vmxml.find_first(dev, 'key')), 'sd_id': vmxml.text(vmxml.find_first(dev, 'lockspace')), 'path': vmxml.find_attr(dev, 'target', 'path'), 'offset': vmxml.find_attr(dev, 'target', 'offset'), } return cls(log, **params)
def from_xml_tree(cls, log, dev, meta): params = parse_device_params(dev) target = vmxml.find_first(dev, 'target') params['size'] = ( int(vmxml.text(vmxml.find_first(target, 'size'))) / 1024 ) params['node'] = vmxml.text(vmxml.find_first(target, 'node')) return cls(log, **params)
def from_xml_tree(cls, log, dev, meta): params = { 'type': dev.tag, 'device': core.find_device_type(dev), 'lease_id': vmxml.text(vmxml.find_first(dev, 'key')), 'sd_id': vmxml.text(vmxml.find_first(dev, 'lockspace')), 'path': vmxml.find_attr(dev, 'target', 'path'), 'offset': vmxml.find_attr(dev, 'target', 'offset'), } core.update_device_params(params, dev) return cls(log, **params)
def parse_xml(dev, meta): params = { 'type': dev.tag, 'device': core.find_device_type(dev), 'lease_id': vmxml.text(vmxml.find_first(dev, 'key')), 'sd_id': vmxml.text(vmxml.find_first(dev, 'lockspace')), 'path': vmxml.find_attr(dev, 'target', 'path'), 'offset': vmxml.find_attr(dev, 'target', 'offset'), } core.update_device_params(params, dev) core.update_device_params_from_meta(params, meta) return params
def from_xml_tree(cls, log, dev, meta): params = { 'device': dev.tag, 'type': find_device_type(dev), } update_device_params(params, dev) target = vmxml.find_first(dev, 'target') params['size'] = ( int(vmxml.text(vmxml.find_first(target, 'size'))) / 1024 ) params['node'] = vmxml.text(vmxml.find_first(target, 'node')) return cls(log, **params)
def parse_xml(dev, meta): params = { 'type': dev.tag, 'device': core.find_device_type(dev), 'lease_id': vmxml.text(vmxml.find_first(dev, 'key')), 'sd_id': vmxml.text(vmxml.find_first(dev, 'lockspace')), 'path': vmxml.find_attr(dev, 'target', 'path'), 'offset': vmxml.find_attr(dev, 'target', 'offset'), } core.update_device_params(params, dev) core.update_device_params_from_meta(params, meta) return params
def from_xml_tree(cls, log, dev, meta): params = { 'device': dev.tag, 'type': find_device_type(dev), } update_device_params(params, dev) target = vmxml.find_first(dev, 'target') params['size'] = ( int(vmxml.text(vmxml.find_first(target, 'size'))) // 1024 ) params['node'] = vmxml.text(vmxml.find_first(target, 'node')) update_device_params_from_meta(params, meta) return cls(log, **params)
def from_xml_tree(cls, log, dev, meta): params = { 'device': core.find_device_type(dev), 'type': dev.tag, 'custom': meta.get('custom', {}), 'vmid': meta['vmid'], 'vm_custom': {}, 'specParams': {}, } core.update_device_params(params, dev) params.update(core.get_xml_elem(dev, 'macAddr', 'mac', 'address')) params.update(core.get_xml_elem(dev, 'nicModel', 'model', 'type')) params.update(core.get_xml_elem(dev, 'bootOrder', 'boot', 'order')) if params['device'] == 'hostdev': params.update(_get_hostdev_params(dev)) link = vmxml.find_first(dev, 'link', None) if link is not None: if link.attrib.get('state', 'down') == 'down': params['linkActive'] = False else: params['linkActive'] = True vlan = vmxml.find_first(dev, 'vlan', None) if vlan is not None: params['specParams']['vlanid'] = vmxml.find_attr(vlan, 'tag', 'id') mtu = vmxml.find_first(dev, "mtu", None) if mtu is not None: params['mtu'] = int(vmxml.attr(mtu, 'size')) filterref = vmxml.find_first(dev, 'filterref', None) if filterref is not None: params['filter'] = vmxml.attr(filterref, 'filter') params['filterParameters'] = [{ 'name': param.attrib['name'], 'value': param.attrib['value'], } for param in vmxml.find_all(filterref, 'parameter')] driver = vmxml.find_first(dev, 'driver', None) if driver is not None: params['custom'].update( core.parse_device_attrs(driver, ('queues', ))) sndbuf = dev.find('./tune/sndbuf') if sndbuf is not None: params['vm_custom']['sndbuf'] = vmxml.text(sndbuf) bandwidth = vmxml.find_first(dev, 'bandwidth', None) if bandwidth is not None: for mode in ('inbound', 'outbound'): elem = vmxml.find_first(bandwidth, mode, None) if elem is not None: params['specParams'][mode] = elem.attrib.copy() net = (meta.get('network', None) or vmxml.find_attr(dev, 'source', 'bridge')) if net is None: raise MissingNetwork("no network to join") params['network'] = net _update_port_mirroring(params, meta) core.update_device_params_from_meta(params, meta) return cls(log, **params)
def get_memory_size(self, current=False): """ Return the vm memory from xml in MiB. :param current: If true, return current memory size (which may be reduced by balloon); if false, return boot time memory size. :type current: bool """ tag = 'currentMemory' if current else 'memory' memory = vmxml.find_first(self._dom, tag, None) return int(vmxml.text(memory)) // 1024 if memory is not None else None
def from_xml_tree(cls, log, dev, meta): params = parse_device_params(dev, attrs=('model', )) params['specParams'] = parse_device_attrs( vmxml.find_first(dev, 'rate'), ('period', 'bytes') ) params['specParams']['source'] = rngsources.get_source_name( vmxml.text(vmxml.find_first(dev, 'backend')) ) params['vmid'] = meta['vmid'] return cls(log, **params)
def from_xml_tree(cls, log, dev, meta): params = parse_device_params(dev, attrs=('model', )) params['specParams'] = {} rate = vmxml.find_first(dev, 'rate', None) if rate is not None: params['specParams'].update( parse_device_attrs(rate, ('period', 'bytes'))) params['specParams']['source'] = rngsources.get_source_name( vmxml.text(vmxml.find_first(dev, 'backend'))) params['vmid'] = meta['vmid'] return cls(log, **params)
def collect_inner_elements(el, d): """ This helper method collects all nodes in el and adds them to dictionary d. :param el: XML DOM element object with text only children :param d: Dictionary to add the values to """ for chel in vmxml.children(el): try: d[vmxml.tag(chel)] = int(vmxml.text(chel)) except (IndexError, ValueError): log.exception("Invalid value for %s", vmxml.tag(chel))
def drive_from_element(disk_devices, disk_element): # we try serial first for backward compatibility # REQUIRED_FOR: vdsm <= 4.2 serial_elem = vmxml.find_first(disk_element, 'serial', None) if serial_elem is not None: serial = vmxml.text(serial_elem) try: return drive_by_serial(disk_devices, serial) except LookupError: pass # try again by alias before to give up alias = core.find_device_alias(disk_element) return device_by_alias(disk_devices, alias)
def drive_from_element(disk_devices, disk_element): # we try serial first for backward compatibility # REQUIRED_FOR: vdsm <= 4.2 serial_elem = vmxml.find_first(disk_element, 'serial', None) if serial_elem is not None: serial = vmxml.text(serial_elem) try: return drive_by_serial(disk_devices, serial) except LookupError: pass # try again by alias before to give up alias = core.find_device_alias(disk_element) return device_by_alias(disk_devices, alias)
def collect_inner_elements(el, d): """ This helper method collects all nodes in el and adds them to dictionary d. :param el: XML DOM element object with text only children :param d: Dictionary to add the values to """ for chel in vmxml.children(el): try: d[vmxml.tag(chel)] = int(vmxml.text(chel)) except (IndexError, ValueError): log.exception("Invalid value for %s", vmxml.tag(chel))
def from_xml_tree(cls, log, dev, meta): params = {'type': find_device_type(dev)} update_device_params(params, dev, attrs=('model', )) params['device'] = params['model'] rate = vmxml.find_first(dev, 'rate', None) if rate is not None: params['specParams'] = parse_device_attrs( rate, ('period', 'bytes') ) else: params['specParams'] = {} params['specParams']['source'] = rngsources.get_source_name( vmxml.text(vmxml.find_first(dev, 'backend')) ) update_device_params_from_meta(params, meta) params['vmid'] = meta['vmid'] return cls(log, **params)
def update_device_info(cls, vm, device_conf): for rng in vm.domain.get_device_elements('rng'): address, alias = parse_device_ident(rng) source = vmxml.text(vmxml.find_first(rng, 'backend')) for dev in device_conf: if dev.uses_source(source) and not hasattr(dev, 'alias'): dev.address = address dev.alias = alias break for dev in vm.conf['devices']: if dev['type'] == hwclass.RNG and \ Rng.matching_source(dev, source) and \ 'alias' not in dev: dev['address'] = address dev['alias'] = alias break
def update_device_info(cls, vm, device_conf): for rng in vm.domain.get_device_elements('rng'): address = find_device_guest_address(rng) alias = find_device_alias(rng) source = vmxml.text(vmxml.find_first(rng, 'backend')) for dev in device_conf: if dev.uses_source(source) and not hasattr(dev, 'alias'): dev.address = address dev.alias = alias break for dev in vm.conf['devices']: if dev['type'] == hwclass.RNG and \ Rng.matching_source(dev, source) and \ 'alias' not in dev: dev['address'] = address dev['alias'] = alias break
def from_xml_tree(cls, log, dev, meta): params = { 'custom': {}, 'vm_custom': {}, 'specParams': {}, } params.update(core.parse_device_params(dev)) params['device'] = params['type'] params.update(_get_xml_elem(dev, 'macAddr', 'mac', 'address')) params.update(_get_xml_elem(dev, 'nicModel', 'model', 'type')) params.update(_get_xml_elem(dev, 'bootOrder', 'boot', 'order')) filterref = vmxml.find_first(dev, 'filterref', None) if filterref is not None: params['filter'] = vmxml.attr(filterref, 'filter') params['filterParameters'] = { param.attrib['name']: param.attrib['value'] for param in vmxml.find_all(filterref, 'parameter') } driver = vmxml.find_first(dev, 'driver', None) if driver is not None: params['custom'].update( core.parse_device_attrs(driver, ('queues', ))) sndbuf = dev.find('./tune/sndbuf') if sndbuf is not None: params['vm_custom']['sndbuf'] = vmxml.text(sndbuf) bandwidth = vmxml.find_first(dev, 'bandwidth', None) if bandwidth is not None: for mode in ('inbound', 'outbound'): elem = vmxml.find_first(bandwidth, mode, None) if elem is not None: params['specParams'][mode] = elem.attrib.copy() net = (meta.get('network', None) or vmxml.find_attr(dev, 'source', 'bridge')) if net is None: raise RuntimeError('could not detect the network to join') params['network'] = net return cls(log, **params)
def get_memory_size(self): """ Return the vm memory from xml in MiB """ memory = vmxml.find_first(self._dom, "memory", None) return int(vmxml.text(memory)) // 1024 if memory is not None else None
def get_identifying_attrs(cls, dev_elem): return { 'devtype': core.dev_class_from_dev_elem(dev_elem), 'name': vmxml.text(vmxml.find_first(dev_elem, 'key')), }
def _update_serial_params(params, dev): serial = vmxml.find_first(dev, 'serial', None) if serial is not None: params['serial'] = vmxml.text(serial)
def get_identifying_attrs(cls, dev_elem): return { 'devtype': core.dev_class_from_dev_elem(dev_elem), 'name': vmxml.text(vmxml.find_first(dev_elem, 'key')), }
def test_text(self, tag, result): element = vmxml.find_first(self._dom, tag) text = vmxml.text(element) self.assertEqual(text, result)
def _update_serial_params(params, dev): serial = vmxml.find_first(dev, 'serial', None) if serial is not None: params['serial'] = vmxml.text(serial)
def test_text(self, tag, result): element = vmxml.find_first(self._dom, tag) text = vmxml.text(element) assert text == result
def test_text(self, tag, result): element = vmxml.find_first(self._dom, tag) text = vmxml.text(element) self.assertEqual(text, result)