websocket.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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
  10. from flask_socketio import emit, join_room, Namespace
  11. from walle.model.record import RecordModel
  12. from walle.model.task import TaskModel
  13. class WalleSocketIO(Namespace):
  14. namespace, room, app = None, None, None
  15. task_info = None
  16. def __init__(self, namespace, room=None, app=None):
  17. super(WalleSocketIO, self).__init__(namespace=namespace)
  18. self.room = room
  19. self.app = app
  20. def init_app(self, app):
  21. self.app = app
  22. def on_connect(self):
  23. pass
  24. def on_open(self, message):
  25. current_app.logger.info(message)
  26. self.room = message['task']
  27. if not current_user.is_authenticated:
  28. emit('close', {'event': 'pusher:disconnect', 'data': {}}, room=self.room)
  29. join_room(room=self.room)
  30. self.task_info = TaskModel(id=self.room).item()
  31. emit('construct', {'event': 'pusher:connect', 'data': self.task_info}, room=self.room)
  32. def on_deploy(self, message):
  33. emit('console', {'event': 'task:console', 'data': {}}, room=self.room)
  34. from walle.service.deployer import Deployer
  35. self.task_info = TaskModel(id=self.room).item()
  36. if self.task_info['status'] in [TaskModel.status_pass, TaskModel.status_fail]:
  37. wi = Deployer(task_id=self.room)
  38. ret = wi.walle_deploy()
  39. else:
  40. emit('console', {'event': 'task:forbidden', 'data': self.task_info}, room=self.room)
  41. def on_logs(self, message):
  42. current_app.logger.info(message)
  43. self.logs(task=self.room)
  44. def logs(self, task):
  45. emit('console', {'event': 'task:console', 'data': {'task': task}}, room=task)
  46. logs = RecordModel().fetch(task_id=task)
  47. for log in logs:
  48. log = RecordModel.logs(**log)
  49. emit('console', {'event': 'task:console', 'data': log}, room=self.room)