Пример #1
0
 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}
Пример #2
0
 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}
Пример #3
0
 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
     })
Пример #4
0
 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})
Пример #5
0
 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',
     }
Пример #6
0
 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',
         }),
Пример #7
0
 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}