Browse Source

fix task status with project's enable_audit

walle 6 years ago
parent
commit
a36342551e
5 changed files with 57 additions and 34 deletions
  1. 1 1
      walle/api/space.py
  2. 10 3
      walle/form/task.py
  3. 3 0
      walle/model/project.py
  4. 32 25
      walle/service/deployer.py
  5. 11 5
      walle/service/websocket.py

+ 1 - 1
walle/api/space.py

@@ -153,5 +153,5 @@ class SpaceAPI(SecurityResource):
         page = page - 1 if page else 0
         size = int(request.args.get('size', 10))
         kw = request.values.get('kw', '')
-        members, count = MemberModel(group_id=space_id).members_new(page=page, size=size, kw=kw)
+        members, count, user_ids = MemberModel(group_id=space_id).members(page=page, size=size, kw=kw)
         return self.list_json(list=members, count=count, enable_create=permission.enable_role(MASTER))

+ 10 - 3
walle/form/task.py

@@ -11,9 +11,11 @@ try:
 except ImportError:
     from flask_wtf import Form as FlaskForm  # Fallback to Flask-WTF v0.12 or older
 from flask_wtf import Form
-
+from flask import current_app
 from wtforms import TextField, IntegerField
 from wtforms import validators
+from walle.model.project import ProjectModel
+from walle.model.task import TaskModel
 
 
 class TaskForm(Form):
@@ -34,14 +36,19 @@ class TaskForm(Form):
         self.id = id
 
     def form2dict(self):
