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): """ 创建应用市场应用 --- 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, 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))
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))