websocket.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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. class WalleSocketIO(Namespace):
  15. namespace, room, app = None, None, None
  16. task_id, project_id = None, None
  17. task_info = None
  18. def __init__(self, namespace, room=None, app=None):
  19. super(WalleSocketIO, self).__init__(namespace=namespace)
  20. self.room = room
  21. self.app = app
  22. def init_app(self, app):
  23. self.app = app
  24. def on_connect(self):
  25. pass
  26. def on_open(self, message):
  27. current_app.logger.info(message)
  28. if 'task' in message:
  29. self.task_id = message['task']
  30. self.room = self.task_id
  31. if 'project_id' in message:
  32. self.project_id = message['project_id']
  33. self.room = self.project_id
  34. if not current_user.is_authenticated:
  35. emit('close', {'event': 'disconnect', 'data': {}}, room=self.room)
  36. join_room(room=self.room)
  37. self.task_info = TaskModel(id=self.room).item()
  38. emit('construct', {'event': 'connect', 'data': self.task_info}, room=self.room)
  39. def on_deploy(self, message):
  40. self.task_info = TaskModel(id=self.room).item()
  41. if self.task_info['status'] in [TaskModel.status_pass, TaskModel.status_fail]:
  42. wi = Deployer(task_id=self.room, console=True)
  43. ret = wi.walle_deploy()
  44. else:
  45. emit('console', {'event': 'forbidden', 'data': self.task_info}, room=self.room)
  46. def on_branches(self, message=None):
  47. wi = Deployer(project_id=self.room)
  48. try:
  49. branches = wi.list_branch()
  50. emit('branches', {'event': 'branches', 'data': branches}, room=self.room)
  51. except Exception as e:
  52. emit('branches', {'event': 'error', 'data': {'message': e.message}}, room=self.room)
  53. def on_tags(self, message=None):
  54. wi = Deployer(project_id=self.room)
  55. try:
  56. tags = wi.list_tag()
  57. emit('tags', {'event': 'tags', 'data': tags}, room=self.room)
  58. except Exception as e:
  59. emit('tags', {'event': 'error', 'data': {'message': e.message}}, room=self.room)
  60. def on_commits(self, message=None):
  61. wi = Deployer(project_id=self.room)
  62. if 'branch' not in message:
  63. emit('commits', {'event': 'error', 'data': {'message': 'invalid branch'}}, room=self.room)
  64. else:
  65. try:
  66. commits = wi.list_commit(message['branch'])
  67. emit('commits', {'event': 'commits', 'data': commits}, room=self.room)
  68. except Exception as e:
  69. emit('commits', {'event': 'error', 'data': {'message': e.message}}, room=self.room)
  70. def on_ping(self, message):
  71. current_app.logger.info(message)
  72. import time
  73. emit('pong',
  74. {'event': 'ping:pong', 'data': {'time': time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))}},
  75. room=self.room)
  76. def on_logs(self, message):
  77. current_app.logger.info(message)
  78. self.logs(task=self.room)
  79. def logs(self, task):
  80. emit('console', {'event': 'console', 'data': {'task': task}}, room=task)
  81. logs = RecordModel().fetch(task_id=task)
  82. for log in logs:
  83. log = RecordModel.logs(**log)
  84. emit('console', {'event': 'console', 'data': log}, room=self.room)