示例#1
0
    def post(self, request, *args, **kwargs):
        """
        创建应用市场应用
        ---
        parameters:
            - name: tenantName
              description: 团队名称
              required: true
              type: string
              paramType: path
            - name: group_id
              description: 组id
              required: true
              type: string
              paramType: form
            - name: app_id
              description: rainbond app id
              required: true
              type: string
              paramType: form
        """
        try:
            group_id = request.data.get("group_id", -1)
            group_key = request.data.get("group_key", None)
            group_version = request.data.get("group_version", None)
            is_deploy = request.data.get("is_deploy", True)
            if not group_key or not group_version:
                return Response(general_message(400, "app id is null", "请指明需要安装的应用"), status=400)
            if int(group_id) != -1:
                code, _, _ = group_service.get_group_by_id(self.tenant, self.response_region, group_id)
                if code != 200:
                    return Response(general_message(400, "group not exist", "所选组不存在"), status=400)

            code, app = market_app_service.get_rain_bond_app_by_key_and_version(group_key, group_version)

            if not app:
                return Response(general_message(404, "not found", "云市应用不存在"), status=404)
            market_app_service.check_package_app_resource(self.tenant, self.response_region, app)

            market_app_service.install_service(self.tenant, self.response_region, self.user, group_id, app, is_deploy)

            RainbondCenterApp.objects.filter(group_key=group_key, version=group_version).update(
                install_number=F("install_number") + 1
            )
            logger.debug("market app create success")
            result = general_message(200, "success", "创建成功")
        except ResourceNotEnoughException as re:
            logger.exception(re)
            return Response(general_message(10406, "resource is not enough", re.message), status=412)
        except AccountOverdueException as re:
            logger.exception(re)
            return Response(general_message(10406, "resource is not enough", re.message), status=412)
        except Exception as e:
            logger.exception(e)
            result = error_message(e.message)
        return Response(result, status=result["code"])
示例#2
0
    def post(self, request, *args, **kwargs):
        """
        创建应用市场应用
        ---
        parameters:
            - name: tenantName
              description: 团队名称
              required: true
              type: string
              paramType: path
            - name: group_id
              description: 组id
              required: true
              type: string
              paramType: form
            - name: app_id
              description: rainbond app id
              required: true
              type: string
              paramType: form
        """
        try:
            group_id = request.data.get("group_id", -1)
            app_id = request.data.get("app_id", None)
            if not app_id:
                return Response(general_message(400, "app id is null",
                                                "请指明需要安装的应用"),
                                status=400)
            if int(group_id) != -1:
                code, msg, group_info = group_service.get_group_by_id(
                    self.tenant, self.response_region, group_id)
                if code != 200:
                    return Response(general_message(400, "group not exist",
                                                    "所选组不存在"),
                                    status=400)

            code, app = market_app_service.get_rain_bond_app_by_pk(app_id)
            if not app:
                return Response(general_message(404, "not found", "云市应用不存在"),
                                status=404)
            allow_create, tips, total_memory = market_app_service.check_package_app_resource(
                self.tenant, app)
            if not allow_create:
                return Response(general_message(
                    412, "over resource",
                    "应用所需内存大小为{0},{1}".format(total_memory, tips)),
                                status=412)
            market_app_service.install_service(self.tenant,
                                               self.response_region, self.user,
                                               group_id, app)
            logger.debug("market app create success")
            result = general_message(200, "success", "创建成功")
        except Exception as e:
            logger.exception(e)
            result = error_message(e.message)
        return Response(result, status=result["code"])
