コード例 #1
0
    def post(self, request, enterprise_id, market_name, *args, **kwargs):
        logo = request.data.get("logo")
        base64_logo = ""
        if logo:
            if logo.startswith(settings.MEDIA_URL):
                logo = logo.replace(settings.MEDIA_URL, settings.MEDIA_ROOT + "/")
            try:
                with open(logo, "rb") as f:
                    base64_logo = "data:image/{};base64,".format(logo.split(".")[-1]) + base64.b64encode(f.read()).decode()
            except Exception as e:
                logger.exception(e)
                base64_logo = ""
        name = request.data.get("name", "")
        if not validate_name(name):
            raise ServiceHandleException(msg="error params", msg_show="应用名称只支持中文、字母、数字和-_组合,并且必须以中文、字母、数字开始和结束")

        dt = {
            "desc": request.data.get("desc"),
            "logo": base64_logo,
            "name": name,
            "publish_type": request.data.get("publish_type"),
            "tags": request.data.get("tags"),
            "introduction": request.data.get("introduction"),
            "org_id": request.data.get("org_id")
        }
        market = app_market_service.get_app_market_by_name(enterprise_id, market_name, raise_exception=True)
        rst = app_market_service.create_market_app_model(market, body=dt)
        result = general_message(200, msg="success", msg_show=None, bean=(rst.to_dict() if rst else None))
        return Response(result, status=200)
コード例 #2
0
 def get_or_create_upgrade_record(self, tenant_id, group_id, group_key, upgrade_group_id, is_from_cloud, market_name):
     """获取或创建升级记录"""
     recode_kwargs = {
         "tenant_id": tenant_id,
         "group_id": group_id,
         "group_key": group_key,
         "create_time": datetime.now(),
         "is_from_cloud": is_from_cloud,
         "market_name": market_name,
         "upgrade_group_id": upgrade_group_id,
     }
     try:
         return upgrade_repo.get_app_not_upgrade_record(status__lt=UpgradeStatus.UPGRADED.value, **recode_kwargs)
     except AppUpgradeRecord.DoesNotExist:
         from console.services.group_service import group_service
         tenant = Tenants.objects.get(tenant_id=tenant_id)
         service_group_keys = group_service.get_group_service_sources(group_id).values_list('group_key', flat=True)
         if group_key in set(service_group_keys or []):
             if not is_from_cloud:
                 app = rainbond_app_repo.get_rainbond_app_qs_by_key(tenant.enterprise_id, group_key)
                 if not app:
                     raise ServiceHandleException(
                         msg="the rainbond app is not in the group", msg_show="该应用中没有这个云市组件", status_code=404)
                 app_name = app.app_name
             else:
                 market = app_market_service.get_app_market_by_name(tenant.enterprise_id, market_name, raise_exception=True)
                 app = app_market_service.get_market_app_model(market, group_key)
                 app_name = app.app_name
             app_record = upgrade_repo.create_app_upgrade_record(group_name=app_name, **recode_kwargs)
             return app_record
         else:
             raise AbortRequest(msg="the app model is not in the group", msg_show="该应用中没有这个应用模型", status_code=404)
コード例 #3
0
 def get_add_services(self,
                      enterprise_id,
                      services,
                      group_key,
                      version,
                      market_name=None):
     """获取新增组件"""
     app_template = None
     if services:
         service_keys = services.values_list('service_key', flat=True)
         service_keys = set(service_keys) if service_keys else set()
         if not market_name:
             app = rainbond_app_repo.get_rainbond_app_by_key_version(
                 group_key=group_key, version=version)
             if app:
                 app_template = app.app_template
         else:
             market = app_market_service.get_app_market_by_name(
                 enterprise_id, market_name, raise_exception=True)
             app = app_market_service.get_market_app_model_version(
                 market, group_key, version, get_template=True)
             if app:
                 app_template = app.template
         if app_template:
             return list(
                 self.get_new_services(
                     self.parse_app_template(app_template),
                     service_keys).values())
     else:
         return []
