Skip to content

Commit 44617eb

Browse files
Refactoring: all server-info-* utils have one entry point (#185)
* Refactoring(server-info): single entry point. * Refactoring(server-info): deleted old server-info-rate and server-info-show utils. * Fixed(tests): modern call of server-info --show. * Added(tests): server-info --rate call should never fail. * Fixed(tests): server-info --rate is passing now. * Fixed(README): new examples in README.
1 parent d468d32 commit 44617eb

10 files changed

+158
-78
lines changed

README.rst

+2-2
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ Much alike lshw but designed for network processing role of server.
147147

148148
.. code:: yaml
149149
150-
# server-info show
150+
# server-info --show
151151
cpu:
152152
info:
153153
Architecture: x86_64
@@ -211,7 +211,7 @@ It also can rate hardware and its features in range of 1..10.
211211

212212
.. code:: yaml
213213
214-
# server-info rate
214+
# server-info --rate
215215
cpu:
216216
BogoMIPS: 7
217217
CPU MHz: 7

netutils_linux_hardware/assessor.py

+4-5
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ class Assessor(object):
1717
info = None
1818
avg = None
1919

20-
def __init__(self, data):
20+
def __init__(self, data, args):
2121
self.data = data
22-
self.args = self.parse_args()
22+
self.args = args
2323
if self.data:
2424
self.assess()
2525

@@ -81,7 +81,7 @@ def assess_memory_size(self, size):
8181
return self.fold({
8282
'MemTotal': Grade.int(size.get('MemTotal'), 2 * (1024 ** 2), 16 * (1024 ** 2)),
8383
'SwapTotal': Grade.int(size.get('SwapTotal'), 512 * 1024, 4 * (1024 ** 2)),
84-
}, FOLDING_DEVICE)
84+
}, FOLDING_DEVICE) if size else 1
8585

8686
def assess_memory(self):
8787
meminfo = self.data.get('memory')
@@ -133,8 +133,7 @@ def assess_disk(self, disk):
133133

134134
def __assess(self, func, key):
135135
items = self.data.get(key)
136-
if items:
137-
return self.fold(dict((item, func(item)) for item in items), FOLDING_SUBSYSTEM)
136+
return self.fold(dict((item, func(item)) for item in items), FOLDING_SUBSYSTEM) if items else 1
138137

139138
def parse_args(self):
140139
parser = argparse.ArgumentParser()

netutils_linux_hardware/cli.py

+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
# coding=utf-8
2+
3+
import argparse
4+
5+
from six import print_
6+
7+
from netutils_linux_hardware.assessor import Assessor, FOLDING_NO, FOLDING_DEVICE, FOLDING_SUBSYSTEM, FOLDING_SERVER
8+
from netutils_linux_hardware.collect import ServerInfoCollect
9+
from netutils_linux_hardware.reader import Reader
10+
11+
12+
class ServerInfo(object):
13+
""" Single entry point for --collect, --rate, --show """
14+
args = None
15+
commands = ['--collect', '--rate', '--show', '--help']
16+
17+
def __init__(self):
18+
self.__parse_args()
19+
self.__check_args()
20+
self.main()
21+
22+
def __parse_args(self):
23+
default_directory = '/tmp/netutils_server_info/'
24+
parser = argparse.ArgumentParser()
25+
parser.add_argument('--directory', type=str, help="Specify a data directory or a tarball",
26+
default=default_directory)
27+
parser.add_argument('--collect', action='store_true', help='Collect the data about the server', default=False)
28+
parser.add_argument('--gzip', action='store_true', help="Compress the data", default=False)
29+
parser.add_argument('--show', action='store_true', help='Shows data about the server in YAML', default=False)
30+
parser.add_argument('--rate', action='store_true', help='Rates data about the server', default=False)
31+
parser.add_argument('-f', '--folding', action='count', help='-f - device, -ff - subsystem, -fff - server',
32+
default=FOLDING_NO)
33+
parser.add_argument('--device', action='store_const', const=FOLDING_DEVICE, dest='folding',
34+
help='Folds rates details to entire devices')
35+
parser.add_argument('--subsystem', action='store_const', const=FOLDING_SUBSYSTEM, dest='folding',
36+
help='Folds rates details to entire subsystems')
37+
parser.add_argument('--server', action='store_const', const=FOLDING_SERVER, dest='folding',
38+
help='Folds rates details to entire server')
39+
self.args = parser.parse_args()
40+
41+
def __check_args(self):
42+
""" Maybe they should be positional arguments, not options. But subparsers/groups are stupid """
43+
assert any([self.args.collect, self.args.rate, self.args.show]), "Specify command: {0}".format(self.commands)
44+
45+
def tarball_directory(self):
46+
""" Decision about and smart 'corrections' """
47+
suffix = '.tar.gz'
48+
if self.args.directory.endswith(suffix):
49+
return self.args.directory, self.args.directory[:-7]
50+
return (self.args.directory.rstrip('/') + suffix) if self.args.gzip else None, self.args.directory
51+
52+
def main(self):
53+
""" Main logic """
54+
tarball, directory = self.tarball_directory()
55+
ServerInfoCollect(directory, tarball, self.args.collect)
56+
if self.args.rate or self.args.show:
57+
reader = Reader(directory)
58+
print_(Assessor(reader.info, self.args) if self.args.rate else reader)

