def create_share_info(self, share_record, share_team, share_user, share_info): # 开启事务 sid = transaction.savepoint() try: # 删除历史数据 ServiceShareRecordEvent.objects.filter( record_id=share_record.ID).delete() RainbondCenterApp.objects.filter( record_id=share_record.ID).delete() app_templete = {} # 处理基本信息 try: app_templete["template_version"] = "v2" group_info = share_info["share_group_info"] app_templete["group_key"] = group_info["group_key"] app_templete["group_name"] = group_info["group_name"] app_templete["group_version"] = group_info["version"] except Exception as e: if sid: transaction.savepoint_rollback(sid) logger.exception(e) return 500, "基本信息处理错误", None # 处理插件相关,v3.5暂时不实现 try: # 确定分享的插件ID share_plugin_ids = {} plugins = share_info.get("share_plugin_list", None) if plugins: share_plugins = list() for plugin in plugins: version = plugin.get("build_version", "") plugin_id = plugin.get("plugin_id", "") if version and plugin_id: # 只有自己创建的插件需要分享出去 if plugin["origin"] == "source_code" and plugin[ "is_share"]: plugin_version = plugin_repo.get_plugin_buildversion( plugin_id, version) if plugin_version and plugin_version.plugin_version_status != "fixed": plugin_version.plugin_version_status = "fixed" plugin_version.save() plugin["config_groups"] = [ group.to_dict() for group in plugin_repo.get_plugin_config_groups( plugin_id, version) ] plugin["config_items"] = [ item.to_dict() for item in plugin_repo.get_plugin_config_items( plugin_id, version) ] plugin["version"] = plugin_version.to_dict() # TODO: 插件应该单独分享,此处暂时不处理,分享到应用内部 share_plugin_ids[plugin_id] = True share_plugins.append(plugin) app_templete["plugins"] = share_plugins except Exception as e: if sid: transaction.savepoint_rollback(sid) logger.exception(e) return 500, "插件处理发生错误", None # 处理应用相关 try: services = share_info["share_service_list"] if services: new_services = list() for service in services: image = service["image"] # 源码应用 if image.startswith("goodrain.me/runner") and service[ "language"] != "dockerfile": service[ 'service_slug'] = app_store.get_slug_connection_info( group_info["scope"], share_team.tenant_name) if not service['service_slug']: if sid: transaction.savepoint_rollback(sid) return 400, "获取源码包上传地址错误", None else: service[ "service_image"] = app_store.get_image_connection_info( group_info["scope"], share_team.tenant_name) if not service["service_image"]: if sid: transaction.savepoint_rollback(sid) return 400, "获取镜像上传地址错误", None if service.get("need_share", None): ssre = ServiceShareRecordEvent( team_id=share_team.tenant_id, service_key=service["service_key"], service_id=service["service_id"], service_name=service["service_cname"], service_alias=service["service_alias"], record_id=share_record.ID, team_name=share_team.tenant_name, event_status="not_start") ssre.save() new_services.append(service) # TODO:处理应用继承关系RainbondCenterAppInherit app_templete["apps"] = new_services else: if sid: transaction.savepoint_rollback(sid) return 400, "分享的应用信息不能为空", None except Exception as e: if sid: transaction.savepoint_rollback(sid) logger.exception(e) return 500, "应用信息处理发生错误", None # 删除同个应用组分享的相同版本 RainbondCenterApp.objects.filter( version=group_info["version"], tenant_service_group_id=share_record.group_id).delete() # 新增加 app = RainbondCenterApp( group_key=app_templete["group_key"], group_name=app_templete["group_name"], share_user=share_user.user_id, share_team=share_team.tenant_name, tenant_service_group_id=share_record.group_id, pic=group_info.get("pic", ""), source="local", record_id=share_record.ID, version=group_info["version"], enterprise_id=share_team.enterprise_id, scope=group_info["scope"], describe=group_info["describe"], app_template=json.dumps(app_templete)) app.save() share_record.step = 2 share_record.update_time = datetime.datetime.now() share_record.save() # 提交事务 if sid: transaction.savepoint_commit(sid) return 200, "分享信息处理成功", share_record.to_dict() except Exception as e: logger.exception(e) if sid: transaction.savepoint_rollback(sid) return 500, "应用分享处理发生错误", None
def get(self, request, team_name, share_id, *args, **kwargs): """ 查询分享的插件信息 --- parameter: - name: team_name description: 团队名 required: true type: string paramType: path - name: share_id description: 分享记录ID required: true type: string paramType: path """ team_id = self.team.tenant_id try: share_record = share_service.get_service_share_record_by_ID( ID=share_id, team_name=team_name) if not share_record: result = general_message(404, "share record not found", "分享流程不存在,请退出重试") return Response(result, status=404) if share_record.is_success or share_record.step >= 3: result = general_message(400, "share record is complete", "分享流程已经完成,请重新进行分享") return Response(result, status=400) share_plugin_info = dict() share_plugin = share_repo.get_share_plugin(share_record.group_id) if share_plugin: plugin_id = share_plugin.plugin_id share_plugin_info = share_plugin.to_dict() share_plugin_info["is_shared"] = True share_plugin_info.pop("update_time") else: plugin = plugin_repo.get_plugin_by_plugin_id( team_id, share_record.group_id) if not plugin: result = general_message(404, msg="plugin not exist", msg_show="插件不存在") return Response(result, status=400) plugin_id = plugin.plugin_id share_plugin_info["category"] = plugin.category share_plugin_info["plugin_key"] = make_uuid() share_plugin_info["plugin_id"] = plugin_id share_plugin_info["plugin_name"] = plugin.plugin_alias share_plugin_info["version"] = "1.0" share_plugin_info["desc"] = "This is a default description." share_plugin_info["scope"] = "team" share_plugin_info["share_id"] = share_record.group_id share_plugin_info["pic"] = "" share_plugin_info["share_user"] = str(self.user.user_id) share_plugin_info["share_team"] = team_name share_plugin_info["is_shared"] = False plugin_version = plugin_svc.get_tenant_plugin_newest_versions( self.response_region, self.tenant, plugin_id) share_plugin_info["build_version"] = plugin_version[ 0].build_version config_groups = [] for group in plugin_repo.get_plugin_config_groups( plugin_id, plugin_version[0].build_version): group_map = group.to_dict() items = plugin_svc.get_config_items_by_id_metadata_and_version( group.plugin_id, group.build_version, group.service_meta_type) config_items = [] for item in items: config_items.append(item.to_dict()) group_map['config_items'] = config_items config_groups.append(group_map) share_plugin_info["config_groups"] = config_groups return Response( general_message(200, "", "", bean={'share_plugin_info': share_plugin_info}), 200) except Exception as e: logger.exception(e) result = error_message(e.message) return Response(result, status=500)