def _get_device_type(address): """Get a PCI device's device type. An assignable PCI device can be a normal PCI device, a SR-IOV Physical Function (PF), or a SR-IOV Virtual Function (VF). Only normal PCI devices or SR-IOV VFs are assignable. """ try: path = '/sys/bus/pci/devices/' + address + '/' output, status = processutils.execute('ls', path) if "physfn" in output: phys_address = None upath = '/sys/bus/pci/devices/%s/physfn/uevent' % address try: ou, st = processutils.execute('cat', upath) lines = ou.split('\n') for line in lines: if 'PCI_SLOT_NAME' in line: columns = line.split("=") phys_address = columns[1] except processutils.ProcessExecutionError: raise exception.CommandError(cmd='cat') return { 'dev_type': fields.PciDeviceType.SRIOV_VF, 'parent_addr': phys_address } if "virtfn" in output: return {'dev_type': fields.PciDeviceType.SRIOV_PF} except processutils.ProcessExecutionError: raise exception.CommandError(cmd='ls') return {'dev_type': fields.PciDeviceType.STANDARD}
def get_cpu_numa_info(self): # TODO(sbiswas7): rootwrap changes for zun required. old_lscpu = False try: output = processutils.execute('lscpu', '-p=socket,cpu,online') except processutils.ProcessExecutionError as e: LOG.info("There was a problem while executing lscpu -p=socket" ",cpu,online. Try again without the online column.") # There is a possibility that an older version of lscpu is used # So let's try without the online column try: output = processutils.execute('lscpu', '-p=socket,cpu') old_lscpu = True except processutils.ProcessExecutionError as e: LOG.exception("There was a problem while executing lscpu " "-p=socket,cpu : %s", six.text_type(e)) raise exception.CommandError(cmd="lscpu") if old_lscpu: cpu_sock_pair = re.findall("\d+(?:,\d+)?", str(output)) else: cpu_sock_pair = re.findall("\d+(?:,\d+,[Y/N])?", str(output)) sock_map = defaultdict(list) for value in cpu_sock_pair: val = value.split(",") if len(val) == 3 and val[2] == 'Y': sock_map[val[0]].append(int(val[1])) elif len(val) == 2 and old_lscpu: sock_map[val[0]].append(int(val[1])) return sock_map
def custom_execute(*cmd, **kwargs): try: return processutils.execute(*cmd, **kwargs) except processutils.ProcessExecutionError as e: sanitized_cmd = strutils.mask_password(' '.join(cmd)) raise exception.CommandError(cmd=sanitized_cmd, error=str(e))
def test_unmount_error(self, mock_execute): fake_devpath = '/dev/3' fake_mp = '/path/to/3' fake_fstype = 'ext4' mock_execute.side_effect = exception.CommandError() mounter = mount.Mounter() self.assertRaises(exception.MountException, mounter.mount, fake_devpath, fake_mp, fake_fstype)
def _get_product_and_vendor(address): try: output, status = processutils.execute('lspci', '-n', '-s', address) value = output.split()[2] result = value.split(":") return result[0], result[1] except processutils.ProcessExecutionError: raise exception.CommandError(cmd='lspci')
def get_total_disk_for_container(self): try: (output, err) = utils.execute('df', '-B', '1G', CONF.docker.docker_data_root, run_as_root=True) except exception.CommandError: LOG.info('There was a problem while executing df -B 1G %s', CONF.docker.docker_data_root) raise exception.CommandError(cmd='df') total_disk = int(output.split('\n')[1].split()[1]) return int(total_disk * (1 - CONF.compute.reserve_disk_for_image))
def _get_numa_node(address): numa_node = None try: output, status = processutils.execute('lspci', '-vmm', '-s', address) lines = output.split('\n') for line in lines: if 'NUMANode' in line: numa_node = int(line.split(":")[1]) except processutils.ProcessExecutionError: raise exception.CommandError(cmd='lspci') return numa_node
def _get_pcinet_info(self, vf_address): """Returns a dict of NET device.""" devname = pci_utils.get_net_name_by_vf_pci_address(vf_address) if not devname: return ifname = pci_utils.get_ifname_by_pci_address(vf_address) # Features from the that libvirt supported, get them by ethtool -k # Note: I cannot find the rdma feature returned by ethtool, correct me # if the string is wrong. FEATURES_LIST = [ 'rx-checksumming', 'tx-checksumming', 'scatter-gather', 'tcp-segmentation-offload', 'generic-segmentation-offload', 'generic-receive-offload', 'large-receive-offload', 'rx-vlan-offload', 'tx-vlan-offload', 'ntuple-filters', 'receive-hashing', 'tx-udp_tnl-segmentation', 'rdma' ] FEATURES_MAP = { 'rx-checksumming': 'rx', 'tx-checksumming': 'tx', 'scatter-gather': 'sg', 'tcp-segmentation-offload': 'tso', 'generic-segmentation-offload': 'gso', 'generic-receive-offload': 'gro', 'large-receive-offload': 'lro', 'rx-vlan-offload': 'rxvlan', 'tx-vlan-offload': 'txvlan', 'ntuple-filters': 'ntuple', 'receive-hashing': 'rxhash', 'tx-udp_tnl-segmentation': 'txudptnl', 'rdma': 'rdma' } features = [] try: output, status = processutils.execute('ethtool', '-k', ifname) lines = output.split('\n') for line in lines: columns = line.split(":") if columns[0].strip() in FEATURES_LIST: if "on" in columns[1].strip(): features.append(FEATURES_MAP.get(columns[0].strip())) except processutils.ProcessExecutionError: raise exception.CommandError(cmd='ethtool -k') return {'name': devname, 'capabilities': features}
def get_pci_resources(self): addresses = [] try: output, status = utils.execute('lspci', '-D', '-nnmm') lines = output.split('\n') for line in lines: if not line: continue columns = line.split() address = columns[0] addresses.append(address) except processutils.ProcessExecutionError: raise exception.CommandError(cmd='lspci') pci_info = [] for addr in addresses: pci_info.append(self._get_pci_dev_info(addr)) return jsonutils.dumps(pci_info)
def test_read_mounts_error(self, mock_execute): mock_execute.side_effect = exception.CommandError() mounter = mount.Mounter() self.assertRaises(exception.FileNotFound, mounter.read_mounts)
def test_get_cpu_numa_info_without_online(self, mock_output): mock_output.side_effect = [exception.CommandError(), LSCPU_NO_ONLINE] expected_output = {'0': [0, 1], '1': [2, 3]} output = os_capability_linux.LinuxHost().get_cpu_numa_info() self.assertEqual(expected_output, output)
def test_get_cpu_numa_info_exception(self, mock_output): mock_output.side_effect = exception.CommandError() self.assertRaises(exception.CommandError, os_capability_linux.LinuxHost().get_cpu_numa_info)