strizhechenko/netutils-linux

View on GitHub
netutils_linux_hardware/interrupts.py

Summary

Maintainability
A
2 hrs
Test Coverage
# coding: utf-8
# pylint: disable=C0111, C0103

from six import print_

from netutils_linux_hardware.parser import Parser


class NICQueues(object):

    def __init__(self):
        self.queues = {
            'own': [],
            'rx': [],
            'tx': [],
            'rxtx': [],
            'shared': [],
            'unknown': [],
        }

    @staticmethod
    def netdev_queue_relationship(queue, dev):
        if dev not in queue:
            return
        if queue == dev:
            return 'own'
        if queue.startswith(dev + '-'):
            kind = queue.split('-')[1]
            if kind in ('tx', 'rx', 'rxtx'):
                return kind
            if kind.isdigit() or kind == 'TxRx':
                return 'rxtx'
            print_(queue)
        if queue.count(',') > 0 and dev in queue:
            return 'shared'
        return 'unknown'

    def parse(self, all_queues, dev):
        # maybe some nic's have no own separate queue, just rx/tx/rxtx
        for queue in all_queues:
            kind = self.netdev_queue_relationship(queue, dev)
            if kind:
                self.queues[kind].append(queue)
        return self.queues


class IRQQueueCounter(Parser):

    @staticmethod
    def all_netdev_queues(text, netdevs):
        for line in text.strip().split('\n'):
            for netdev in netdevs:
                if netdev in line:
                    yield line.strip()
                    continue

    def irq2queues(self, text, cpu_count, netdevs):
        netdev_queues = self.all_netdev_queues(text, netdevs)
        return [' '.join(line.split()[cpu_count + 2:]) for line in netdev_queues]

    @staticmethod
    def irq2cpucount(text):
        """ IDK maybe /proc/interrupts cpu count differ from nproc """
        return len(text.split('\n')[0].split())

    def parse(self, text, **kwargs):
        netdevs = kwargs['netdevs']
        cpu_count = self.irq2cpucount(text)
        queues_names = self.irq2queues(text, cpu_count, netdevs)
        for netdev in netdevs:
            netdevs[netdev]['queues'] = NICQueues().parse(queues_names, netdev)