Exemplo n.º 1
0
    def __install_plugin(self, region_name, user, tenant, plugin_template):
        image = None
        image_tag = None
        if plugin_template["share_image"]:
            image_and_tag = plugin_template["share_image"].rsplit(":", 1)
            if len(image_and_tag) > 1:
                image = image_and_tag[0]
                image_tag = image_and_tag[1]
            else:
                image = image_and_tag[0]
                image_tag = "latest"

        status, msg, plugin_base_info = plugin_service.create_tenant_plugin(
            tenant, user.user_id, region_name, plugin_template["desc"],
            plugin_template["plugin_alias"], plugin_template["category"],
            "image", image, plugin_template["code_repo"])
        if status != 200:
            return status, msg

        plugin_base_info.origin = 'local_market'
        plugin_base_info.origin_share_id = plugin_template.get("plugin_key")
        plugin_base_info.save()

        build_version = plugin_template.get('build_version')
        min_memory = plugin_template.get('min_memory', 128)

        plugin_build_version = plugin_version_service.create_build_version(
            region_name,
            plugin_base_info.plugin_id,
            tenant.tenant_id,
            user.user_id,
            "",
            "unbuild",
            min_memory,
            image_tag=image_tag,
            code_version="",
            build_version=build_version)

        share_config_groups = plugin_template.get('config_groups', [])

        plugin_config_service.create_config_groups(plugin_base_info.plugin_id,
                                                   build_version,
                                                   share_config_groups)

        event_id = make_uuid()
        plugin_build_version.event_id = event_id
        plugin_build_version.plugin_version_status = "fixed"

        plugin_service.create_region_plugin(region_name,
                                            tenant,
                                            plugin_base_info,
                                            image_tag=image_tag)

        ret = plugin_service.build_plugin(
            region_name, plugin_base_info, plugin_build_version, user, tenant,
            event_id, plugin_template.get("plugin_image", None))
        plugin_build_version.build_status = ret.get('bean').get('status')
        plugin_build_version.save()
        return 200, "success"
    def install_plugin(self, user, tenant, region_name, market_plugin):
        plugin_template = json.loads(market_plugin.plugin_template)
        share_plugin_info = plugin_template.get("share_plugin_info")

        sid = transaction.savepoint()

        try:
            image = None
            image_tag = None
            if plugin_template["share_image"]:
                image_and_tag = plugin_template["share_image"].rsplit(":", 1)
                if len(image_and_tag) > 1:
                    image = image_and_tag[0]
                    image_tag = image_and_tag[1]
                else:
                    image = image_and_tag[0]
                    image_tag = "latest"

            status, msg, plugin_base_info = plugin_service.create_tenant_plugin(
                tenant, user.user_id, region_name,
                share_plugin_info.get("desc"), plugin_template["plugin_name"],
                plugin_template["category"], "image", image,
                plugin_template["code_repo"])

            if status != 200:
                return status, msg

            plugin_base_info.origin = 'local_market' if market_plugin.source == 'local' else market_plugin.source
            plugin_base_info.origin_share_id = share_plugin_info.get(
                "plugin_key")
            plugin_base_info.save()

            build_version = plugin_template.get('build_version')
            min_memory = build_version.get('min_memory')

            plugin_build_version = plugin_version_service.create_build_version(
                region_name,
                plugin_base_info.plugin_id,
                tenant.tenant_id,
                user.user_id,
                "",
                "unbuild",
                min_memory,
                image_tag=image_tag,
                code_version="")

            config_groups, config_items = [], []
            share_config_groups = share_plugin_info.get('config_groups', [])

            for group in share_config_groups:
                plugin_config_group = PluginConfigGroup(
                    plugin_id=plugin_base_info.plugin_id,
                    build_version=plugin_build_version.build_version,
                    config_name=group.get("config_name"),
                    service_meta_type=group.get("service_meta_type"),
                    injection=group.get("injection"))
                config_groups.append(plugin_config_group)

                share_config_items = group.get('config_items', [])
                for item in share_config_items:
                    plugin_config_item = PluginConfigItems(
                        plugin_id=plugin_base_info.plugin_id,
                        build_version=plugin_build_version.build_version,
                        service_meta_type=item.get("service_meta_type"),
                        attr_name=item.get("attr_name"),
                        attr_alt_value=item.get("attr_alt_value"),
                        attr_type=item.get("attr_type", "string"),
                        attr_default_value=item.get("attr_default_value",
                                                    None),
                        is_change=item.get("is_change", False),
                        attr_info=item.get("attr_info", ""),
                        protocol=item.get("protocol", ""))
                    config_items.append(plugin_config_item)

            PluginConfigGroup.objects.bulk_create(config_groups)
            PluginConfigItems.objects.bulk_create(config_items)

            event_id = make_uuid()
            plugin_build_version.event_id = event_id
            plugin_build_version.plugin_version_status = "fixed"

            plugin_service.create_region_plugin(region_name,
                                                tenant,
                                                plugin_base_info,
                                                image_tag=image_tag)

            ret = plugin_service.build_plugin(
                region_name, plugin_base_info, plugin_build_version, user,
                tenant, event_id, share_plugin_info.get("plugin_image", None))
            plugin_build_version.build_status = ret.get('bean').get('status')
            plugin_build_version.save()

            return 200, '安装成功'
        except Exception as e:
            logger.exception(e)
            if sid:
                transaction.savepoint_rollback(sid)
            return 500, '插件安装失败'
