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"])
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)
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"])
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)
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
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"])
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))
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"])