config.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. # coding=utf-8
  2. from public import db
  3. from flask import Blueprint, abort
  4. from libs.tools import json_response, JsonParser, Argument, AttrDict
  5. from apps.deploy.models import Image, ImageConfig, App
  6. from apps.configuration.models import ConfigKey, ConfigValue
  7. from apps.deploy.utils import valid_app_setting
  8. from libs.decorators import require_permission
  9. blueprint = Blueprint(__name__, __name__)
  10. args = AttrDict(
  11. id=Argument('id', type=int, help='丢失id!'),
  12. name=Argument('name', filter=lambda x: not x.startswith('__'), help='请输入非双下划线开头的变量名称!'),
  13. desc=Argument('desc', required=False),
  14. value=Argument('value', help='请输入变量的值!')
  15. )
  16. def type_id_to_model_instance(owner_type, owner_id):
  17. if owner_type == 'app':
  18. return App.query.get_or_404(owner_id)
  19. elif owner_type == 'img':
  20. return Image.query.get_or_404(owner_id)
  21. else:
  22. abort(404)
  23. @blueprint.route('/image/<int:img_id>', methods=['GET'])
  24. @require_permission('publish_image_var_view')
  25. def get_image(img_id):
  26. configs = ImageConfig.query.filter_by(img_id=img_id).all()
  27. return json_response(configs)
  28. @blueprint.route('/image/<int:img_id>', methods=['POST'])
  29. @require_permission('publish_image_var_add')
  30. def post_image(img_id):
  31. form, error = JsonParser(args.name, args.desc, args.value).parse()
  32. if error is None:
  33. if ImageConfig.query.filter_by(img_id=img_id, name=form.name).first():
  34. return json_response(message='已存在相同的变量名称!')
  35. ImageConfig(img_id=img_id, **form).save()
  36. return json_response()
  37. return json_response(message=error)
  38. @blueprint.route('/image/<int:img_id>', methods=['PUT'])
  39. @require_permission('publish_image_var_edit')
  40. def put_image(img_id):
  41. form, error = JsonParser(args.id, args.name, args.desc, args.value).parse()
  42. if error is None:
  43. exists_config = ImageConfig.query.filter_by(img_id=img_id, name=form.name).first()
  44. if exists_config and exists_config.id != form.id:
  45. return json_response(message='已存在相同的变量名称!')
  46. config = ImageConfig.query.get_or_404(form.id)
  47. config.update(**form)
  48. return json_response()
  49. return json_response(message=error)
  50. @blueprint.route('/image/<int:img_id>', methods=['DELETE'])
  51. @require_permission('publish_image_var_del')
  52. def delete_image(img_id):
  53. config = ImageConfig.query.get_or_404(img_id)
  54. config.delete()
  55. return json_response()
  56. @blueprint.route('/app/<int:owner_id>/settings/', methods=['POST'])
  57. def setting_post(owner_id):
  58. form, error = JsonParser(
  59. Argument('name', filter=lambda x: x in ['__MEM_LIMIT', '__NETWORK_MODE', '__EXPOSE_PORT', '__BIND_VOLUME', '__DNS_SERVER', '__HOST_NAME'],
  60. help='无效的设置参数!'),
  61. Argument('value', type=dict),
  62. 'desc').parse()
  63. if error is None:
  64. ok, message = valid_app_setting(form.name, form.value.values())
  65. if not ok:
  66. return json_response(message=message)
  67. values = form.pop('value')
  68. config_key = ConfigKey.query.filter_by(owner_type='app', owner_id=owner_id, name=form.name,
  69. type='system').first()
  70. if not config_key:
  71. config_key = ConfigKey(owner_type='app', owner_id=owner_id, type='system', **form).save()
  72. for env_id, value in values.items():
  73. config_value = ConfigValue.query.filter_by(env_id=env_id, key_id=config_key.id).first()
  74. if config_value:
  75. config_value.update(value=value)
  76. else:
  77. ConfigValue(key_id=config_key.id, env_id=env_id, value=value).save()
  78. return json_response()
  79. return json_response(message=error)
  80. @blueprint.route('/app/<int:app_id>', methods=['GET'])
  81. @require_permission('publish_app_ctr_view')
  82. def get_app(app_id):
  83. keys = ConfigKey.query.filter_by(owner_id=app_id, owner_type='app', type='system').all()
  84. result = [x.to_json() for x in keys if not x.name.startswith('__')] # 过滤容器设置的值(双下划线开头)
  85. values = ConfigValue.query.filter(ConfigValue.key_id.in_([x['id'] for x in result])).all() if result else []
  86. for key in result:
  87. key['value'] = {}
  88. for val in values:
  89. if val.key_id == key['id']:
  90. key['value'][val.env_id] = val.value
  91. return json_response(result)
  92. @blueprint.route('/app/<int:app_id>', methods=['POST'])
  93. @require_permission('publish_app_ctr_edit')
  94. def post_app(app_id):
  95. form, error = JsonParser(args.name, 'desc', 'value').parse()
  96. if error is None:
  97. if ConfigKey.query.filter_by(owner_type='app', owner_id=app_id, type='system', name=form.name).first():
  98. return json_response(message='重复的变量名称!')
  99. values = form.pop('value')
  100. config_key = ConfigKey(owner_type='app', owner_id=app_id, type='system', **form).save()
  101. for k, v in values.items():
  102. ConfigValue(key_id=config_key.id, env_id=k, value=v).add()
  103. db.session.commit()
  104. return json_response(message=error)
  105. @blueprint.route('/app/<int:key_id>', methods=['PUT'])
  106. @require_permission('publish_app_ctr_edit')
  107. def put_app(key_id):
  108. form, error = JsonParser(args.name, 'desc', 'value').parse()
  109. if error is None:
  110. config_key = ConfigKey.query.get_or_404(key_id)
  111. owner = App.query.get_or_404(config_key.owner_id)
  112. exists_config = ConfigKey.query.filter_by(owner_type='app', owner_id=owner.id, type='system', name=form.name).first()
  113. if exists_config and exists_config.id != key_id:
  114. return json_response(message='重复的变量名称!')
  115. for env_id, value in form.pop('value').items():
  116. config_value = ConfigValue.query.filter_by(env_id=env_id, key_id=config_key.id).first()
  117. if config_value:
  118. config_value.update(value=value)
  119. else:
  120. ConfigValue(key_id=config_key.id, env_id=env_id, value=value).save()
  121. config_key.update(**form)
  122. return json_response(message=error)