コード例 #4
0
 def post(self, request, enterprise_id, market_name, *args, **kwargs):
     logo = request.data.get("logo")
     base64_logo = ""
     if logo:
         try:
             with open(logo, "rb") as f:
                 base64_logo = "data:image/{};base64,".format(
                     logo.split(".")[-1]) + base64.b64encode(f.read())
         except Exception as e:
             logger.error("parse app logo error: ", e)
             base64_logo = ""
     dt = {
         "desc": request.data.get("desc"),
         "logo": base64_logo,
         "name": request.data.get("name"),
         "publish_type": request.data.get("publish_type"),
         "tags": request.data.get("tags"),
         "introduction": request.data.get("introduction"),
     }
     market = app_market_service.get_app_market_by_name(
         enterprise_id, market_name, raise_exception=True)
     rst = app_market_service.create_market_app_model(market, body=dt)
     result = general_message(200,
                              msg="success",
                              msg_show=None,
                              bean=(rst.to_dict() if rst else None))
     return Response(result, status=200)
コード例 #5
0
 def get(self, request, enterprise_id, market_name, app_id, *args,
         **kwargs):
     query_all = request.GET.get("query_all", False)
     market_model = app_market_service.get_app_market_by_name(
         enterprise_id, market_name, raise_exception=True)
     data = app_market_service.get_market_app_model_versions(
         market_model, app_id, query_all=query_all, extend=True)
     result = general_message(200, "success", None, list=data)
     return Response(result, status=200)
コード例 #6
0
 def get(self, request, enterprise_id, market_name, *args, **kwargs):
     query = request.GET.get("query", None)
     query_all = request.GET.get("query_all", False)
     page = int(request.GET.get("page", 1))
     page_size = int(request.GET.get("page_size", 10))
     market_model = app_market_service.get_app_market_by_name(enterprise_id, market_name, raise_exception=True)
     data, page, page_size, total = app_market_service.get_market_app_models(
         market_model, page, page_size, query=query, query_all=query_all, extend=True)
     result = general_message(200, msg="success", msg_show=None, list=data, page=page, page_size=page_size, total=total)
     return Response(result, status=200)
コード例 #7
0
 def get(self, request, enterprise_id, market_name):
     market_model = app_market_service.get_app_market_by_name(enterprise_id, market_name, raise_exception=True)
     orgs = app_market_service.get_market_orgs(market_model)
     result = general_message(200, msg="success", msg_show=None, list=orgs)
     return Response(result, status=200)
コード例 #8
0
    def get(self, request, team_name, group_id, *args, **kwargs):
        data = []
        market = dict()
        cloud_app = dict()
        page = int(request.GET.get("page", 1))
        page_size = int(request.GET.get("page_size", 10))
        total, share_records = share_repo.get_service_share_records_by_groupid(
            team_name=team_name, group_id=group_id, page=page, page_size=page_size)
        if not share_records:
            result = general_message(200, "success", "获取成功", bean={'total': total}, list=data)
            return Response(result, status=200)
        for share_record in share_records:
            app_model_name = share_record.share_app_model_name
            app_model_id = share_record.app_id
            upgrade_time = None
            store_name = share_record.share_store_name
            store_id = share_record.share_app_market_name
            scope = share_record.scope
            if scope != "goodrain" and not app_model_name:
                app = rainbond_app_repo.get_rainbond_app_by_app_id(self.tenant.enterprise_id, share_record.app_id)
                app_model_name = app.app_name if app else ""
                app_version = rainbond_app_repo.get_rainbond_app_version_by_record_id(share_record.ID)
                if app_version:
                    upgrade_time = app_version.upgrade_time
                    share_record.share_version_alias = app_version.version_alias
                    share_record.share_app_version_info = app_version.app_version_info
                share_record.share_app_model_name = app_model_name
                share_record.save()
            if scope == "goodrain" and store_id and share_record.app_id and not app_model_name:
                try:
                    mkt = market.get(share_record.share_app_market_name, None)
                    if not mkt:
                        mkt = app_market_service.get_app_market_by_name(
                            self.tenant.enterprise_id, share_record.share_app_market_name, raise_exception=True)
                        market[share_record.share_app_market_name] = mkt

                    c_app = cloud_app.get(share_record.app_id, None)
                    if not c_app:
                        c_app = app_market_service.get_market_app_model(mkt, share_record.app_id, True)
                        cloud_app[share_record.app_id] = c_app
                    store_name = c_app.market_name
                    app_model_name = c_app.app_name
                    share_record.share_app_model_name = app_model_name
                    share_record.share_store_name = store_name
                    share_record.save()
                except ServiceHandleException:
                    app_model_id = share_record.app_id
            data.append({
                "app_model_id": app_model_id,
                "app_model_name": app_model_name,
                "version": share_record.share_version,
                "version_alias": share_record.share_version_alias,
                "scope": scope,
                "create_time": share_record.create_time,
                "upgrade_time": upgrade_time,
                "step": share_record.step,
                "is_success": share_record.is_success,
                "status": share_record.status,
                "scope_target": {
                    "store_name": store_name,
                    "store_id": store_id,
                },
                "record_id": share_record.ID,
                "app_version_info": share_record.share_app_version_info,
            })
        result = general_message(200, "success", "获取成功", bean={'total': total}, list=data)
        return Response(result, status=200)
