dodo_utils.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import subprocess
  2. import time
  3. from doit import loader
  4. def wait_net_service(server, port, timeout=None):
  5. """ Wait for network service to appear
  6. @param timeout: in seconds, if None or 0 wait forever
  7. @return: True of False, if timeout is None may return only True or
  8. throw unhandled network exception
  9. """
  10. import socket
  11. import errno
  12. s = socket.socket()
  13. if timeout:
  14. from time import time as now
  15. # time module is needed to calc timeout shared between two exceptions
  16. end = now() + timeout
  17. while True:
  18. try:
  19. if timeout:
  20. next_timeout = end - now()
  21. if next_timeout < 0:
  22. return False
  23. else:
  24. s.settimeout(next_timeout)
  25. s.connect((server, port))
  26. except socket.timeout as err:
  27. # this exception occurs only if timeout is set
  28. if timeout:
  29. return False
  30. except socket.error as err:
  31. # catch timeout exception from underlying network library
  32. # this one is different from socket.timeout
  33. if type(err.args) != tuple or err[0] != errno.ETIMEDOUT:
  34. raise
  35. else:
  36. s.close()
  37. return True
  38. def wait_pgsql_db(container, dbname, user, timeout=60):
  39. container_id = subprocess.check_output(
  40. 'docker ps -qf name=feedati_db'.split()).decode('utf8').strip()
  41. print('container db=', container_id)
  42. cmd = ['docker', 'exec', container_id,
  43. 'psql', '-h', 'localhost', '-U', user, '-w', dbname]
  44. for i in range(timeout):
  45. try:
  46. subprocess.check_output(cmd, shell=False)
  47. except subprocess.CalledProcessError as exc:
  48. if exc.returncode == 2: # there's some more to wait
  49. time.sleep(1)
  50. continue
  51. raise
  52. else:
  53. return True
  54. def up2date_anyimages():
  55. cmd = "docker images -q feedati/*".split()
  56. output = subprocess.check_output(cmd).strip()
  57. if output:
  58. return True
  59. return False
  60. def up2date_hasimage(imagename):
  61. def fun():
  62. cmd = ' '.join(['docker', 'volume', 'ls',
  63. '-qf', 'name=%s' % imagename])
  64. out = subprocess.check_output(cmd, shell=True).decode('utf8').strip()
  65. if out:
  66. return True
  67. return False
  68. return fun
  69. def run(cmd, **kwargs):
  70. def fun():
  71. subprocess.check_call(cmd, **kwargs)
  72. return True
  73. return fun
  74. def run_task_func(taskf):
  75. ret = taskf()
  76. tasks = loader.generate_tasks(taskf.__name__, ret, taskf.__doc__)
  77. try:
  78. from doit.task import Stream
  79. stream = Stream(0)
  80. except ImportError:
  81. stream = None
  82. def fun():
  83. for task in tasks:
  84. if stream is None:
  85. task.execute()
  86. else:
  87. task.execute(stream)
  88. return True
  89. if tasks:
  90. fun.__doc__ = '\n'.join(t.doc for t in tasks)
  91. return fun