field.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. from flask import Blueprint
  2. from public import db
  3. from libs.tools import json_response, JsonParser, Argument, AttrDict
  4. from docker.errors import DockerException
  5. from libs.utils import Container
  6. from apps.deploy.models import DeployField, App, AppFieldRel
  7. from apps.configuration.models import Environment
  8. from apps.assets.models import Host
  9. from libs.decorators import require_permission
  10. blueprint = Blueprint(__name__, __name__)
  11. args = AttrDict(
  12. name=Argument('name', help='请输入字段名称'),
  13. desc=Argument('desc', help='请输入字段描述'),
  14. command=Argument('command', help='请输入执行的内容'),
  15. )
  16. @blueprint.route('/', methods=['GET'])
  17. @require_permission('publish_field_view')
  18. def get():
  19. fields = DeployField.query.all()
  20. return json_response(fields)
  21. @blueprint.route('/', methods=['POST'])
  22. @require_permission('publish_field_add')
  23. def post():
  24. form, error = JsonParser(*args.values()).parse()
  25. if error is None:
  26. DeployField(**form).save()
  27. return json_response(message=error)
  28. @blueprint.route('/<int:field_id>', methods=['PUT'])
  29. @require_permission('publish_field_edit')
  30. def put(field_id):
  31. form, error = JsonParser(*args.values()).parse()
  32. if error is None:
  33. field = DeployField.query.get_or_404(field_id)
  34. field.update(**form)
  35. return json_response(message=error)
  36. @blueprint.route('/<int:field_id>', methods=['DELETE'])
  37. @require_permission('publish_field_del')
  38. def delete(field_id):
  39. field = DeployField.query.get_or_404(field_id)
  40. rel = AppFieldRel.query.filter_by(field_id=field_id).first()
  41. if rel:
  42. rel_app = App.query.get_or_404(rel.app_id)
  43. return json_response(message='应用 <%s> 使用了该字段,请解除关联后再尝试删除该字段!' % rel_app.name)
  44. field.delete()
  45. return json_response()
  46. @blueprint.route('/<int:field_id>/exec', methods=['POST'])
  47. @require_permission('publish_app_view')
  48. def do_exec(field_id):
  49. form, error = JsonParser(
  50. Argument('host_id', type=int),
  51. Argument('app_id', type=int),
  52. Argument('env_id', type=int)
  53. ).parse()
  54. if error is None:
  55. field = DeployField.query.get_or_404(field_id)
  56. pro = App.query.get_or_404(form.app_id)
  57. cli = Host.query.get_or_404(form.host_id)
  58. env = Environment.query.get_or_404(form.env_id)
  59. try:
  60. ctr = Container(cli.docker_uri, '{}.{}'.format(pro.identify, env.identify))
  61. output = ctr.exec_command_with_base64(field.command, timeout=5)
  62. except DockerException:
  63. output = 'N/A'
  64. return json_response(output.strip())
  65. return json_response(message=error)
  66. @blueprint.route('/<int:field_id>/apps', methods=['GET'])
  67. @require_permission('publish_field_rel_view')
  68. def fetch_apps(field_id):
  69. field = DeployField.query.get_or_404(field_id)
  70. return json_response(field.apps)
  71. @blueprint.route('/<int:field_id>/bind/apps', methods=['POST'])
  72. @require_permission('publish_field_rel_edit')
  73. def bind_apps(field_id):
  74. form, error = JsonParser(Argument('app_ids', type=list)).parse()
  75. if error is None:
  76. old_relationships = AppFieldRel.query.filter_by(field_id=field_id).all()[:]
  77. for app_id in form.app_ids:
  78. rel = AppFieldRel(field_id=field_id, app_id=app_id)
  79. if rel in old_relationships:
  80. old_relationships.remove(rel)
  81. else:
  82. rel.add()
  83. for old_rel in old_relationships:
  84. old_rel.delete(commit=False)
  85. db.session.commit()
  86. return json_response(message=error)