blob: 059101a956a2190e28f6c81dead6c3450ee7ff09 [file] [log] [blame]
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -08001import time
koder aka kdanilov4ec0f712015-02-19 19:19:27 -08002import socket
koder aka kdanilovdda86d32015-03-16 11:20:04 +02003import os.path
koder aka kdanilove21d7472015-02-14 19:02:04 -08004import logging
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -08005import threading
6import contextlib
koder aka kdanilov4643fd62015-02-10 16:20:13 -08007import multiprocessing
8
koder aka kdanilove21d7472015-02-14 19:02:04 -08009
10logger = logging.getLogger("io-perf-tool")
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -080011
12
koder aka kdanilove06762a2015-03-22 23:32:09 +020013def parse_creds(creds):
14 # parse user:passwd@host
15 user, passwd_host = creds.split(":", 1)
16
17 if '@' not in passwd_host:
18 passwd, host = passwd_host, None
19 else:
20 passwd, host = passwd_host.rsplit('@', 1)
21
22 return user, passwd, host
23
24
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -080025def get_barrier(count, threaded=False):
26 if threaded:
27 class val(object):
28 value = count
29 cond = threading.Condition()
30 else:
31 val = multiprocessing.Value('i', count)
32 cond = multiprocessing.Condition()
koder aka kdanilov4643fd62015-02-10 16:20:13 -080033
34 def closure(timeout):
35 with cond:
36 val.value -= 1
37 if val.value == 0:
38 cond.notify_all()
39 else:
40 cond.wait(timeout)
41 return val.value == 0
42
43 return closure
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -080044
45
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -080046def wait_on_barrier(barrier, latest_start_time):
47 if barrier is not None:
48 if latest_start_time is not None:
49 timeout = latest_start_time - time.time()
50 else:
51 timeout = None
52
53 if timeout is not None and timeout > 0:
54 msg = "Ready and waiting on barrier. " + \
55 "Will wait at most {0} seconds"
koder aka kdanilove21d7472015-02-14 19:02:04 -080056 logger.debug(msg.format(int(timeout)))
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -080057
58 if not barrier(timeout):
koder aka kdanilove21d7472015-02-14 19:02:04 -080059 logger.debug("Barrier timeouted")
koder aka kdanilov4ec0f712015-02-19 19:19:27 -080060 else:
61 logger.debug("Passing barrier, starting test")
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -080062
63
64@contextlib.contextmanager
65def log_error(action, types=(Exception,)):
66 if not action.startswith("!"):
koder aka kdanilove21d7472015-02-14 19:02:04 -080067 logger.debug("Starts : " + action)
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -080068 else:
69 action = action[1:]
70
71 try:
72 yield
73 except Exception as exc:
74 if isinstance(exc, types) and not isinstance(exc, StopIteration):
75 templ = "Error during {0} stage: {1}"
koder aka kdanilove21d7472015-02-14 19:02:04 -080076 logger.debug(templ.format(action, exc.message))
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -080077 raise
78
79
80def run_over_ssh(conn, cmd):
81 "should be replaces by normal implementation, with select"
82
83 stdin, stdout, stderr = conn.exec_command(cmd)
84 out = stdout.read()
85 err = stderr.read()
86 code = stdout.channel.recv_exit_status()
87 return code, out, err
koder aka kdanilov83cd7132015-02-14 21:37:14 -080088
89
koder aka kdanilov6e2ae792015-03-04 18:02:24 -080090def kb_to_ssize(ssize):
91 size_ext = {
92 4: 'P',
93 3: 'T',
94 2: 'G',
95 1: 'M',
96 0: 'K'
97 }
98
99 for idx in reversed(sorted(size_ext)):
100 if ssize > 1024 ** idx:
101 ext = size_ext[idx]
102 return "{0}{1}".format(int(ssize / 1024 ** idx), ext)
103 raise ValueError("Can't convert {0} to kb".format(ssize))
104
105
koder aka kdanilov83cd7132015-02-14 21:37:14 -0800106def ssize_to_kb(ssize):
107 try:
108 smap = dict(k=1, K=1, M=1024, m=1024, G=1024**2, g=1024**2)
109 for ext, coef in smap.items():
110 if ssize.endswith(ext):
111 return int(ssize[:-1]) * coef
112
113 if int(ssize) % 1024 != 0:
114 raise ValueError()
115
116 return int(ssize) / 1024
117
118 except (ValueError, TypeError, AttributeError):
119 tmpl = "Unknow size format {0!r} (or size not multiples 1024)"
120 raise ValueError(tmpl.format(ssize))
koder aka kdanilov8ad6e812015-03-22 14:42:18 +0200121
122
123def ssize_to_b(ssize):
124 try:
125 smap = dict(k=1, K=1, M=1024, m=1024, G=1024**2, g=1024**2)
126 for ext, coef in smap.items():
127 if ssize.endswith(ext):
128 return int(ssize[:-1]) * coef * 1024
129
130 return int(ssize)
131 except (ValueError, TypeError, AttributeError):
132 tmpl = "Unknow size format {0!r} (or size not multiples 1024)"
133 raise ValueError(tmpl.format(ssize))