def _qga_call_fsinfo(self, vm): """ Get file system information and disk mapping """ disks = [] mapping = {} ret = self.call_qga_command(vm, _QEMU_FSINFO_COMMAND) if ret is None: return {} for fs in ret: try: fsinfo = guestagenthelpers.translate_fsinfo(fs) except ValueError: self.log.warning('Invalid message returned to call \'%s\': %r', _QEMU_FSINFO_COMMAND, ret) continue # Skip stats with missing info. This is e.g. the case of System # Reserved volumes on Windows. if fsinfo['total'] != '' and fsinfo['used'] != '': disks.append(fsinfo) if _FS_DISK_FIELD not in fs: continue for d in fs[_FS_DISK_FIELD]: if _FS_DISK_SERIAL_FIELD in d and \ _FS_DISK_DEVICE_FIELD in d: dev = d[_FS_DISK_DEVICE_FIELD] m = _DISK_DEVICE_RE.match(dev) if m is not None: dev = m.group(1) self.log.debug('Stripping partition number: %s -> %s', d[_FS_DISK_DEVICE_FIELD], dev) mapping[d[_FS_DISK_SERIAL_FIELD]] = {'name': dev} return {'disksUsage': disks, 'diskMapping': mapping}
def _libvirt_fsinfo(self, info, store_disk_mapping=True): disks = [] mapping = {} for i in range(info.get('fs.count', 0)): prefix = 'fs.{:d}.'.format(i) try: fsinfo = guestagenthelpers.translate_fsinfo(info, i) except ValueError: self.log.warning( 'Invalid message returned to call \'%s\': %r', _QEMU_FSINFO_COMMAND, info) continue # Skip stats with missing info. This is e.g. the case of System # Reserved volumes on Windows. if fsinfo['total'] != '' and fsinfo['used'] != '': disks.append(fsinfo) # Store disk mapping if not store_disk_mapping: continue for di in range(info.get(prefix + 'disk.count')): disk_prefix = '{}disk.{:d}.'.format(prefix, di) if (disk_prefix + 'serial') in info and \ (disk_prefix + 'device') in info: dev = info[disk_prefix + 'device'] m = _DISK_DEVICE_RE.match(dev) if m is not None: dev = m.group(1) self.log.debug( 'Stripping partition number: %s -> %s', info[disk_prefix + 'device'], dev) mapping[info[disk_prefix + 'serial']] = {'name': dev} if store_disk_mapping: return {'disksUsage': disks, 'diskMapping': mapping} else: return {'disksUsage': disks}
def _execute(self): disks = [] mapping = {} ret = self._qga_poller.call_qga_command(self._vm, _QEMU_FSINFO_COMMAND) if ret is None: return for fs in ret: try: fsinfo = guestagenthelpers.translate_fsinfo(fs) except ValueError: self._qga_poller.log.warning( 'Invalid message returned to call \'%s\': %r', _QEMU_FSINFO_COMMAND, ret) continue # Skip stats with missing info. This is e.g. the case of System # Reserved volumes on Windows. if fsinfo['total'] != '' and fsinfo['used'] != '': disks.append(fsinfo) if _FS_DISK_FIELD not in fs: continue for d in fs[_FS_DISK_FIELD]: if _FS_DISK_SERIAL_FIELD in d and \ _FS_DISK_DEVICE_FIELD in d: mapping[d[_FS_DISK_SERIAL_FIELD]] = \ {'name': d[_FS_DISK_DEVICE_FIELD]} self._qga_poller.update_guest_info(self._vm.id, { 'disksUsage': disks, 'diskMapping': mapping })
def _execute(self): disks = [] mapping = {} ret = self._qga_poller.call_qga_command( self._vm, _QEMU_FSINFO_COMMAND) if ret is None: return for fs in ret: try: fsinfo = guestagenthelpers.translate_fsinfo(fs) except ValueError: self._qga_poller.log.warning( 'Invalid message returned to call \'%s\': %r', _QEMU_FSINFO_COMMAND, ret) continue # Skip stats with missing info. This is e.g. the case of System # Reserved volumes on Windows. if fsinfo['total'] != '' and fsinfo['used'] != '': disks.append(fsinfo) if _FS_DISK_FIELD not in fs: continue for d in fs[_FS_DISK_FIELD]: if _FS_DISK_SERIAL_FIELD in d and \ _FS_DISK_DEVICE_FIELD in d: mapping[d[_FS_DISK_SERIAL_FIELD]] = \ {'name': d[_FS_DISK_DEVICE_FIELD]} self._qga_poller.update_guest_info( self._vm.id, {'disksUsage': disks, 'diskMapping': mapping})
def test_translate_fsinfo(self): assert guestagenthelpers.translate_fsinfo({ 'name': 'dm-3', 'used-bytes': 123, 'total-bytes': 456, 'mountpoint': '/home', 'disk': [], 'type': 'ext4', }) == { 'fs': 'ext4', 'path': '/home', 'total': '456', 'used': '123', }
def test_translate_fsinfo(self): self.assertEqual( guestagenthelpers.translate_fsinfo({ 'name': 'dm-3', 'used-bytes': 123, 'total-bytes': 456, 'mountpoint': '/home', 'disk': [], 'type': 'ext4', }), { 'fs': 'ext4', 'path': '/home', 'total': '456', 'used': '123', }),
def _libvirt_fsinfo(self, info): disks = [] mapping = {} for i in range(info.get('fs.count', 0)): prefix = 'fs.{:d}.'.format(i) try: fsinfo = guestagenthelpers.translate_fsinfo(info, i) except ValueError: self.log.warning('Invalid message returned to call \'%s\': %r', _QEMU_FSINFO_COMMAND, info) continue # Skip stats with missing info. This is e.g. the case of System # Reserved volumes on Windows. if fsinfo['total'] != '' and fsinfo['used'] != '': disks.append(fsinfo) for di in range(info.get(prefix + 'disk.count')): disk_prefix = '{}disk.{:d}.'.format(prefix, di) if (disk_prefix + 'serial') in info and \ (disk_prefix + 'device') in info: mapping[info[disk_prefix + 'serial']] = \ {'name': info[disk_prefix + 'device']} return {'disksUsage': disks, 'diskMapping': mapping}