def check_the_same_plugin(self, plugin_id, tenant_id, service_id):
        plugin_ids = []
        categories = []
        service_plugins = app_plugin_relation_repo.get_service_plugin_relation_by_service_id(
            service_id)
        if not service_plugins:
            """ component has not installed plugin"""
            return
        """ filter the same category plugin"""
        for i in service_plugins:
            plugin_ids.append(i.plugin_id)
        plugins = plugin_repo.get_plugin_by_plugin_ids(plugin_ids)
        for i in plugins:
            categories.append(i.category)

        # the trend to install plugin
        plugin_info = plugin_repo.get_plugin_by_plugin_id(tenant_id, plugin_id)

        category_info = plugin_info.category.split(":")
        if category_info[0] == "net-plugin":
            if plugin_info.category in categories:
                raise has_the_same_category_plugin
            if category_info[1] == "in-and-out" and (
                    "net-plugin:up" in categories
                    or "net-plugin:down" in categories):
                raise has_the_same_category_plugin
Exemple #2
0
 def get_plugin_by_plugin_id(self, tenant, plugin):
     plugin = plugin_repo.get_plugin_by_plugin_id(tenant.tenant_id,
                                                  plugin.plugin_id)
     if plugin:
         return 200, plugin
     else:
         return 404, None
    def post(self, request, team_name, plugin_id, *args, **kwargs):
        """
        创建分享插件记录
        ---
        parameter:
            - name: team_name
              description: 团队名
              required: true
              type: string
              paramType: path
            - name: plugin_id
              description: 插件id
              required: true
              type: string
              paramType: path
            - name: build_version
              description: 构建版本
              required: true
              type: string
              paramType: path
        """
        team_id = self.team.tenant_id

        plugin = plugin_repo.get_plugin_by_plugin_id(team_id, plugin_id)
        if not plugin:
            return Response(general_message(404, 'plugin not exist', '插件不存在'))

        share_record = share_service.get_service_share_record_by_group_id(
            plugin_id)
        if share_record:
            if not share_record.is_success and share_record.step < 3:
                result = general_message(20021,
                                         "share not complete",
                                         "有分享流程未完成",
                                         bean=share_record.to_dict())
                return Response(result, status=200)

        status, msg, msg_show = market_plugin_service.check_plugin_share_condition(
            self.team, plugin_id, self.response_region)
        if status != 200:
            return Response(general_message(status, msg, msg_show),
                            status=status)

        record = {
            "group_share_id": make_uuid(),
            "group_id": plugin_id,
            "team_name": team_name,
            "is_success": False,
            "step": 1,
        }
        service_share_record = share_service.create_service_share_record(
            **record)
        result = general_message(200,
                                 "create success",
                                 "创建成功",
                                 bean=service_share_record.to_dict())
        return Response(result, status=200)
