Skip to content

Commit

Permalink
Added: python 2 & 3 compatibility (six). (strizhechenko#86)
Browse files Browse the repository at this point in the history
* Added: python 2 & 3 compatibility (six).
* Restored: link-rate test virtualenv activation
* Fixed bug with round up in py3 (strizhechenko#87)
* Added: travis CI tests utils running with python 3.6 now.
* Refactoring: using pytest for testing py2/py3 compatibility.
* Fixed: pep8.
* Fixed: travis CI: removed explicit virtualenv creation.
strizhechenko#62
  • Loading branch information
strizhechenko committed Jun 22, 2017
1 parent 2a8bee7 commit 36b45d6
Show file tree
Hide file tree
Showing 23 changed files with 121 additions and 71 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
env
env3
*.pyc
dist
*.egg-info/
Expand Down
3 changes: 2 additions & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ os: linux

python:
- "2.7"
- "3.6"

install: make env
install: pip install --upgrade -r requirements.txt && python setup.py install

script: make test lint
55 changes: 40 additions & 15 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
test: env
test:
./tests/rss-ladder
./tests/server-info-show
./tests/link_rate_units.sh
pytest netutils_linux_*/

env:
rm -rf env
virtualenv env && \
. env/bin/activate && \
./tests/rss-ladder && \
./tests/rx_buffers_test.py && \
./tests/softnet_stat_test.py && \
./tests/server-info-show && \
./tests/softirq_top_test.py && \
./tests/assessor_test.py & \
./tests/link_rate_units.sh
pip install --upgrade -r requirements.txt && \
python setup.py install

help:
@echo " env create a development environment using virtualenv"
Expand All @@ -16,12 +19,35 @@ help:
@echo " coverage run tests with code coverage"
@echo " test run tests"

env:
rm -rf env
virtualenv env && \
. env/bin/activate && \
pip install --upgrade -r requirements.txt && \
python setup.py install
# only for localhost MacOS testing.
test2:
. env2/bin/activate && \
./tests/rss-ladder && \
./tests/server-info-show && \
./tests/link_rate_units.sh
pytest netutils_linux_*/

env2:
rm -rf env2
virtualenv --python=python2 env2 && \
. env2/bin/activate && \
pip install --upgrade -r requirements.txt && \
python setup.py install

# only for localhost MacOS testing.
test3:
. env3/bin/activate && \
./tests/rss-ladder && \
./tests/server-info-show && \
./tests/link_rate_units.sh
pytest netutils_linux_*/

env3:
rm -rf env3
virtualenv --python=python3 env3 && \
. env3/bin/activate && \
pip install --upgrade -r requirements.txt && \
python setup.py install

clean:
rm -fr env
Expand All @@ -32,7 +58,6 @@ clean:
find . -name '*~' -exec rm -f {} \;

lint:
. env/bin/activate && \
flake8 netutils_linux_monitoring netutils_linux_tuning netutils_linux_hardware

coverage:
Expand Down
13 changes: 10 additions & 3 deletions netutils_linux_hardware/assessor.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
import re
import math
import yaml


def round_(x, d=0):
p = 10 ** d
return float(math.floor((x * p) + math.copysign(0.5, x)))/p


def extract(dictionary, key_sequence):
key_sequence.reverse()
while dictionary and key_sequence:
Expand Down Expand Up @@ -35,9 +41,10 @@ def any2int(value):
return int(value)
return 0

def grade_int(self, value, _min, _max, scale=10):
value = self.any2int(value)
return min(scale, max(1, int(1 + round((value - _min) * (scale - 1.) / (_max - _min)))))
@staticmethod
def grade_int(value, _min, _max, scale=10):
value = Assessor.any2int(value)
return min(scale, max(1, int(1 + round_((value - _min) * (scale - 1.) / (_max - _min)+.001))))

@staticmethod
def grade_str(value, good=None, bad=None):
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#!/usr/bin/env python

from unittest import TestCase, main
from six import iteritems
from netutils_linux_hardware import Assessor


Expand Down Expand Up @@ -30,7 +31,7 @@ def test_grade_str(self):
"Dlink": 1,
"Realtek": 1,
}
for k, v in expected.iteritems():
for k, v in iteritems(expected):
self.assertEqual(Assessor.grade_str(k, good, bad), v)

def test_grade_fact(self):
Expand Down Expand Up @@ -59,5 +60,6 @@ def test_grade_list(self):
self.assertEqual(assessor.grade_list([1], 1, 4), 1)
self.assertEqual(assessor.grade_list([1, 2, 3, 4], 1, 4), 10)


if __name__ == '__main__':
main()
9 changes: 5 additions & 4 deletions netutils_linux_hardware/interrupts.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
# coding: utf-8
# pylint: disable=C0111, C0103

from parsers import Parser
from six import print_
from netutils_linux_hardware.parsers import Parser


class NICQueues(object):
Expand All @@ -28,7 +29,7 @@ def netdev_queue_relationship(queue, dev):
return kind
if kind.isdigit() or kind == 'TxRx':
return 'rxtx'
print queue
print_(queue)
if queue.count(',') > 0 and dev in queue:
return 'shared'
return 'unknown'
Expand All @@ -47,7 +48,7 @@ class IRQQueueCounter(Parser):
@staticmethod
def all_netdev_queues(text, netdevs):
for line in text.strip().split('\n'):
for netdev in netdevs.iterkeys():
for netdev in netdevs:
if netdev in line:
yield line.strip()
continue
Expand All @@ -65,5 +66,5 @@ 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.iterkeys():
for netdev in netdevs:
netdevs[netdev]['queues'] = NICQueues().parse(queues_names, netdev)
7 changes: 4 additions & 3 deletions netutils_linux_hardware/netdev.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@
# pylint: disable=C0111, C0103

import os
from interrupts import IRQQueueCounter
from parsers import EthtoolBuffers, ReductorMirror, BrctlOutput, YAMLLike
from six import iteritems
from netutils_linux_hardware.interrupts import IRQQueueCounter
from netutils_linux_hardware.parsers import EthtoolBuffers, ReductorMirror, BrctlOutput, YAMLLike


class ReaderNet(object):
Expand Down Expand Up @@ -38,7 +39,7 @@ def net_dev_list_drivers(self):
driverfile = os.path.join(self.datadir, 'ethtool/i', netdev)
driverdata = YAMLLike().parse_file_safe(driverfile)
if driverdata:
driverdata = dict((k, v) for k, v in driverdata.iteritems() if k in keys_required)
driverdata = dict((k, v) for k, v in iteritems(driverdata) if k in keys_required)
else:
driverdata = dict()
self.netdevs[netdev]['driver'] = driverdata
Expand Down
21 changes: 11 additions & 10 deletions netutils_linux_hardware/parsers.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

import os
import yaml
from six import print_, iteritems


class Parser(object):
Expand All @@ -29,7 +30,7 @@ class ReductorMirror(Parser):
@staticmethod
def parse(text):
lines = dict((line.split(' ', 1)) for line in text.strip().split('\n'))
for netdev, conf in lines.iteritems():
for netdev, conf in iteritems(lines):
output = dict()
output['conf'] = dict()
output['conf']['vlan'], output['conf']['ip'] = conf.split()
Expand All @@ -53,8 +54,8 @@ def invert_dict_nesting(d):
}
"""
d2 = dict()
for k, v in d.iteritems():
for k2, v2 in v.iteritems():
for k, v in iteritems(d):
for k2, v2 in iteritems(v):
if not d2.get(k2):
d2[k2] = dict()
d2[k2][k] = v2
Expand All @@ -78,11 +79,11 @@ def parse(text):
types = ['SSD', 'HDD']
if not text:
return dict()
return dict((k, types[v]) for k, v in yaml.load(text
.replace(":", ": ")
.replace("/sys/block/", "")
.replace("/queue/rotational", ""))
.iteritems())
return dict((k, types[v]) for k, v in iteritems(yaml.load(text
.replace(":", ": ")
.replace("/sys/block/", "")
.replace("/queue/rotational", ""))
))

class DiskSizeInfo(Parser):

Expand Down Expand Up @@ -116,7 +117,7 @@ class MemInfo(YAMLLike):
)

def parse(self, text):
return dict((k, int(v.replace(' kB', ''))) for k, v in yaml.load(text).iteritems() if k in self.keys_required)
return dict((k, int(v.replace(' kB', ''))) for k, v in iteritems(yaml.load(text)) if k in self.keys_required)


class CPULayout(Parser):
Expand All @@ -141,7 +142,7 @@ def parse(text):
elif key.count('.') == 0:
dev = key
else:
print 'QinQ not supported yet. Device: {0}'.format(key)
print_('QinQ not supported yet. Device: {0}'.format(key))
raise NotImplementedError

netdevs[dev] = dict()
Expand Down
4 changes: 2 additions & 2 deletions netutils_linux_hardware/reader.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@

import os
import yaml
from parsers import YAMLLike, CPULayout, DiskInfo, MemInfo
from netdev import ReaderNet
from netutils_linux_hardware.parsers import YAMLLike, CPULayout, DiskInfo, MemInfo
from netutils_linux_hardware.netdev import ReaderNet


class Reader(object):
Expand Down
9 changes: 5 additions & 4 deletions netutils_linux_monitoring/base_top.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
from random import randint
from optparse import Option, OptionParser, OptionConflictError
from colorama import Fore
from colors import wrap
from six import print_, iteritems
from netutils_linux_monitoring.colors import wrap


class BaseTop(object):
Expand Down Expand Up @@ -55,7 +56,7 @@ def parse_options(self, options=None):
pass
self.options, _ = parser.parse_args()
if options:
for name, value in options.iteritems():
for name, value in iteritems(options):
setattr(self.options, name, value)
if hasattr(self, 'post_optparse'):
# pylint: disable=E1101
Expand Down Expand Up @@ -84,9 +85,9 @@ def run(self):
if self.options.clear:
system('clear')
if self.diff:
print self
print_(self)
except KeyboardInterrupt:
print
print_()
exit(0)

def repr_source(self):
Expand Down
1 change: 1 addition & 0 deletions netutils_linux_monitoring/irqtop.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from random import randint
from copy import deepcopy
from optparse import Option
from six.moves import xrange
from netutils_linux_monitoring.base_top import BaseTop
from netutils_linux_monitoring.colors import colorize_cpu_list, colorize
from netutils_linux_monitoring.numa import Numa
Expand Down
7 changes: 4 additions & 3 deletions netutils_linux_monitoring/layout.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

""" Everything about console output's layout """