Exemplo n.º 3
0
    def post(self, request, *args, **kwargs):
        """
        插件创建
        ---
        parameters:
            - name: tenantName
              description: 团队名
              required: true
              type: string
              paramType: path
            - name: plugin_alias
              description: 插件名称
              required: true
              type: string
              paramType: form
            - name: build_source
              description: 构建来源 dockerfile | image
              required: true
              type: string
              paramType: form
            - name: min_memory
              description: 最小内存
              required: true
              type: integer
              paramType: form
            - name: category
              description: 插件类别 net-plugin:down|net-plugin:up|net-plugin:in-and-out|
              analyst-plugin:perf|init-plugin|general-plugin
              required: false
              type: string
              paramType: form
            - name: build_cmd
              description: 构建命令
              required: false
              type: string
              paramType: form
            - name: code_repo
              description: dockerfile构建代码仓库地址,选择dockerfile时必须
              required: false
              type: string
              paramType: form
            - name: code_version
              description: 代码版本,默认master
              required: false
              type: string
              paramType: form
            - name: image
              description: 镜像构建时镜像名称
              required: false
              type: string
              paramType: form
            - name: desc
              description: 镜像说明
              required: true
              type: string
              paramType: form

        """
        # 必要参数
        plugin_alias = request.data.get("plugin_alias", None)
        build_source = request.data.get("build_source", None)
        min_memory = request.data.get("min_memory", None)
        category = request.data.get("category", None)
        desc = request.data.get("desc", None)
        # 非必要参数
        build_cmd = request.data.get("build_cmd", None)
        code_repo = request.data.get("code_repo", None)
        code_version = request.data.get("code_version", None)
        image = request.data.get("image", None)
        # username and password is used for private docker hub or private git repo
        username = request.data.get("username", None)
        password = request.data.get("password", None)
        tenant_plugin = None
        plugin_build_version = None
        try:
            if not plugin_alias:
                return Response(general_message(400, "plugin alias is null",
                                                "插件名称未指明"),
                                status=400)
            if not build_source:
                return Response(general_message(400, "build source is null",
                                                "构建来源未指明"),
                                status=400)
            if not min_memory:
                return Response(general_message(400,
                                                "plugin min_memroy is null",
                                                "插件内存大小未指明"),
                                status=400)
            if not category:
                return Response(general_message(400, "plugin category is null",
                                                "插件类别未指明"),
                                status=400)
            else:
                if category not in allow_plugins:
                    return Response(general_message(
                        400, "plugin category is wrong",
                        "插件类别参数错误,详情请参数API说明"),
                                    status=400)
            if not desc:
                return Response(general_message(400, "plugin desc is null",
                                                "请填写插件描述"),
                                status=400)

            image_tag = ""
            if image and build_source == "image":
                image_and_tag = image.rsplit(":", 1)
                if len(image_and_tag) > 1:
                    image = image_and_tag[0]
                    image_tag = image_and_tag[1]
                else:
                    image = image_and_tag[0]
                    image_tag = "latest"
            # 创建基本信息
            plugin_params = {
                "tenant_id": self.tenant.tenant_id,
                "region": self.response_region,
                "create_user": self.user.user_id,
                "desc": desc,
                "plugin_alias": plugin_alias,
                "category": category,
                "build_source": build_source,
                "image": image,
                "code_repo": code_repo,
                "username": username,
                "password": password
            }
            code, msg, tenant_plugin = plugin_service.create_tenant_plugin(
                plugin_params)
            if code != 200:
                return Response(general_message(code, "create plugin error",
                                                msg),
                                status=code)

            # 创建插件版本信息
            plugin_build_version = plugin_version_service.create_build_version(
                self.response_region, tenant_plugin.plugin_id,
                self.tenant.tenant_id, self.user.user_id, "", "unbuild",
                min_memory, build_cmd, image_tag, code_version)
            # 数据中心创建插件
            code, msg = plugin_service.create_region_plugin(
                self.response_region, self.tenant, tenant_plugin, image_tag)
            if code != 200:
                plugin_service.delete_console_tenant_plugin(
                    tenant_plugin.plugin_id)
                plugin_version_service.delete_build_version_by_id_and_version(
                    tenant_plugin.plugin_id,
                    plugin_build_version.build_version, True)
                return Response(general_message(code, "create plugin error",
                                                msg),
                                status=code)

            bean = tenant_plugin.to_dict()
            bean["build_version"] = plugin_build_version.build_version
            bean["code_version"] = plugin_build_version.code_version
            bean["build_status"] = plugin_build_version.build_status
            bean["update_info"] = plugin_build_version.update_info
            bean["image_tag"] = plugin_build_version.image_tag

            result = general_message(200, "success", "创建成功", bean=bean)
        except Exception as e:
            logger.exception(e)
            result = error_message(e.message)
            if tenant_plugin:
                plugin_service.delete_console_tenant_plugin(
                    tenant_plugin.plugin_id)
            if plugin_build_version:
                plugin_version_service.delete_build_version_by_id_and_version(
                    tenant_plugin.plugin_id,
                    plugin_build_version.build_version, True)
        return Response(result, status=result["code"])