host.py 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. from flask import Blueprint
  2. from libs.tools import json_response, JsonParser, Argument, AttrDict
  3. from libs.utils import Container
  4. from apps.deploy.models import AppHostRel, App
  5. from apps.assets.models import Host
  6. from apps.configuration.models import Environment
  7. import time
  8. from libs.decorators import require_permission
  9. blueprint = Blueprint(__name__, __name__)
  10. args = AttrDict(
  11. app_id=Argument('app_id', type=int),
  12. env_id=Argument('env_id', type=int),
  13. cli_id=Argument('cli_id', type=int)
  14. )
  15. @blueprint.route('/<int:app_id>/<string:env_id>', methods=['GET'])
  16. @require_permission('publish_app_publish_view | publish_app_publish_deploy')
  17. def get(app_id, env_id):
  18. hosts = Host.query.join(AppHostRel).filter_by(env_id=env_id, app_id=app_id).all()
  19. return json_response(hosts)
  20. @blueprint.route('/', methods=['POST'])
  21. @require_permission('publish_app_publish_view | publish_app_publish_deploy')
  22. def post():
  23. form, error = JsonParser(
  24. Argument('action', filter=lambda x: x in ['v_start', 'v_stop', 'v_remove'], help='无效的操作指令!'),
  25. *args.values()
  26. ).parse()
  27. if error is None:
  28. pro = App.query.get_or_404(form.app_id)
  29. env = Environment.query.get_or_404(form.env_id)
  30. cli = Host.query.get_or_404(form.cli_id)
  31. ctr = Container(cli.docker_uri, pro.identify + '.' + env.identify)
  32. # ctr_info = ctr.info
  33. # if form.action != 'v_start':
  34. # if ctr_info.State != 'running':
  35. # ctr.start()
  36. # exec_code, exec_out = ctr.exec_command('/entrypoint.sh ' + form.action, True)
  37. # if exec_code != '0':
  38. # print('执行{0}钩子失败,返回状态码:{1}'.format(form.action, exec_code))
  39. # # return json_response(message='执行{0}钩子失败,返回状态码:{1}'.format(form.action, exec_code))
  40. getattr(ctr, form.action.lstrip('v_'))()
  41. return json_response(message=error)
  42. @blueprint.route('/state', methods=['POST'])
  43. @require_permission('publish_app_publish_view | publish_app_publish_deploy')
  44. def state():
  45. form, error = JsonParser(*args.values()).parse()
  46. if error:
  47. return json_response(message=error)
  48. pro = App.query.get_or_404(form.app_id)
  49. env = Environment.query.get_or_404(form.env_id)
  50. cli = Host.query.get_or_404(form.cli_id)
  51. ctr_name = pro.identify + '.' + env.identify
  52. info = Container(cli.docker_uri, ctr_name).info
  53. if info:
  54. return json_response({'running': info.running, 'status': info.Status, 'image': info.Image})
  55. else:
  56. return json_response({'running': False, 'status': 'N/A', 'image': 'N/A'})
  57. @blueprint.route('/logs', methods=['POST'])
  58. @require_permission('publish_app_publish_view | publish_app_publish_deploy')
  59. def logs():
  60. form, error = JsonParser(*args.values()).parse()
  61. if error is None:
  62. pro = App.query.get_or_404(form.app_id)
  63. env = Environment.query.get_or_404(form.env_id)
  64. cli = Host.query.get_or_404(form.cli_id)
  65. ctr = Container(cli.docker_uri, pro.identify + '.' + env.identify)
  66. str_logs = ctr.logs(timestamps=True, tail=20, since=int(time.time() - 300))
  67. return json_response(str_logs)
  68. return json_response(message=error)