from six import print_
from prettytable import PrettyTable


Expand All @@ -20,8 +21,8 @@ def make_table(header, align_map=None, rows=None):
try:
t.add_row(row)
except Exception as err:
print 'fields:', t.field_names
print 'row:', row
print 'rows:', rows
print_('fields:', t.field_names)
print_('row:', row)
print_('rows:', rows)
raise err
return t
7 changes: 4 additions & 3 deletions netutils_linux_monitoring/link_rate.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from random import randint
from optparse import Option
from collections import namedtuple
from six import print_, iteritems
from netutils_linux_monitoring.base_top import BaseTop
from netutils_linux_monitoring.layout import make_table
from netutils_linux_monitoring.numa import Numa
Expand Down Expand Up @@ -57,7 +58,7 @@ def parse(self):

def eval(self):
self.diff = deepcopy(self.current)
for dev, data in self.current.iteritems():
for dev, data in iteritems(self.current):
for stat in self.stats:
if self.options.random:
self.diff[dev][stat] = randint(0, 10000)
Expand Down Expand Up @@ -130,7 +131,7 @@ def devices_list(self):
devices = self.options.devices.split(',')
else:
devices = self.devices_list_regex()
return filter(self.devices_list_validate, devices)
return list(filter(self.devices_list_validate, devices))

def post_optparse(self):
""" Asserting and applying parsing options """
Expand Down Expand Up @@ -167,4 +168,4 @@ def unit_change(self):


if __name__ == '__main__':
print LinkRateTop().run()
print_(LinkRateTop().run())
Loading

0 comments on commit 36b45d6

Please sign in to comment.