project.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. # -*- coding: utf-8 -*-
  2. """
  3. walle-web
  4. :copyright: © 2015-2017 walle-web.io
  5. :created time: 2017-03-25 11:15:01
  6. :author: wushuiyong@walle-web.io
  7. """
  8. import json
  9. import os, shutil
  10. from flask import request, abort
  11. from walle.api.api import SecurityResource
  12. from walle.form.project import ProjectForm
  13. from walle.model.member import MemberModel
  14. from walle.model.project import ProjectModel
  15. from walle.service.extensions import permission
  16. from walle.service.rbac.role import *
  17. from walle.service.deployer import Deployer
  18. class ProjectAPI(SecurityResource):
  19. actions = ['members', 'copy', 'detection']
  20. @permission.upper_reporter
  21. def get(self, action=None, project_id=None):
  22. """
  23. fetch project list or one item
  24. /project/<int:project_id>
  25. :return:
  26. """
  27. super(ProjectAPI, self).get()
  28. return self.item(project_id) if project_id else self.list()
  29. def list(self):
  30. """
  31. fetch project list
  32. :return:
  33. """
  34. page = int(request.args.get('page', 0))
  35. page = page - 1 if page else 0
  36. size = int(request.args.get('size', 10))
  37. kw = request.values.get('kw', '')
  38. environment_id = request.values.get('environment_id', '')
  39. project_model = ProjectModel()
  40. project_list, count = project_model.list(page=page, size=size, kw=kw, environment_id=environment_id,
  41. space_id=self.space_id)
  42. return self.list_json(list=project_list, count=count,
  43. enable_create=permission.role_upper_master() and current_user.role != SUPER)
  44. def item(self, project_id):
  45. """
  46. 获取某个用户组
  47. :param id:
  48. :return:
  49. """
  50. project_model = ProjectModel(id=project_id)
  51. current_app.logger.info(project_id)
  52. project_info = project_model.item(id=project_id)
  53. current_app.logger.info(project_info)
  54. if not project_info:
  55. return self.render_json(code=-1)
  56. project_info['members'], count, project_info['user_uids'] = MemberModel().members(project_id=project_id)
  57. return self.render_json(data=project_info)
  58. @permission.upper_developer
  59. def post(self, action=None, project_id=None):
  60. """
  61. create a project
  62. /environment/
  63. :return:
  64. """
  65. super(ProjectAPI, self).post()
  66. if action is None:
  67. return self.create()
  68. if action in self.actions:
  69. self_action = getattr(self, action.lower(), None)
  70. return self_action(project_id)
  71. else:
  72. abort(404)
  73. def create(self):
  74. form = ProjectForm(request.form, csrf=False)
  75. if form.validate_on_submit():
  76. # add project
  77. project = ProjectModel()
  78. data = form.form2dict()
  79. project_new = project.add(data)
  80. if not project_new:
  81. return self.render_json(code=-1)
  82. return self.render_json(data=project_new)
  83. else:
  84. return self.render_error(code=Code.form_error, message=form.errors)
  85. @permission.upper_developer
  86. def put(self, project_id, action=None):
  87. """
  88. update project
  89. /project/<int:id>
  90. :return:
  91. """
  92. super(ProjectAPI, self).put()
  93. if action and action == 'members':
  94. return self.members(project_id, members=json.loads(request.data.decode('utf-8')))
  95. form = ProjectForm(request.form, csrf=False)
  96. form.set_id(project_id)
  97. if form.validate_on_submit():
  98. server = ProjectModel().get_by_id(project_id)
  99. repo_url_origin = server.repo_url
  100. data = form.form2dict()
  101. # a new type to update a model
  102. ret = server.update(data)
  103. # maybe sth changed by git
  104. if repo_url_origin != data['repo_url']:
  105. dir_codebase_project = current_app.config.get('CODE_BASE') + str(project_id)
  106. if os.path.exists(dir_codebase_project):
  107. shutil.rmtree(dir_codebase_project)
  108. return self.render_json(data=server.item())
  109. else:
  110. return self.render_error(code=Code.form_error, message=form.errors)
  111. @permission.upper_developer
  112. def delete(self, project_id):
  113. """
  114. remove an project
  115. /project/<int:id>
  116. :return:
  117. """
  118. super(ProjectAPI, self).delete()
  119. project_model = ProjectModel(id=project_id)
  120. project_model.remove(project_id)
  121. return self.render_json(message='')
  122. def members(self, project_id, members):
  123. """
  124. :param project_id:
  125. :param members:
  126. :return:
  127. """
  128. group_model = MemberModel(project_id=project_id)
  129. ret = group_model.update_project(project_id=project_id, members=members)
  130. item, count, user_ids = group_model.members()
  131. return self.render_json(data=item)
  132. def copy(self, project_id):
  133. """
  134. :param project_id:
  135. :return:
  136. """
  137. project = ProjectModel.get_by_id(project_id).to_dict()
  138. project['id'] = None
  139. project['name'] = project['name'] + '-copy'
  140. project_new = ProjectModel()
  141. project_new_info = project_new.add(dict(project))
  142. return self.render_json(data=project_new_info)
  143. def detection(self, project_id):
  144. """
  145. :param project_id:
  146. :return:
  147. """
  148. # walle LOCAL_SERVER_USER => walle user
  149. # show ssh_rsa.pub
  150. # LOCAL_SERVER_USER => git
  151. # LOCAL_SERVER_USER => target_servers
  152. # webroot is directory
  153. # remote release directory
  154. errors = Deployer(project_id=project_id).project_detection()
  155. message = ''
  156. if not errors:
  157. message = '配置检测通过,恭喜:)开始你的上线之旅吧'
  158. return self.render_json(data=errors, message=message)