Source code for insights.parsers.interrupts

"""
Interrupts - file ``/proc/interrupts``
======================================

Provides parsing for contents of ``/proc/interrupts``.
The contents of a typical ``interrupts`` file looks like::

             CPU0       CPU1       CPU2       CPU3
    0:         37          0          0          0  IR-IO-APIC   2-edge      timer
    1:          3          2          1          0  IR-IO-APIC   1-edge      i8042
    8:          0          1          0          0  IR-IO-APIC   8-edge      rtc0
    9:      11107       2316       4040       1356  IR-IO-APIC   9-fasteoi   acpi
  NMI:        210         92        179         96   Non-maskable interrupts
  LOC:    7561411    2488524    6527767    2448192   Local timer interrupts
  ERR:          0
  MIS:          0

The information is parsed by the ``Interrupts`` class.  The information is stored
as a list of dictionaries in order corresponding to the output.
The counts in the CPU# columns are represented in a ``list``.
The following is a sample of the parsed information stored in an ``Interrupts``
class object::

    [
        { 'irq': '0',
          'num_cpus': 4,
          'counts': [37, 0, 0, 0],


        { 'irq': 'MIS',
          'num_cpus': 4,
          'counts': [0, ]}
    ]

Examples:
    >>> int_info = shared[Interrupts]
    >>> int_info.data[0]
    {'irq': '0', 'num_cpus': 4, 'counts': [37, 0, 0, 0],
     'type_device': 'IR-IO-APIC   2-edge      timer'}
    >>> int_info.num_cpus
    4
    >>> int_info.get('i8042')
    [{'irq': '1', 'num_cpus': 4, 'counts': [3, 2, 1, 0],
      'type_device': 'IR-IO-APIC   1-edge      i8042'}]
    >>> [i['irq'] for i in int_info if i['counts'][0] > 1000]
    ['9', 'LOC']
"""
from insights.core import Parser
from insights.core.exceptions import ParseException
from insights.core.plugins import parser
from insights.specs import Specs


[docs] @parser(Specs.interrupts) class Interrupts(Parser): """Parse contents of ``/proc/interrupts``. Attributes: data (list of dict): List of dictionaries with each entry representing a row of the command output after the first line of headings. Raises: ParseException: Returned if first line is invalid, or no data is found to parse. """
[docs] def get(self, filter): """list: Returns list of records containing ``filter`` in the type/device field.""" return [i for i in self.data if 'type_device' in i and filter in i['type_device']]
def __iter__(self): return iter(self.data) @property def num_cpus(self): """int: Returns total number of CPUs.""" return int(self.data[0]['num_cpus'])
[docs] def parse_content(self, content): self.data = [] try: cpu_names = content[0].split() except: raise ParseException("Invalid first line of content for /proc/interrupts") if len(cpu_names) < 1 or not cpu_names[0].startswith("CPU"): raise ParseException("Unable to determine number of CPUs in /proc/interrupts") for line in content[1:]: parts = line.split(None, len(cpu_names) + 1) one_int = {'irq': parts[0].replace(":", "")} one_int['num_cpus'] = len(cpu_names) one_int['counts'] = [] if len(parts) == len(cpu_names) + 2: one_int['type_device'] = parts[-1] for part, cpu in zip(parts[1:-1], cpu_names): one_int['counts'].append(int(part)) else: for part, cpu in zip(parts[1:], cpu_names): one_int['counts'].append(int(part)) self.data.append(one_int) if len(self.data) < 1: raise ParseException("No information in /proc/interrupts")