Example #1
0
        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}
Example #2
0
 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
Example #3
0
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))
Example #4
0
 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)
Example #5
0
 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')
Example #6
0
 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))
Example #7
0
 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
Example #8
0
    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}
Example #9
0
    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)
Example #10
0
 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)