Esempio n. 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)
            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"])
Esempio n. 2
0
 def post(self, request, app_id, *args, **kwargs):
     is_deploy = request.GET.get("is_deploy", False)
     if is_deploy == "true":
         is_deploy = True
     serializer = InstallSerializer(data=request.data)
     serializer.is_valid(raise_exception=True)
     market_url = serializer.data.get("market_url")
     market_domain = serializer.data.get("market_domain")
     market_type = serializer.data.get("market_type")
     market_access_key = serializer.data.get("market_access_key")
     app_model_id = serializer.data.get("app_model_id")
     app_model_version = serializer.data.get("app_model_version")
     market = app_market_service.get_app_market_by_domain_url(
         self.team.enterprise_id, market_domain, market_url)
     if not market:
         market_name = make_uuid()
         dt = {
             "name": market_name,
             "url": market_url,
             "type": market_type,
             "enterprise_id": self.team.enterprise_id,
             "access_key": market_access_key,
             "domain": market_domain,
         }
         app_market_service.create_app_market(dt)
         dt, market = app_market_service.get_app_market(
             self.team.enterprise_id, market_name, raise_exception=True)
     market_name = market.name
     app, app_version_info = app_market_service.cloud_app_model_to_db_model(
         market, app_model_id, app_model_version, for_install=True)
     if not app:
         raise ServiceHandleException(status_code=404,
                                      msg="not found",
                                      msg_show="云端应用不存在")
     if not app_version_info:
         raise ServiceHandleException(status_code=404,
                                      msg="not found",
                                      msg_show="云端应用版本不存在")
     market_app_service.install_service(self.team,
                                        self.region_name,
                                        self.user,
                                        app_id,
                                        app,
                                        app_version_info,
                                        is_deploy,
                                        True,
                                        market_name=market_name)
     services = group_service.get_group_services(app_id)
     app_info = model_to_dict(self.app)
     app_info["app_name"] = app_info["group_name"]
     app_info["team_id"] = app_info["tenant_id"]
     app_info["enterprise_id"] = self.team.enterprise_id
     app_info["service_list"] = services
     reapp = MarketInstallSerializer(data=app_info)
     reapp.is_valid()
     return Response(reapp.data, status=status.HTTP_200_OK)
Esempio n. 3
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"])
Esempio n. 4
0
 def post(self, request, *args, **kwargs):
     serializer = MarketInstallSerializer(data=request.data)
     serializer.is_valid(raise_exception=True)
     data = serializer.data
     logger.info(data)
     app = group_service.get_app_by_id(data["app_id"])
     if not app:
         return Response(FailSerializer(
             {"msg": "install target app not found"}),
                         status=status.HTTP_400_BAD_REQUEST)
     tenant = team_services.get_team_by_team_id(app.tenant_id)
     # TODO: get app info by order id
     token = market_sycn_service.get_enterprise_access_token(
         tenant.enterprise_id, "market")
     if token:
         market_client = get_market_client(token.access_id,
                                           token.access_token,
                                           token.access_url)
         app_version = market_client.download_app_by_order(
             order_id=data["order_id"])
         if not app_version:
             return Response(FailSerializer(
                 {"msg": "download app metadata failure"}),
                             status=status.HTTP_400_BAD_REQUEST)
         rainbond_app, rainbond_app_version = market_app_service.conversion_cloud_version_to_app(
             app_version)
         market_app_service.install_service(tenant, app.region_name,
                                            request.user, app.ID,
                                            rainbond_app,
                                            rainbond_app_version, True,
                                            True)
         services = group_service.get_group_services(data["app_id"])
         appInfo = model_to_dict(app)
         appInfo["enterprise_id"] = tenant.enterprise_id
         appInfo["service_list"] = ServiceBaseInfoSerializer(services,
                                                             many=True).data
         reapp = AppInfoSerializer(data=appInfo)
         reapp.is_valid()
         return Response(reapp.data, status=status.HTTP_200_OK)
     else:
         return Response(FailSerializer(
             {"msg": "not support install from market, not bound"}),
                         status=status.HTTP_400_BAD_REQUEST)
Esempio n. 5
0
    def install_service_group(self, user, tenant_name, group_key,
                              group_version, region_name, template_version):
        tenant_service_group = None
        new_group = None
        try:
            logger.debug('prepared install [{}-{}] to [{}] on [{}]'.format(
                group_key, group_version, tenant_name, region_name))
            if tenant_name:
                tenant = self.get_tenant_by_name(tenant_name)
            else:
                tenant = self.get_default_tenant_by_user(user.user_id)

            if not tenant:
                logger.error('tenant does not existed!')
                return False, '租户不存在', None
            logger.debug('login_user_id: {}'.format(user.user_id))
            logger.debug('login_user: {}'.format(user.nick_name))
            logger.debug('tenant_name: {}'.format(tenant.tenant_name))

            # 查看安装的目标数据中心是否已初始化, 如果未初始化则先初始化
            if not tenant_svc.init_region_tenant(tenant, region_name):
                return False, '初始化数据中心失败: {}'.format(region_name), None
            app = market_sycn_service.download_app_service_group_from_market(
                user, tenant, group_key, group_version)
            new_group = self.__create_group(tenant.tenant_id, region_name,
                                            app.group_name)
            tenant_service_group, _ = market_app_service.install_service(
                tenant, region_name, user, new_group.ID, app, True)
            if tenant_service_group:
                tenant_service_group = self.get_group_services_by_pk(
                    tenant_service_group.pk)
            return True, "success", tenant_service_group
        except Exception as e:
            logger.exception(e)
            # 回滚数据
            if tenant_service_group:
                tenant_service_group_repo.delete_tenant_service_group_by_pk(
                    tenant_service_group.ID)
            if new_group:
                group_repo.delete_group_by_pk(new_group.ID)
            return False, str(e.message), None