netutils_linux_hardware/collect.py

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# coding=utf-8
2+
3+
import os
4+
import shutil
5+
6+
7+
class ServerInfoCollect(object):
8+
""" Temporary wrapper, later collection will be fully rewritten in python """
9+
10+
def __init__(self, directory, tarball, collect):
11+
self.directory = directory
12+
self.tarball = tarball
13+
self.__collect(collect)
14+
self.__archive()
15+
16+
def __collect(self, collect):
17+
already_exists = os.path.exists(self.directory)
18+
if already_exists and not collect:
19+
return
20+
if already_exists:
21+
shutil.rmtree(self.directory)
22+
os.makedirs(self.directory)
23+
os.system('server-info-collect {0}'.format(self.directory))
24+
25+
def __archive(self):
26+
if not self.tarball:
27+
return
28+
os.chdir(os.path.join(self.directory, '..'))
29+
os.system('tar cfz {0} {1} 2>/dev/null'.format(self.tarball, self.directory))

tests/server-info-rate

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
#!/usr/bin/env bash
2+
3+
set -euo pipefail
4+
5+
testdata=./tests/server-info-show.tests/
6+
TMPDIR=/tmp/server-info-show/
7+
mkdir -p $TMPDIR
8+
9+
COLOR_SUCCESS="\\033[1;32m"
10+
COLOR_FAILURE="\\033[1;31m"
11+
COLOR_WARNING="\\033[1;33m"
12+
COLOR_NORMAL="\\033[0;39m"
13+
14+
run_test() {
15+
local name="${1##*/}"
16+
local directory="$1"
17+
shift
18+
local rc=0
19+
echo "server-info --rate --directory='$directory' $*" > "$TMPDIR/output"
20+
server-info --rate --directory="$directory" "$@" &>> "$TMPDIR/output" || rc=$?
21+
if [ "$rc" = '0' ]; then
22+
echo -e "$COLOR_SUCCESS# $name $*"
23+
else
24+
echo -e "$COLOR_FAILURE# $name $*:$COLOR_NORMAL"
25+
cat "$TMPDIR/output"
26+
fi
27+
echo -ne "$COLOR_NORMAL"
28+
return "$rc"
29+
}
30+
31+
32+
retval=0
33+
# shellcheck disable=SC2044
34+
for test in $(find "$testdata" -mindepth 1 -maxdepth 1 -type d); do
35+
if [ -f "$test/expected_output" ]; then
36+
if ! run_test "$test"; then
37+
retval=1
38+
break
39+
fi
40+
for param in --device --subsystem --server -f -ff -fff; do
41+
if ! run_test "$test" "$param"; then
42+
retval=1
43+
break 2
44+
fi
45+
done
46+
fi
47+
done
48+
rm -rf $TMPDIR
49+
exit "$retval"

tests/server-info-show

+8-8
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,15 @@ run_test() {
1010
local name="${1##*/}"
1111
local rc=0
1212
echo -n "# $name "
13-
DATADIR="$1" ./utils/server-info-show > $TMPDIR/output
14-
if [ "${REWRITE:-}" = '1' ]; then
15-
DATADIR="$1" ./utils/server-info-show > $testdata/$name/expected_output
13+
server-info --show --directory="$1" > $TMPDIR/output
14+
if [ "${REWRITE:-0}" = '1' ]; then
15+
server-info --show --directory="$1" > "$testdata/$name/expected_output"
1616
fi
1717
cmp -s $1/expected_output $TMPDIR/output || rc=$?
1818
if [ "$rc" = '0' ]; then
1919
echo OK
2020
else
21-
diff -U 5 $testdata/$name/expected_output $TMPDIR/output
21+
diff -U 5 "$testdata/$name/expected_output" "$TMPDIR/output"
2222
echo FAIL
2323
fi
2424
return "$rc"
@@ -27,13 +27,13 @@ run_test() {
2727

2828
retval=0
2929
# shellcheck disable=SC2044
30-
for test in $(find $testdata -mindepth 1 -maxdepth 1 -type d); do
31-
if [ -f $test/expected_output ]; then
32-
if ! run_test $test; then
30+
for test in $(find "$testdata" -mindepth 1 -maxdepth 1 -type d); do
31+
if [ -f "$test/expected_output" ]; then
32+
if ! run_test "$test"; then
3333
retval=1
3434
break
3535
fi
3636
fi
3737
done
3838
rm -rf $TMPDIR
39-
exit $retval
39+
exit "$retval"

utils/server-info

+6-11
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,8 @@
1-
#!/bin/bash
1+
#!/usr/bin/env python
2+
# coding=utf-8
23

3-
set -euo pipefail
44

5-
if [ "$1" != 'show' ] && [ "$1" != 'rate' ]; then
6-
echo "Usage $0 [show|rate]"
7-
exit 1
8-
fi
9-
server-info-collect server
10-
cd /root/
11-
tar xfz server.tar.gz
12-
cd /root/server/
13-
server-info-"$1"
5+
from netutils_linux_hardware.cli import ServerInfo
6+
7+
if __name__ == '__main__':
8+
ServerInfo()

utils/server-info-collect

+2-10
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
set -euo pipefail
44

55
SYSCONFIG=/etc/sysconfig/network-scripts/
6-
TMPDIR="/tmp/$1"
6+
TMPDIR="$1"
77

88
prepare() {
99
mkdir -p $TMPDIR/ethtool/{g,i,c} $TMPDIR/network-scripts/
@@ -62,18 +62,10 @@ network_info() {
6262
done
6363
}
6464

65-
make_archive() {
66-
local output="/root/$1.tar.gz"
67-
cd /tmp/
68-
tar cfz "$output" "$1"
69-
rm -rf $TMPDIR
70-
}
71-
7265
main() {
7366
prepare
7467
server_info
7568
network_info
76-
make_archive "$@"
7769
}
7870

79-
main "$@"
71+
main

utils/server-info-rate

-22
This file was deleted.

utils/server-info-show

-20
This file was deleted.

0 commit comments

Comments
 (0)