示例#3
0
    def post(self, request, group_id, *args, **kwargs):
        """提交升级任务"""
        rq_args = (
            {
                'key': 'upgrade_record_id',
                'required': True,
                'error': 'upgrade_record_id is a required parameter'
            },
            {
                'key': 'group_key',
                'required': True,
                'error': 'group_key is a required parameter'
            },
            {
                'key': 'version',
                'required': True,
                'error': 'version is a required parameter'
            },
            {
                'key': 'services',
                'required': True,
                'error': 'services is a required parameter'
            },
        )
        data = parse_date(request, rq_args)
        group_key = data['group_key']
        version = data['version']

        app_record = get_object_or_404(
            AppUpgradeRecord,
            msg="Upgrade record not found",
            tenant_id=self.tenant.tenant_id,
            group_id=int(group_id),
            group_key=group_key,
            status=UpgradeStatus.NOT.value,
            pk=data['upgrade_record_id'],
        )

        # 处理新增的服务
        add_service_infos = {
            service['service']['service_key']: service['upgrade_info']
            for service in data['services']
            if service['service']['type'] == UpgradeType.ADD.value
            and service['upgrade_info']
        }
        install_info = {}
        if add_service_infos:
            old_app = rainbond_app_repo.get_rainbond_app_by_key_version(
                group_key=group_key, version=version)
            new_app = deepcopy(old_app)
            # mock app信息
            template = json.loads(new_app.app_template)
            template['apps'] = add_service_infos.values()
            new_app.app_template = json.dumps(template)

            # 查询某一个云市应用下的所有服务
            services = group_service.get_rainbond_services(
                int(group_id), group_key)
            try:
                market_app_service.check_package_app_resource(
                    self.tenant, self.response_region, new_app)
                install_info = market_app_service.install_service_when_upgrade_app(
                    self.tenant, self.response_region, self.user, group_id,
                    new_app, old_app, services, True)

            except (ResourceNotEnoughException, AccountOverdueException) as re:
                logger.exception(re)
                return MessageResponse(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_service_infos)

        # 处理需要升级的服务
        upgrade_service_infos = {
            service['service']['service_id']: service['upgrade_info']
            for service in data['services']
            if service['service']['type'] == UpgradeType.UPGRADE.value
            and service['upgrade_info']
        }

        app_record.version = version
        app_record.old_version = upgrade_service.get_old_version(
            group_key, upgrade_service_infos.keys())
        app_record.save()

        services = service_repo.get_services_by_service_ids_and_group_key(
            data['group_key'], upgrade_service_infos.keys())

        market_services = [
            upgrade_service.market_service_and_create_backup(
                self.tenant, service, app_record.version)
            for service in services
        ]

        upgrade_service.upgrade_database(market_services)
        upgrade_service.send_upgrade_request(market_services, self.tenant,
                                             self.user, app_record,
                                             upgrade_service_infos)
        upgrade_repo.change_app_record_status(app_record,
                                              UpgradeStatus.UPGRADING.value)

        # 处理依赖关系
        if add_service_infos:
            market_app_service.save_service_deps_when_upgrade_app(
                self.tenant,
                install_info['service_key_dep_key_map'],
                install_info['key_service_map'],
                install_info['apps'],
                install_info['app_map'],
            )

        return MessageResponse(
            msg="success",
            bean=upgrade_service.serialized_upgrade_record(app_record))
示例#4
0
    def post(self, request, group_id, *args, **kwargs):
        """提交升级任务"""
        rq_args = (
            {
                'key': 'upgrade_record_id',
                'required': True,
                'error': 'upgrade_record_id is a required parameter'
            },
            {
                'key': 'group_key',
                'required': True,
                'error': 'group_key is a required parameter'
            },
            {
                'key': 'version',
                'required': True,
                'error': 'version is a required parameter'
            },
            {
                'key': 'services',
                'required': True,
                'error': 'services is a required parameter'
            },
        )
        data = parse_date(request, rq_args)
        app_record = get_object_or_404(
            AppUpgradeRecord,
            msg="Upgrade record not found",
            tenant_id=self.tenant.tenant_id,
            group_id=int(group_id),
            group_key=data['group_key'],
            status=UpgradeStatus.NOT.value,
            pk=data['upgrade_record_id'],
        )
        app_record.version = data['version']
        app_record.save()
        # 处理新增的服务
        add_service_infos = [
            service['upgrade_info'] for service in data['services']
            if service['service']['type'] == UpgradeType.ADD.value
        ]
        if add_service_infos:
            app = rainbond_app_repo.get_rainbond_app_by_key_version(
                group_key=data['group_key'], version=app_record.version)
            # mock app信息
            template = json.loads(app.app_template)
            template['apps'] = add_service_infos
            app.app_template = json.dumps(template)
            market_app_service.check_package_app_resource(
                self.tenant, self.response_region, app)
            market_app_service.install_service(self.tenant,
                                               self.response_region, self.user,
                                               group_id, app, True)

        # 处理需要升级的服务
        upgrade_service_infos = {
            service['service']['service_id']: service['upgrade_info']
            for service in data['services']
            if service['service']['type'] == UpgradeType.UPGRADE.value
        }
        services = service_repo.get_services_by_service_ids_and_group_key(
            data['group_key'], upgrade_service_infos.keys())

        market_services = [
            upgrade_service.market_service_and_create_backup(
                self.tenant, service, app_record.version)
            for service in services
        ]

        upgrade_service.upgrade_database(market_services)
        upgrade_service.send_upgrade_request(market_services, self.tenant,
                                             self.user, app_record,
                                             upgrade_service_infos)
        upgrade_repo.change_app_record_status(app_record,
                                              UpgradeStatus.UPGRADING.value)

        return MessageResponse(
            msg="success",
            bean=upgrade_service.serialized_upgrade_record(app_record))