websocket.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. # -*- coding: utf-8 -*-
  2. """
  3. walle-web
  4. :copyright: © 2015-2019 walle-web.io
  5. :created time: 2018-09-06 20:20:33
  6. :author: wushuiyong@walle-web.io
  7. """
  8. from flask import current_app
  9. from flask_login import current_user, login_required
  10. from flask_socketio import emit, join_room, Namespace
  11. from walle.model.record import RecordModel
  12. from walle.model.task import TaskModel
  13. from walle.service.deployer import Deployer
  14. from walle.service.error import Code
  15. class WalleSocketIO(Namespace):
  16. namespace, room, app = None, None, None
  17. task_id, project_id = None, None
  18. task_info = None
  19. def __init__(self, namespace, room=None, app=None):
  20. super(WalleSocketIO, self).__init__(namespace=namespace)
  21. self.room = room
  22. self.app = app
  23. def init_app(self, app):
  24. self.app = app
  25. def on_open(self, message):
  26. current_app.logger.info(message)
  27. if 'task' in message:
  28. self.task_id = message['task']
  29. self.room = self.task_id
  30. if 'project_id' in message:
  31. self.project_id = message['project_id']
  32. self.room = self.project_id
  33. if not current_user.is_authenticated:
  34. emit('close', {'event': 'disconnect', 'data': {}}, room=self.room)
  35. join_room(room=self.room)
  36. self.task_info = TaskModel(id=self.room).item()
  37. emit('construct', {'event': 'connect', 'data': self.task_info}, room=self.room)
  38. def on_deploy(self, message):
  39. if self.task_info['status'] in [TaskModel.status_pass, TaskModel.status_fail]:
  40. wi = Deployer(task_id=self.room, console=True)
  41. if self.task_info['is_rollback']:
  42. wi.walle_rollback()
  43. else:
  44. wi.walle_deploy()
  45. else:
  46. emit('console', {'event': 'forbidden', 'data': self.task_info}, room=self.room)
  47. def on_branches(self, message=None):
  48. wi = Deployer(project_id=self.room)
  49. try:
  50. branches = wi.list_branch()
  51. emit('branches', {'event': 'branches', 'data': branches}, room=self.room)
  52. except Exception as e:
  53. emit('branches', {'event': 'error', 'data': {'message': e.message}}, room=self.room)
  54. def on_tags(self, message=None):
  55. wi = Deployer(project_id=self.room)
  56. try:
  57. tags = wi.list_tag()
  58. tags.reverse()
  59. emit('tags', {'event': 'tags', 'data': tags}, room=self.room)
  60. except Exception as e:
  61. emit('tags', {'event': 'error', 'data': {'message': e.message}}, room=self.room)
  62. def on_commits(self, message=None):
  63. wi = Deployer(project_id=self.room)
  64. if 'branch' not in message:
  65. emit('commits', {'event': 'error', 'data': {'message': 'invalid branch'}}, room=self.room)
  66. else:
  67. try:
  68. commits = wi.list_commit(message['branch'])
  69. emit('commits', {'event': 'commits', 'data': commits}, room=self.room)
  70. except Exception as e:
  71. emit('commits', {'event': 'error', 'data': {'message': e.message}}, room=self.room)
  72. def on_ping(self, message):
  73. current_app.logger.info(message)
  74. import time
  75. emit('pong',
  76. {'event': 'ping:pong', 'data': {'time': time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))}},
  77. room=self.room)
  78. def on_logs(self, message):
  79. current_app.logger.info(message)
  80. self.logs(task=self.room)
  81. def logs(self, task):
  82. task_info = TaskModel().get_by_id(self.task_id)
  83. if task_info.status not in [TaskModel.status_doing, TaskModel.status_success, TaskModel.status_fail]:
  84. emit('console', {'event': 'console', 'data': ''}, room=self.room)
  85. return True
  86. deployer = Deployer(task_id=self.room)
  87. for log in deployer.logs():
  88. log = RecordModel.logs(**log)
  89. if log['stage'] == RecordModel.stage_end:
  90. cmd = 'success' if log['status'] == RecordModel.status_success else 'fail'
  91. msg = log['host'] + ' 部署完成!' if log['status'] == RecordModel.status_success else log['host'] + Code.code_msg[Code.deploy_fail]
  92. emit(cmd, {'event': 'finish', 'data': {'host': log['host'], 'message': msg}}, room=self.room)
  93. else:
  94. emit('console', {'event': 'console', 'data': log}, room=self.room)
  95. deployer.end(success=task_info.status == TaskModel.status_success, update_status=False)