示例#1
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 []
 def get(self, request, enterprise_id, market_name, app_id, version, *args,
         **kwargs):
     _, market_model = app_market_service.get_app_market(
         enterprise_id, market_name, raise_exception=True)
     data = app_market_service.get_market_app_model_version(market_model,
                                                            app_id,
                                                            version,
                                                            extend=True)
     result = general_message(200, "success", None, bean=data)
     return Response(result, status=200)
示例#3
0
def get_upgrade_app_version_template_app(tenant, version, pc):
    if pc.install_from_cloud:
        data = app_market_service.get_market_app_model_version(pc.market, pc.current_app.app_id, version, get_template=True)
        template = json.loads(data.template)
        apps = template.get("apps")

        def func(x):
            result = x.get("service_share_uuid", None) == pc.service_source.service_share_uuid \
                     or x.get("service_key", None) == pc.service_source.service_share_uuid
            return result

        app = next(iter(filter(lambda x: func(x), apps)), None)
    else:
        app = rbd_center_app_service.get_version_app(tenant.enterprise_id, version, pc.service_source)
    return app
示例#4
0
def get_upgrade_app_template(tenant, version, pc):
    template = None
    if pc.install_from_cloud:
        data = app_market_service.get_market_app_model_version(
            pc.market, pc.service_source.group_key, version, get_template=True)
        template = json.loads(data.template)
        pc.template_updatetime = data.update_time
    else:
        data = rainbond_app_repo.get_enterpirse_app_by_key_and_version(tenant.enterprise_id, pc.service_source.group_key,
                                                                       version)
        if not data:
            raise ServiceHandleException(msg="app version {} can not exist".format(version), msg_show="应用模版版本不存在")
        template = json.loads(data.app_template)
        pc.template_updatetime = data.update_time
    if template:
        return template
    raise ServiceHandleException(msg="app version {} can not exist".format(version), msg_show="应用模版版本不存在")
示例#5
0
    def openapi_upgrade_app_models(self, user, team, region_name,
                                   oauth_instance, app_id, data):
        from console.services.market_app_service import market_app_service
        update_versions = data["update_versions"]
        for update_version in update_versions:
            app_model_id = update_version["app_model_id"]
            app_model_version = update_version["app_model_version"]
            market_name = update_version["market_name"]
            # TODO: get upgrade component will set upgrade_group_id.
            # Otherwise, there is a problem with multiple installs and upgrades of an application.
            services = group_service.get_rainbond_services(
                int(app_id), app_model_id)
            if not services:
                continue
            exist_component = services.first()
            pc = PropertiesChanges(exist_component,
                                   team,
                                   all_component_one_model=services)
            recode_kwargs = {
                "tenant_id": team.tenant_id,
                "group_id": int(app_id),
                "group_key": app_model_id,
                "is_from_cloud": bool(market_name),
                "market_name": market_name,
            }

            # 获取升级信息
            upgrade_info, add_info = self.get_upgrade_info(
                team, services, app_model_id, app_model_version, market_name)

            # 生成升级记录
            app_record = self.get_or_create_upgrade_record(**recode_kwargs)
            self.synchronous_upgrade_status(team, region_name, app_record)
            app_record = AppUpgradeRecord.objects.get(ID=app_record.ID)

            # 处理新增的组件
            install_info = {}
            if add_info:
                old_app = app_market_service.get_market_app_model_version(
                    pc.market,
                    app_model_id,
                    app_model_version,
                    get_template=True)
                new_app = deepcopy(old_app)
                # mock app信息
                template = json.loads(new_app.template)
                template['apps'] = list(add_info.values())
                new_app.template = json.dumps(template)

                # 查询某一个云市应用下的所有组件
                try:
                    install_info = market_app_service.install_service_when_upgrade_app(
                        team, region_name, user, app_id, new_app, old_app,
                        services, True,
                        exist_component.tenant_service_group_id,
                        pc.install_from_cloud, pc.market_name)
                except ResourceNotEnoughException as re:
                    raise re
                except AccountOverdueException as re:
                    logger.exception(re)
                    raise ServiceHandleException(msg="resource is not enough",
                                                 msg_show=re.message,
                                                 status_code=412,
                                                 error_code=10406)
                upgrade_service.create_add_service_record(
                    app_record, install_info['events'], add_info)

            app_record.version = app_model_version
            app_record.old_version = pc.current_version
            app_record.save()
            # 处理升级组件
            upgrade_services = service_repo.get_services_by_service_ids_and_group_key(
                app_model_id, list(upgrade_info.keys()))
            market_services = [
                self.market_service_and_create_backup(team, service,
                                                      app_record.version,
                                                      upgrade_services)
                for service in upgrade_services
            ]
            # 处理依赖关系
            if add_info:
                market_app_service.save_service_deps_when_upgrade_app(
                    team,
                    install_info['service_key_dep_key_map'],
                    install_info['key_service_map'],
                    install_info['apps'],
                    install_info['app_map'],
                )

            upgrade_service.upgrade_database(market_services)
            upgrade_service.send_upgrade_request(market_services, team, user,
                                                 app_record, upgrade_info,
                                                 oauth_instance)
            upgrade_repo.change_app_record_status(
                app_record, UpgradeStatus.UPGRADING.value)