Forráskód Böngészése

Merge pull request #6 from meolu/master

sync master
flying 6 éve
szülő
commit
5cbe1f6e61

+ 7 - 3
README.md

@@ -2,7 +2,10 @@
 
 Walle 2.0 - [官方主页](https://www.walle-web.io)
 =========================
-[![Build Status](https://travis-ci.org/meolu/walle-web.svg?branch=master)](https://travis-ci.org/meolu/walle-web)
+<p align="left">
+    <a href='https://travis-ci.org/meolu/walle-web'><img src='https://travis-ci.org/meolu/walle-web.svg?branch=master' alt="Build Status"></a>  
+    <a href='https://gitter.im/meolu/walle-web'><img src='https://badges.gitter.im/Join%20Chat.svg'></a>
+</p>
 
 功能强大,且免费开源的`walle-web 瓦力`终于更新`2.0.0`了!!!
 
@@ -63,8 +66,7 @@ Roadmap
 - **2.1.0**  2019-03-22
     - 超管权限完善
     - `Dashboard` 1.0(全新的玩法,欢迎提issue)
-    - 3月24日开源中国苏州源创会-[开源综合技术主题](https://www.oschina.net/event/2303765)《开源构建多空间可视化一键部署Devops平台》
-    - 冲刺`github` 10000 `star`(靠你们和你们的同事们了)
+    - ~~3月24日开源中国苏州源创会-[开源综合技术主题](https://www.oschina.net/event/2303765)《开源构建多空间可视化一键部署Devops平台》~~
 - **2.2.0**  2019-04-22
     - webhook (gitlab)
     - 上线时间记录、命令与结果拆分、实时console
@@ -105,6 +107,8 @@ Discussing
 
 <img src="https://raw.githubusercontent.com/meolu/walle-web/master/screenshot/weixin-xupengfei.jpg" width="244" height="314" alt="Flying 微信" align=left />
 
+<img src="https://raw.githubusercontent.com/meolu/walle-web/master/screenshot/weixin-jiangyongping.jpg" width="244" height="314" alt="小平 微信" align=left />
+
 <br><br><br><br><br><br><br><br><br><br><br><br><br>
 <br><br><br><br><br><br><br><br><br><br><br><br><br>
 

BIN
screenshot/weixin-jiangyongping.jpg


+ 12 - 6
walle/api/space.py

@@ -125,16 +125,22 @@ class SpaceAPI(SecurityResource):
             space = SpaceModel().get_by_id(space_id)
             data = form.form2dict()
             current_app.logger.info(data)
-
+            member_model = MemberModel(group_id=space_id)
+            old_owner = space.user_id
+            new_owner = data['user_id']
             # a new type to update a model
-            ret = space.update(data)
+            space.update(data)
+
+            if str(old_owner) != str(new_owner):
+                # owner has changed
+                member_model.change_owner(old_owner, new_owner)
+
             # create group
-            member = {"user_id": data['user_id'], "role": OWNER}
-            members = []
+            current_owner = {"user_id": new_owner, "role": OWNER}
             if 'members' in request.form:
                 members = json.loads(request.form['members'])
-                members.append(member)
-                MemberModel(group_id=space_id).update_group(members=members)
+                members.append(current_owner)
+                member_model.update_group(members=members)
             return self.render_json(data=space.item())
         else:
             return self.render_error(code=Code.form_error, message=form.errors)

+ 4 - 1
walle/api/task.py

@@ -39,7 +39,10 @@ class TaskAPI(SecurityResource):
         size = int(request.args.get('size', 10))
         kw = request.values.get('kw', '')
 
-        task_list, count = TaskModel().list(page=page, size=size, kw=kw, space_id=self.space_id)
+        user_id = request.values.get('user_id', '')
+        user_id = user_id.split(',') if user_id else []
+
+        task_list, count = TaskModel().list(page=page, size=size, kw=kw, space_id=self.space_id, user_id=user_id)
         return self.list_json(list=task_list, count=count, enable_create=permission.role_upper_reporter() and current_user.role != SUPER)
 
     def item(self, task_id):

+ 23 - 0
walle/model/member.py

@@ -141,6 +141,29 @@ class MemberModel(SurrogatePK, Model):
 
         return ret
 
+    def change_owner(self, old_owner_id, new_owner_id):
+        # change owner for space
+        if not new_owner_id or str(new_owner_id) == str(old_owner_id):
+            return
+
+        filters = {
+            MemberModel.source_id == self.group_id,
+            MemberModel.source_type == self.source_type_group,
+            MemberModel.user_id.in_([old_owner_id, new_owner_id])
+        }
+        MemberModel.query.filter(*filters).delete(synchronize_session=False)
+
+        update = {
+            'user_id': new_owner_id,
+            'source_id': self.group_id,
+            'source_type': self.source_type_group,
+            'access_level': OWNER,
+            'status': self.status_available,
+        }
+        m = MemberModel(**update)
+        db.session.add(m)
+        db.session.commit()
+
     def update_project(self, project_id, members, group_name=None):
         space_info = model.project.ProjectModel.query.filter_by(id=project_id).first().to_json()
         space_members, count, user_ids = self.members(group_id=space_info['space_id'], size=-1)

+ 4 - 1
walle/model/task.py

@@ -73,7 +73,7 @@ class TaskModel(SurrogatePK, Model):
     #     return dict(project_info, **self.taskMdl)
     #
 
-    def list(self, page=0, size=10, space_id=None, kw=None):
+    def list(self, page=0, size=10, space_id=None, user_id=None, kw=None):
         """
         获取分页列表
         :param page:
@@ -99,6 +99,9 @@ class TaskModel(SurrogatePK, Model):
         if space_id:
             query = query.filter(ProjectModel.space_id == space_id)
 
+        if user_id:
+            query = query.filter(TaskModel.user_id.in_(user_id))
+
         query = query.add_columns(ProjectModel.name, EnvironmentModel.name, ProjectModel.keep_version_num)
         count = query.count()
 

+ 14 - 14
walle/service/deployer.py

@@ -72,11 +72,12 @@ class Deployer:
             self.project_info = self.taskMdl.get('project_info')
 
             # copy to a local version
-            self.release_version = '{project_id}_{task_id}_{timestamp}'.format(
-                project_id=self.project_info['id'],
-                task_id=self.task_id,
-                timestamp=time.strftime('%Y%m%d_%H%M%S', time.localtime(time.time())),
-            )
+            self.release_version = self.taskMdl.get('link_id') if (self.taskMdl.get("is_rollback")) else \
+                '{project_id}_{task_id}_{timestamp}'.format(
+                    project_id=self.project_info['id'],
+                    task_id=self.task_id,
+                    timestamp=time.strftime('%Y%m%d_%H%M%S', time.localtime(time.time())),
+                )
             current_app.logger.info(self.taskMdl)
 
             # 将环境变量包在 "" 里,防止特殊字符报错
@@ -491,10 +492,10 @@ class Deployer:
                     waller = Waller(host=host, user=server_info['user'], port=server_info['port'], inline_ssh_env=True)
                     waller.init_env(env=self.custom_global_env)
 
-                    self.connections[host] = waller
-                    self.prev_release(self.connections[host])
-                    self.release(self.connections[host])
-                    self.post_release(self.connections[host])
+                    self.connections[self.task_id] = waller
+                    self.prev_release(self.connections[self.task_id])
+                    self.release(self.connections[self.task_id])
+                    self.post_release(self.connections[self.task_id])
                     RecordModel().save_record(stage=RecordModel.stage_end, sequence=0, user_id=current_user.id,
                                               task_id=self.task_id, status=RecordModel.status_success, host=host,
                                               user=server_info['user'], command='')
@@ -519,17 +520,16 @@ class Deployer:
 
         try:
             is_all_servers_success = True
-            self.release_version = self.taskMdl.get('link_id')
             for server_info in self.servers:
                 host = server_info['host']
                 try:
                     waller = Waller(host=host, user=server_info['user'], port=server_info['port'], inline_ssh_env=True)
                     waller.init_env(env=self.custom_global_env)
 
-                    self.connections[host] = waller
-                    self.prev_release_custom(self.connections[host])
-                    self.release(self.connections[host])
-                    self.post_release(self.connections[host])
+                    self.connections[self.task_id] = waller
+                    self.prev_release_custom(self.connections[self.task_id])
+                    self.release(self.connections[self.task_id])
+                    self.post_release(self.connections[self.task_id])
                     RecordModel().save_record(stage=RecordModel.stage_end, sequence=0, user_id=current_user.id,
                                               task_id=self.task_id, status=RecordModel.status_success, host=host,
                                               user=server_info['user'], command='')