From 96d7754a6f464e59c50ebb1a78fd5a21b266e75f Mon Sep 17 00:00:00 2001 From: Oleg Strizhechenko Date: Wed, 24 Jan 2018 11:48:44 +0500 Subject: [PATCH 01/17] Added(server-info): collection of max/cur queue count info --- utils/server-info-collect | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/server-info-collect b/utils/server-info-collect index 82bd5f0..e18fef1 100755 --- a/utils/server-info-collect +++ b/utils/server-info-collect @@ -51,7 +51,7 @@ network_info() { for netdev in $(grep : /proc/net/dev | awk '{print $1}' | tr -d :); do ethtool -i "$netdev" &>/dev/null || continue - for action in i g c; do + for action in i g c l; do if ! ethtool -"$action" "$netdev" &>"$TMPDIR/ethtool/$action/$netdev"; then rm -f "$TMPDIR/ethtool/$action/$netdev" fi From e42da12527dc95002a7fe2937f5d3df0c56bcf82 Mon Sep 17 00:00:00 2001 From: Oleg Strizhechenko Date: Fri, 26 Jan 2018 21:56:11 +0500 Subject: [PATCH 02/17] Fixed(server-info): --collect didn't collect queue data --- utils/server-info-collect | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/server-info-collect b/utils/server-info-collect index e18fef1..e4655fd 100755 --- a/utils/server-info-collect +++ b/utils/server-info-collect @@ -6,7 +6,7 @@ SYSCONFIG=/etc/sysconfig/network-scripts/ TMPDIR="$1" prepare() { - mkdir -p $TMPDIR/ethtool/{g,i,c} $TMPDIR/network-scripts/ + mkdir -p $TMPDIR/ethtool/{g,i,c,l} $TMPDIR/network-scripts/ } server_info() { From d8589fea26108a0b2e56e6c3b708825454590618 Mon Sep 17 00:00:00 2001 From: Oleg Strizhechenko Date: Sat, 27 Jan 2018 12:59:28 +0500 Subject: [PATCH 03/17] Added(server-info): analyzing `ethtool -l` output to know about queues --- netutils_linux_hardware/net.py | 41 +++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/netutils_linux_hardware/net.py b/netutils_linux_hardware/net.py index bbb1f9b..595df3e 100644 --- a/netutils_linux_hardware/net.py +++ b/netutils_linux_hardware/net.py @@ -21,8 +21,7 @@ def rate(self): def __netdev(self, netdev): netdevinfo = extract(self.data, ['net', netdev]) - queues = sum( - len(extract(netdevinfo, ['queues', x])) for x in ('rx', 'rxtx')) + queues = sum(len(extract(netdevinfo, ['queues', x])) for x in ('rx', 'rxtx')) buffers = netdevinfo.get('buffers') or {} return self.folding.fold({ 'queues': Grade.int(queues, 2, 8), @@ -113,6 +112,26 @@ def parse(text): } +class EthtoolQueues(Parser): + @staticmethod + def parse(text): + __queues = [int(line.split()[1]) for line in text.split('\n') if line.split()[1].isdigit()] + if len(__queues) == 8: + queues = { + 'rx': { + 'max': __queues[0], + 'cur': __queues[4], + }, + 'combined': { + 'max': __queues[3], + 'cur': __queues[7], + }, + } + if queues['rx']['max'] == 0 and queues['combined']['max'] != 0: + del queues['rx'] + return queues + + class ReaderNet(object): netdevs = None @@ -130,6 +149,11 @@ def net_dev_list_bridge(self): def net_dev_list_ethtool(self): return EthtoolFiles().parse_file(self.path('ethtool/i')) + def net_dev_list_queues(self): + for netdev in self.netdevs: + buffers_path = os.path.join(self.datadir, 'ethtool/l', netdev) + self.netdevs[netdev]['queues_ethtool'] = EthtoolQueues().parse_file_safe(buffers_path) + def net_dev_list_buffers(self): for netdev in self.netdevs: buffers_path = os.path.join(self.datadir, 'ethtool/g', netdev) @@ -141,13 +165,13 @@ def net_dev_list_drivers(self): 'version', ) for netdev in self.netdevs: - driverfile = os.path.join(self.datadir, 'ethtool/i', netdev) - driverdata = YAMLLike().parse_file_safe(driverfile) - if driverdata: - driverdata = dict((key, v) for key, v in iteritems(driverdata) if key in keys_required) + driver_file = os.path.join(self.datadir, 'ethtool/i', netdev) + driver_data = YAMLLike().parse_file_safe(driver_file) + if driver_data: + driver_data = dict((key, v) for key, v in iteritems(driver_data) if key in keys_required) else: - driverdata = dict() - self.netdevs[netdev]['driver'] = driverdata + driver_data = dict() + self.netdevs[netdev]['driver'] = driver_data def net_dev_list(self): """ @@ -161,5 +185,6 @@ def net_dev_list(self): return self.net_dev_list_buffers() self.net_dev_list_drivers() + self.net_dev_list_queues() interrupts = self.path('interrupts') IRQQueueCounter().parse_file_safe(interrupts, netdevs=self.netdevs) From d1ed0e943b881c99573d2a65204b4107729d670e Mon Sep 17 00:00:00 2001 From: Oleg Strizhechenko Date: Sat, 27 Jan 2018 13:01:54 +0500 Subject: [PATCH 04/17] Added(test-data): server info for Intel Core i5 + Intel I350 in mirror. --- .../1xi5.single_i350.l2_vlan_master/cpuinfo | 104 ++++++++++++++++++ .../disks_types | 2 + .../1xi5.single_i350.l2_vlan_master/dmidecode | 0 .../ethtool/c/eth0 | 27 +++++ .../ethtool/c/eth1 | 27 +++++ .../ethtool/g/eth0 | 12 ++ .../ethtool/g/eth1 | 12 ++ .../ethtool/i/br0 | 9 ++ .../ethtool/i/br1 | 9 ++ .../ethtool/i/br2 | 9 ++ .../ethtool/i/br3 | 9 ++ .../ethtool/i/eth0 | 9 ++ .../ethtool/i/eth1 | 9 ++ .../ethtool/i/eth1.1 | 9 ++ .../ethtool/i/eth2 | 9 ++ .../ethtool/l/eth0 | 12 ++ .../ethtool/l/eth1 | 12 ++ .../interrupts | 53 +++++++++ .../lsblk_models | 3 + .../lsblk_sizes | 12 ++ .../lscpu_info | 22 ++++ .../lscpu_layout | 4 + .../1xi5.single_i350.l2_vlan_master/lspci | 17 +++ .../1xi5.single_i350.l2_vlan_master/meminfo | 43 ++++++++ .../mirror_info.conf | 1 + .../network-scripts/ifcfg-br0 | 0 .../network-scripts/ifcfg-br1 | 0 .../network-scripts/ifcfg-br2 | 0 .../network-scripts/ifcfg-br3 | 0 .../network-scripts/ifcfg-eth0 | 0 .../network-scripts/ifcfg-eth1 | 0 .../network-scripts/ifcfg-eth1.1 | 0 .../network-scripts/ifcfg-eth2 | 0 .../1xi5.single_i350.l2_vlan_master/scsi | 7 ++ 34 files changed, 442 insertions(+) create mode 100644 tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/cpuinfo create mode 100644 tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/disks_types create mode 100644 tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/dmidecode create mode 100644 tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/c/eth0 create mode 100644 tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/c/eth1 create mode 100644 tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/g/eth0 create mode 100644 tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/g/eth1 create mode 100644 tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/i/br0 create mode 100644 tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/i/br1 create mode 100644 tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/i/br2 create mode 100644 tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/i/br3 create mode 100644 tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/i/eth0 create mode 100644 tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/i/eth1 create mode 100644 tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/i/eth1.1 create mode 100644 tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/i/eth2 create mode 100644 tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/l/eth0 create mode 100644 tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/l/eth1 create mode 100644 tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/interrupts create mode 100644 tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/lsblk_models create mode 100644 tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/lsblk_sizes create mode 100644 tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/lscpu_info create mode 100644 tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/lscpu_layout create mode 100644 tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/lspci create mode 100644 tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/meminfo create mode 100644 tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/mirror_info.conf create mode 100644 tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/network-scripts/ifcfg-br0 create mode 100644 tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/network-scripts/ifcfg-br1 create mode 100644 tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/network-scripts/ifcfg-br2 create mode 100644 tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/network-scripts/ifcfg-br3 create mode 100644 tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/network-scripts/ifcfg-eth0 create mode 100644 tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/network-scripts/ifcfg-eth1 create mode 100644 tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/network-scripts/ifcfg-eth1.1 create mode 100644 tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/network-scripts/ifcfg-eth2 create mode 100644 tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/scsi diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/cpuinfo b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/cpuinfo new file mode 100644 index 0000000..acf83df --- /dev/null +++ b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/cpuinfo @@ -0,0 +1,104 @@ +processor : 0 +vendor_id : GenuineIntel +cpu family : 6 +model : 60 +model name : Intel(R) Core(TM) i5-4440 CPU @ 3.10GHz +stepping : 3 +microcode : 18 +cpu MHz : 3092.746 +cache size : 6144 KB +physical id : 0 +siblings : 4 +core id : 0 +cpu cores : 4 +apicid : 0 +initial apicid : 0 +fpu : yes +fpu_exception : yes +cpuid level : 13 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm ida arat epb xsaveopt pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase bmi1 avx2 smep bmi2 erms invpcid +bogomips : 6185.49 +clflush size : 64 +cache_alignment : 64 +address sizes : 39 bits physical, 48 bits virtual +power management: + +processor : 1 +vendor_id : GenuineIntel +cpu family : 6 +model : 60 +model name : Intel(R) Core(TM) i5-4440 CPU @ 3.10GHz +stepping : 3 +microcode : 18 +cpu MHz : 3092.746 +cache size : 6144 KB +physical id : 0 +siblings : 4 +core id : 1 +cpu cores : 4 +apicid : 2 +initial apicid : 2 +fpu : yes +fpu_exception : yes +cpuid level : 13 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm ida arat epb xsaveopt pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase bmi1 avx2 smep bmi2 erms invpcid +bogomips : 6185.49 +clflush size : 64 +cache_alignment : 64 +address sizes : 39 bits physical, 48 bits virtual +power management: + +processor : 2 +vendor_id : GenuineIntel +cpu family : 6 +model : 60 +model name : Intel(R) Core(TM) i5-4440 CPU @ 3.10GHz +stepping : 3 +microcode : 18 +cpu MHz : 3092.746 +cache size : 6144 KB +physical id : 0 +siblings : 4 +core id : 2 +cpu cores : 4 +apicid : 4 +initial apicid : 4 +fpu : yes +fpu_exception : yes +cpuid level : 13 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm ida arat epb xsaveopt pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase bmi1 avx2 smep bmi2 erms invpcid +bogomips : 6185.49 +clflush size : 64 +cache_alignment : 64 +address sizes : 39 bits physical, 48 bits virtual +power management: + +processor : 3 +vendor_id : GenuineIntel +cpu family : 6 +model : 60 +model name : Intel(R) Core(TM) i5-4440 CPU @ 3.10GHz +stepping : 3 +microcode : 18 +cpu MHz : 3092.746 +cache size : 6144 KB +physical id : 0 +siblings : 4 +core id : 3 +cpu cores : 4 +apicid : 6 +initial apicid : 6 +fpu : yes +fpu_exception : yes +cpuid level : 13 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm ida arat epb xsaveopt pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase bmi1 avx2 smep bmi2 erms invpcid +bogomips : 6185.49 +clflush size : 64 +cache_alignment : 64 +address sizes : 39 bits physical, 48 bits virtual +power management: + diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/disks_types b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/disks_types new file mode 100644 index 0000000..4a3e1e1 --- /dev/null +++ b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/disks_types @@ -0,0 +1,2 @@ +/sys/block/sda/queue/rotational:1 +/sys/block/sdb/queue/rotational:1 diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/dmidecode b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/dmidecode new file mode 100644 index 0000000..e69de29 diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/c/eth0 b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/c/eth0 new file mode 100644 index 0000000..408299c --- /dev/null +++ b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/c/eth0 @@ -0,0 +1,27 @@ +Coalesce parameters for eth0: +Adaptive RX: off TX: off +stats-block-usecs: 0 +sample-interval: 0 +pkt-rate-low: 0 +pkt-rate-high: 0 + +rx-usecs: 3 +rx-frames: 0 +rx-usecs-irq: 0 +rx-frames-irq: 0 + +tx-usecs: 3 +tx-frames: 0 +tx-usecs-irq: 0 +tx-frames-irq: 0 + +rx-usecs-low: 0 +rx-frame-low: 0 +tx-usecs-low: 0 +tx-frame-low: 0 + +rx-usecs-high: 0 +rx-frame-high: 0 +tx-usecs-high: 0 +tx-frame-high: 0 + diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/c/eth1 b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/c/eth1 new file mode 100644 index 0000000..44fe2c8 --- /dev/null +++ b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/c/eth1 @@ -0,0 +1,27 @@ +Coalesce parameters for eth1: +Adaptive RX: off TX: off +stats-block-usecs: 0 +sample-interval: 0 +pkt-rate-low: 0 +pkt-rate-high: 0 + +rx-usecs: 3 +rx-frames: 0 +rx-usecs-irq: 0 +rx-frames-irq: 0 + +tx-usecs: 3 +tx-frames: 0 +tx-usecs-irq: 0 +tx-frames-irq: 0 + +rx-usecs-low: 0 +rx-frame-low: 0 +tx-usecs-low: 0 +tx-frame-low: 0 + +rx-usecs-high: 0 +rx-frame-high: 0 +tx-usecs-high: 0 +tx-frame-high: 0 + diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/g/eth0 b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/g/eth0 new file mode 100644 index 0000000..8756110 --- /dev/null +++ b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/g/eth0 @@ -0,0 +1,12 @@ +Ring parameters for eth0: +Pre-set maximums: +RX: 4096 +RX Mini: 0 +RX Jumbo: 0 +TX: 4096 +Current hardware settings: +RX: 256 +RX Mini: 0 +RX Jumbo: 0 +TX: 256 + diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/g/eth1 b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/g/eth1 new file mode 100644 index 0000000..922e225 --- /dev/null +++ b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/g/eth1 @@ -0,0 +1,12 @@ +Ring parameters for eth1: +Pre-set maximums: +RX: 4096 +RX Mini: 0 +RX Jumbo: 0 +TX: 4096 +Current hardware settings: +RX: 2048 +RX Mini: 0 +RX Jumbo: 0 +TX: 256 + diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/i/br0 b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/i/br0 new file mode 100644 index 0000000..693c489 --- /dev/null +++ b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/i/br0 @@ -0,0 +1,9 @@ +driver: bridge +version: 2.3 +firmware-version: N/A +bus-info: N/A +supports-statistics: no +supports-test: no +supports-eeprom-access: no +supports-register-dump: no +supports-priv-flags: no diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/i/br1 b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/i/br1 new file mode 100644 index 0000000..693c489 --- /dev/null +++ b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/i/br1 @@ -0,0 +1,9 @@ +driver: bridge +version: 2.3 +firmware-version: N/A +bus-info: N/A +supports-statistics: no +supports-test: no +supports-eeprom-access: no +supports-register-dump: no +supports-priv-flags: no diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/i/br2 b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/i/br2 new file mode 100644 index 0000000..693c489 --- /dev/null +++ b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/i/br2 @@ -0,0 +1,9 @@ +driver: bridge +version: 2.3 +firmware-version: N/A +bus-info: N/A +supports-statistics: no +supports-test: no +supports-eeprom-access: no +supports-register-dump: no +supports-priv-flags: no diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/i/br3 b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/i/br3 new file mode 100644 index 0000000..693c489 --- /dev/null +++ b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/i/br3 @@ -0,0 +1,9 @@ +driver: bridge +version: 2.3 +firmware-version: N/A +bus-info: N/A +supports-statistics: no +supports-test: no +supports-eeprom-access: no +supports-register-dump: no +supports-priv-flags: no diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/i/eth0 b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/i/eth0 new file mode 100644 index 0000000..2798045 --- /dev/null +++ b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/i/eth0 @@ -0,0 +1,9 @@ +driver: igb +version: 5.3.0-k +firmware-version: 1.63, 0x80000f04 +bus-info: 0000:01:00.0 +supports-statistics: yes +supports-test: yes +supports-eeprom-access: yes +supports-register-dump: yes +supports-priv-flags: no diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/i/eth1 b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/i/eth1 new file mode 100644 index 0000000..4cad6c8 --- /dev/null +++ b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/i/eth1 @@ -0,0 +1,9 @@ +driver: igb +version: 5.3.0-k +firmware-version: 1.63, 0x80000f04 +bus-info: 0000:01:00.1 +supports-statistics: yes +supports-test: yes +supports-eeprom-access: yes +supports-register-dump: yes +supports-priv-flags: no diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/i/eth1.1 b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/i/eth1.1 new file mode 100644 index 0000000..b13ca24 --- /dev/null +++ b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/i/eth1.1 @@ -0,0 +1,9 @@ +driver: 802.1Q VLAN Support +version: 1.8 +firmware-version: N/A +bus-info: +supports-statistics: no +supports-test: no +supports-eeprom-access: no +supports-register-dump: no +supports-priv-flags: no diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/i/eth2 b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/i/eth2 new file mode 100644 index 0000000..b4c01b3 --- /dev/null +++ b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/i/eth2 @@ -0,0 +1,9 @@ +driver: r8169 +version: 2.3LK-NAPI +firmware-version: rtl8168g-2_0.0.1 02/06/13 +bus-info: 0000:03:00.0 +supports-statistics: yes +supports-test: no +supports-eeprom-access: no +supports-register-dump: yes +supports-priv-flags: no diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/l/eth0 b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/l/eth0 new file mode 100644 index 0000000..b4414a5 --- /dev/null +++ b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/l/eth0 @@ -0,0 +1,12 @@ +Channel parameters for eth0: +Pre-set maximums: +RX: 0 +TX: 0 +Other: 1 +Combined: 8 +Current hardware settings: +RX: 0 +TX: 0 +Other: 1 +Combined: 4 + diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/l/eth1 b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/l/eth1 new file mode 100644 index 0000000..b968d76 --- /dev/null +++ b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/ethtool/l/eth1 @@ -0,0 +1,12 @@ +Channel parameters for eth1: +Pre-set maximums: +RX: 0 +TX: 0 +Other: 1 +Combined: 8 +Current hardware settings: +RX: 0 +TX: 0 +Other: 1 +Combined: 4 + diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/interrupts b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/interrupts new file mode 100644 index 0000000..a18923d --- /dev/null +++ b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/interrupts @@ -0,0 +1,53 @@ + CPU0 CPU1 CPU2 CPU3 + 0: 133 0 0 0 IR-IO-APIC-edge timer + 1: 2 0 0 0 IR-IO-APIC-edge i8042 + 5: 0 0 0 0 IR-IO-APIC-edge parport0 + 8: 1 0 0 0 IR-IO-APIC-edge rtc0 + 9: 3 0 0 0 IR-IO-APIC-fasteoi acpi + 12: 4 0 0 0 IR-IO-APIC-edge i8042 + 20: 26 0 0 0 IR-IO-APIC-fasteoi ehci_hcd:usb1 + 23: 26 0 0 0 IR-IO-APIC-fasteoi ehci_hcd:usb2 + 24: 0 0 0 0 DMAR_MSI-edge dmar0 + 25: 0 0 0 0 DMAR_MSI-edge dmar1 + 26: 615 0 0 0 IR-HPET_MSI-edge hpet2 + 27: 0 0 0 0 IR-HPET_MSI-edge hpet3 + 28: 0 0 0 0 IR-HPET_MSI-edge hpet4 + 29: 0 0 0 0 IR-HPET_MSI-edge hpet5 + 31: 195 0 0 0 IR-PCI-MSI-edge i915 + 32: 4981 0 0 0 IR-PCI-MSI-edge xhci_hcd + 33: 1241566 0 0 0 IR-PCI-MSI-edge ahci + 34: 7 0 0 0 IR-PCI-MSI-edge eth0 + 35: 1443295 130361 0 0 IR-PCI-MSI-edge eth0-rx-0 + 36: 1283120 188385 0 0 IR-PCI-MSI-edge eth0-rx-1 + 37: 1402578 190656 0 0 IR-PCI-MSI-edge eth0-rx-2 + 38: 1280942 317089 0 0 IR-PCI-MSI-edge eth0-rx-3 + 39: 1196121 180071 0 0 IR-PCI-MSI-edge eth0-tx-0 + 40: 1159228 84251 0 0 IR-PCI-MSI-edge eth0-tx-1 + 41: 1341122 467302 0 0 IR-PCI-MSI-edge eth0-tx-2 + 42: 2745426 708694 0 0 IR-PCI-MSI-edge eth0-tx-3 + 43: 7 0 0 0 IR-PCI-MSI-edge eth1 + 44: 32093625 2934871 0 0 IR-PCI-MSI-edge eth1-rx-0 + 45: 26392704 2469228 0 0 IR-PCI-MSI-edge eth1-rx-1 + 46: 28700797 2835047 0 0 IR-PCI-MSI-edge eth1-rx-2 + 47: 27155764 2539648 0 0 IR-PCI-MSI-edge eth1-rx-3 + 48: 168397 8933 0 0 IR-PCI-MSI-edge eth1-tx-0 + 49: 168155 8866 0 0 IR-PCI-MSI-edge eth1-tx-1 + 50: 168155 8866 0 0 IR-PCI-MSI-edge eth1-tx-2 + 51: 168155 8866 0 0 IR-PCI-MSI-edge eth1-tx-3 + 52: 52 0 0 0 IR-PCI-MSI-edge snd_hda_intel + 53: 363 0 0 0 IR-PCI-MSI-edge snd_hda_intel + 54: 0 0 0 0 IR-PCI-MSI-edge eth2 +NMI: 213 52 155 45 Non-maskable interrupts +LOC: 44371570 8167779 13024247 5507404 Local timer interrupts +SPU: 0 0 0 0 Spurious interrupts +PMI: 213 52 155 45 Performance monitoring interrupts +IWI: 0 0 0 0 IRQ work interrupts +RES: 72784 103362 73930 146083 Rescheduling interrupts +CAL: 103 281 250 263 Function call interrupts +TLB: 76302 273363 204099 106388 TLB shootdowns +TRM: 0 0 0 0 Thermal event interrupts +THR: 0 0 0 0 Threshold APIC interrupts +MCE: 0 0 0 0 Machine check exceptions +MCP: 617 617 617 617 Machine check polls +ERR: 0 +MIS: 0 diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/lsblk_models b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/lsblk_models new file mode 100644 index 0000000..7b074eb --- /dev/null +++ b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/lsblk_models @@ -0,0 +1,3 @@ +NAME MODEL +sda ST1000DM003-1ER1 +sdb Transcend 8GB diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/lsblk_sizes b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/lsblk_sizes new file mode 100644 index 0000000..13205df --- /dev/null +++ b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/lsblk_sizes @@ -0,0 +1,12 @@ +1000204886016 sda + 10485760000 / sda1 + 12599689216 [SWAP] sda2 + 679526531072 /mnt/var sda3 + 1024 sda4 + 104857600000 /mnt/db sda5 + 15728640000 /app sda6 + 104857600000 /mnt/log sda7 + 4194304000 /mnt/etc sda8 + 67947724800 /mnt/backup sda9 + 7813988352 sdb + 2347761664 sdb1 diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/lscpu_info b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/lscpu_info new file mode 100644 index 0000000..5d48e13 --- /dev/null +++ b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/lscpu_info @@ -0,0 +1,22 @@ +Architecture: x86_64 +CPU op-mode(s): 32-bit, 64-bit +Byte Order: Little Endian +CPU(s): 4 +On-line CPU(s) list: 0-3 +Thread(s) per core: 1 +Core(s) per socket: 4 +Socket(s): 1 +NUMA node(s): 1 +Vendor ID: GenuineIntel +CPU family: 6 +Model: 60 +Model name: Intel(R) Core(TM) i5-4440 CPU @ 3.10GHz +Stepping: 3 +CPU MHz: 3092.746 +BogoMIPS: 6185.49 +Virtualization: VT-x +L1d cache: 32K +L1i cache: 32K +L2 cache: 256K +L3 cache: 6144K +NUMA node0 CPU(s): 0-3 diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/lscpu_layout b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/lscpu_layout new file mode 100644 index 0000000..be93814 --- /dev/null +++ b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/lscpu_layout @@ -0,0 +1,4 @@ +0 0 +1 0 +2 0 +3 0 diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/lspci b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/lspci new file mode 100644 index 0000000..d85b800 --- /dev/null +++ b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/lspci @@ -0,0 +1,17 @@ +00:00.0 Host bridge: Intel Corporation 4th Gen Core Processor DRAM Controller (rev 06) +00:01.0 PCI bridge: Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor PCI Express x16 Controller (rev 06) +00:02.0 VGA compatible controller: Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor Integrated Graphics Controller (rev 06) +00:03.0 Audio device: Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor HD Audio Controller (rev 06) +00:14.0 USB controller: Intel Corporation 8 Series/C220 Series Chipset Family USB xHCI (rev 05) +00:16.0 Communication controller: Intel Corporation 8 Series/C220 Series Chipset Family MEI Controller #1 (rev 04) +00:1a.0 USB controller: Intel Corporation 8 Series/C220 Series Chipset Family USB EHCI #2 (rev 05) +00:1b.0 Audio device: Intel Corporation 8 Series/C220 Series Chipset High Definition Audio Controller (rev 05) +00:1c.0 PCI bridge: Intel Corporation 8 Series/C220 Series Chipset Family PCI Express Root Port #1 (rev d5) +00:1c.2 PCI bridge: Intel Corporation 8 Series/C220 Series Chipset Family PCI Express Root Port #3 (rev d5) +00:1d.0 USB controller: Intel Corporation 8 Series/C220 Series Chipset Family USB EHCI #1 (rev 05) +00:1f.0 ISA bridge: Intel Corporation B85 Express LPC Controller (rev 05) +00:1f.2 SATA controller: Intel Corporation 8 Series/C220 Series Chipset Family 6-port SATA Controller 1 [AHCI mode] (rev 05) +00:1f.3 SMBus: Intel Corporation 8 Series/C220 Series Chipset Family SMBus Controller (rev 05) +01:00.0 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01) +01:00.1 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01) +03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 0c) diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/meminfo b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/meminfo new file mode 100644 index 0000000..10deeb8 --- /dev/null +++ b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/meminfo @@ -0,0 +1,43 @@ +MemTotal: 24475424 kB +MemFree: 19920140 kB +Buffers: 571816 kB +Cached: 3204360 kB +SwapCached: 0 kB +Active: 1543052 kB +Inactive: 2319892 kB +Active(anon): 86760 kB +Inactive(anon): 4008 kB +Active(file): 1456292 kB +Inactive(file): 2315884 kB +Unevictable: 0 kB +Mlocked: 0 kB +SwapTotal: 12304380 kB +SwapFree: 12304380 kB +Dirty: 296 kB +Writeback: 0 kB +AnonPages: 86600 kB +Mapped: 21124 kB +Shmem: 4024 kB +Slab: 435820 kB +SReclaimable: 282808 kB +SUnreclaim: 153012 kB +KernelStack: 2848 kB +PageTables: 5172 kB +NFS_Unstable: 0 kB +Bounce: 0 kB +WritebackTmp: 0 kB +CommitLimit: 24542092 kB +Committed_AS: 231936 kB +VmallocTotal: 34359738367 kB +VmallocUsed: 433048 kB +VmallocChunk: 34359206880 kB +HardwareCorrupted: 0 kB +AnonHugePages: 8192 kB +HugePages_Total: 0 +HugePages_Free: 0 +HugePages_Rsvd: 0 +HugePages_Surp: 0 +Hugepagesize: 2048 kB +DirectMap4k: 6144 kB +DirectMap2M: 1990656 kB +DirectMap1G: 23068672 kB diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/mirror_info.conf b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/mirror_info.conf new file mode 100644 index 0000000..4a6758a --- /dev/null +++ b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/mirror_info.conf @@ -0,0 +1 @@ +eth1 1 - diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/network-scripts/ifcfg-br0 b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/network-scripts/ifcfg-br0 new file mode 100644 index 0000000..e69de29 diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/network-scripts/ifcfg-br1 b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/network-scripts/ifcfg-br1 new file mode 100644 index 0000000..e69de29 diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/network-scripts/ifcfg-br2 b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/network-scripts/ifcfg-br2 new file mode 100644 index 0000000..e69de29 diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/network-scripts/ifcfg-br3 b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/network-scripts/ifcfg-br3 new file mode 100644 index 0000000..e69de29 diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/network-scripts/ifcfg-eth0 b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/network-scripts/ifcfg-eth0 new file mode 100644 index 0000000..e69de29 diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/network-scripts/ifcfg-eth1 b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/network-scripts/ifcfg-eth1 new file mode 100644 index 0000000..e69de29 diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/network-scripts/ifcfg-eth1.1 b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/network-scripts/ifcfg-eth1.1 new file mode 100644 index 0000000..e69de29 diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/network-scripts/ifcfg-eth2 b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/network-scripts/ifcfg-eth2 new file mode 100644 index 0000000..e69de29 diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/scsi b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/scsi new file mode 100644 index 0000000..2161e0f --- /dev/null +++ b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/scsi @@ -0,0 +1,7 @@ +Attached devices: +Host: scsi5 Channel: 00 Id: 00 Lun: 00 + Vendor: ATA Model: ST1000DM003-1ER1 Rev: CC45 + Type: Direct-Access ANSI SCSI revision: 05 +Host: scsi6 Channel: 00 Id: 00 Lun: 00 + Vendor: JetFlash Model: Transcend 8GB Rev: 8.07 + Type: Direct-Access ANSI SCSI revision: 04 From 66782afc73bcc96d40380d2c41dae12a6d21f351 Mon Sep 17 00:00:00 2001 From: Oleg Strizhechenko Date: Sat, 27 Jan 2018 20:51:58 +0500 Subject: [PATCH 05/17] Refactoring(server-info): actual expected output and renamed it to .yml for syntax highlighting --- netutils_linux_hardware/net.py | 1 + tests/server-info-show | 15 ++-- .../{expected_output => expected_output.yml} | 1 + .../{expected_output => expected_output.yml} | 2 + .../{expected_output => expected_output.yml} | 2 + .../{expected_output => expected_output.yml} | 4 + .../{expected_output => expected_output.yml} | 1 + .../expected_output.yml | 76 +++++++++++++++++++ .../{expected_output => expected_output.yml} | 1 + .../{expected_output => expected_output.yml} | 3 + .../{expected_output => expected_output.yml} | 5 ++ .../{expected_output => expected_output.yml} | 2 + .../{expected_output => expected_output.yml} | 1 + .../{expected_output => expected_output.yml} | 2 + .../{expected_output => expected_output.yml} | 1 + 15 files changed, 109 insertions(+), 8 deletions(-) rename tests/server-info-show.tests/1xE3-1271.I217_and_X710.L2_mixed.masterconf/{expected_output => expected_output.yml} (97%) rename tests/server-info-show.tests/1xE31240.2x82576.L2.manual/{expected_output => expected_output.yml} (96%) rename tests/server-info-show.tests/1xE5200.82571EB_and_AR8121.L2.manual/{expected_output => expected_output.yml} (95%) rename tests/server-info-show.tests/1xi3.I211_I219V.L2_manual/{expected_output => expected_output.yml} (95%) rename tests/server-info-show.tests/1xi3.single_i350.l2_mixed.manual/{expected_output => expected_output.yml} (97%) create mode 100644 tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/expected_output.yml rename tests/server-info-show.tests/1xi7-4770K.1x82541PI.L2.manual/{expected_output => expected_output.yml} (97%) rename tests/server-info-show.tests/2xE2690.1mellanox_1emulex.L2.masterconf/{expected_output => expected_output.yml} (97%) rename tests/server-info-show.tests/2xE5-2640.i350_and_82599ES.l2_mixed.masterconf/{expected_output => expected_output.yml} (97%) rename tests/server-info-show.tests/2xE5530.82576_and_82574L.l2_mixed.manual/{expected_output => expected_output.yml} (96%) rename tests/server-info-show.tests/2xL5520.1x82576.L2_mixed.manual/{expected_output => expected_output.yml} (98%) rename tests/server-info-show.tests/2xX5650.BCM5709_and_MT27520.L2.manual/{expected_output => expected_output.yml} (96%) rename tests/server-info-show.tests/kvm.l3.masterconf/{expected_output => expected_output.yml} (97%) diff --git a/netutils_linux_hardware/net.py b/netutils_linux_hardware/net.py index 595df3e..e2a8077 100644 --- a/netutils_linux_hardware/net.py +++ b/netutils_linux_hardware/net.py @@ -133,6 +133,7 @@ def parse(text): class ReaderNet(object): + """ Reading data about network from multiple sources and merging them for every network device """ netdevs = None def __init__(self, datadir, path): diff --git a/tests/server-info-show b/tests/server-info-show index 5f00d0a..9917159 100755 --- a/tests/server-info-show +++ b/tests/server-info-show @@ -12,9 +12,9 @@ run_test() { echo -n "# $name " server-info --show --directory="$1" > $TMPDIR/output if [ "${REWRITE:-0}" = '1' ]; then - server-info --show --directory="$1" > "$testdata/$name/expected_output" + server-info --show --directory="$1" > "$testdata/$name/expected_output.yml" fi - cmp -s $1/expected_output $TMPDIR/output || rc=$? + cmp -s $1/expected_output.yml $TMPDIR/output || rc=$? if [ "$rc" = '0' ]; then echo OK else @@ -28,12 +28,11 @@ run_test() { retval=0 # shellcheck disable=SC2044 for test in $(find "$testdata" -mindepth 1 -maxdepth 1 -type d); do - if [ -f "$test/expected_output" ]; then - if ! run_test "$test"; then - retval=1 - break - fi - fi + [ -f "$test/expected_output.yml" ] || continue + run_test "$test" && continue + [ "${REWRITE:-0}" = '1' ] && continue + retval=1 + break done rm -rf $TMPDIR exit "$retval" diff --git a/tests/server-info-show.tests/1xE3-1271.I217_and_X710.L2_mixed.masterconf/expected_output b/tests/server-info-show.tests/1xE3-1271.I217_and_X710.L2_mixed.masterconf/expected_output.yml similarity index 97% rename from tests/server-info-show.tests/1xE3-1271.I217_and_X710.L2_mixed.masterconf/expected_output rename to tests/server-info-show.tests/1xE3-1271.I217_and_X710.L2_mixed.masterconf/expected_output.yml index 7a1c323..0b92baa 100644 --- a/tests/server-info-show.tests/1xE3-1271.I217_and_X710.L2_mixed.masterconf/expected_output +++ b/tests/server-info-show.tests/1xE3-1271.I217_and_X710.L2_mixed.masterconf/expected_output.yml @@ -61,3 +61,4 @@ net: - i40e-eth0-TxRx-1 - i40e-eth0-TxRx-2 - i40e-eth0-TxRx-3 + queues_ethtool: null diff --git a/tests/server-info-show.tests/1xE31240.2x82576.L2.manual/expected_output b/tests/server-info-show.tests/1xE31240.2x82576.L2.manual/expected_output.yml similarity index 96% rename from tests/server-info-show.tests/1xE31240.2x82576.L2.manual/expected_output rename to tests/server-info-show.tests/1xE31240.2x82576.L2.manual/expected_output.yml index a7d702b..d85537f 100644 --- a/tests/server-info-show.tests/1xE31240.2x82576.L2.manual/expected_output +++ b/tests/server-info-show.tests/1xE31240.2x82576.L2.manual/expected_output.yml @@ -61,6 +61,7 @@ net: shared: [] tx: [] unknown: [] + queues_ethtool: null eth1: buffers: cur: 2048 @@ -87,3 +88,4 @@ net: shared: [] tx: [] unknown: [] + queues_ethtool: null diff --git a/tests/server-info-show.tests/1xE5200.82571EB_and_AR8121.L2.manual/expected_output b/tests/server-info-show.tests/1xE5200.82571EB_and_AR8121.L2.manual/expected_output.yml similarity index 95% rename from tests/server-info-show.tests/1xE5200.82571EB_and_AR8121.L2.manual/expected_output rename to tests/server-info-show.tests/1xE5200.82571EB_and_AR8121.L2.manual/expected_output.yml index f6f22fb..6cb353c 100644 --- a/tests/server-info-show.tests/1xE5200.82571EB_and_AR8121.L2.manual/expected_output +++ b/tests/server-info-show.tests/1xE5200.82571EB_and_AR8121.L2.manual/expected_output.yml @@ -46,6 +46,7 @@ net: shared: [] tx: [] unknown: [] + queues_ethtool: null eth2: buffers: null conf: @@ -62,3 +63,4 @@ net: shared: [] tx: [] unknown: [] + queues_ethtool: null diff --git a/tests/server-info-show.tests/1xi3.I211_I219V.L2_manual/expected_output b/tests/server-info-show.tests/1xi3.I211_I219V.L2_manual/expected_output.yml similarity index 95% rename from tests/server-info-show.tests/1xi3.I211_I219V.L2_manual/expected_output rename to tests/server-info-show.tests/1xi3.I211_I219V.L2_manual/expected_output.yml index 1f32e8f..a893e30 100644 --- a/tests/server-info-show.tests/1xi3.I211_I219V.L2_manual/expected_output +++ b/tests/server-info-show.tests/1xi3.I211_I219V.L2_manual/expected_output.yml @@ -59,6 +59,7 @@ net: shared: [] tx: [] unknown: [] + queues_ethtool: null eth0: buffers: cur: 256 @@ -81,6 +82,7 @@ net: - eth0-tx-0 - eth0-tx-1 unknown: [] + queues_ethtool: null eth1: buffers: cur: 4096 @@ -99,6 +101,7 @@ net: shared: [] tx: [] unknown: [] + queues_ethtool: null wlan0: buffers: cur: 0 @@ -116,3 +119,4 @@ net: shared: [] tx: [] unknown: [] + queues_ethtool: null diff --git a/tests/server-info-show.tests/1xi3.single_i350.l2_mixed.manual/expected_output b/tests/server-info-show.tests/1xi3.single_i350.l2_mixed.manual/expected_output.yml similarity index 97% rename from tests/server-info-show.tests/1xi3.single_i350.l2_mixed.manual/expected_output rename to tests/server-info-show.tests/1xi3.single_i350.l2_mixed.manual/expected_output.yml index e1c5bc5..3cb741a 100644 --- a/tests/server-info-show.tests/1xi3.single_i350.l2_mixed.manual/expected_output +++ b/tests/server-info-show.tests/1xi3.single_i350.l2_mixed.manual/expected_output.yml @@ -54,3 +54,4 @@ net: shared: [] tx: [] unknown: [] + queues_ethtool: null diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/expected_output.yml b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/expected_output.yml new file mode 100644 index 0000000..b5dc3ec --- /dev/null +++ b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/expected_output.yml @@ -0,0 +1,76 @@ +cpu: + info: + Architecture: x86_64 + BogoMIPS: 6185 + Byte Order: Little Endian + CPU MHz: 3092 + CPU family: 6 + CPU op-mode(s): 32-bit, 64-bit + CPU(s): 4 + Core(s) per socket: 4 + L1d cache: 32K + L1i cache: 32K + L2 cache: 256K + L3 cache: 6144K + Model: 60 + Model name: Intel(R) Core(TM) i5-4440 CPU @ 3.10GHz + NUMA node(s): 1 + NUMA node0 CPU(s): 0-3 + On-line CPU(s) list: 0-3 + Socket(s): 1 + Stepping: 3 + Thread(s) per core: 1 + Vendor ID: GenuineIntel + Virtualization: VT-x + layout: + '0': '0' + '1': '0' + '2': '0' + '3': '0' +disk: + sda: + model: ST1000DM003-1ER1 + size: 1000204886016 + type: HDD + sdb: + model: Transcend 8GB + size: 7813988352 + type: HDD +memory: + devices: null + size: + MemFree: 19920140 + MemTotal: 24475424 + SwapFree: 12304380 + SwapTotal: 12304380 +net: + eth1: + buffers: + cur: 2048 + max: 4096 + conf: + ip: '' + vlan: true + driver: + driver: igb + version: 5.3.0-k + queues: + own: + - eth1 + rx: + - eth1-rx-0 + - eth1-rx-1 + - eth1-rx-2 + - eth1-rx-3 + rxtx: [] + shared: [] + tx: + - eth1-tx-0 + - eth1-tx-1 + - eth1-tx-2 + - eth1-tx-3 + unknown: [] + queues_ethtool: + combined: + cur: 4 + max: 8 diff --git a/tests/server-info-show.tests/1xi7-4770K.1x82541PI.L2.manual/expected_output b/tests/server-info-show.tests/1xi7-4770K.1x82541PI.L2.manual/expected_output.yml similarity index 97% rename from tests/server-info-show.tests/1xi7-4770K.1x82541PI.L2.manual/expected_output rename to tests/server-info-show.tests/1xi7-4770K.1x82541PI.L2.manual/expected_output.yml index d3e07a5..b63273b 100644 --- a/tests/server-info-show.tests/1xi7-4770K.1x82541PI.L2.manual/expected_output +++ b/tests/server-info-show.tests/1xi7-4770K.1x82541PI.L2.manual/expected_output.yml @@ -54,3 +54,4 @@ net: shared: [] tx: [] unknown: [] + queues_ethtool: null diff --git a/tests/server-info-show.tests/2xE2690.1mellanox_1emulex.L2.masterconf/expected_output b/tests/server-info-show.tests/2xE2690.1mellanox_1emulex.L2.masterconf/expected_output.yml similarity index 97% rename from tests/server-info-show.tests/2xE2690.1mellanox_1emulex.L2.masterconf/expected_output rename to tests/server-info-show.tests/2xE2690.1mellanox_1emulex.L2.masterconf/expected_output.yml index afb9bc8..9803d4d 100644 --- a/tests/server-info-show.tests/2xE2690.1mellanox_1emulex.L2.masterconf/expected_output +++ b/tests/server-info-show.tests/2xE2690.1mellanox_1emulex.L2.masterconf/expected_output.yml @@ -109,6 +109,7 @@ net: tx: - eth1-tx-0 unknown: [] + queues_ethtool: null eth6: buffers: cur: 8192 @@ -134,6 +135,7 @@ net: shared: [] tx: [] unknown: [] + queues_ethtool: null eth7: buffers: cur: 8192 @@ -159,3 +161,4 @@ net: shared: [] tx: [] unknown: [] + queues_ethtool: null diff --git a/tests/server-info-show.tests/2xE5-2640.i350_and_82599ES.l2_mixed.masterconf/expected_output b/tests/server-info-show.tests/2xE5-2640.i350_and_82599ES.l2_mixed.masterconf/expected_output.yml similarity index 97% rename from tests/server-info-show.tests/2xE5-2640.i350_and_82599ES.l2_mixed.masterconf/expected_output rename to tests/server-info-show.tests/2xE5-2640.i350_and_82599ES.l2_mixed.masterconf/expected_output.yml index 734ab42..6815a59 100644 --- a/tests/server-info-show.tests/2xE5-2640.i350_and_82599ES.l2_mixed.masterconf/expected_output +++ b/tests/server-info-show.tests/2xE5-2640.i350_and_82599ES.l2_mixed.masterconf/expected_output.yml @@ -98,6 +98,7 @@ net: shared: [] tx: [] unknown: [] + queues_ethtool: null eth2: buffers: cur: 4096 @@ -148,6 +149,7 @@ net: shared: [] tx: [] unknown: [] + queues_ethtool: null eth3: buffers: cur: 4096 @@ -198,6 +200,7 @@ net: shared: [] tx: [] unknown: [] + queues_ethtool: null eth4: buffers: cur: 4096 @@ -248,6 +251,7 @@ net: shared: [] tx: [] unknown: [] + queues_ethtool: null eth5: buffers: cur: 4096 @@ -298,3 +302,4 @@ net: shared: [] tx: [] unknown: [] + queues_ethtool: null diff --git a/tests/server-info-show.tests/2xE5530.82576_and_82574L.l2_mixed.manual/expected_output b/tests/server-info-show.tests/2xE5530.82576_and_82574L.l2_mixed.manual/expected_output.yml similarity index 96% rename from tests/server-info-show.tests/2xE5530.82576_and_82574L.l2_mixed.manual/expected_output rename to tests/server-info-show.tests/2xE5530.82576_and_82574L.l2_mixed.manual/expected_output.yml index a73b748..dbcfaf0 100644 --- a/tests/server-info-show.tests/2xE5530.82576_and_82574L.l2_mixed.manual/expected_output +++ b/tests/server-info-show.tests/2xE5530.82576_and_82574L.l2_mixed.manual/expected_output.yml @@ -63,6 +63,7 @@ net: tx: - eth1-tx-0 unknown: [] + queues_ethtool: null eth3: buffers: cur: 2048 @@ -89,3 +90,4 @@ net: shared: [] tx: [] unknown: [] + queues_ethtool: null diff --git a/tests/server-info-show.tests/2xL5520.1x82576.L2_mixed.manual/expected_output b/tests/server-info-show.tests/2xL5520.1x82576.L2_mixed.manual/expected_output.yml similarity index 98% rename from tests/server-info-show.tests/2xL5520.1x82576.L2_mixed.manual/expected_output rename to tests/server-info-show.tests/2xL5520.1x82576.L2_mixed.manual/expected_output.yml index 6a2355f..97adc1e 100644 --- a/tests/server-info-show.tests/2xL5520.1x82576.L2_mixed.manual/expected_output +++ b/tests/server-info-show.tests/2xL5520.1x82576.L2_mixed.manual/expected_output.yml @@ -70,3 +70,4 @@ net: shared: [] tx: [] unknown: [] + queues_ethtool: null diff --git a/tests/server-info-show.tests/2xX5650.BCM5709_and_MT27520.L2.manual/expected_output b/tests/server-info-show.tests/2xX5650.BCM5709_and_MT27520.L2.manual/expected_output.yml similarity index 96% rename from tests/server-info-show.tests/2xX5650.BCM5709_and_MT27520.L2.manual/expected_output rename to tests/server-info-show.tests/2xX5650.BCM5709_and_MT27520.L2.manual/expected_output.yml index b5777cb..ef4e886 100644 --- a/tests/server-info-show.tests/2xX5650.BCM5709_and_MT27520.L2.manual/expected_output +++ b/tests/server-info-show.tests/2xX5650.BCM5709_and_MT27520.L2.manual/expected_output.yml @@ -65,6 +65,7 @@ net: shared: [] tx: [] unknown: [] + queues_ethtool: null eth2: buffers: cur: 8192 @@ -90,3 +91,4 @@ net: shared: [] tx: [] unknown: [] + queues_ethtool: null diff --git a/tests/server-info-show.tests/kvm.l3.masterconf/expected_output b/tests/server-info-show.tests/kvm.l3.masterconf/expected_output.yml similarity index 97% rename from tests/server-info-show.tests/kvm.l3.masterconf/expected_output rename to tests/server-info-show.tests/kvm.l3.masterconf/expected_output.yml index 73579d7..395b067 100644 --- a/tests/server-info-show.tests/kvm.l3.masterconf/expected_output +++ b/tests/server-info-show.tests/kvm.l3.masterconf/expected_output.yml @@ -48,3 +48,4 @@ net: - uhci_hcd:usb1, eth0, eth1 tx: [] unknown: [] + queues_ethtool: null From ceeb82e96068d708ee34052745d8583ecf427406 Mon Sep 17 00:00:00 2001 From: Oleg Strizhechenko Date: Sat, 27 Jan 2018 21:03:51 +0500 Subject: [PATCH 06/17] Refactoring(server-info): removed duplicating code for parsing buffers and queues. --- netutils_linux_hardware/net.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/netutils_linux_hardware/net.py b/netutils_linux_hardware/net.py index e2a8077..0485983 100644 --- a/netutils_linux_hardware/net.py +++ b/netutils_linux_hardware/net.py @@ -150,15 +150,16 @@ def net_dev_list_bridge(self): def net_dev_list_ethtool(self): return EthtoolFiles().parse_file(self.path('ethtool/i')) - def net_dev_list_queues(self): + def max_cur_parse(self, ethtool_key, parser, output_key): for netdev in self.netdevs: - buffers_path = os.path.join(self.datadir, 'ethtool/l', netdev) - self.netdevs[netdev]['queues_ethtool'] = EthtoolQueues().parse_file_safe(buffers_path) + file_path = os.path.join(self.datadir, 'ethtool/{0}'.format(ethtool_key), netdev) + self.netdevs[netdev][output_key] = parser().parse_file_safe(file_path) + + def net_dev_list_queues(self): + self.max_cur_parse('l', EthtoolQueues, 'queues_ethtool') def net_dev_list_buffers(self): - for netdev in self.netdevs: - buffers_path = os.path.join(self.datadir, 'ethtool/g', netdev) - self.netdevs[netdev]['buffers'] = EthtoolBuffers().parse_file_safe(buffers_path) + self.max_cur_parse('g', EthtoolBuffers, 'buffers') def net_dev_list_drivers(self): keys_required = ( From 5f3137722ad70f965d7cb453defb57dbe7ee01df Mon Sep 17 00:00:00 2001 From: Oleg Strizhechenko Date: Sat, 27 Jan 2018 22:18:36 +0500 Subject: [PATCH 07/17] Refactoring(server-info): simplified queue data processing --- netutils_linux_hardware/net.py | 35 ++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/netutils_linux_hardware/net.py b/netutils_linux_hardware/net.py index 0485983..9278f13 100644 --- a/netutils_linux_hardware/net.py +++ b/netutils_linux_hardware/net.py @@ -22,6 +22,7 @@ def rate(self): def __netdev(self, netdev): netdevinfo = extract(self.data, ['net', netdev]) queues = sum(len(extract(netdevinfo, ['queues', x])) for x in ('rx', 'rxtx')) + queues_ethtool = self.rate_queue_ethtool() buffers = netdevinfo.get('buffers') or {} return self.folding.fold({ 'queues': Grade.int(queues, 2, 8), @@ -42,6 +43,8 @@ def __netdev(self, netdev): }, self.folding.DEVICE) }, self.folding.DEVICE) + def rate_queue_ethtool(self): + class ReductorMirror(Parser): @staticmethod @@ -116,20 +119,24 @@ class EthtoolQueues(Parser): @staticmethod def parse(text): __queues = [int(line.split()[1]) for line in text.split('\n') if line.split()[1].isdigit()] - if len(__queues) == 8: - queues = { - 'rx': { - 'max': __queues[0], - 'cur': __queues[4], - }, - 'combined': { - 'max': __queues[3], - 'cur': __queues[7], - }, - } - if queues['rx']['max'] == 0 and queues['combined']['max'] != 0: - del queues['rx'] - return queues + if len(__queues) != 8: + return + queues = { + 'rx': { + 'max': __queues[0], + 'cur': __queues[4], + }, + 'combined': { + 'max': __queues[3], + 'cur': __queues[7], + }, + } + if queues['rx']['max'] == 0 and queues['combined']['max'] != 0: + del queues['rx'] + return queues + + def rate(self): + pass class ReaderNet(object): From 46d043e132adde583c5f84feb21c01033d949446 Mon Sep 17 00:00:00 2001 From: Oleg Strizhechenko Date: Sat, 27 Jan 2018 23:13:41 +0500 Subject: [PATCH 08/17] Addded(server-info): CPU data is collecting if --net / --system flags used --- netutils_linux_hardware/net.py | 3 --- netutils_linux_hardware/server.py | 4 +++- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/netutils_linux_hardware/net.py b/netutils_linux_hardware/net.py index 9278f13..c86c0ee 100644 --- a/netutils_linux_hardware/net.py +++ b/netutils_linux_hardware/net.py @@ -135,9 +135,6 @@ def parse(text): del queues['rx'] return queues - def rate(self): - pass - class ReaderNet(object): """ Reading data about network from multiple sources and merging them for every network device """ diff --git a/netutils_linux_hardware/server.py b/netutils_linux_hardware/server.py index dbd28de..7fc4585 100644 --- a/netutils_linux_hardware/server.py +++ b/netutils_linux_hardware/server.py @@ -58,7 +58,9 @@ def read(self): for key, subsystem in self.subsystems.items(): if key != 'system' and getattr(self.args, key): info[key] = subsystem(datadir=self.directory).parse() - if not self.args.cpu and self.args.system: + # system requires cpu because virtualization data is in lscpu output + # net requires cpu because queue count rate depends on NUMA's core count + if not self.args.cpu and (self.args.system or self.args.net): info['cpu'] = CPU(datadir=self.directory).parse() return info From 28a3536078e43988622100a9e2d4104d76a7f0ae Mon Sep 17 00:00:00 2001 From: Oleg Strizhechenko Date: Sat, 27 Jan 2018 23:30:06 +0500 Subject: [PATCH 09/17] Fixed(server-info): don't show cpu if only --system / --net args given --- netutils_linux_hardware/net.py | 3 +++ netutils_linux_hardware/server.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/netutils_linux_hardware/net.py b/netutils_linux_hardware/net.py index c86c0ee..8175a93 100644 --- a/netutils_linux_hardware/net.py +++ b/netutils_linux_hardware/net.py @@ -26,6 +26,7 @@ def __netdev(self, netdev): buffers = netdevinfo.get('buffers') or {} return self.folding.fold({ 'queues': Grade.int(queues, 2, 8), + 'queues_ethtool': Grade.int(queues_ethtool, 2, 8), 'driver': { 'mlx5_core': 10, # 7500 mbit/s 'mlx4_en': 9, # 6500 mbit/s @@ -44,6 +45,8 @@ def __netdev(self, netdev): }, self.folding.DEVICE) def rate_queue_ethtool(self): + return 1 + # print(self.data) class ReductorMirror(Parser): diff --git a/netutils_linux_hardware/server.py b/netutils_linux_hardware/server.py index 7fc4585..ac64bfa 100644 --- a/netutils_linux_hardware/server.py +++ b/netutils_linux_hardware/server.py @@ -60,7 +60,7 @@ def read(self): info[key] = subsystem(datadir=self.directory).parse() # system requires cpu because virtualization data is in lscpu output # net requires cpu because queue count rate depends on NUMA's core count - if not self.args.cpu and (self.args.system or self.args.net): + if self.args.rate and not self.args.cpu and (self.args.system or self.args.net): info['cpu'] = CPU(datadir=self.directory).parse() return info From 5bf6eb010989adcd1725203d24bb21efb267f2d3 Mon Sep 17 00:00:00 2001 From: Oleg Strizhechenko Date: Sat, 27 Jan 2018 23:36:56 +0500 Subject: [PATCH 10/17] Added(server-info): collection of device binding to NUMA node --- utils/server-info-collect | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/utils/server-info-collect b/utils/server-info-collect index e4655fd..34ee515 100755 --- a/utils/server-info-collect +++ b/utils/server-info-collect @@ -59,6 +59,11 @@ network_info() { [ -f "$SYSCONFIG/ifcfg-$netdev" ] || continue # avoiding collection of identification/privacy info grep ETHTOOL "$SYSCONFIG/ifcfg-$netdev" > "$TMPDIR/network-scripts/ifcfg-$netdev" || true + numa_node="/sys/class/net/$netdev/device/numa_node" + if [ -f "$numa_node" ]; then + mkdir -p "$TMPDIR${numa_node%/*}" + cat "$numa_node" > "${TMPDIR}${numa_node}" + fi done } From a74eea63a4835c0c890485aa7793a84e74bead95 Mon Sep 17 00:00:00 2001 From: Oleg Strizhechenko Date: Sat, 27 Jan 2018 23:47:55 +0500 Subject: [PATCH 11/17] Added(test-data): samples of NUMA-node data for network device. --- .../sys/class/net/eth0/device/numa_node | 1 + .../sys/class/net/eth1/device/numa_node | 1 + .../sys/class/net/eth2/device/numa_node | 1 + 3 files changed, 3 insertions(+) create mode 100644 tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/sys/class/net/eth0/device/numa_node create mode 100644 tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/sys/class/net/eth1/device/numa_node create mode 100644 tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/sys/class/net/eth2/device/numa_node diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/sys/class/net/eth0/device/numa_node b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/sys/class/net/eth0/device/numa_node new file mode 100644 index 0000000..3a2e3f4 --- /dev/null +++ b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/sys/class/net/eth0/device/numa_node @@ -0,0 +1 @@ +-1 diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/sys/class/net/eth1/device/numa_node b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/sys/class/net/eth1/device/numa_node new file mode 100644 index 0000000..3a2e3f4 --- /dev/null +++ b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/sys/class/net/eth1/device/numa_node @@ -0,0 +1 @@ +-1 diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/sys/class/net/eth2/device/numa_node b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/sys/class/net/eth2/device/numa_node new file mode 100644 index 0000000..3a2e3f4 --- /dev/null +++ b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/sys/class/net/eth2/device/numa_node @@ -0,0 +1 @@ +-1 From a6c20d475e27ee24da5f542f998d76dc808a3b81 Mon Sep 17 00:00:00 2001 From: Oleg Strizhechenko Date: Sun, 28 Jan 2018 16:54:45 +0500 Subject: [PATCH 12/17] Refactoring(server-info): network routine moved from net.py to net_read.py --- netutils_linux_hardware/net.py | 180 ++++------------------------ netutils_linux_hardware/net_read.py | 148 +++++++++++++++++++++++ 2 files changed, 168 insertions(+), 160 deletions(-) create mode 100644 netutils_linux_hardware/net_read.py diff --git a/netutils_linux_hardware/net.py b/netutils_linux_hardware/net.py index 8175a93..ad6f99b 100644 --- a/netutils_linux_hardware/net.py +++ b/netutils_linux_hardware/net.py @@ -1,11 +1,8 @@ # coding=utf-8 -import os -from six import iteritems, print_ from netutils_linux_hardware.grade import Grade -from netutils_linux_hardware.interrupts import IRQQueueCounter -from netutils_linux_hardware.parser import Parser, YAMLLike +from netutils_linux_hardware.net_read import ReaderNet from netutils_linux_hardware.rate_math import extract from netutils_linux_hardware.subsystem import Subsystem @@ -17,12 +14,12 @@ def parse(self): return ReaderNet(self.datadir, self.path).netdevs def rate(self): - return self.map(self.__netdev, 'net') + return self.map(self.rate_device, 'net') - def __netdev(self, netdev): + def rate_device(self, netdev): netdevinfo = extract(self.data, ['net', netdev]) queues = sum(len(extract(netdevinfo, ['queues', x])) for x in ('rx', 'rxtx')) - queues_ethtool = self.rate_queue_ethtool() + queues_ethtool = self.rate_queue_ethtool(netdevinfo) buffers = netdevinfo.get('buffers') or {} return self.folding.fold({ 'queues': Grade.int(queues, 2, 8), @@ -44,156 +41,19 @@ def __netdev(self, netdev): }, self.folding.DEVICE) }, self.folding.DEVICE) - def rate_queue_ethtool(self): - return 1 - # print(self.data) - - -class ReductorMirror(Parser): - @staticmethod - def parse(text): - lines = dict((line.split(' ', 1)) for line in text.strip().split('\n')) - for netdev, conf in iteritems(lines): - output = dict() - output['conf'] = dict() - output['conf']['vlan'], output['conf']['ip'] = conf.split() - output['conf']['vlan'] = output['conf']['vlan'] != '-' - if output['conf']['ip'] == '-': - output['conf']['ip'] = '' - lines[netdev] = output - return lines - - -class NetdevParser(Parser): - @staticmethod - def parse(netdev_keys): - """ - :param netdev_keys: list of device names - :return: dict[device_name] = {'vlan': bool; 'ip': ''} - """ - netdevs = dict() - for key in netdev_keys: - if key.count('.') == 1: - dev, _ = key.split('.') - elif key.count('.') == 0: - dev = key - else: - print_('QinQ not supported yet. Device: {0}'.format(key)) - raise NotImplementedError - netdevs[dev] = dict() - netdevs[dev]['conf'] = { - 'vlan': key.count('.') == 1, - 'ip': '', - } - return netdevs - - -class BridgeOutput(NetdevParser): - @staticmethod - def parse(text): - """ # 0 - id, 1 - dev, 2 - _, 3 - state, 4 - _, 5 - details, 6 - _, 7 - mtu, 8 - _, 9 - master - :param text: # 3: eth1 state DOWN : mtu 1500 master br1 state disabled - :return: analyzed netdevs - """ - __dev__ = 1 - netdevs_keys = [line.split()[__dev__] for line in text.strip().split('\n')] - return NetdevParser.parse(netdevs_keys) - - -class EthtoolFiles(NetdevParser): - def parse_file(self, filepath, **kwargs): - return self.parse(os.listdir(filepath)) - - -class EthtoolBuffers(Parser): - @staticmethod - def parse(text): - buffers = [int(line.split()[1]) - for line in text.strip().split('\n') - if line.startswith('RX:')] - if buffers and len(buffers) == 2: - return { - 'max': buffers[0], - 'cur': buffers[1], - } - - -class EthtoolQueues(Parser): - @staticmethod - def parse(text): - __queues = [int(line.split()[1]) for line in text.split('\n') if line.split()[1].isdigit()] - if len(__queues) != 8: - return - queues = { - 'rx': { - 'max': __queues[0], - 'cur': __queues[4], - }, - 'combined': { - 'max': __queues[3], - 'cur': __queues[7], - }, - } - if queues['rx']['max'] == 0 and queues['combined']['max'] != 0: - del queues['rx'] - return queues - - -class ReaderNet(object): - """ Reading data about network from multiple sources and merging them for every network device """ - netdevs = None - - def __init__(self, datadir, path): - self.datadir = datadir - self.path = path - self.net_dev_list() - - def net_dev_mirror_info(self): - return ReductorMirror().parse_file_safe(self.path('mirror_info.conf')) - - def net_dev_list_bridge(self): - return BridgeOutput().parse_file_safe(self.path('bridge_link')) - - def net_dev_list_ethtool(self): - return EthtoolFiles().parse_file(self.path('ethtool/i')) - - def max_cur_parse(self, ethtool_key, parser, output_key): - for netdev in self.netdevs: - file_path = os.path.join(self.datadir, 'ethtool/{0}'.format(ethtool_key), netdev) - self.netdevs[netdev][output_key] = parser().parse_file_safe(file_path) - - def net_dev_list_queues(self): - self.max_cur_parse('l', EthtoolQueues, 'queues_ethtool') - - def net_dev_list_buffers(self): - self.max_cur_parse('g', EthtoolBuffers, 'buffers') - - def net_dev_list_drivers(self): - keys_required = ( - 'driver', - 'version', - ) - for netdev in self.netdevs: - driver_file = os.path.join(self.datadir, 'ethtool/i', netdev) - driver_data = YAMLLike().parse_file_safe(driver_file) - if driver_data: - driver_data = dict((key, v) for key, v in iteritems(driver_data) if key in keys_required) - else: - driver_data = dict() - self.netdevs[netdev]['driver'] = driver_data - - def net_dev_list(self): - """ - Priority: - 1. mirror_info.conf (collected only in case of reductor (master conf)) - 2. bridges output (collected only in case of reductor (manual conf)) - 3. ethtool information (non reductor case) - """ - self.netdevs = self.net_dev_mirror_info() or self.net_dev_list_bridge() or self.net_dev_list_ethtool() - if not self.netdevs: - return - self.net_dev_list_buffers() - self.net_dev_list_drivers() - self.net_dev_list_queues() - interrupts = self.path('interrupts') - IRQQueueCounter().parse_file_safe(interrupts, netdevs=self.netdevs) + def rate_queue_ethtool(self, netdevinfo): + # TODO: numa belonging + # import json + # print(json.dumps(netdevinfo, indent=2)) + # exit(0) + queues_ethtool = netdevinfo['queues_ethtool'] + queues_type = 'rx' + if len(queues_ethtool.keys()) == 1: + queues_type = list(queues_ethtool.keys())[0] + cpu_count = len(self.data.get('cpu').get('layout')) + # print(json.dumps(queues_ethtool, indent=2)) + # print(json.dumps(self.data.get('cpu').get('layout'), indent=4)) + queues_count = 0 + if queues_type == 'combined' or queues_type == 'rx': + queues_count = queues_ethtool.get(queues_type).get('cur') + return int(queues_count / cpu_count * 10) diff --git a/netutils_linux_hardware/net_read.py b/netutils_linux_hardware/net_read.py new file mode 100644 index 0000000..21efdfb --- /dev/null +++ b/netutils_linux_hardware/net_read.py @@ -0,0 +1,148 @@ +# coding=utf-8 +import os + +from six import iteritems + +from netutils_linux_hardware.interrupts import IRQQueueCounter +from netutils_linux_hardware.parser import Parser, YAMLLike + + +class ReaderNet(object): + """ Reading data about network from multiple sources and merging them for every network device """ + netdevs = None + + def __init__(self, datadir, path): + self.datadir = datadir + self.path = path + self.net_dev_list() + + def max_cur_parse(self, ethtool_key, parser, output_key): + for netdev in self.netdevs: + file_path = os.path.join(self.datadir, 'ethtool/{0}'.format(ethtool_key), netdev) + self.netdevs[netdev][output_key] = parser().parse_file_safe(file_path) + + def net_dev_list_queues(self): + self.max_cur_parse('l', EthtoolQueues, 'queues_ethtool') + IRQQueueCounter().parse_file_safe(self.path('interrupts'), netdevs=self.netdevs) + + def net_dev_list_buffers(self): + self.max_cur_parse('g', EthtoolBuffers, 'buffers') + + def net_dev_list_drivers(self): + keys_required = ( + 'driver', + 'version', + ) + for netdev in self.netdevs: + driver_file = os.path.join(self.datadir, 'ethtool/i', netdev) + driver_data = YAMLLike().parse_file_safe(driver_file) or dict() + if driver_data: + driver_data = dict((key, v) for key, v in iteritems(driver_data) if key in keys_required) + self.netdevs[netdev]['driver'] = driver_data + + def net_dev_list(self): + """ + Priority: + 1. mirror_info.conf (collected only in case of reductor (master conf)) + 2. bridges output (collected only in case of reductor (manual conf)) + 3. ethtool information (non reductor case) + """ + self.netdevs = ReductorMirror().parse_file_safe(self.path('mirror_info.conf')) + if not self.netdevs: + self.netdevs = BridgeOutput().parse_file_safe(self.path('bridge_link')) + if not self.netdevs: + self.netdevs = EthtoolFiles().parse_file(self.path('ethtool/i')) + if self.netdevs: + self.net_dev_list_buffers() + self.net_dev_list_drivers() + self.net_dev_list_queues() + + +class NetdevClassificator(Parser): + @staticmethod + def parse(netdev_keys): + """ + :param netdev_keys: list of device names + :return: dict[device_name] = {'vlan': bool; 'ip': ''} + """ + netdevs = dict() + for key in netdev_keys: + if key.count('.') == 1: + dev, _ = key.split('.') + elif key.count('.') == 0: + dev = key + else: + print_('QinQ not supported yet. Device: {0}'.format(key)) + raise NotImplementedError + netdevs[dev] = dict() + netdevs[dev]['conf'] = { + 'vlan': key.count('.') == 1, + 'ip': '', + } + return netdevs + + +class ReductorMirror(Parser): + @staticmethod + def parse(text): + lines = dict((line.split(' ', 1)) for line in text.strip().split('\n')) + for netdev, conf in iteritems(lines): + output = dict() + output['conf'] = dict() + output['conf']['vlan'], output['conf']['ip'] = conf.split() + output['conf']['vlan'] = output['conf']['vlan'] != '-' + if output['conf']['ip'] == '-': + output['conf']['ip'] = '' + lines[netdev] = output + return lines + + +class BridgeOutput(NetdevClassificator): + @staticmethod + def parse(text): + """ # 0 - id, 1 - dev, 2 - _, 3 - state, 4 - _, 5 - details, 6 - _, 7 - mtu, 8 - _, 9 - master + :param text: # 3: eth1 state DOWN : mtu 1500 master br1 state disabled + :return: analyzed netdevs + """ + __dev__ = 1 + netdevs_keys = [line.split()[__dev__] for line in text.strip().split('\n')] + return NetdevClassificator.parse(netdevs_keys) + + +class EthtoolFiles(NetdevClassificator): + def parse_file(self, filepath, **kwargs): + return self.parse(os.listdir(filepath)) + + +class EthtoolBuffers(Parser): + @staticmethod + def parse(text): + buffers = [int(line.split()[1]) + for line in text.strip().split('\n') + if line.startswith('RX:')] + if buffers and len(buffers) == 2: + return { + 'max': buffers[0], + 'cur': buffers[1], + } + + +class EthtoolQueues(Parser): + @staticmethod + def parse(text): + __queues = [int(line.split()[1]) for line in text.split('\n') if line.split()[1].isdigit()] + if len(__queues) != 8: + return + queues = { + 'rx': { + 'max': __queues[0], + 'cur': __queues[4], + }, + 'combined': { + 'max': __queues[3], + 'cur': __queues[7], + }, + } + if queues['rx']['max'] == 0 and queues['combined']['max'] != 0: + del queues['rx'] + return queues From 02752e655eea59ee0a22d7323b1f9bc88ee5bb46 Mon Sep 17 00:00:00 2001 From: Oleg Strizhechenko Date: Sun, 28 Jan 2018 16:59:47 +0500 Subject: [PATCH 13/17] Refactoring(server-info): server main read simplified --- netutils_linux_hardware/server.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/netutils_linux_hardware/server.py b/netutils_linux_hardware/server.py index ac64bfa..5fefff1 100644 --- a/netutils_linux_hardware/server.py +++ b/netutils_linux_hardware/server.py @@ -54,10 +54,7 @@ def collect(self): def read(self): """ Parser of raw saved data info dictionary """ - info = dict() - for key, subsystem in self.subsystems.items(): - if key != 'system' and getattr(self.args, key): - info[key] = subsystem(datadir=self.directory).parse() + info = self.__read() # system requires cpu because virtualization data is in lscpu output # net requires cpu because queue count rate depends on NUMA's core count if self.args.rate and not self.args.cpu and (self.args.system or self.args.net): @@ -81,6 +78,13 @@ def archive(self): os.chdir(os.path.join(self.directory, '..')) os.system('tar cfz {0} {1} 2>/dev/null'.format(self.tarball, self.directory)) + def __read(self): + return dict( + (key, subsystem(datadir=self.directory).parse()) + for key, subsystem in self.subsystems.items() + if key != 'system' and getattr(self.args, key) + ) + def __parse_args(self): default_directory = '/tmp/netutils_server_info/' self.parser.add_argument('--directory', type=str, help="Specify a data directory or a tarball", From 6f0e093b7299290b71ecfd45b7e042f105680000 Mon Sep 17 00:00:00 2001 From: Oleg Strizhechenko Date: Sun, 28 Jan 2018 17:34:46 +0500 Subject: [PATCH 14/17] Added(server-info): parsing numa-node file --- netutils_linux_hardware/net_read.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/netutils_linux_hardware/net_read.py b/netutils_linux_hardware/net_read.py index 21efdfb..66d51d8 100644 --- a/netutils_linux_hardware/net_read.py +++ b/netutils_linux_hardware/net_read.py @@ -40,6 +40,11 @@ def net_dev_list_drivers(self): driver_data = dict((key, v) for key, v in iteritems(driver_data) if key in keys_required) self.netdevs[netdev]['driver'] = driver_data + def net_dev_list_numa(self): + for netdev in self.netdevs: + numa_file = os.path.join(self.datadir, 'sys/class/net/', netdev, 'device/numa_node') + self.netdevs[netdev]['numa_node'] = int(open(numa_file).read()) if os.path.exists(numa_file) else -1 + def net_dev_list(self): """ Priority: @@ -56,6 +61,7 @@ def net_dev_list(self): self.net_dev_list_buffers() self.net_dev_list_drivers() self.net_dev_list_queues() + self.net_dev_list_numa() class NetdevClassificator(Parser): From 79b46603f21c68b34853a52f3df60a861bf25201 Mon Sep 17 00:00:00 2001 From: Oleg Strizhechenko Date: Mon, 29 Jan 2018 11:47:16 +0500 Subject: [PATCH 15/17] Fixed(server-info): added numa-node info to expected output of tests. --- tests/server-info-show | 2 +- .../expected_output.yml | 1 + .../1xE31240.2x82576.L2.manual/expected_output.yml | 2 ++ .../1xE5200.82571EB_and_AR8121.L2.manual/expected_output.yml | 2 ++ .../1xi3.I211_I219V.L2_manual/expected_output.yml | 4 ++++ .../1xi3.single_i350.l2_mixed.manual/expected_output.yml | 1 + .../1xi5.single_i350.l2_vlan_master/expected_output.yml | 1 + .../1xi7-4770K.1x82541PI.L2.manual/expected_output.yml | 1 + .../expected_output.yml | 3 +++ .../expected_output.yml | 5 +++++ .../expected_output.yml | 2 ++ .../2xL5520.1x82576.L2_mixed.manual/expected_output.yml | 1 + .../expected_output.yml | 2 ++ .../kvm.l3.masterconf/expected_output.yml | 1 + 14 files changed, 27 insertions(+), 1 deletion(-) diff --git a/tests/server-info-show b/tests/server-info-show index 9917159..290683b 100755 --- a/tests/server-info-show +++ b/tests/server-info-show @@ -18,7 +18,7 @@ run_test() { if [ "$rc" = '0' ]; then echo OK else - diff -U 5 "$testdata/$name/expected_output" "$TMPDIR/output" + diff -U 5 "$testdata/$name/expected_output.yml" "$TMPDIR/output" echo FAIL fi return "$rc" diff --git a/tests/server-info-show.tests/1xE3-1271.I217_and_X710.L2_mixed.masterconf/expected_output.yml b/tests/server-info-show.tests/1xE3-1271.I217_and_X710.L2_mixed.masterconf/expected_output.yml index 0b92baa..0328b7f 100644 --- a/tests/server-info-show.tests/1xE3-1271.I217_and_X710.L2_mixed.masterconf/expected_output.yml +++ b/tests/server-info-show.tests/1xE3-1271.I217_and_X710.L2_mixed.masterconf/expected_output.yml @@ -50,6 +50,7 @@ net: driver: driver: i40e version: 1.5.10-k + numa_node: -1 queues: own: [] rx: [] diff --git a/tests/server-info-show.tests/1xE31240.2x82576.L2.manual/expected_output.yml b/tests/server-info-show.tests/1xE31240.2x82576.L2.manual/expected_output.yml index d85537f..49b374a 100644 --- a/tests/server-info-show.tests/1xE31240.2x82576.L2.manual/expected_output.yml +++ b/tests/server-info-show.tests/1xE31240.2x82576.L2.manual/expected_output.yml @@ -45,6 +45,7 @@ net: driver: driver: igb version: 5.3.0-k + numa_node: -1 queues: own: - eth0 @@ -72,6 +73,7 @@ net: driver: driver: igb version: 5.3.0-k + numa_node: -1 queues: own: - eth1 diff --git a/tests/server-info-show.tests/1xE5200.82571EB_and_AR8121.L2.manual/expected_output.yml b/tests/server-info-show.tests/1xE5200.82571EB_and_AR8121.L2.manual/expected_output.yml index 6cb353c..8ff7e8a 100644 --- a/tests/server-info-show.tests/1xE5200.82571EB_and_AR8121.L2.manual/expected_output.yml +++ b/tests/server-info-show.tests/1xE5200.82571EB_and_AR8121.L2.manual/expected_output.yml @@ -38,6 +38,7 @@ net: driver: driver: e1000e version: 3.2.6-k + numa_node: -1 queues: own: - eth1 @@ -55,6 +56,7 @@ net: driver: driver: ATL1E version: 1.0.0.7-NAPI + numa_node: -1 queues: own: - eth2 diff --git a/tests/server-info-show.tests/1xi3.I211_I219V.L2_manual/expected_output.yml b/tests/server-info-show.tests/1xi3.I211_I219V.L2_manual/expected_output.yml index a893e30..ce27866 100644 --- a/tests/server-info-show.tests/1xi3.I211_I219V.L2_manual/expected_output.yml +++ b/tests/server-info-show.tests/1xi3.I211_I219V.L2_manual/expected_output.yml @@ -52,6 +52,7 @@ net: driver: driver: bridge version: 2.3 + numa_node: -1 queues: own: [] rx: [] @@ -70,6 +71,7 @@ net: driver: driver: igb version: 5.3.0-k + numa_node: -1 queues: own: - eth0 @@ -93,6 +95,7 @@ net: driver: driver: e1000e version: 3.2.6-k + numa_node: -1 queues: own: - eth1 @@ -112,6 +115,7 @@ net: driver: driver: iwlwifi version: 2.6.32-642.el6.x86_64 + numa_node: -1 queues: own: [] rx: [] diff --git a/tests/server-info-show.tests/1xi3.single_i350.l2_mixed.manual/expected_output.yml b/tests/server-info-show.tests/1xi3.single_i350.l2_mixed.manual/expected_output.yml index 3cb741a..f0d035f 100644 --- a/tests/server-info-show.tests/1xi3.single_i350.l2_mixed.manual/expected_output.yml +++ b/tests/server-info-show.tests/1xi3.single_i350.l2_mixed.manual/expected_output.yml @@ -42,6 +42,7 @@ net: driver: driver: igb version: 5.3.5.4 + numa_node: -1 queues: own: - eth6 diff --git a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/expected_output.yml b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/expected_output.yml index b5dc3ec..02057f0 100644 --- a/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/expected_output.yml +++ b/tests/server-info-show.tests/1xi5.single_i350.l2_vlan_master/expected_output.yml @@ -54,6 +54,7 @@ net: driver: driver: igb version: 5.3.0-k + numa_node: -1 queues: own: - eth1 diff --git a/tests/server-info-show.tests/1xi7-4770K.1x82541PI.L2.manual/expected_output.yml b/tests/server-info-show.tests/1xi7-4770K.1x82541PI.L2.manual/expected_output.yml index b63273b..ac4372a 100644 --- a/tests/server-info-show.tests/1xi7-4770K.1x82541PI.L2.manual/expected_output.yml +++ b/tests/server-info-show.tests/1xi7-4770K.1x82541PI.L2.manual/expected_output.yml @@ -46,6 +46,7 @@ net: driver: driver: e1000e version: 3.2.6-k + numa_node: -1 queues: own: - eth0 diff --git a/tests/server-info-show.tests/2xE2690.1mellanox_1emulex.L2.masterconf/expected_output.yml b/tests/server-info-show.tests/2xE2690.1mellanox_1emulex.L2.masterconf/expected_output.yml index 9803d4d..0f6c998 100644 --- a/tests/server-info-show.tests/2xE2690.1mellanox_1emulex.L2.masterconf/expected_output.yml +++ b/tests/server-info-show.tests/2xE2690.1mellanox_1emulex.L2.masterconf/expected_output.yml @@ -97,6 +97,7 @@ net: driver: driver: tg3 version: 3.137 + numa_node: -1 queues: own: [] rx: @@ -120,6 +121,7 @@ net: driver: driver: mlx4_en version: 2.2-1 (Feb 2014) + numa_node: -1 queues: own: [] rx: [] @@ -146,6 +148,7 @@ net: driver: driver: mlx4_en version: 2.2-1 (Feb 2014) + numa_node: -1 queues: own: [] rx: [] diff --git a/tests/server-info-show.tests/2xE5-2640.i350_and_82599ES.l2_mixed.masterconf/expected_output.yml b/tests/server-info-show.tests/2xE5-2640.i350_and_82599ES.l2_mixed.masterconf/expected_output.yml index 6815a59..69c7a4f 100644 --- a/tests/server-info-show.tests/2xE5-2640.i350_and_82599ES.l2_mixed.masterconf/expected_output.yml +++ b/tests/server-info-show.tests/2xE5-2640.i350_and_82599ES.l2_mixed.masterconf/expected_output.yml @@ -82,6 +82,7 @@ net: driver: driver: igb version: 5.2.15-k + numa_node: -1 queues: own: - eth1 @@ -109,6 +110,7 @@ net: driver: driver: ixgbe version: 4.0.1-k + numa_node: -1 queues: own: - eth2 @@ -160,6 +162,7 @@ net: driver: driver: ixgbe version: 4.0.1-k + numa_node: -1 queues: own: - eth3 @@ -211,6 +214,7 @@ net: driver: driver: ixgbe version: 4.0.1-k + numa_node: -1 queues: own: - eth4 @@ -262,6 +266,7 @@ net: driver: driver: ixgbe version: 4.0.1-k + numa_node: -1 queues: own: - eth5 diff --git a/tests/server-info-show.tests/2xE5530.82576_and_82574L.l2_mixed.manual/expected_output.yml b/tests/server-info-show.tests/2xE5530.82576_and_82574L.l2_mixed.manual/expected_output.yml index dbcfaf0..ecce152 100644 --- a/tests/server-info-show.tests/2xE5530.82576_and_82574L.l2_mixed.manual/expected_output.yml +++ b/tests/server-info-show.tests/2xE5530.82576_and_82574L.l2_mixed.manual/expected_output.yml @@ -53,6 +53,7 @@ net: driver: driver: e1000e version: 3.2.5-k + numa_node: -1 queues: own: - eth1 @@ -74,6 +75,7 @@ net: driver: driver: igb version: 5.2.15-k + numa_node: -1 queues: own: - eth3 diff --git a/tests/server-info-show.tests/2xL5520.1x82576.L2_mixed.manual/expected_output.yml b/tests/server-info-show.tests/2xL5520.1x82576.L2_mixed.manual/expected_output.yml index 97adc1e..1ccd0c0 100644 --- a/tests/server-info-show.tests/2xL5520.1x82576.L2_mixed.manual/expected_output.yml +++ b/tests/server-info-show.tests/2xL5520.1x82576.L2_mixed.manual/expected_output.yml @@ -54,6 +54,7 @@ net: driver: driver: igb version: 5.3.0-k + numa_node: -1 queues: own: - em2 diff --git a/tests/server-info-show.tests/2xX5650.BCM5709_and_MT27520.L2.manual/expected_output.yml b/tests/server-info-show.tests/2xX5650.BCM5709_and_MT27520.L2.manual/expected_output.yml index ef4e886..7f5a93a 100644 --- a/tests/server-info-show.tests/2xX5650.BCM5709_and_MT27520.L2.manual/expected_output.yml +++ b/tests/server-info-show.tests/2xX5650.BCM5709_and_MT27520.L2.manual/expected_output.yml @@ -50,6 +50,7 @@ net: driver: driver: bnx2 version: 2.2.5 + numa_node: -1 queues: own: [] rx: [] @@ -76,6 +77,7 @@ net: driver: driver: mlx4_en version: 2.2-1 (Feb 2014) + numa_node: -1 queues: own: [] rx: [] diff --git a/tests/server-info-show.tests/kvm.l3.masterconf/expected_output.yml b/tests/server-info-show.tests/kvm.l3.masterconf/expected_output.yml index 395b067..bbd3f3a 100644 --- a/tests/server-info-show.tests/kvm.l3.masterconf/expected_output.yml +++ b/tests/server-info-show.tests/kvm.l3.masterconf/expected_output.yml @@ -40,6 +40,7 @@ net: driver: driver: e1000 version: 7.3.21-k8-NAPI + numa_node: -1 queues: own: [] rx: [] From 50c90e047c89b63660703bdd641f8235355455dd Mon Sep 17 00:00:00 2001 From: Oleg Strizhechenko Date: Mon, 29 Jan 2018 11:54:44 +0500 Subject: [PATCH 16/17] Fixed(server-info): print_ from six was missed --- netutils_linux_hardware/net_read.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netutils_linux_hardware/net_read.py b/netutils_linux_hardware/net_read.py index 66d51d8..b3f4128 100644 --- a/netutils_linux_hardware/net_read.py +++ b/netutils_linux_hardware/net_read.py @@ -1,7 +1,7 @@ # coding=utf-8 import os -from six import iteritems +from six import iteritems, print_ from netutils_linux_hardware.interrupts import IRQQueueCounter from netutils_linux_hardware.parser import Parser, YAMLLike From abb54869057b1b38316e1fce0cfe84f5acccfbfc Mon Sep 17 00:00:00 2001 From: Oleg Strizhechenko Date: Mon, 12 Feb 2018 12:04:50 +0500 Subject: [PATCH 17/17] Fixed(server-info): return 1 if no data about queues. --- netutils_linux_hardware/net.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/netutils_linux_hardware/net.py b/netutils_linux_hardware/net.py index ad6f99b..3fbdc60 100644 --- a/netutils_linux_hardware/net.py +++ b/netutils_linux_hardware/net.py @@ -48,6 +48,8 @@ def rate_queue_ethtool(self, netdevinfo): # exit(0) queues_ethtool = netdevinfo['queues_ethtool'] queues_type = 'rx' + if not queues_ethtool: + return 1 if len(queues_ethtool.keys()) == 1: queues_type = list(queues_ethtool.keys())[0] cpu_count = len(self.data.get('cpu').get('layout'))