dodo.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. import subprocess
  2. import os
  3. from doit.tools import LongRunning
  4. from dodo_utils import wait_net_service, wait_pgsql_db, \
  5. up2date_hasimage, up2date_anyimages, \
  6. run_task_func, scan_dir
  7. COMPOSE = 'docker-compose -p feedati'
  8. DOIT_CONFIG = {'default_tasks': ['up']}
  9. def task_build():
  10. '''builda il container docker'''
  11. return {
  12. 'uptodate': [up2date_anyimages],
  13. 'file_dep': ['docker-compose.yml',
  14. 'rss-bridge/Dockerfile',
  15. ] + list(scan_dir('docker')),
  16. 'actions': [COMPOSE + ' build'],
  17. 'clean': [run_task_func(task__build_rm),
  18. run_task_func(task__build_rmi)],
  19. 'doc': '''
  20. This task recreates every docker container. While it is automatically run for most changes in the
  21. development environment, please remember that if you want to run it manually to grab changes in the
  22. docker hub, you need to run `doit run -a build`.
  23. '''
  24. }
  25. def task__build_rm():
  26. '''rimuove container avviati'''
  27. return {'actions': [
  28. "docker container ls -a --format '{{.ID}}\t{{.Names}}'|"
  29. "awk '$2 ~ /^feedati_/ { print $1 }' | "
  30. "xargs -r docker container rm",
  31. ]}
  32. def task__build_rmi():
  33. '''rimuove immagini ottenute con build'''
  34. return {
  35. 'actions': [
  36. r"docker images -q 'feedati/*' |"
  37. "xargs -r --verbose docker rmi",
  38. ]
  39. }
  40. def task__dbprepare_clean():
  41. '''rimuove il dump caricato sul db'''
  42. return {
  43. 'actions': [
  44. "docker ps -aqf name=feedati_db|xargs -r docker container rm ",
  45. "docker volume rm feedati_postgres_data || true",
  46. ]
  47. }
  48. def stop():
  49. subprocess.check_call((COMPOSE + ' stop').split())
  50. return True
  51. def task_dbprepare():
  52. '''applica il dump sql al container del db'''
  53. return {
  54. 'setup': ['_dbprepare_clean', 'build'],
  55. 'file_dep': ['docker/ttrss.sql'],
  56. 'actions': [
  57. (COMPOSE + ' up -d db').split(),
  58. (wait_net_service, ('localhost', 5432, 300)),
  59. (wait_pgsql_db, ('feedati_db', 'ttrss', 'ttrss')),
  60. 'echo LOADING DB',
  61. r'docker exec -i $(docker ps -aqf name=feedati_db) '
  62. 'psql -h 127.0.0.1 -f - -d ttrss ttrss < docker/ttrss.sql',
  63. 'echo DB RESTORED',
  64. ],
  65. 'teardown': [(stop, [])],
  66. 'uptodate': [up2date_hasimage('feedati_postgres_data')()],
  67. 'clean': [run_task_func(task__dbprepare_clean)]
  68. }
  69. def task__fix_perms():
  70. '''fix permissions for shared www dir'''
  71. # currently empty, but keeping it for later use
  72. return {
  73. 'actions': None,
  74. }
  75. def task_up():
  76. '''RUN that stuff!'''
  77. return {
  78. 'task_dep': ['build', 'dbprepare', '_fix_perms'],
  79. 'teardown': [(stop, [])],
  80. 'actions': [LongRunning(
  81. (COMPOSE + ' up').split(),
  82. shell=False)
  83. ]
  84. }
  85. def restart(*containers):
  86. '''This actually restart the container(s).'''
  87. srv = subprocess.check_output((COMPOSE + ' config --services').split())
  88. services = srv.decode('utf-8').strip().split()
  89. for container in containers:
  90. if container not in services:
  91. raise ValueError("%s is not among the services %r" % (container, services))
  92. subprocess.check_call((COMPOSE + 'restart %s' % container).split())
  93. return True
  94. def task_restart(*containers):
  95. '''Restarts a container specified via commandline.'''
  96. return {
  97. 'params': [{'name': 'services',
  98. 'short': 's',
  99. 'long': 'service',
  100. 'type': list,
  101. 'default': [],
  102. 'help': "the list of services to be restarted"}],
  103. 'actions': [(restart, containers)],
  104. }
  105. def task__cleanall():
  106. '''clean everything there is to clean'''
  107. return {
  108. 'task_dep': ['_build_rm', '_build_rmi', '_dbprepare_clean'],
  109. 'actions': None
  110. }