コード例 #1
0
 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
コード例 #2
0
    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)