コード例 #9
0
    def get_build_info(self, tenant, service):
        service_source = service_source_repo.get_service_source(
            team_id=service.tenant_id, service_id=service.service_id)

        code_from = service.code_from
        oauth_type = support_oauth_type.keys()
        if code_from in oauth_type:
            result_url = re_split("[:,@]", service.git_url)
            service.git_url = result_url[0] + '//' + result_url[-1]
        bean = {
            "user_name": "",
            "password": "",
            "service_source": service.service_source,
            "image": service.image,
            "cmd": service.cmd,
            "code_from": service.code_from,
            "version": service.version,
            "docker_cmd": service.docker_cmd,
            "create_time": service.create_time,
            "git_url": service.git_url,
            "code_version": service.code_version,
            "server_type": service.server_type,
            "language": service.language,
            "oauth_service_id": service.oauth_service_id,
            "full_name": service.git_full_name
        }
        if service_source:
            bean["user"] = service_source.user_name
            bean["password"] = service_source.password
        if service.service_source == 'market':
            from console.services.market_app_service import market_app_service
            from console.services.app import app_market_service
            if service_source:
                # get from cloud
                app = None
                app_version = None
                if service_source.extend_info:
                    extend_info = json.loads(service_source.extend_info)
                    if extend_info and extend_info.get("install_from_cloud",
                                                       False):
                        market_name = extend_info.get("market_name")
                        bean["install_from_cloud"] = True
                        try:
                            market = app_market_service.get_app_market_by_name(
                                tenant.enterprise_id,
                                market_name,
                                raise_exception=True)
                            app, app_version = app_market_service.cloud_app_model_to_db_model(
                                market, service_source.group_key,
                                service_source.version)
                            bean["market_error_code"] = 200
                            bean["market_status"] = 1
                        except ServiceHandleException as e:
                            logger.debug(e)
                            bean["market_status"] = 0
                            bean["market_error_code"] = e.error_code
                            return bean
                        bean["install_from_cloud"] = True
                        bean["app_detail_url"] = app.describe
                if not app:
                    try:
                        app, app_version = market_app_service.get_rainbond_app_and_version(
                            tenant.enterprise_id, service_source.group_key,
                            service_source.version)
                    except RbdAppNotFound:
                        logger.warning(
                            "not found app {0} version {1} in local market".
                            format(service_source.group_key,
                                   service_source.version))
                if app and app_version:
                    bean["rain_app_name"] = app.app_name
                    bean["details"] = app.details
                    logger.debug("app_version: {}".format(app_version.version))
                    bean["app_version"] = app_version.version
                    bean["version"] = app_version.version
                    bean["group_key"] = app.app_id
        return bean