Esempio n. 6
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
            - name: install_from_cloud
              description: install app from cloud
              required: false
              type: bool
              paramType: form
        """
        try:
            group_id = request.data.get("group_id", -1)
            app_id = request.data.get("app_id", None)
            app_version = request.data.get("app_version", None)
            is_deploy = request.data.get("is_deploy", True)
            install_from_cloud = request.data.get("install_from_cloud", False)
            if not app_id or not app_version:
                return Response(general_message(400, "app id is null", "请指明需要安装的应用"), status=400)
            if int(group_id) != -1:
                group_service.get_group_by_id(self.tenant, self.response_region, group_id)
            app = None
            app_version_info = None
            if install_from_cloud:
                app, app_version_info = market_app_service.get_app_from_cloud(self.tenant, app_id, app_version, True)
                if not app:
                    return Response(general_message(404, "not found", "云端应用不存在"), status=404)
            else:
                app, app_version_info = market_app_service.get_rainbond_app_and_version(self.user.enterprise_id, app_id,
                                                                                        app_version)
                if not app:
                    return Response(general_message(404, "not found", "云市应用不存在"), status=404)

            market_app_service.install_service(self.tenant, self.response_region, self.user, group_id, app, app_version_info,
                                               is_deploy, install_from_cloud)
            if not install_from_cloud:
                market_app_service.update_rainbond_app_install_num(self.user.enterprise_id, app_id, app_version)
            logger.debug("market app create success")
            result = general_message(200, "success", "创建成功")
        except ResourceNotEnoughException as re:
            raise re
        except AccountOverdueException as re:
            logger.exception(re)
            return Response(general_message(10406, "resource is not enough", re.message), status=412)
        except ServiceHandleException as e:
            raise e
        except Exception as e:
            logger.exception(e)
            result = error_message(e.message)
        return Response(result, status=result["code"])
Esempio n. 7
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))
Esempio n. 8
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
         - name: install_from_cloud
           description: install app from cloud
           required: false
           type: bool
           paramType: form
     """
     try:
         group_id = request.data.get("group_id", -1)
         app_id = request.data.get("app_id", None)
         app_version = request.data.get("app_version", None)
         is_deploy = request.data.get("is_deploy", True)
         install_from_cloud = request.data.get("install_from_cloud", False)
         market_name = request.data.get("market_name", None)
         if not app_id or not app_version:
             return Response(general_message(400, "app id is null", "请指明需要安装的应用"), status=400)
         if int(group_id) != -1:
             group_service.get_group_by_id(self.tenant, self.response_region, group_id)
         app = None
         app_version_info = None
         if install_from_cloud:
             dt, market = app_market_service.get_app_market(self.tenant.enterprise_id, market_name, raise_exception=True)
             app, app_version_info = app_market_service.cloud_app_model_to_db_model(
                 market, app_id, app_version, for_install=True)
             if not app:
                 return Response(general_message(404, "not found", "云端应用不存在"), status=404)
         else:
             app, app_version_info = market_app_service.get_rainbond_app_and_version(self.user.enterprise_id, app_id,
                                                                                     app_version)
             if not app:
                 return Response(general_message(404, "not found", "云市应用不存在"), status=404)
             if app_version_info and app_version_info.region_name and app_version_info.region_name != self.region_name:
                 raise ServiceHandleException(
                     msg="app version can not install to this region",
                     msg_show="该应用版本属于{}集群,无法跨集群安装,若需要跨集群,请在企业设置中配置跨集群访问的镜像仓库后重新发布。".format(app_version_info.region_name))
         if not app_version_info:
             return Response(general_message(404, "not found", "应用版本不存在,不能进行安装"), status=404)
         market_app_service.install_service(
             self.tenant,
             self.response_region,
             self.user,
             group_id,
             app,
             app_version_info,
             is_deploy,
             install_from_cloud,
             market_name=market_name)
         if not install_from_cloud:
             market_app_service.update_rainbond_app_install_num(self.user.enterprise_id, app_id, app_version)
         logger.debug("market app create success")
         result = general_message(200, "success", "创建成功")
     except ServiceHandleException as e:
         raise e
     except ResourceNotEnoughException as re:
         raise re
     except AccountOverdueException as re:
         logger.exception(re)
         return Response(general_message(10406, "resource is not enough", re.message), status=412)
     return Response(result, status=result["code"])