dodo_utils.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import subprocess
  2. from doit import loader
  3. def wait_net_service(server, port, timeout=None):
  4. """ Wait for network service to appear
  5. @param timeout: in seconds, if None or 0 wait forever
  6. @return: True of False, if timeout is None may return only True or
  7. throw unhandled network exception
  8. """
  9. import socket
  10. import errno
  11. s = socket.socket()
  12. if timeout:
  13. from time import time as now
  14. # time module is needed to calc timeout shared between two exceptions
  15. end = now() + timeout
  16. while True:
  17. try:
  18. if timeout:
  19. next_timeout = end - now()
  20. if next_timeout < 0:
  21. return False
  22. else:
  23. s.settimeout(next_timeout)
  24. s.connect((server, port))
  25. except socket.timeout as err:
  26. # this exception occurs only if timeout is set
  27. if timeout:
  28. return False
  29. except socket.error as err:
  30. # catch timeout exception from underlying network library
  31. # this one is different from socket.timeout
  32. if type(err.args) != tuple or err[0] != errno.ETIMEDOUT:
  33. raise
  34. else:
  35. s.close()
  36. return True
  37. def up2date_anyimages():
  38. cmd = "docker images -q feedati/*".split()
  39. output = subprocess.check_output(cmd).strip()
  40. if output:
  41. return True
  42. return False
  43. def run(cmd, **kwargs):
  44. def fun():
  45. subprocess.check_call(cmd, **kwargs)
  46. return True
  47. return fun
  48. def run_task_func(taskf):
  49. ret = taskf()
  50. tasks = loader.generate_tasks(taskf.__name__, ret, taskf.__doc__)
  51. def fun():
  52. for task in tasks:
  53. task.execute()
  54. return True
  55. if tasks:
  56. fun.__doc__ = '\n'.join(t.doc for t in tasks)
  57. return fun