def __init__(self, pid, ifids): """ Initialize a HostSample. :param pid: The PID of this vdsm host. :type pid: int :param ifids: The IDs of the interfaces you want to sample. :type: list """ BaseSample.__init__(self, pid, ifids) self.totcpu = TotalCpuSample() meminfo = utils.readMemInfo() freeOrCached = (meminfo['MemFree'] + meminfo['Cached'] + meminfo['Buffers']) self.memUsed = 100 - int(100.0 * (freeOrCached) / meminfo['MemTotal']) self.anonHugePages = meminfo.get('AnonHugePages', 0) / 1024 try: self.cpuLoad = file('/proc/loadavg').read().split()[1] except: self.cpuLoad = '0.0' self.diskStats = self._getDiskStats() try: with file(_THP_STATE_PATH) as f: s = f.read() self.thpState = s[s.index('[') + 1:s.index(']')] except: self.thpState = 'never' self.cpuCores = CpuCoreSample() self.numaNodeMem = NumaNodeMemorySample()
def __init__(self, pid): """ Initialize a HostSample. :param pid: The PID of this vdsm host. :type pid: int """ self.timestamp = time.time() self.pidcpu = PidCpuSample(pid) self.ncpus = os.sysconf('SC_NPROCESSORS_ONLN') self.totcpu = TotalCpuSample() meminfo = utils.readMemInfo() freeOrCached = (meminfo['MemFree'] + meminfo['Cached'] + meminfo['Buffers']) self.memUsed = 100 - int(100.0 * (freeOrCached) / meminfo['MemTotal']) self.anonHugePages = meminfo.get('AnonHugePages', 0) // KiB try: with open('/proc/loadavg') as loadavg: self.cpuLoad = loadavg.read().split()[1] except: self.cpuLoad = '0.0' self.diskStats = self._getDiskStats() try: with open(_THP_STATE_PATH) as f: s = f.read() self.thpState = s[s.index('[') + 1:s.index(']')] except: self.thpState = 'never' self.hugepages = hugepages.state() self.cpuCores = CpuCoreSample() self.numaNodeMem = NumaNodeMemorySample()
def __init__(self, pid): """ Initialize a HostSample. :param pid: The PID of this vdsm host. :type pid: int """ self.timestamp = time.time() self.pidcpu = PidCpuSample(pid) self.ncpus = os.sysconf('SC_NPROCESSORS_ONLN') self.totcpu = TotalCpuSample() meminfo = utils.readMemInfo() freeOrCached = (meminfo['MemFree'] + meminfo['Cached'] + meminfo['Buffers']) self.memUsed = 100 - int(100.0 * (freeOrCached) / meminfo['MemTotal']) self.anonHugePages = meminfo.get('AnonHugePages', 0) // 1024 try: with open('/proc/loadavg') as loadavg: self.cpuLoad = loadavg.read().split()[1] except: self.cpuLoad = '0.0' self.diskStats = self._getDiskStats() try: with open(_THP_STATE_PATH) as f: s = f.read() self.thpState = s[s.index('[') + 1:s.index(']')] except: self.thpState = 'never' self.hugepages = hugepages.state() self.cpuCores = CpuCoreSample() self.numaNodeMem = NumaNodeMemorySample()
def _memFree(): """ Return the actual free mem on host. """ meminfo = utils.readMemInfo() return (meminfo['MemFree'] + meminfo['Cached'] + meminfo['Buffers']) * Kbytes
def __init__(self, pid): """ Initialize a HostSample. :param pid: The PID of this vdsm host. :type pid: int """ TimedSample.__init__(self) self.interfaces = dict( (link.name, InterfaceSample(link)) for link in getLinks()) self.pidcpu = PidCpuSample(pid) self.totcpu = TotalCpuSample() meminfo = utils.readMemInfo() freeOrCached = (meminfo['MemFree'] + meminfo['Cached'] + meminfo['Buffers']) self.memUsed = 100 - int(100.0 * (freeOrCached) / meminfo['MemTotal']) self.anonHugePages = meminfo.get('AnonHugePages', 0) / 1024 try: self.cpuLoad = file('/proc/loadavg').read().split()[1] except: self.cpuLoad = '0.0' self.diskStats = self._getDiskStats() try: with file(_THP_STATE_PATH) as f: s = f.read() self.thpState = s[s.index('[') + 1:s.index(']')] except: self.thpState = 'never' self.cpuCores = CpuCoreSample() self.numaNodeMem = NumaNodeMemorySample()
def __init__(self, pid): """ Initialize a HostSample. :param pid: The PID of this vdsm host. :type pid: int """ TimedSample.__init__(self) self.interfaces = dict( (link.name, InterfaceSample(link)) for link in getLinks()) self.pidcpu = PidCpuSample(pid) self.totcpu = TotalCpuSample() meminfo = utils.readMemInfo() freeOrCached = (meminfo['MemFree'] + meminfo['Cached'] + meminfo['Buffers']) self.memUsed = 100 - int(100.0 * (freeOrCached) / meminfo['MemTotal']) self.anonHugePages = meminfo.get('AnonHugePages', 0) / 1024 try: self.cpuLoad = file('/proc/loadavg').read().split()[1] except: self.cpuLoad = '0.0' self.diskStats = self._getDiskStats() try: with file(_THP_STATE_PATH) as f: s = f.read() self.thpState = s[s.index('[') + 1:s.index(']')] except: self.thpState = 'never' self.cpuCores = CpuCoreSample() self.numaNodeMem = NumaNodeMemorySample() ENGINE_DEFAULT_POLL_INTERVAL = 15 self.recentClient = ( self.timestamp - os.stat(P_VDSM_CLIENT_LOG).st_mtime < 2 * ENGINE_DEFAULT_POLL_INTERVAL)
def testReadMemInfo(self): meminfo = utils.readMemInfo() # most common fields as per man 5 proc # add your own here fields = ('MemTotal', 'MemFree', 'Buffers', 'Cached', 'SwapCached', 'Active', 'Inactive', 'SwapTotal', 'SwapFree', 'Dirty', 'Writeback', 'Mapped', 'Slab', 'VmallocTotal', 'VmallocUsed', 'VmallocChunk') for field in fields: self.assertIn(field, meminfo) self.assertTrue(isinstance(meminfo[field], int))
def getUMAHostMemoryStats(): """ Get the memory stats of a UMA host, the unit is MiB. :return: dict like {'total': '49141', 'free': '46783'} """ memDict = {} memInfo = utils.readMemInfo() memDict['total'] = str(memInfo['MemTotal'] / 1024) memDict['free'] = str(memInfo['MemFree'] / 1024) return memDict
def get(): caps = {} caps['kvmEnabled'] = \ str(config.getboolean('vars', 'fake_kvm_support') or os.path.exists('/dev/kvm')).lower() cpuInfo = CpuInfo() cpuTopology = CpuTopology() if config.getboolean('vars', 'report_host_threads_as_cores'): caps['cpuCores'] = str(cpuTopology.threads()) else: caps['cpuCores'] = str(cpuTopology.cores()) caps['cpuThreads'] = str(cpuTopology.threads()) caps['cpuSockets'] = str(cpuTopology.sockets()) caps['cpuSpeed'] = cpuInfo.mhz() if config.getboolean('vars', 'fake_kvm_support'): caps['cpuModel'] = 'Intel(Fake) CPU' flags = set(cpuInfo.flags() + ['vmx', 'sse2', 'nx']) caps['cpuFlags'] = ','.join(flags) + 'model_486,model_pentium,' \ 'model_pentium2,model_pentium3,model_pentiumpro,model_qemu32,' \ 'model_coreduo,model_core2duo,model_n270,model_Conroe,' \ 'model_Penryn,model_Nehalem,model_Opteron_G1' else: caps['cpuModel'] = cpuInfo.model() caps['cpuFlags'] = ','.join(cpuInfo.flags() + _getCompatibleCpuModels()) caps.update(dsaversion.version_info) caps.update(netinfo.get()) try: caps['hooks'] = hooks.installed() except: logging.debug('not reporting hooks', exc_info=True) caps['operatingSystem'] = osversion() caps['uuid'] = utils.getHostUUID() caps['packages2'] = _getKeyPackages() caps['emulatedMachines'] = _getEmulatedMachines() caps['ISCSIInitiatorName'] = _getIscsiIniName() caps['HBAInventory'] = storage.hba.HBAInventory() caps['vmTypes'] = ['kvm'] caps['memSize'] = str(utils.readMemInfo()['MemTotal'] / 1024) caps['reservedMem'] = str(config.getint('vars', 'host_mem_reserve') + config.getint('vars', 'extra_mem_reserve')) caps['guestOverhead'] = config.get('vars', 'guest_ram_overhead') return caps
def _memUsageInfo(cif): """ Return an approximation of available memory for new VMs. """ committed = 0 resident = 0 for v in cif.vmContainer.values(): mem_info = v.memory_info() resident += mem_info.get('rss', 0) * Kbytes committed += mem_info.get('commit', 0) * Kbytes meminfo = utils.readMemInfo() freeOrCached = (meminfo['MemFree'] + meminfo['Cached'] + meminfo['Buffers']) * Kbytes available = (freeOrCached + resident - committed - config.getint('vars', 'host_mem_reserve') * Mbytes) return available, committed
def _memUsageInfo(cif): """ Return an approximation of available memory for new VMs. """ # These values are not used by Engine >= 4.2 anymore, but they are still # processed, stored to the database and must be present. Let's return # something very roughly meaningful until it's removed from Engine # completely -- that means just free memory and sum of VM sizes. committed = 0 for v in cif.vmContainer.values(): committed += v.mem_size_mb() * Mbytes meminfo = utils.readMemInfo() freeOrCached = (meminfo['MemFree'] + meminfo['Cached'] + meminfo['Buffers']) * Kbytes available = (freeOrCached + config.getint('vars', 'host_mem_reserve') * Mbytes) return available, committed
def _memUsageInfo(cif): """ Return an approximation of available memory for new VMs. """ # These values are not used by Engine >= 4.2 anymore, but they are still # processed, stored to the database and must be present. Let's return # something very roughly meaningful until it's removed from Engine # completely -- that means just free memory and sum of VM sizes. committed = 0 for v in cif.vmContainer.values(): committed += v.mem_size_mb() * Mbytes meminfo = utils.readMemInfo() freeOrCached = (meminfo['MemFree'] + meminfo['Cached'] + meminfo['Buffers']) * Kbytes available = ( freeOrCached + config.getint('vars', 'host_mem_reserve') * Mbytes ) return available, committed
def _memUsageInfo(cif): """ Return an approximation of available memory for new VMs. """ committed = 0 resident = 0 for v in cif.vmContainer.values(): mem_info = v.memory_info() resident += mem_info.get('rss', 0) * Kbytes committed += mem_info.get('commit', 0) * Kbytes meminfo = utils.readMemInfo() freeOrCached = (meminfo['MemFree'] + meminfo['Cached'] + meminfo['Buffers']) * Kbytes available = ( freeOrCached + resident - committed - config.getint('vars', 'host_mem_reserve') * Mbytes ) return available, committed
def _memAvailable(self): """ Return an approximation of available memory for new VMs. """ memCommitted = self._memCommitted() resident = 0 for v in self._cif.vmContainer.values(): if v.conf['pid'] == '0': continue try: statmfile = file('/proc/' + v.conf['pid'] + '/statm') resident += int(statmfile.read().split()[1]) except: pass resident *= PAGE_SIZE_BYTES meminfo = utils.readMemInfo() freeOrCached = (meminfo['MemFree'] + meminfo['Cached'] + meminfo['Buffers']) * Kbytes return freeOrCached + resident - memCommitted - \ config.getint('vars', 'host_mem_reserve') * Mbytes
def get(): caps = {} caps["kvmEnabled"] = str(config.getboolean("vars", "fake_kvm_support") or os.path.exists("/dev/kvm")).lower() cpuInfo = CpuInfo() caps["cpuCores"] = str(cpuInfo.cores()) caps["cpuSockets"] = str(cpuInfo.sockets()) caps["cpuSpeed"] = cpuInfo.mhz() if config.getboolean("vars", "fake_kvm_support"): caps["cpuModel"] = "Intel(Fake) CPU" flags = set(cpuInfo.flags() + ["vmx", "sse2", "nx"]) caps["cpuFlags"] = ( ",".join(flags) + "model_486,model_pentium," "model_pentium2,model_pentium3,model_pentiumpro,model_qemu32," "model_coreduo,model_core2duo,model_n270,model_Conroe," "model_Penryn,model_Nehalem,model_Opteron_G1" ) else: caps["cpuModel"] = cpuInfo.model() caps["cpuFlags"] = ",".join(cpuInfo.flags() + _getCompatibleCpuModels()) caps.update(dsaversion.version_info) caps.update(netinfo.get()) try: caps["hooks"] = hooks.installed() except: logging.debug("not reporting hooks", exc_info=True) caps["operatingSystem"] = osversion() caps["uuid"] = utils.getHostUUID() caps["packages2"] = _getKeyPackages() caps["emulatedMachines"] = _getEmulatedMachines() caps["ISCSIInitiatorName"] = _getIscsiIniName() caps["HBAInventory"] = storage.hba.HBAInventory() caps["vmTypes"] = ["kvm"] caps["memSize"] = str(utils.readMemInfo()["MemTotal"] / 1024) caps["reservedMem"] = str(config.getint("vars", "host_mem_reserve") + config.getint("vars", "extra_mem_reserve")) caps["guestOverhead"] = config.get("vars", "guest_ram_overhead") return caps
def __init__(self, pid): """ Initialize a HostSample. :param pid: The PID of this vdsm host. :type pid: int """ super(HostSample, self).__init__() self.interfaces = _get_interfaces_and_samples() self.pidcpu = PidCpuSample(pid) self.ncpus = os.sysconf('SC_NPROCESSORS_ONLN') self.totcpu = TotalCpuSample() meminfo = utils.readMemInfo() freeOrCached = (meminfo['MemFree'] + meminfo['Cached'] + meminfo['Buffers']) self.memUsed = 100 - int(100.0 * (freeOrCached) / meminfo['MemTotal']) self.anonHugePages = meminfo.get('AnonHugePages', 0) / 1024 try: with open('/proc/loadavg') as loadavg: self.cpuLoad = loadavg.read().split()[1] except: self.cpuLoad = '0.0' self.diskStats = self._getDiskStats() try: with open(_THP_STATE_PATH) as f: s = f.read() self.thpState = s[s.index('[') + 1:s.index(']')] except: self.thpState = 'never' self.hugepages = hugepages.state() self.cpuCores = CpuCoreSample() self.numaNodeMem = NumaNodeMemorySample() ENGINE_DEFAULT_POLL_INTERVAL = 15 try: self.recentClient = ( self.timestamp - os.stat(P_VDSM_CLIENT_LOG).st_mtime < 2 * ENGINE_DEFAULT_POLL_INTERVAL) except OSError as e: if e.errno == errno.ENOENT: self.recentClient = False else: raise
def _memAvailable(cif): """ Return an approximation of available memory for new VMs. """ memCommitted = _memCommitted(cif) resident = 0 for v in cif.vmContainer.values(): if v.conf['pid'] == '0': continue try: with open('/proc/' + v.conf['pid'] + '/statm') as statmfile: resident += int(statmfile.read().split()[1]) except: pass resident *= cpuarch.PAGE_SIZE_BYTES meminfo = utils.readMemInfo() freeOrCached = (meminfo['MemFree'] + meminfo['Cached'] + meminfo['Buffers']) * Kbytes return freeOrCached + resident - memCommitted - \ config.getint('vars', 'host_mem_reserve') * Mbytes
def __init__(self, pid): """ Initialize a HostSample. :param pid: The PID of this vdsm host. :type pid: int """ TimedSample.__init__(self) self.interfaces = dict( (link.name, InterfaceSample(link)) for link in getLinks()) self.pidcpu = PidCpuSample(pid) self.totcpu = TotalCpuSample() meminfo = utils.readMemInfo() freeOrCached = (meminfo['MemFree'] + meminfo['Cached'] + meminfo['Buffers']) self.memUsed = 100 - int(100.0 * (freeOrCached) / meminfo['MemTotal']) self.anonHugePages = meminfo.get('AnonHugePages', 0) / 1024 try: self.cpuLoad = file('/proc/loadavg').read().split()[1] except: self.cpuLoad = '0.0' self.diskStats = self._getDiskStats() try: with file(_THP_STATE_PATH) as f: s = f.read() self.thpState = s[s.index('[') + 1:s.index(']')] except: self.thpState = 'never' self.cpuCores = CpuCoreSample() self.numaNodeMem = NumaNodeMemorySample() ENGINE_DEFAULT_POLL_INTERVAL = 15 try: self.recentClient = ( self.timestamp - os.stat(P_VDSM_CLIENT_LOG).st_mtime < 2 * ENGINE_DEFAULT_POLL_INTERVAL) except OSError as e: if e.errno == errno.ENOENT: self.recentClient = False else: raise
def get(): targetArch = getTargetArch() caps = {} caps['kvmEnabled'] = \ str(config.getboolean('vars', 'fake_kvm_support') or os.path.exists('/dev/kvm')).lower() cpuInfo = CpuInfo() cpuTopology = CpuTopology() if config.getboolean('vars', 'report_host_threads_as_cores'): caps['cpuCores'] = str(cpuTopology.threads()) else: caps['cpuCores'] = str(cpuTopology.cores()) caps['cpuThreads'] = str(cpuTopology.threads()) caps['cpuSockets'] = str(cpuTopology.sockets()) caps['onlineCpus'] = ','.join(cpuTopology.onlineCpus()) caps['cpuSpeed'] = cpuInfo.mhz() if config.getboolean('vars', 'fake_kvm_support'): if targetArch == Architecture.X86_64: caps['cpuModel'] = 'Intel(Fake) CPU' flagList = ['vmx', 'sse2', 'nx'] if targetArch == platform.machine(): flagList += cpuInfo.flags() flags = set(flagList) caps['cpuFlags'] = ','.join(flags) + ',model_486,model_pentium,' \ 'model_pentium2,model_pentium3,model_pentiumpro,' \ 'model_qemu32,model_coreduo,model_core2duo,model_n270,' \ 'model_Conroe,model_Penryn,model_Nehalem,model_Opteron_G1' elif targetArch in Architecture.POWER: caps['cpuModel'] = 'POWER 8 (fake)' caps['cpuFlags'] = 'powernv,model_power8' else: raise RuntimeError('Unsupported architecture: %s' % targetArch) else: caps['cpuModel'] = cpuInfo.model() caps['cpuFlags'] = ','.join(cpuInfo.flags() + _getCompatibleCpuModels()) caps.update(_getVersionInfo()) caps.update(netinfo.get()) _report_network_qos(caps) try: caps['hooks'] = hooks.installed() except: logging.debug('not reporting hooks', exc_info=True) caps['operatingSystem'] = osversion() caps['uuid'] = utils.getHostUUID() caps['packages2'] = _getKeyPackages() caps['emulatedMachines'] = _getEmulatedMachines(targetArch) caps['ISCSIInitiatorName'] = _getIscsiIniName() caps['HBAInventory'] = storage.hba.HBAInventory() caps['vmTypes'] = ['kvm'] caps['memSize'] = str(utils.readMemInfo()['MemTotal'] / 1024) caps['reservedMem'] = str(config.getint('vars', 'host_mem_reserve') + config.getint('vars', 'extra_mem_reserve')) caps['guestOverhead'] = config.get('vars', 'guest_ram_overhead') # Verify that our libvirt supports virtio RNG (since 10.0.2-31) libvirtVer = LooseVersion( '-'.join((caps['packages2']['libvirt']['version'], caps['packages2']['libvirt']['release']))) requiredVer = LooseVersion('0.10.2-31') if libvirtVer >= requiredVer: caps['rngSources'] = _getRngSources() else: logging.debug('VirtioRNG DISABLED: libvirt version %s required >= %s', libvirtVer, requiredVer) caps['numaNodes'] = getNumaTopology() caps['numaNodeDistance'] = getNumaNodeDistance() caps['autoNumaBalancing'] = getAutoNumaBalancingInfo() caps['selinux'] = _getSELinux() liveSnapSupported = _getLiveSnapshotSupport(targetArch) if liveSnapSupported is not None: caps['liveSnapshot'] = str(liveSnapSupported).lower() caps['liveMerge'] = str(getLiveMergeSupport()).lower() caps['kdumpStatus'] = _getKdumpStatus() caps['hostdevPassthrough'] = str(_getHostdevPassthorughSupport()).lower() caps['additionalFeatures'] = [] if _glusterEnabled: caps['additionalFeatures'].extend(glusterAdditionalFeatures()) return caps
def get(): caps = {} cpu_topology = numa.cpu_topology() caps['kvmEnabled'] = str(os.path.exists('/dev/kvm')).lower() if config.getboolean('vars', 'report_host_threads_as_cores'): caps['cpuCores'] = str(cpu_topology.threads) else: caps['cpuCores'] = str(cpu_topology.cores) caps['cpuThreads'] = str(cpu_topology.threads) caps['cpuSockets'] = str(cpu_topology.sockets) caps['onlineCpus'] = ','.join(cpu_topology.online_cpus) caps['cpuSpeed'] = cpuinfo.frequency() caps['cpuModel'] = cpuinfo.model() caps['cpuFlags'] = ','.join(cpuinfo.flags() + machinetype.compatible_cpu_models()) caps.update(_getVersionInfo()) net_caps = supervdsm.getProxy().network_caps() caps.update(net_caps) try: caps['hooks'] = hooks.installed() except: logging.debug('not reporting hooks', exc_info=True) caps['operatingSystem'] = osinfo.version() caps['uuid'] = host.uuid() caps['packages2'] = osinfo.package_versions() caps['realtimeKernel'] = osinfo.runtime_kernel_flags().realtime caps['kernelArgs'] = osinfo.kernel_args() caps['nestedVirtualization'] = osinfo.nested_virtualization().enabled caps['emulatedMachines'] = machinetype.emulated_machines( cpuarch.effective()) caps['ISCSIInitiatorName'] = _getIscsiIniName() caps['HBAInventory'] = hba.HBAInventory() caps['vmTypes'] = ['kvm'] caps['memSize'] = str(utils.readMemInfo()['MemTotal'] // 1024) caps['reservedMem'] = str(config.getint('vars', 'host_mem_reserve') + config.getint('vars', 'extra_mem_reserve')) caps['guestOverhead'] = config.get('vars', 'guest_ram_overhead') caps['rngSources'] = rngsources.list_available() caps['numaNodes'] = dict(numa.topology()) caps['numaNodeDistance'] = dict(numa.distances()) caps['autoNumaBalancing'] = numa.autonuma_status() caps['selinux'] = osinfo.selinux_status() caps['liveSnapshot'] = 'true' caps['liveMerge'] = 'true' caps['kdumpStatus'] = osinfo.kdump_status() caps['hostdevPassthrough'] = str(hostdev.is_supported()).lower() # TODO This needs to be removed after adding engine side support # and adding gdeploy support to enable libgfapi on RHHI by default caps['additionalFeatures'] = ['libgfapi_supported'] if osinfo.glusterEnabled: from vdsm.gluster.api import glusterAdditionalFeatures caps['additionalFeatures'].extend(glusterAdditionalFeatures()) caps['hostedEngineDeployed'] = _isHostedEngineDeployed() caps['hugepages'] = hugepages.supported() caps['kernelFeatures'] = osinfo.kernel_features() caps['vncEncrypted'] = _isVncEncrypted() caps['backupEnabled'] = False try: caps["connector_info"] = managedvolume.connector_info() except se.ManagedVolumeNotSupported as e: logging.info("managedvolume not supported: %s", e) except se.ManagedVolumeHelperFailed as e: logging.exception("Error getting managedvolume connector info: %s", e) return caps
def get(): caps = {} cpu_topology = numa.cpu_topology() caps['kvmEnabled'] = str(os.path.exists('/dev/kvm')).lower() if config.getboolean('vars', 'report_host_threads_as_cores'): caps['cpuCores'] = str(cpu_topology.threads) else: caps['cpuCores'] = str(cpu_topology.cores) caps['cpuThreads'] = str(cpu_topology.threads) caps['cpuSockets'] = str(cpu_topology.sockets) caps['onlineCpus'] = ','.join(cpu_topology.online_cpus) caps['cpuSpeed'] = cpuinfo.frequency() caps['cpuModel'] = cpuinfo.model() caps['cpuFlags'] = ','.join(cpuinfo.flags() + machinetype.compatible_cpu_models()) caps.update(_getVersionInfo()) net_caps = supervdsm.getProxy().network_caps() caps.update(net_caps) try: caps['hooks'] = hooks.installed() except: logging.debug('not reporting hooks', exc_info=True) caps['operatingSystem'] = osinfo.version() caps['uuid'] = host.uuid() caps['packages2'] = osinfo.package_versions() caps['realtimeKernel'] = osinfo.runtime_kernel_flags().realtime caps['kernelArgs'] = osinfo.kernel_args() caps['nestedVirtualization'] = osinfo.nested_virtualization().enabled caps['emulatedMachines'] = machinetype.emulated_machines( cpuarch.effective()) caps['ISCSIInitiatorName'] = _getIscsiIniName() caps['HBAInventory'] = hba.HBAInventory() caps['vmTypes'] = ['kvm'] caps['memSize'] = str(utils.readMemInfo()['MemTotal'] / 1024) caps['reservedMem'] = str(config.getint('vars', 'host_mem_reserve') + config.getint('vars', 'extra_mem_reserve')) caps['guestOverhead'] = config.get('vars', 'guest_ram_overhead') caps['rngSources'] = rngsources.list_available() caps['numaNodes'] = dict(numa.topology()) caps['numaNodeDistance'] = dict(numa.distances()) caps['autoNumaBalancing'] = numa.autonuma_status() caps['selinux'] = osinfo.selinux_status() liveSnapSupported = _getLiveSnapshotSupport(cpuarch.effective()) if liveSnapSupported is not None: caps['liveSnapshot'] = str(liveSnapSupported).lower() caps['liveMerge'] = str(getLiveMergeSupport()).lower() caps['kdumpStatus'] = osinfo.kdump_status() caps['hostdevPassthrough'] = str(hostdev.is_supported()).lower() caps['additionalFeatures'] = [] if osinfo.glusterEnabled: from vdsm.gluster.api import glusterAdditionalFeatures caps['additionalFeatures'].extend(glusterAdditionalFeatures()) caps['containers'] = containersconnection.is_supported() caps['hostedEngineDeployed'] = _isHostedEngineDeployed() return caps
def get(): caps = {} cpu_topology = numa.cpu_topology() caps['kvmEnabled'] = str(os.path.exists('/dev/kvm')).lower() if config.getboolean('vars', 'report_host_threads_as_cores'): caps['cpuCores'] = str(cpu_topology.threads) else: caps['cpuCores'] = str(cpu_topology.cores) caps['cpuThreads'] = str(cpu_topology.threads) caps['cpuSockets'] = str(cpu_topology.sockets) caps['onlineCpus'] = ','.join(cpu_topology.online_cpus) caps['cpuSpeed'] = cpuinfo.frequency() caps['cpuModel'] = cpuinfo.model() caps['cpuFlags'] = ','.join(cpuinfo.flags() + machinetype.compatible_cpu_models()) caps.update(_getVersionInfo()) # TODO: Version requests by engine to ease handling of compatibility. netinfo_data = netinfo_cache.get(compatibility=30600) caps.update(netinfo_data) super_caps_networks = supervdsm.getProxy().caps_networks() caps.update(super_caps_networks) try: caps['hooks'] = hooks.installed() except: logging.debug('not reporting hooks', exc_info=True) caps['operatingSystem'] = osinfo.version() caps['uuid'] = host.uuid() caps['packages2'] = osinfo.package_versions() caps['emulatedMachines'] = machinetype.emulated_machines( cpuarch.effective()) caps['ISCSIInitiatorName'] = _getIscsiIniName() caps['HBAInventory'] = storage.hba.HBAInventory() caps['vmTypes'] = ['kvm'] caps['memSize'] = str(utils.readMemInfo()['MemTotal'] / 1024) caps['reservedMem'] = str(config.getint('vars', 'host_mem_reserve') + config.getint('vars', 'extra_mem_reserve')) caps['guestOverhead'] = config.get('vars', 'guest_ram_overhead') # Verify that our libvirt supports virtio RNG (since 10.0.2-31) requiredVer = LooseVersion('0.10.2-31') if 'libvirt' not in caps['packages2']: libvirtVer = None else: libvirtVer = LooseVersion( '-'.join((caps['packages2']['libvirt']['version'], caps['packages2']['libvirt']['release']))) if libvirtVer is None: logging.debug('VirtioRNG DISABLED: unknown libvirt version') elif libvirtVer < requiredVer: logging.debug('VirtioRNG DISABLED: libvirt version %s required >= %s', libvirtVer, requiredVer) else: caps['rngSources'] = vmdevices.core.Rng.available_sources() caps['numaNodes'] = dict(numa.topology()) caps['numaNodeDistance'] = dict(numa.distances()) caps['autoNumaBalancing'] = numa.autonuma_status() caps['selinux'] = osinfo.selinux_status() liveSnapSupported = _getLiveSnapshotSupport(cpuarch.effective()) if liveSnapSupported is not None: caps['liveSnapshot'] = str(liveSnapSupported).lower() caps['liveMerge'] = str(getLiveMergeSupport()).lower() caps['kdumpStatus'] = osinfo.kdump_status() caps['hostdevPassthrough'] = str(hostdev.is_supported()).lower() caps['additionalFeatures'] = [] if osinfo.glusterEnabled: from gluster.api import glusterAdditionalFeatures caps['additionalFeatures'].extend(glusterAdditionalFeatures()) return caps
def get(): targetArch = getTargetArch() caps = {} caps["kvmEnabled"] = str(config.getboolean("vars", "fake_kvm_support") or os.path.exists("/dev/kvm")).lower() cpuInfo = CpuInfo() cpuTopology = CpuTopology() if config.getboolean("vars", "report_host_threads_as_cores"): caps["cpuCores"] = str(cpuTopology.threads()) else: caps["cpuCores"] = str(cpuTopology.cores()) caps["cpuThreads"] = str(cpuTopology.threads()) caps["cpuSockets"] = str(cpuTopology.sockets()) caps["onlineCpus"] = ",".join(cpuTopology.onlineCpus()) caps["cpuSpeed"] = cpuInfo.mhz() if config.getboolean("vars", "fake_kvm_support"): if targetArch == Architecture.X86_64: caps["cpuModel"] = "Intel(Fake) CPU" flagList = ["vmx", "sse2", "nx"] if targetArch == platform.machine(): flagList += cpuInfo.flags() flags = set(flagList) caps["cpuFlags"] = ( ",".join(flags) + ",model_486,model_pentium," "model_pentium2,model_pentium3,model_pentiumpro," "model_qemu32,model_coreduo,model_core2duo,model_n270," "model_Conroe,model_Penryn,model_Nehalem,model_Opteron_G1" ) elif targetArch in Architecture.POWER: caps["cpuModel"] = "POWER 8 (fake)" caps["cpuFlags"] = "powernv,model_POWER8" else: raise RuntimeError("Unsupported architecture: %s" % targetArch) else: caps["cpuModel"] = cpuInfo.model() caps["cpuFlags"] = ",".join(cpuInfo.flags() + _getCompatibleCpuModels()) caps.update(_getVersionInfo()) caps.update(netinfo.get()) try: caps["hooks"] = hooks.installed() except: logging.debug("not reporting hooks", exc_info=True) caps["operatingSystem"] = osversion() caps["uuid"] = utils.getHostUUID() caps["packages2"] = _getKeyPackages() caps["emulatedMachines"] = _getEmulatedMachines(targetArch) caps["ISCSIInitiatorName"] = _getIscsiIniName() caps["HBAInventory"] = storage.hba.HBAInventory() caps["vmTypes"] = ["kvm"] caps["memSize"] = str(utils.readMemInfo()["MemTotal"] / 1024) caps["reservedMem"] = str(config.getint("vars", "host_mem_reserve") + config.getint("vars", "extra_mem_reserve")) caps["guestOverhead"] = config.get("vars", "guest_ram_overhead") # Verify that our libvirt supports virtio RNG (since 10.0.2-31) requiredVer = LooseVersion("0.10.2-31") if "libvirt" not in caps["packages2"]: libvirtVer = None else: libvirtVer = LooseVersion( "-".join((caps["packages2"]["libvirt"]["version"], caps["packages2"]["libvirt"]["release"])) ) if libvirtVer is None: logging.debug("VirtioRNG DISABLED: unknown libvirt version") elif libvirtVer < requiredVer: logging.debug("VirtioRNG DISABLED: libvirt version %s required >= %s", libvirtVer, requiredVer) else: caps["rngSources"] = _getRngSources() caps["numaNodes"] = getNumaTopology() caps["numaNodeDistance"] = getNumaNodeDistance() caps["autoNumaBalancing"] = getAutoNumaBalancingInfo() caps["selinux"] = _getSELinux() liveSnapSupported = _getLiveSnapshotSupport(targetArch) if liveSnapSupported is not None: caps["liveSnapshot"] = str(liveSnapSupported).lower() caps["liveMerge"] = str(getLiveMergeSupport()).lower() caps["kdumpStatus"] = _getKdumpStatus() caps["hostdevPassthrough"] = str(_getHostdevPassthorughSupport()).lower() caps["additionalFeatures"] = [] if _glusterEnabled: caps["additionalFeatures"].extend(glusterAdditionalFeatures()) return caps
def _readSwapTotalFree(): meminfo = utils.readMemInfo() return meminfo['SwapTotal'] / 1024, meminfo['SwapFree'] / 1024
def get(): caps = {} cpu_topology = numa.cpu_topology() caps['kvmEnabled'] = str(os.path.exists('/dev/kvm')).lower() if config.getboolean('vars', 'report_host_threads_as_cores'): caps['cpuCores'] = str(cpu_topology.threads) else: caps['cpuCores'] = str(cpu_topology.cores) caps['cpuThreads'] = str(cpu_topology.threads) caps['cpuSockets'] = str(cpu_topology.sockets) caps['onlineCpus'] = ','.join(cpu_topology.online_cpus) caps['cpuSpeed'] = cpuinfo.frequency() caps['cpuModel'] = cpuinfo.model() caps['cpuFlags'] = ','.join(cpuinfo.flags() + machinetype.compatible_cpu_models()) caps.update(_getVersionInfo()) net_caps = supervdsm.getProxy().network_caps() caps.update(net_caps) try: caps['hooks'] = hooks.installed() except: logging.debug('not reporting hooks', exc_info=True) caps['operatingSystem'] = osinfo.version() caps['uuid'] = host.uuid() caps['packages2'] = osinfo.package_versions() caps['kernelArgs'] = osinfo.kernel_args() caps['emulatedMachines'] = machinetype.emulated_machines( cpuarch.effective()) caps['ISCSIInitiatorName'] = _getIscsiIniName() caps['HBAInventory'] = hba.HBAInventory() caps['vmTypes'] = ['kvm'] caps['memSize'] = str(utils.readMemInfo()['MemTotal'] / 1024) caps['reservedMem'] = str( config.getint('vars', 'host_mem_reserve') + config.getint('vars', 'extra_mem_reserve')) caps['guestOverhead'] = config.get('vars', 'guest_ram_overhead') caps['rngSources'] = rngsources.available_sources() caps['numaNodes'] = dict(numa.topology()) caps['numaNodeDistance'] = dict(numa.distances()) caps['autoNumaBalancing'] = numa.autonuma_status() caps['selinux'] = osinfo.selinux_status() liveSnapSupported = _getLiveSnapshotSupport(cpuarch.effective()) if liveSnapSupported is not None: caps['liveSnapshot'] = str(liveSnapSupported).lower() caps['liveMerge'] = str(getLiveMergeSupport()).lower() caps['kdumpStatus'] = osinfo.kdump_status() caps['hostdevPassthrough'] = str(hostdev.is_supported()).lower() caps['additionalFeatures'] = [] if osinfo.glusterEnabled: from gluster.api import glusterAdditionalFeatures caps['additionalFeatures'].extend(glusterAdditionalFeatures()) return caps
def get(): numa.update() caps = {} cpu_topology = numa.cpu_topology() caps['kvmEnabled'] = str(os.path.exists('/dev/kvm')).lower() if config.getboolean('vars', 'report_host_threads_as_cores'): caps['cpuCores'] = str(cpu_topology.threads) else: caps['cpuCores'] = str(cpu_topology.cores) caps['cpuThreads'] = str(cpu_topology.threads) caps['cpuSockets'] = str(cpu_topology.sockets) caps['onlineCpus'] = ','.join( [str(cpu_id) for cpu_id in cpu_topology.online_cpus]) caps['cpuTopology'] = [{ 'cpu_id': cpu.cpu_id, 'numa_cell_id': cpu.numa_cell_id, 'socket_id': cpu.socket_id, 'die_id': cpu.die_id, 'core_id': cpu.core_id, } for cpu in numa.cpu_info()] caps['cpuSpeed'] = cpuinfo.frequency() caps['cpuModel'] = cpuinfo.model() caps['cpuFlags'] = ','.join(_getFlagsAndFeatures()) caps['vdsmToCpusAffinity'] = list(taskset.get(os.getpid())) caps.update(dsaversion.version_info()) proxy = supervdsm.getProxy() net_caps = proxy.network_caps() caps.update(net_caps) caps['ovnConfigured'] = proxy.is_ovn_configured() try: caps['hooks'] = hooks.installed() except: logging.debug('not reporting hooks', exc_info=True) caps['operatingSystem'] = osinfo.version() caps['uuid'] = host.uuid() caps['packages2'] = osinfo.package_versions() caps['realtimeKernel'] = osinfo.runtime_kernel_flags().realtime caps['kernelArgs'] = osinfo.kernel_args() caps['nestedVirtualization'] = osinfo.nested_virtualization().enabled caps['emulatedMachines'] = machinetype.emulated_machines( cpuarch.effective()) caps['ISCSIInitiatorName'] = _getIscsiIniName() caps['HBAInventory'] = hba.HBAInventory() caps['vmTypes'] = ['kvm'] caps['memSize'] = str(utils.readMemInfo()['MemTotal'] // 1024) caps['reservedMem'] = str( config.getint('vars', 'host_mem_reserve') + config.getint('vars', 'extra_mem_reserve')) caps['guestOverhead'] = config.get('vars', 'guest_ram_overhead') caps['rngSources'] = rngsources.list_available() caps['numaNodes'] = dict(numa.topology()) caps['numaNodeDistance'] = dict(numa.distances()) caps['autoNumaBalancing'] = numa.autonuma_status() caps['selinux'] = osinfo.selinux_status() caps['liveSnapshot'] = 'true' caps['liveMerge'] = 'true' caps['kdumpStatus'] = osinfo.kdump_status() caps["deferred_preallocation"] = True caps['hostdevPassthrough'] = str(hostdev.is_supported()).lower() # TODO This needs to be removed after adding engine side support # and adding gdeploy support to enable libgfapi on RHHI by default caps['additionalFeatures'] = ['libgfapi_supported'] if osinfo.glusterEnabled: from vdsm.gluster.api import glusterAdditionalFeatures caps['additionalFeatures'].extend(glusterAdditionalFeatures()) caps['hostedEngineDeployed'] = _isHostedEngineDeployed() caps['hugepages'] = hugepages.supported() caps['kernelFeatures'] = osinfo.kernel_features() caps['vncEncrypted'] = _isVncEncrypted() caps['backupEnabled'] = True caps['coldBackupEnabled'] = True caps['clearBitmapsEnabled'] = True caps['fipsEnabled'] = _getFipsEnabled() try: caps['boot_uuid'] = osinfo.boot_uuid() except Exception: logging.exception("Can not find boot uuid") caps['tscFrequency'] = _getTscFrequency() caps['tscScaling'] = _getTscScaling() try: caps["connector_info"] = managedvolume.connector_info() except se.ManagedVolumeNotSupported as e: logging.info("managedvolume not supported: %s", e) except se.ManagedVolumeHelperFailed as e: logging.exception("Error getting managedvolume connector info: %s", e) # Which domain versions are supported by this host. caps["domain_versions"] = sc.DOMAIN_VERSIONS caps["supported_block_size"] = backends.supported_block_size() caps["cd_change_pdiv"] = True caps["refresh_disk_supported"] = True return caps
def get(): targetArch = getTargetArch() caps = {} caps['kvmEnabled'] = \ str(config.getboolean('vars', 'fake_kvm_support') or os.path.exists('/dev/kvm')).lower() cpuInfo = CpuInfo() cpuTopology = CpuTopology() if config.getboolean('vars', 'report_host_threads_as_cores'): caps['cpuCores'] = str(cpuTopology.threads()) else: caps['cpuCores'] = str(cpuTopology.cores()) caps['cpuThreads'] = str(cpuTopology.threads()) caps['cpuSockets'] = str(cpuTopology.sockets()) caps['cpuSpeed'] = cpuInfo.mhz() if config.getboolean('vars', 'fake_kvm_support'): if targetArch == Architecture.X86_64: caps['cpuModel'] = 'Intel(Fake) CPU' flagList = ['vmx', 'sse2', 'nx'] if targetArch == platform.machine(): flagList += cpuInfo.flags() flags = set(flagList) caps['cpuFlags'] = ','.join(flags) + ',model_486,model_pentium,' \ 'model_pentium2,model_pentium3,model_pentiumpro,' \ 'model_qemu32,model_coreduo,model_core2duo,model_n270,' \ 'model_Conroe,model_Penryn,model_Nehalem,model_Opteron_G1' elif targetArch == Architecture.PPC64: caps['cpuModel'] = 'POWER 7 (fake)' caps['cpuFlags'] = 'powernv,model_POWER7_v2.3' else: raise RuntimeError('Unsupported architecture: %s' % targetArch) else: caps['cpuModel'] = cpuInfo.model() caps['cpuFlags'] = ','.join(cpuInfo.flags() + _getCompatibleCpuModels()) caps.update(_getVersionInfo()) caps.update(netinfo.get()) _report_legacy_bondings(caps) try: caps['hooks'] = hooks.installed() except: logging.debug('not reporting hooks', exc_info=True) caps['operatingSystem'] = osversion() caps['uuid'] = utils.getHostUUID() caps['packages2'] = _getKeyPackages() caps['emulatedMachines'] = _getEmulatedMachines(targetArch) caps['ISCSIInitiatorName'] = _getIscsiIniName() caps['HBAInventory'] = storage.hba.HBAInventory() caps['vmTypes'] = ['kvm'] caps['memSize'] = str(utils.readMemInfo()['MemTotal'] / 1024) caps['reservedMem'] = str(config.getint('vars', 'host_mem_reserve') + config.getint('vars', 'extra_mem_reserve')) caps['guestOverhead'] = config.get('vars', 'guest_ram_overhead') caps['rngSources'] = _getRngSources() caps['numaNodes'] = getNumaTopology() caps['numaNodeDistance'] = getNumaNodeDistance() caps['autoNumaBalancing'] = getAutoNumaBalancingInfo() caps['selinux'] = _getSELinux() liveSnapSupported = _getLiveSnapshotSupport(targetArch) if liveSnapSupported is not None: caps['liveSnapshot'] = str(liveSnapSupported).lower() caps['kdumpStatus'] = _getKdumpStatus() return caps
def get(): caps = {} cpu_topology = numa.cpu_topology() caps['kvmEnabled'] = str(os.path.exists('/dev/kvm')).lower() if config.getboolean('vars', 'report_host_threads_as_cores'): caps['cpuCores'] = str(cpu_topology.threads) else: caps['cpuCores'] = str(cpu_topology.cores) caps['cpuThreads'] = str(cpu_topology.threads) caps['cpuSockets'] = str(cpu_topology.sockets) caps['onlineCpus'] = ','.join(cpu_topology.online_cpus) caps['cpuSpeed'] = cpuinfo.frequency() caps['cpuModel'] = cpuinfo.model() caps['cpuFlags'] = ','.join(cpuinfo.flags() + machinetype.compatible_cpu_models()) caps.update(_getVersionInfo()) net_caps = supervdsm.getProxy().network_caps() caps.update(net_caps) try: caps['hooks'] = hooks.installed() except: logging.debug('not reporting hooks', exc_info=True) caps['operatingSystem'] = osinfo.version() caps['uuid'] = host.uuid() caps['packages2'] = osinfo.package_versions() caps['realtimeKernel'] = osinfo.runtime_kernel_flags().realtime caps['kernelArgs'] = osinfo.kernel_args() caps['nestedVirtualization'] = osinfo.nested_virtualization().enabled caps['emulatedMachines'] = machinetype.emulated_machines( cpuarch.effective()) caps['ISCSIInitiatorName'] = _getIscsiIniName() caps['HBAInventory'] = hba.HBAInventory() caps['vmTypes'] = ['kvm'] caps['memSize'] = str(utils.readMemInfo()['MemTotal'] // 1024) caps['reservedMem'] = str( config.getint('vars', 'host_mem_reserve') + config.getint('vars', 'extra_mem_reserve')) caps['guestOverhead'] = config.get('vars', 'guest_ram_overhead') caps['rngSources'] = rngsources.list_available() caps['numaNodes'] = dict(numa.topology()) caps['numaNodeDistance'] = dict(numa.distances()) caps['autoNumaBalancing'] = numa.autonuma_status() caps['selinux'] = osinfo.selinux_status() caps['liveSnapshot'] = 'true' caps['liveMerge'] = 'true' caps['kdumpStatus'] = osinfo.kdump_status() caps['hostdevPassthrough'] = str(hostdev.is_supported()).lower() # TODO This needs to be removed after adding engine side support # and adding gdeploy support to enable libgfapi on RHHI by default caps['additionalFeatures'] = ['libgfapi_supported'] if osinfo.glusterEnabled: from vdsm.gluster.api import glusterAdditionalFeatures caps['additionalFeatures'].extend(glusterAdditionalFeatures()) caps['containers'] = containersconnection.is_supported() caps['hostedEngineDeployed'] = _isHostedEngineDeployed() caps['hugepages'] = hugepages.supported() caps['kernelFeatures'] = osinfo.kernel_features() return caps
def get(): targetArch = getTargetArch() caps = {} caps['kvmEnabled'] = \ str(config.getboolean('vars', 'fake_kvm_support') or os.path.exists('/dev/kvm')).lower() cpuInfo = CpuInfo() cpuTopology = CpuTopology() if config.getboolean('vars', 'report_host_threads_as_cores'): caps['cpuCores'] = str(cpuTopology.threads()) else: caps['cpuCores'] = str(cpuTopology.cores()) caps['cpuThreads'] = str(cpuTopology.threads()) caps['cpuSockets'] = str(cpuTopology.sockets()) caps['onlineCpus'] = ','.join(cpuTopology.onlineCpus()) caps['cpuSpeed'] = cpuInfo.mhz() if config.getboolean('vars', 'fake_kvm_support'): if targetArch == Architecture.X86_64: caps['cpuModel'] = 'Intel(Fake) CPU' flagList = ['vmx', 'sse2', 'nx'] if targetArch == platform.machine(): flagList += cpuInfo.flags() flags = set(flagList) caps['cpuFlags'] = ','.join(flags) + ',model_486,model_pentium,' \ 'model_pentium2,model_pentium3,model_pentiumpro,' \ 'model_qemu32,model_coreduo,model_core2duo,model_n270,' \ 'model_Conroe,model_Penryn,model_Nehalem,model_Opteron_G1' elif targetArch in Architecture.POWER: caps['cpuModel'] = 'POWER 8 (fake)' caps['cpuFlags'] = 'powernv,model_power8' else: raise RuntimeError('Unsupported architecture: %s' % targetArch) else: caps['cpuModel'] = cpuInfo.model() caps['cpuFlags'] = ','.join(cpuInfo.flags() + _getCompatibleCpuModels()) caps.update(_getVersionInfo()) caps.update(netinfo.get()) _report_legacy_bondings(caps) _report_network_qos(caps) try: caps['hooks'] = hooks.installed() except: logging.debug('not reporting hooks', exc_info=True) caps['operatingSystem'] = osversion() caps['uuid'] = utils.getHostUUID() caps['packages2'] = _getKeyPackages() caps['emulatedMachines'] = _getEmulatedMachines(targetArch) caps['ISCSIInitiatorName'] = _getIscsiIniName() caps['HBAInventory'] = storage.hba.HBAInventory() caps['vmTypes'] = ['kvm'] caps['memSize'] = str(utils.readMemInfo()['MemTotal'] / 1024) caps['reservedMem'] = str( config.getint('vars', 'host_mem_reserve') + config.getint('vars', 'extra_mem_reserve')) caps['guestOverhead'] = config.get('vars', 'guest_ram_overhead') # Verify that our libvirt supports virtio RNG (since 10.0.2-31) libvirtVer = LooseVersion('-'.join( (caps['packages2']['libvirt']['version'], caps['packages2']['libvirt']['release']))) requiredVer = LooseVersion('0.10.2-31') if libvirtVer >= requiredVer: caps['rngSources'] = _getRngSources() else: logging.debug('VirtioRNG DISABLED: libvirt version %s required >= %s', libvirtVer, requiredVer) caps['numaNodes'] = getNumaTopology() caps['numaNodeDistance'] = getNumaNodeDistance() caps['autoNumaBalancing'] = getAutoNumaBalancingInfo() caps['selinux'] = _getSELinux() liveSnapSupported = _getLiveSnapshotSupport(targetArch) if liveSnapSupported is not None: caps['liveSnapshot'] = str(liveSnapSupported).lower() caps['liveMerge'] = str(getLiveMergeSupport()).lower() caps['kdumpStatus'] = _getKdumpStatus() caps['hostdevPassthrough'] = str(_getHostdevPassthorughSupport()).lower() return caps