
from mgr_module import MgrModule


class Module(MgrModule):
    COMMANDS = [
        {
            "cmd": "iostat",
            "desc": "Get IO rates",
            "perm": "r",
            "poll": "true"
        },
    ]


    def __init__(self, *args, **kwargs):
        super(Module, self).__init__(*args, **kwargs)

    def self_test(self):
        r = self.get('io_rate')
        assert('pg_stats_delta' in r)
        assert('stamp_delta' in r['pg_stats_delta'])
        assert('stat_sum' in r['pg_stats_delta'])
        assert('num_read_kb' in r['pg_stats_delta']['stat_sum'])
        assert('num_write_kb' in r['pg_stats_delta']['stat_sum'])
        assert('num_write' in r['pg_stats_delta']['stat_sum'])
        assert('num_read' in r['pg_stats_delta']['stat_sum'])

    def handle_command(self, inbuf, command):
        rd = 0
        wr = 0
        total = 0
        rd_ops = 0
        wr_ops = 0
        total_ops = 0
        ret = ''

        if command['prefix'] == 'iostat':
            r = self.get('io_rate')

            stamp_delta = float(r['pg_stats_delta']['stamp_delta'])
            if (stamp_delta > 0):
                rd = int(r['pg_stats_delta']['stat_sum']['num_read_kb']) / stamp_delta
                wr = int(r['pg_stats_delta']['stat_sum']['num_write_kb']) / stamp_delta
                # The values are in kB, but to_pretty_iec() requires them to be in bytes
                rd = int(rd) << 10
                wr = int(wr) << 10
                total = rd + wr

                rd_ops = int(r['pg_stats_delta']['stat_sum']['num_read']) / stamp_delta
                wr_ops = int(r['pg_stats_delta']['stat_sum']['num_write']) / stamp_delta
                total_ops = rd_ops + wr_ops

            if 'width' in command:
                width = command['width']
            else:
                width = 80

            if command.get('print_header', False):
                elems = ['Read', 'Write', 'Total', 'Read IOPS', 'Write IOPS', 'Total IOPS']
                ret += self.get_pretty_header(elems, width)

            elems = [
                self.to_pretty_iec(rd) + 'B/s',
                self.to_pretty_iec(wr) + 'B/s',
                self.to_pretty_iec(total) + 'B/s',
                int(rd_ops),
                int(wr_ops),
                int(total_ops)
            ]
            ret += self.get_pretty_row(elems, width)

        return 0, '', ret
