def save_market_app_template(self, user, tenant, app_templates): template_version = app_templates["template_version"] is_v1 = bool(template_version == "v1") if is_v1: v2_template = template_transform_service.v1_to_v2(app_templates) else: v2_template = app_templates rainbond_app = rainbond_app_repo.get_enterpirse_app_by_key_and_version( tenant.enterprise_id, v2_template["group_key"], v2_template["group_version"]) if not rainbond_app: if common_services.is_public() and user.is_sys_admin: enterprise_id = "public" else: enterprise_id = tenant.enterprise_id rainbond_app = RainbondCenterApp( group_key=app_templates["group_key"], group_name=app_templates["group_name"], version=app_templates['group_version'], share_user=0, record_id=0, share_team="", source="market", scope="goodrain", describe=app_templates["info"], pic=app_templates["pic"], app_template="", enterprise_id=enterprise_id, template_version=app_templates.get("template_version", "")) if is_v1: rainbond_app.share_user = v2_template["share_user"] rainbond_app.share_team = v2_template["share_team"] rainbond_app.pic = v2_template["pic"] rainbond_app.describe = v2_template["describe"] rainbond_app.app_template = json.dumps(v2_template) rainbond_app.is_complete = True rainbond_app.update_time = current_time_str("%Y-%m-%d %H:%M:%S") rainbond_app.save() else: user_name = v2_template.get("publish_user", None) user_id = 0 if user_name: try: user = user_repo.get_user_by_username(user_name) user_id = user.user_id except Exception as e: logger.exception(e) rainbond_app.share_user = user_id rainbond_app.share_team = v2_template.get("publish_team", "") rainbond_app.pic = v2_template.get("pic", rainbond_app.pic) rainbond_app.describe = v2_template.get("update_note", rainbond_app.describe) rainbond_app.app_template = v2_template["template_content"] rainbond_app.is_complete = True rainbond_app.update_time = current_time_str("%Y-%m-%d %H:%M:%S") rainbond_app.save()
def create_group_compose(self, tenant, region, group_id, compose_content, hub_user="", hub_pass=""): gc = compose_repo.get_group_compose_by_group_id(group_id) if gc: return 409, "该组已与其他compose组关联", None # 将yaml格式信息转成json数据 group_compose_data = { "hub_user": hub_user, "hub_pass": hub_pass, "group_id": group_id, "team_id": tenant.tenant_id, "region": region, "compose_content": compose_content, "compose_id": make_uuid(), "create_status": "creating", "create_time": current_time_str("%Y-%m-%d %H:%M:%S"), } group_compose = compose_repo.create_group_compose(**group_compose_data) return 200, "创建groupcompose成功", group_compose
def get_service_event(self, tenant, service, page, page_size, start_time_str): # 前端传入时间到分钟,默认会加上00,这样一来刚部署的应用的日志无法查询到,所有将当前时间添加一分钟 if not start_time_str: start_time_str = current_time_str(fmt="%Y-%m-%d %H:%M:%S") else: start_time = str_to_time(start_time_str, fmt="%Y-%m-%d %H:%M") start_time_str = time_to_str(start_time + datetime.timedelta(minutes=1)) events = event_repo.get_events_before_specify_time(tenant.tenant_id, service.service_id, start_time_str) event_paginator = JuncheePaginator(events, int(page_size)) total = event_paginator.count page_events = event_paginator.page(page) has_next = True if page_size * page >= total: has_next = False self.__sync_region_service_event_status(service.service_region, tenant.tenant_name, page_events) re_events = [] for event in list(page_events): event_re = event.to_dict() # codeVersion = "版本:4c042b9 上传者:黄峻贤 Commit:Merge branch 'developer' into 'test'" version_info = self.wrapper_code_version(service, event) if version_info: event_re["code_version"] = version_info type_cn = self.translate_event_type(event.type) event_re["type_cn"] = type_cn re_events.append(event_re) return re_events, has_next
def down_market_group_list(self, tenant): app_group_list = market_api.get_service_group_list(tenant.tenant_id) rainbond_apps = [] for app_group in app_group_list: rbc = rainbond_app_repo.get_rainbond_app_by_key_and_version( app_group["group_key"], app_group["group_version"]) if rbc: rbc.describe = app_group["info"] if app_group[ "info"] else rbc.describe rbc.pic = app_group["pic"] if app_group["pic"] else rbc.pic rbc.update_time = current_time_str("%Y-%m-%d %H:%M:%S") rbc.template_version = app_group.get("template_version", rbc.template_version) rbc.save() else: rainbond_app = RainbondCenterApp( group_key=app_group["group_key"], group_name=app_group["group_name"], version=app_group['group_version'], share_user=0, record_id=0, share_team="", source="market", scope="goodrain", describe=app_group["info"], pic=app_group["pic"], app_template="", template_version=app_group.get("template_version", "")) rainbond_apps.append(rainbond_app) rainbond_app_repo.bulk_create_rainbond_apps(rainbond_apps)
def back_up_group_apps(self, tenant, user, region, group_id, mode, note): service_slug = app_store.get_slug_connection_info( "enterprise", tenant.tenant_name) service_image = app_store.get_image_connection_info( "enterprise", tenant.tenant_name) services = group_service.get_group_services(group_id) event_id = make_uuid() group_uuid = self.get_backup_group_uuid(group_id) metadata = self.get_group_app_metadata(group_id, tenant) version = current_time_str("%Y%m%d%H%M%S") data = { "event_id": event_id, "group_id": group_uuid, "metadata": metadata, "service_ids": [s.service_id for s in services], "mode": mode, "version": version, "slug_info": service_slug, "image_info": service_image } body = region_api.backup_group_apps(region, tenant.tenant_name, data) bean = body["bean"] record_data = { "group_id": group_id, "event_id": event_id, "group_uuid": group_uuid, "version": version, "team_id": tenant.tenant_id, "region": region, "status": bean["status"], "note": note, "mode": mode, "backup_id": bean.get("backup_id", ""), "source_dir": bean.get("source_dir", ""), "backup_size": bean.get("backup_size", 0), "user": user.nick_name, "backup_server_info": json.dumps({ "slug_info": service_slug, "image_info": service_image }) } backup_record = backup_record_repo.create_backup_records(**record_data) return backup_record
def __v1_2_v2_translate_app(self, app, region): new_app = dict() new_app["service_type"] = app["service_type"] new_app["service_cname"] = app["service_name"] new_app["deploy_version"] = current_time_str("%Y%m%d%H%M%S") # 老版本如果slug信息有值,则 slug = app.get("slug", None) new_app["language"] = "" service_image = {} service_slug = {} share_slug_path = "" if slug: new_app["language"] = "" service_slug = self.__generate_slug_info() share_slug_path = slug.replace("/app_publish/", "") else: service_image["hub_url"] = "hub.goodrain.com" service_image["namespace"] = "goodrain" # 云市镜像存储 new_app["share_image"] = app["image"].replace( "goodrain.me", "hub.goodrain.com/goodrain") if share_slug_path: new_app["share_slug_path"] = share_slug_path new_app["service_image"] = service_image new_app["service_slug"] = service_slug new_app["version"] = app["version"] new_app["need_share"] = True new_app["service_key"] = app["service_key"] new_app["service_alias"] = "gr" + app["service_key"][-6:] new_app["extend_method"] = app["extend_method"] category = app["category"] new_app["category"] = category new_app[ "service_source"] = "source_code" if category == "appliaction" else "market" new_app["creater"] = app["creater"] new_app["tenant_id"] = app.get("tenant_id", "") new_app["service_region"] = region new_app["service_id"] = "" new_app["memory"] = app["min_memory"] new_app["image"] = app["image"] new_app["plugin_map_list"] = [] new_app["probes"] = [] # 扩展信息 new_app["extend_method_map"] = self.__v1_2_v2_extends_info(app) # 依赖信息 new_app["dep_service_map_list"] = self.__v1_2_v2_dependencies(app) # 端口信息 new_app["port_map_list"] = self.__v1_2_v2_ports(app) # 持久化信息 new_app["service_volume_map_list"] = self.__v1_2_v2_volumes(app) # 环境变量信息 service_env_map_list, service_connect_info_map_list = self.__v1_2_v2_envs( app) new_app["service_env_map_list"] = service_env_map_list new_app[ "service_connect_info_map_list"] = service_connect_info_map_list return new_app
def backup_group_apps(self, tenant, user, region, group_id, mode, note, force=False): s3_config = EnterpriseConfigService( tenant.enterprise_id).get_cloud_obj_storage_info() if mode == "full-online" and not s3_config: raise ErrObjectStorageInfoNotFound services = group_service.get_group_services(group_id) event_id = make_uuid() group_uuid = self.get_backup_group_uuid(group_id) total_memory, metadata = self.get_group_app_metadata(group_id, tenant) version = current_time_str("%Y%m%d%H%M%S") data = { "event_id": event_id, "group_id": group_uuid, "metadata": json.dumps(metadata), "service_ids": [s.service_id for s in services], "mode": mode, "version": version, "s3_config": s3_config, "force": force, } # 向数据中心发起备份任务 try: body = region_api.backup_group_apps(region, tenant.tenant_name, data) bean = body["bean"] record_data = { "group_id": group_id, "event_id": event_id, "group_uuid": group_uuid, "version": version, "team_id": tenant.tenant_id, "region": region, "status": bean["status"], "note": note, "mode": mode, "backup_id": bean.get("backup_id", ""), "source_dir": bean.get("source_dir", ""), "source_type": bean.get("source_type", ""), "backup_size": bean.get("backup_size", 0), "user": user.nick_name, "total_memory": total_memory, } return backup_record_repo.create_backup_records(**record_data) except region_api.CallApiError as e: logger.exception(e) if e.status == 401: raise ServiceHandleException(msg="backup failed", msg_show="有状态组件必须停止方可进行备份")
def save_market_app_template(self, app_templates): template_version = app_templates["template_version"] is_v1 = bool(template_version == "v1") if is_v1: v2_template = template_transform_service.v1_to_v2(app_templates) else: v2_template = app_templates rainbond_app = rainbond_app_repo.get_rainbond_app_by_key_and_version( v2_template["group_key"], v2_template["group_version"]) logger.debug("=========> {0}".format(json.dumps(v2_template))) if rainbond_app: if is_v1: rainbond_app.share_user = v2_template["share_user"] rainbond_app.share_team = v2_template["share_team"] rainbond_app.pic = v2_template["pic"] rainbond_app.describe = v2_template["describe"] rainbond_app.app_template = json.dumps(v2_template) rainbond_app.is_complete = True rainbond_app.update_time = current_time_str( "%Y-%m-%d %H:%M:%S") rainbond_app.save() else: user_name = v2_template.get("publish_user", None) user_id = 0 if user_name: try: user = user_repo.get_user_by_username(user_name) user_id = user.user_id except Exception as e: logger.exception(e) rainbond_app.share_user = user_id rainbond_app.share_team = v2_template.get("publish_team", "") rainbond_app.pic = v2_template.get("pic", rainbond_app.pic) rainbond_app.describe = v2_template.get( "update_note", rainbond_app.describe) rainbond_app.app_template = v2_template["template_content"] rainbond_app.is_complete = True rainbond_app.update_time = current_time_str( "%Y-%m-%d %H:%M:%S") rainbond_app.save()
def save_market_app_template(self, app_templates): v2_template = template_transform_service.v1_to_v2(app_templates) rainbond_app = rainbond_app_repo.get_rainbond_app_by_key_and_version( v2_template["group_key"], v2_template["group_version"]) if rainbond_app: rainbond_app.share_user = v2_template["share_user"] rainbond_app.share_team = v2_template["share_team"] rainbond_app.pic = v2_template["pic"] rainbond_app.describe = v2_template["describe"] rainbond_app.app_template = json.dumps(v2_template) rainbond_app.is_complete = True rainbond_app.update_time = current_time_str("%Y-%m-%d %H:%M:%S") rainbond_app.save()
def get(self, request, *args, **kwargs): """ 获取服务的构建版本 --- parameters: - name: tenantName description: 租户名 required: true type: string paramType: path - name: serviceAlias description: 服务别名 required: true type: string paramType: path """ try: body = region_api.get_service_build_versions(self.response_region, self.tenant.tenant_name, self.service.service_alias) events = event_repo.get_events_before_specify_time(self.tenant.tenant_id, self.service.service_id, current_time_str(fmt="%Y-%m-%d %H:%M:%S")).filter(type="deploy") version_user_map = {event.deploy_version: event.user_name for event in events} versions_info = body["list"] version_list = [] for info in versions_info: version_list.append({ "build_version": info["BuildVersion"], "kind": BUILD_KIND_MAP.get(info["Kind"]), "service_type": info["DeliveredType"], "image_url": info["ImageName"], "repo_url": info["RepoURL"], "commit_msg": info["CommitMsg"], "author": info["Author"], "create_time": info["CreatedAt"], "status": info["FinalStatus"], "build_user": version_user_map.get(info["BuildVersion"], "未知") }) res_versions = sorted(version_list, key=lambda version: version["build_version"], reverse=True) result = general_message(200, "success", "查询成功", list=res_versions) except Exception as e: logger.exception(e) result = error_message(e.message) return Response(result, status=result["code"])
def backup_group_apps(self, tenant, user, region, group_id, mode, note): service_slug = app_store.get_slug_connection_info("enterprise", tenant.tenant_name) service_image = app_store.get_image_connection_info("enterprise", tenant.tenant_name) if mode == "full-online" and not self.is_hub_info_configed(): return 412, "未配置hub仓库信息", None services = group_service.get_group_services(group_id) event_id = make_uuid() group_uuid = self.get_backup_group_uuid(group_id) total_memory, metadata = self.get_group_app_metadata(group_id, tenant) version = current_time_str("%Y%m%d%H%M%S") data = { "event_id": event_id, "group_id": group_uuid, "metadata": metadata, "service_ids": [s.service_id for s in services], "mode": mode, "version": version, "slug_info": service_slug, "image_info": service_image } # 向数据中心发起备份任务 body = region_api.backup_group_apps(region, tenant.tenant_name, data) bean = body["bean"] record_data = { "group_id": group_id, "event_id": event_id, "group_uuid": group_uuid, "version": version, "team_id": tenant.tenant_id, "region": region, "status": bean["status"], "note": note, "mode": mode, "backup_id": bean.get("backup_id", ""), "source_dir": bean.get("source_dir", ""), "source_type": bean.get("source_type", ""), "backup_size": bean.get("backup_size", 0), "user": user.nick_name, "total_memory": total_memory, "backup_server_info": json.dumps({ "slug_info": service_slug, "image_info": service_image }) } backup_record = backup_record_repo.create_backup_records(**record_data) return 200, "success", backup_record
def backup_group_apps(self, tenant, user, region, group_id, mode, note): s3_config = config_service.get_cloud_obj_storage_info() if mode == "full-online" and not s3_config: raise ErrObjectStorageInfoNotFound services = group_service.get_group_services(group_id) event_id = make_uuid() group_uuid = self.get_backup_group_uuid(group_id) total_memory, metadata = self.get_group_app_metadata(group_id, tenant) version = current_time_str("%Y%m%d%H%M%S") data = { "event_id": event_id, "group_id": group_uuid, "metadata": metadata, "service_ids": [s.service_id for s in services], "mode": mode, "version": version, "s3_config": s3_config, } # 向数据中心发起备份任务 body = region_api.backup_group_apps(region, tenant.tenant_name, data) bean = body["bean"] record_data = { "group_id": group_id, "event_id": event_id, "group_uuid": group_uuid, "version": version, "team_id": tenant.tenant_id, "region": region, "status": bean["status"], "note": note, "mode": mode, "backup_id": bean.get("backup_id", ""), "source_dir": bean.get("source_dir", ""), "source_type": bean.get("source_type", ""), "backup_size": bean.get("backup_size", 0), "user": user.nick_name, "total_memory": total_memory, } return backup_record_repo.create_backup_records(**record_data)
def get(self, request, *args, **kwargs): """ 获取服务的构建版本 --- parameters: - name: tenantName description: 租户名 required: true type: string paramType: path - name: serviceAlias description: 服务别名 required: true type: string paramType: path """ try: page = request.GET.get("page_num", 1) page_size = request.GET.get("page_size", 10) body = region_api.get_service_build_versions( self.response_region, self.tenant.tenant_name, self.service.service_alias) build_version_sort = body["list"] build_version_sort.sort(key=operator.itemgetter('BuildVersion'), reverse=True) paginator = Paginator(build_version_sort, page_size) build_version_list = paginator.page(int(page)).object_list events = event_repo.get_events_before_specify_time( self.tenant.tenant_id, self.service.service_id, current_time_str(fmt="%Y-%m-%d %H:%M:%S")).filter( type="deploy") version_user_map = { event.deploy_version: event.user_name for event in events } versions_info = build_version_list version_list = [] for info in versions_info: version_list.append({ "build_version": info["BuildVersion"], "kind": BUILD_KIND_MAP.get(info["Kind"]), "service_type": info["DeliveredType"], "image_url": info["ImageName"], "repo_url": info["RepoURL"], "commit_msg": info["CommitMsg"], "author": info["Author"], "create_time": info["CreatedAt"], "status": info["FinalStatus"], "build_user": version_user_map.get(info["BuildVersion"], "未知") }) res_versions = sorted(version_list, key=lambda version: version["build_version"], reverse=True) # try: # result = paginator.page(page).object_list # except PageNotAnInteger: # result = paginator.page(1).object_list # except EmptyPage: # result = paginator.page(paginator.num_pages).object_list result = general_message(200, "success", "查询成功", list=res_versions, total=paginator.count) return Response(result, status=result["code"]) except Exception as e: result = error_message(e.message) return Response(result, status=500)
def get(self, request, *args, **kwargs): """ 获取服务的构建版本 --- parameters: - name: tenantName description: 租户名 required: true type: string paramType: path - name: serviceAlias description: 服务别名 required: true type: string paramType: path """ try: page = request.GET.get("page_num", 1) page_size = request.GET.get("page_size", 10) body = region_api.get_service_build_versions( self.response_region, self.tenant.tenant_name, self.service.service_alias) logger.debug('---------body------>{0}'.format(body)) build_version_sort = body["bean"]["list"] run_version = body["bean"]["deploy_version"] total_num_list = list() for build_version_info in build_version_sort: if build_version_info["FinalStatus"] in ("success", "failure"): total_num_list.append(build_version_info) total_num = len(total_num_list) success_num = 0 failure_num = 0 for build_info in build_version_sort: if build_info["FinalStatus"]: if build_info["FinalStatus"] == "success": success_num += 1 else: failure_num += 1 logger.debug( '---------------build_version_sort---------->{0}'.format( build_version_sort)) build_version_sort.sort(key=operator.itemgetter('BuildVersion'), reverse=True) paginator = Paginator(build_version_sort, page_size) build_version_list = paginator.page(int(page)).object_list events = event_repo.get_events_before_specify_time( self.tenant.tenant_id, self.service.service_id, current_time_str(fmt="%Y-%m-%d %H:%M:%S")).filter( type="deploy") version_user_map = { event.event_id: event.user_name for event in events } versions_info = build_version_list version_list = [] for info in versions_info: version_list.append({ "build_version": info["BuildVersion"], "kind": BUILD_KIND_MAP.get(info["Kind"]), "service_type": info["DeliveredType"], "image_url": info["ImageName"], "repo_url": info["RepoURL"], "commit_msg": info["CommitMsg"], "author": info["Author"], "create_time": info["CreatedAt"], "status": info["FinalStatus"], "build_user": version_user_map.get(info["EventID"], "未知") }) res_versions = sorted(version_list, key=lambda version: version["build_version"], reverse=True) for res_version in res_versions: # get deploy version from region if int(res_version["build_version"]) > int(run_version): upgrade_or_rollback = 1 elif int(res_version["build_version"]) == int(run_version): upgrade_or_rollback = 0 else: upgrade_or_rollback = -1 res_version.update( {"upgrade_or_rollback": upgrade_or_rollback}) # try: # result = paginator.page(page).object_list # except PageNotAnInteger: # result = paginator.page(1).object_list # except EmptyPage: # result = paginator.page(paginator.num_pages).object_list is_upgrade = False if res_versions: latest_version = res_versions[0]["build_version"] if int(latest_version) > int(run_version): is_upgrade = True bean = { "is_upgrade": is_upgrade, "current_version": run_version, "success_num": str(success_num), "failure_num": str(failure_num) } result = general_message(200, "success", "查询成功", bean=bean, list=res_versions, total=str(total_num)) return Response(result, status=result["code"]) except Exception as e: logger.exception(e) result = error_message(e.message) return Response(result, status=500)