Exemple #4
0
    def check_plugin_share_condition(self, tenant, plugin_id, region_name):
        plugin = plugin_repo.get_plugin_by_plugin_id(tenant.tenant_id, plugin_id)
        if not plugin:
            return 404, 'plugin not exist', '插件不存在'

        if plugin.origin in ['market', 'local_market']:
            return 400, 'plugin from market', '插件来源于市场,无法分享'

        build_info = plugin_svc.get_tenant_plugin_newest_versions(region_name, tenant, plugin_id)
        if not build_info:
            return 400, 'plugin not build', '插件未构建'

        if build_info[0].build_status != 'build_success':
            return 400, 'plugin not build success', '插件未构建成功,无法分享'
        return 200, 'plugin can share', ''
 def check_the_same_plugin(self, plugin_id, tenant_id, service_id):
     print plugin_id, tenant_id, service_id
     plugin_list = []
     categories = []
     flag = False
     service_plugins = app_plugin_relation_repo.get_service_plugin_relation_by_service_id(
         service_id)
     plugin_info = plugin_repo.get_plugin_by_plugin_id(tenant_id, plugin_id)
     print service_plugins
     if len(service_plugins) != 0:
         for i in service_plugins:
             plugin_list.append(i.plugin_id)
         plugins = plugin_repo.get_plugin_by_plugin_ids(plugin_list)
         for i in plugins:
             categories.append(i.category)
     print plugin_info.category
     if plugin_info.category.split(
             ":")[0] == "net-plugin" and plugin_info.category in categories:
         flag = True
     if plugin_info.category == "net-plugin:in-and-out" and (
             "net-plugin:up" in categories
             or "net-plugin:down" in categories):
         flag = True
     return flag
    def create_plugin_share_info(self, share_record, share_info, user_id,
                                 tenant, region_name):
        tenant_id = tenant.tenant_id
        tenant_name = tenant.tenant_name

        sid = transaction.savepoint()

        try:
            PluginShareRecordEvent.objects.filter(
                record_id=share_record.ID).delete()
            RainbondCenterPlugin.objects.filter(
                record_id=share_record.ID).delete()

            plugin_info = share_info.get("share_plugin_info")
            if isinstance(plugin_info, unicode):
                plugin_info = json.loads(plugin_info)

            if plugin_info.get('scope') == 'goodrain':
                ent = enterprise_repo.get_enterprise_by_enterprise_id(
                    tenant.enterprise_id)
                if ent and not ent.is_active:
                    return 10407, "用户未跟云市认证", None

            plugin_id = plugin_info.get("plugin_id")

            plugin_version = plugin_svc.get_tenant_plugin_newest_versions(
                region_name, tenant, plugin_id)

            if not plugin_version or plugin_version[
                    0].build_status != "build_success":
                return 400, "插件未构建", None

            plugin_version = plugin_version.first()

            tenant_plugin = plugin_repo.get_plugin_by_plugin_id(
                tenant_id, plugin_id)

            plugin_template = {
                "plugin_id": plugin_info.get("plugin_id"),
                "plugin_key": plugin_info.get("plugin_key"),
                "plugin_name": plugin_info.get("plugin_name"),
                "plugin_version": plugin_info.get("version"),
                "code_repo": tenant_plugin.code_repo,
                "build_source": tenant_plugin.build_source,
                "image": tenant_plugin.image,
                "category": tenant_plugin.category
            }

            if plugin_version.plugin_version_status != "fixed":
                plugin_version.plugin_version_status = "fixed"
                plugin_version.save()

            plugin_template["build_version"] = plugin_version.to_dict()

            plugin_info["plugin_image"] = app_store.get_image_connection_info(
                plugin_info["scope"], tenant_name)
            if not plugin_info["plugin_image"]:
                if sid:
                    transaction.savepoint_rollback(sid)
                return 400, "获取镜像上传地址错误", None

            event = PluginShareRecordEvent(
                record_id=share_record.ID,
                team_name=tenant_name,
                team_id=tenant_id,
                plugin_id=plugin_info['plugin_id'],
                plugin_name=plugin_info['plugin_name'],
                event_status='not_start')
            event.save()

            RainbondCenterPlugin.objects.filter(
                version=plugin_info["version"],
                plugin_id=share_record.group_id).delete()

            plugin_info["source"] = "local"
            plugin_info["record_id"] = share_record.ID

            plugin_template['share_plugin_info'] = plugin_info

            plugin = RainbondCenterPlugin(
                plugin_key=plugin_info.get("plugin_key"),
                plugin_name=plugin_info.get("plugin_name"),
                plugin_id=plugin_info.get("plugin_id"),
                record_id=share_record.ID,
                version=plugin_info.get("version"),
                build_version=plugin_info.get('build_version'),
                pic=plugin_info.get("pic", ""),
                scope=plugin_info.get("scope"),
                source="local",
                share_user=user_id,
                share_team=tenant_name,
                desc=plugin_info.get("desc"),
                enterprise_id=tenant.enterprise_id,
                plugin_template=json.dumps(plugin_template),
                category=plugin_info.get('category'))

            plugin.save()

            share_record.step = 2
            share_record.update_time = datetime.now()
            share_record.save()

            transaction.savepoint_commit(sid)

            return 200, "分享信息处理成功", plugin.to_dict()
        except Exception as e:
            logger.exception(e)
            if sid:
                transaction.savepoint_rollback(sid)
            return 500, "插件分享处理发生错误", None
 def get_plugin_by_plugin_id(self, tenant, plugin_id):
     return plugin_repo.get_plugin_by_plugin_id(tenant.tenant_id, plugin_id)
    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)