コード例 #10
0
    def get_build_infos(self, tenant, service_ids):
        from console.repositories.service_repo import service_repo
        apps = dict()
        markets = dict()
        build_infos = dict()
        services = service_repo.get_service_by_service_ids(
            service_ids=service_ids)
        svc_sources = service_source_repo.get_service_sources(
            team_id=tenant.tenant_id, service_ids=service_ids)
        service_sources = {svc_ss.service_id: svc_ss for svc_ss in svc_sources}

        for service in services:
            service_source = service_sources.get(service.service_id, None)
            code_from = service.code_from
            oauth_type = list(support_oauth_type.keys())
            if code_from in oauth_type:
                result_url = re_split("[:,@]", service.git_url)
                service.git_url = result_url[0] + '//' + result_url[-1]
            bean = {
                "user_name": "",
                "password": "",
                "service_source": service.service_source,
                "image": service.image,
                "cmd": service.cmd,
                "code_from": service.code_from,
                "version": service.version,
                "docker_cmd": service.docker_cmd,
                "create_time": service.create_time,
                "git_url": service.git_url,
                "code_version": service.code_version,
                "server_type": service.server_type,
                "language": service.language,
                "oauth_service_id": service.oauth_service_id,
                "full_name": service.git_full_name
            }
            if service_source:
                bean["user"] = service_source.user_name
                bean["password"] = service_source.password
            if service.service_source == 'market':
                from console.services.app import app_market_service
                from console.services.market_app_service import market_app_service
                if not service_source:
                    build_infos[service.service_id] = bean
                    return build_infos

                # get from cloud
                app = None
                if service_source.extend_info:
                    extend_info = json.loads(service_source.extend_info)
                    if extend_info and extend_info.get("install_from_cloud",
                                                       False):
                        market_name = extend_info.get("market_name")
                        bean["install_from_cloud"] = True
                        try:
                            market = markets.get(market_name, None)
                            if not market:
                                market = app_market_service.get_app_market_by_name(
                                    tenant.enterprise_id,
                                    market_name,
                                    raise_exception=True)
                                markets[market_name] = market

                            app = apps.get(service_source.group_key, None)
                            if not app:
                                app, _ = app_market_service.cloud_app_model_to_db_model(
                                    market, service_source.group_key, None)
                                apps[service_source.group_key] = app

                            bean["market_error_code"] = 200
                            bean["market_status"] = 1
                        except ServiceHandleException as e:
                            logger.debug(e)
                            bean["market_status"] = 0
                            bean["market_error_code"] = e.error_code
                            bean["version"] = service_source.version
                            bean["app_version"] = service_source.version
                            return bean
                        bean["install_from_cloud"] = True
                        bean["app_detail_url"] = app.describe
                if not app:
                    try:
                        app = market_app_service.get_rainbond_app(
                            tenant.enterprise_id, service_source.group_key)
                    except RbdAppNotFound:
                        logger.warning(
                            "not found app {0} version {1} in local market".
                            format(service_source.group_key,
                                   service_source.version))
                if app:
                    bean["rain_app_name"] = app.app_name
                    bean["details"] = app.details
                    bean["group_key"] = app.app_id
                    bean["app_version"] = service_source.version
                    bean["version"] = service_source.version
            build_infos[service.service_id] = bean
        return build_infos
コード例 #11
0
    def get(self, request, team_name, group_id, *args, **kwargs):
        data = []
        share_records = share_repo.get_service_share_records_by_groupid(
            group_id=group_id)
        if share_records:
            for share_record in share_records:
                app_model_name = None
                app_model_id = None
                version_alias = None
                upgrade_time = None
                # todo get store name
                store_name = None
                store_id = share_record.share_app_market_name
                scope = share_record.scope
                app = rainbond_app_repo.get_rainbond_app_by_app_id(
                    self.tenant.enterprise_id, share_record.app_id)
                if app:
                    app_model_id = share_record.app_id
                    app_model_name = app.app_name
                    app_version = rainbond_app_repo.get_rainbond_app_version_by_record_id(
                        share_record.ID)
                    if app_version:
                        version_alias = app_version.version_alias
                        upgrade_time = app_version.upgrade_time
                else:
                    try:
                        if store_id and share_record.app_id:

                            market = app_market_service.get_app_market_by_name(
                                self.tenant.enterprise_id,
                                share_record.share_app_market_name,
                                raise_exception=True)
                            cloud_app = app_market_service.get_market_app_model(
                                market, share_record.app_id)
                            if cloud_app:
                                app_model_id = share_record.app_id
                                app_model_name = cloud_app.app_name
                    except ServiceHandleException:
                        app_model_id = share_record.app_id
                data.append({
                    "app_model_id":
                    app_model_id,
                    "app_model_name":
                    app_model_name,
                    "version":
                    share_record.share_version,
                    "version_alias":
                    (share_record.share_version_alias
                     if share_record.share_version_alias else version_alias),
                    "scope":
                    scope,
                    "create_time":
                    share_record.create_time,
                    "upgrade_time":
                    upgrade_time,
                    "step":
                    share_record.step,
                    "is_success":
                    share_record.is_success,
                    "status":
                    share_record.status,
                    "scope_target": {
                        "store_name": store_name,
                        "store_id": store_id,
                    },
                    "record_id":
                    share_record.ID,
                })
        result = general_message(200, "success", None, list=data)
        return Response(result, status=200)