Improvements to CI differential RSS
[ci.git] / htest / utils.py
blob924e4f9bf22eb6aaf33151ece290c87dfb986507
1 #!/usr/bin/env python3
4 # Copyright (c) 2018 Vojtech Horky
5 # All rights reserved.
7 # Redistribution and use in source and binary forms, with or without
8 # modification, are permitted provided that the following conditions
9 # are met:
11 # - Redistributions of source code must retain the above copyright
12 # notice, this list of conditions and the following disclaimer.
13 # - Redistributions in binary form must reproduce the above copyright
14 # notice, this list of conditions and the following disclaimer in the
15 # documentation and/or other materials provided with the distribution.
16 # - The name of the author may not be used to endorse or promote products
17 # derived from this software without specific prior written permission.
19 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20 # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21 # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22 # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24 # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 import time
32 import logging
33 import shlex
35 def retries(n=None, interval=2, timeout=None, message="Operation timed-out (too many retries)", name=""):
36 """
37 To be used in for-loops to try action multiple times.
38 Throws exception on time-out.
39 """
41 if (n is None) and (timeout is None):
42 raise Exception("Specify either n or timeout for retries")
44 if name != "":
45 name = "-" + name
46 logger = logging.getLogger("rtr" + name)
48 if timeout is None:
49 timeout = n * interval
50 remaining = timeout
51 n = 0
52 while remaining > 0:
53 logger.debug("remaining={}, n={}, interval={}, \"{}\"".format(
54 remaining, n, interval, message))
55 remaining = remaining - interval
56 n = n + 1
57 yield n
58 time.sleep(interval)
59 logger.debug("timed-out, n={}, \"{}\"".format(n, message))
60 raise Exception(message)
62 def format_command(cmd):
63 """
64 Escape shell command given as list of arguments.
65 """
66 escaped = [shlex.quote(i) for i in cmd]
67 return ' '.join(escaped)
69 def format_command_pipe(pipe):
70 """
71 Escape shell pipe given as list of list of arguments.
72 """
73 escaped = [format_command(i) for i in pipe]
74 return ' | '.join(escaped)