+        project_info = ProjectModel(id=self.project_id.data).item()
+        task_status = TaskModel.status_new if project_info['enable_audit'] == ProjectModel.enable_audit_true else TaskModel.status_pass
+        current_app.logger.info(project_info)
+        current_app.logger.info(project_info['enable_audit'])
+        current_app.logger.info(task_status)
         return {
             'name': self.name.data if self.name.data else '',
             # todo
             'user_id': 1,
-            'project_id': self.project_id.data if self.project_id.data else '',
+            'project_id': self.project_id.data,
             # todo default value
             'action': 0,
-            'status': self.status.data if self.status.data else 0,
+            'status': task_status,
             'link_id': '',
             'ex_link_id': '',
             'servers': self.servers.data if self.servers.data else '',

+ 3 - 0
walle/model/project.py

@@ -24,6 +24,9 @@ class ProjectModel(SurrogatePK, Model):
     status_close = 0
     status_open = 1
 
+    enable_audit_true = 1
+    enable_audit_false = 0
+
     # 表的结构:
     id = db.Column(Integer, primary_key=True, autoincrement=True)
     user_id = db.Column(Integer)

+ 32 - 25
walle/service/deployer.py

@@ -67,8 +67,7 @@ class Deployer:
         if task_id:
             self.task_id = task_id
             # task start
-            TaskModel(id=self.task_id).update(status=TaskModel.status_doing)
-
+            current_app.logger.info(self.task_id)
             self.taskMdl = TaskModel().item(self.task_id)
             self.user_id = self.taskMdl.get('user_id')
             self.servers = self.taskMdl.get('servers_info')
@@ -88,6 +87,10 @@ class Deployer:
     def config(self):
         return {'task_id': self.task_id, 'user_id': self.user_id, 'stage': self.stage, 'sequence': self.sequence, 'console': self.console}
 
+    def start(self):
+        TaskModel().get_by_id(self.task_id).update({'status': TaskModel.status_doing})
+        self.taskMdl = TaskModel().item(self.task_id)
+
     # ===================== fabric ================
     # SocketHandler
     def prev_deploy(self):
@@ -106,9 +109,6 @@ class Deployer:
         self.stage = self.stage_prev_deploy
         self.sequence = 1
 
-        # TODO remove
-        # result = self.local.run('sleep 30', wenv=self.config())
-
         # 检查 当前用户
         command = 'whoami'
         current_app.logger.info(command)
@@ -406,30 +406,37 @@ class Deployer:
 
                 result = self.local.run(command, wenv=self.config())
 
+    def end(self, success=True):
+        status = TaskModel.status_success if success else TaskModel.status_fail
+        TaskModel().get_by_id(self.task_id).update({'status': status})
 
     def walle_deploy(self):
+        self.start()
         self.prev_deploy()
         self.deploy()
         self.post_deploy()
 
-        server = '172.16.0.231'
-        try:
-            self.connections[server] = Waller(host=server, user=self.project_info['target_user'])
-            self.prev_release(self.connections[server])
-            self.release(self.connections[server])
-            self.post_release(self.connections[server])
-        except Exception as e:
-            current_app.logger.exception(e)
-            self.errors[server] = e.message
-
-        # for server_info in self.servers:
-        #     server = server_info.host
-        #     try:
-        #         self.connections[server] = Waller(host=server, user=self.project_info['target_user'])
-        #         self.prev_release(self.connections[server])
-        #         self.release(self.connections[server])
-        #         self.post_release(self.connections[server])
-        #     except Exception, e:
-        #         self.errors[server] = e.message
-
+        # server = '172.16.0.231'
+        # try:
+        #     self.connections[server] = Waller(host=server, user=self.project_info['target_user'])
+        #     self.prev_release(self.connections[server])
+        #     self.release(self.connections[server])
+        #     self.post_release(self.connections[server])
+        # except Exception as e:
+        #     current_app.logger.exception(e)
+        #     self.errors[server] = e.message
+
+        all_servers_success = True
+        for server_info in self.servers:
+            server = server_info.host
+            try:
+                self.connections[server] = Waller(host=server, user=self.project_info['target_user'])
+                self.prev_release(self.connections[server])
+                self.release(self.connections[server])
+                self.post_release(self.connections[server])
+            except Exception, e:
+                all_servers_success = False
+                self.errors[server] = e.message
+
+        self.end(all_servers_success)
         return {'success': self.success, 'errors': self.errors}

+ 11 - 5
walle/service/websocket.py

@@ -16,6 +16,8 @@ from walle.model.task import TaskModel
 class WalleSocketIO(Namespace):
     namespace, room, app = None, None, None
 
+    task_info = None
+
     def __init__(self, namespace, room=None, app=None):
         super(WalleSocketIO, self).__init__(namespace=namespace)
         self.room = room
@@ -34,14 +36,18 @@ class WalleSocketIO(Namespace):
             emit('close', {'event': 'pusher:disconnect', 'data': {}}, room=self.room)
         join_room(room=self.room)
 
-        task_info = TaskModel(id=self.room).item()
-        emit('construct', {'event': 'pusher:connect', 'data': task_info}, room=self.room)
+        self.task_info = TaskModel(id=self.room).item()
+        emit('construct', {'event': 'pusher:connect', 'data': self.task_info}, room=self.room)
 
     def on_deploy(self, message):
         emit('console', {'event': 'task:console', 'data': {}}, room=self.room)
         from walle.service.deployer import Deployer
-        wi = Deployer(task_id=self.room)
-        ret = wi.walle_deploy()
+        self.task_info = TaskModel(id=self.room).item()
+        if self.task_info['status'] in [TaskModel.status_pass, TaskModel.status_fail]:
+            wi = Deployer(task_id=self.room)
+            ret = wi.walle_deploy()
+        else:
+            emit('console', {'event': 'task:forbidden', 'data': self.task_info}, room=self.room)
 
     def on_logs(self, message):
         current_app.logger.info(message)
@@ -52,4 +58,4 @@ class WalleSocketIO(Namespace):
         logs = RecordModel().fetch(task_id=task)
         for log in logs:
             log = RecordModel.logs(**log)
-            emit('console', {'event': 'task:console', 'data': log}, room=task)
+            emit('console', {'event': 'task:console', 'data': log}, room=self.room)