def sync_app_services(self, tenant, region_name, app_id): group_services = base_service.get_group_services_list( tenant.tenant_id, region_name, app_id) service_ids = [] if group_services: for service in group_services: service_ids.append(service["service_id"]) try: region_app_id = region_app_repo.get_region_app_id( region_name, app_id) body = {"service_ids": service_ids} region_api.batch_update_service_app_id(region_name, tenant.tenant_name, region_app_id, body) except RegionApp.DoesNotExist: app = group_repo.get_group_by_id(app_id) create_body = { "app_name": app.group_name, "service_ids": service_ids } bean = region_api.create_application(region_name, tenant, create_body) req = { "region_name": region_name, "region_app_id": bean["app_id"], "app_id": app_id } region_app_repo.create(**req)
def get_group_service_by_group_id(self, group_id, region_name, team_id, team_name, enterprise_id, query=""): group_services_list = base_service.get_group_services_list(team_id, region_name, group_id, query) if not group_services_list: return [] service_ids = [service.service_id for service in group_services_list] status_list = base_service.status_multi_service(region_name, team_name, service_ids, enterprise_id) status_cache = {} statuscn_cache = {} for status in status_list: status_cache[status["service_id"]] = status["status"] statuscn_cache[status["service_id"]] = status["status_cn"] result = [] for service in group_services_list: service_obj = TenantServiceInfo.objects.filter(service_id=service["service_id"]).first() if service_obj: service["service_source"] = service_obj.service_source service["status_cn"] = statuscn_cache.get(service["service_id"], "未知") status = status_cache.get(service["service_id"], "unknow") if status == "unknow" and service["create_status"] != "complete": service["status"] = "creating" service["status_cn"] = "创建中" else: service["status"] = status_cache.get(service["service_id"], "unknow") if service["status"] == "closed" or service["status"] == "undeploy": service["min_memory"] = 0 status_map = get_status_info_map(service["status"]) service.update(status_map) result.append(service) return result
def build_services(self, user, tenant, region_name, group_id, change_services_map): group_services = base_service.get_group_services_list( tenant.tenant_id, region_name, group_id) change_service_ids = [ change_service["ServiceID"] for change_service in change_services_map.values() ] if not group_services: return [] service_ids = [ group_service.get("service_id") for group_service in group_services ] services = service_repo.get_service_by_service_ids( service_ids=service_ids) for service in services: if service.service_id in change_service_ids: # probe = None if service.service_source == "third_party": # 数据中心连接创建第三方组件 new_service = app_service.create_third_party_service( tenant, service, user.nick_name) else: # 数据中心创建组件 new_service = app_service.create_region_service( tenant, service, user.nick_name) service = new_service # 为组件添加默认探针 if self.is_need_to_add_default_probe(service): code, msg, probe = app_service.add_service_default_porbe( tenant, service) logger.debug("add default probe; code: {}; msg: {}".format( code, msg)) # 添加组件有无状态标签 label_service.update_service_state_label(tenant, service) # 部署组件 app_manage_service.deploy(tenant, service, user, group_version=None) # 添加组件部署关系 deploy_repo.create_deploy_relation_by_service_id( service_id=service.service_id)
def get_group_services_with_build_source(self, tenant, region_name, group_id): group_services = base_service.get_group_services_list( tenant.tenant_id, region_name, group_id) if not group_services: return [] service_ids = [ group_service.get("service_id") for group_service in group_services ] build_infos = base_service.get_build_infos(tenant, service_ids) for group_service in group_services: group_service["app_name"] = group_service.get("group_name") if build_infos.get(group_service["service_id"], None): group_service["build_source"] = build_infos[ group_service["service_id"]] group_service["build_source"]["service_id"] = group_service[ "service_id"] return group_services
def get_group_services_with_build_source(self, tenant, region_name, group_id): group_services = base_service.get_group_services_list( tenant.tenant_id, region_name, group_id) if not group_services: return [] service_ids = [ group_service.get("service_id") for group_service in group_services ] services = service_repo.get_service_by_service_ids( service_ids=service_ids) for group_service in group_services: for service in services: if group_service["service_id"] == service.service_id: group_service[ "build_source"] = base_service.get_build_info( tenant, service) group_service["build_source"][ "service_id"] = service.service_id return group_services
def get_group_service_by_group_id(self, group_id, region_name, team_id, team_name, enterprise_id): group_services_list = base_service.get_group_services_list( team_id=team_id, region_name=region_name, group_id=group_id) if group_services_list: service_ids = [ service.service_id for service in group_services_list ] status_list = base_service.status_multi_service( region=region_name, tenant_name=team_name, service_ids=service_ids, enterprise_id=enterprise_id) status_cache = {} statuscn_cache = {} for status in status_list: status_cache[status["service_id"]] = status["status"] statuscn_cache[status["service_id"]] = status["status_cn"] result = [] for service in group_services_list: service["status_cn"] = statuscn_cache.get( service["service_id"], "未知") status = status_cache.get(service["service_id"], "unknow") if status == "unknow" and service[ "create_status"] != "complete": service["status"] = "creating" service["status_cn"] = "创建中" else: service["status"] = status_cache.get( service["service_id"], "unknow") if service["status"] == "closed" or service[ "status"] == "undeploy": service["min_memory"] = 0 status_map = get_status_info_map(service["status"]) service.update(status_map) result.append(service) return result else: return []
def build_services(self, user, tenant, region_name, group_id, change_services_map): group_services = base_service.get_group_services_list( tenant.tenant_id, region_name, group_id) change_service_ids = [ change_service["ServiceID"] for change_service in list(change_services_map.values()) ] if not group_services: return [] service_ids = [ group_service.get("service_id") for group_service in group_services ] services = service_repo.get_service_by_service_ids( service_ids=service_ids) result = [] for service in services: if service.service_id in change_service_ids: if service.service_source == "third_party": # 数据中心连接创建第三方组件 new_service = app_service.create_third_party_service( tenant, service, user.nick_name) else: # 数据中心创建组件 new_service = app_service.create_region_service( tenant, service, user.nick_name) service = new_service # 为组件添加默认探针 if self.is_need_to_add_default_probe(service): code, msg, probe = app_service.add_service_default_porbe( tenant, service) logger.debug("add default probe; code: {}; msg: {}".format( code, msg)) else: probes = probe_repo.get_service_probe(service.service_id) if probes: for probe in probes: prob_data = { "service_id": service.service_id, "scheme": probe.scheme, "path": probe.path, "port": probe.port, "cmd": probe.cmd, "http_header": probe.http_header, "initial_delay_second": probe.initial_delay_second, "period_second": probe.period_second, "timeout_second": probe.timeout_second, "failure_threshold": probe.failure_threshold, "success_threshold": probe.success_threshold, "is_used": (1 if probe.is_used else 0), "probe_id": probe.probe_id, "mode": probe.mode, } try: res, body = region_api.add_service_probe( service.service_region, tenant.tenant_name, service.service_alias, prob_data) if res.get("status") != 200: logger.debug(body) probe.delete() except Exception as e: logger.debug("error", e) probe.delete() # 添加组件有无状态标签 label_service.update_service_state_label(tenant, service) # 部署组件 app_manage_service.deploy(tenant, service, user, group_version=None) # 添加组件部署关系 deploy_repo.create_deploy_relation_by_service_id( service_id=service.service_id) result.append(service) # 为组件创建插件 build_error_plugin_ids = [] service_plugins = app_plugin_relation_repo.get_service_plugin_relation_by_service_id( service.service_id) for service_plugin in service_plugins: plugin = plugin_repo.get_by_plugin_id( tenant.tenant_id, service_plugin.plugin_id) plugin_version = plugin_repo.get_plugin_buildversion( service_plugin.plugin_id, service_plugin.build_version) # 在数据中心创建插件 try: event_id = make_uuid() plugin_version.event_id = event_id image_tag = (plugin_version.image_tag if plugin_version.image_tag else "latest") plugin_service.create_region_plugin( region_name, tenant, plugin, image_tag=image_tag) ret = plugin_service.build_plugin( region_name, plugin, plugin_version, user, tenant, event_id) plugin_version.build_status = ret.get('bean').get( 'status') plugin_version.save() except Exception as e: logger.debug(e) # 为组件开通插件 try: region_config = app_plugin_service.get_region_config_from_db( service, service_plugin.plugin_id, service_plugin.build_version) data = dict() data["plugin_id"] = service_plugin.plugin_id data["switch"] = True data["version_id"] = service_plugin.build_version data.update(region_config) region_api.install_service_plugin( region_name, tenant.tenant_name, service.service_alias, data) except region_api.CallApiError as e: logger.debug(e) build_error_plugin_ids.append(service_plugin.plugin_id) if build_error_plugin_ids: app_plugin_relation_repo.get_service_plugin_relation_by_service_id( service.service_id).filter( plugin_id__in=build_error_plugin_ids).delete() # create service_monitor in region service_monitors = service_monitor_repo.get_component_service_monitors( tenant.tenant_id, service.service_id) for monitor in service_monitors: req = { "name": monitor.name, "path": monitor.path, "port": monitor.port, "service_show_name": monitor.service_show_name, "interval": monitor.interval } try: region_api.create_service_monitor( tenant.enterprise_id, service.service_region, tenant.tenant_name, service.service_alias, req) except region_api.CallApiError as e: ServiceMonitor.objects.filter( tenant_id=tenant.tenant_id, service_id=service.service_id, name=monitor.name).delete() logger.debug(e) return result
def build_services(self, user, tenant, region_name, group_id, change_services_map): group_services = base_service.get_group_services_list( tenant.tenant_id, region_name, group_id) change_service_ids = [ change_service["ServiceID"] for change_service in list(change_services_map.values()) ] if not group_services: return [] service_ids = [ group_service.get("service_id") for group_service in group_services ] services = service_repo.list_by_component_ids(service_ids=service_ids) result = [] for service in services: if service.service_id in change_service_ids: if service.service_source == "third_party": # 数据中心连接创建第三方组件 new_service = app_service.create_third_party_service( tenant, service, user.nick_name) else: # 数据中心创建组件 new_service = app_service.create_region_service( tenant, service, user.nick_name) service = new_service # 部署组件 app_manage_service.deploy(tenant, service, user, group_version=None) # 添加组件部署关系 deploy_repo.create_deploy_relation_by_service_id( service_id=service.service_id) result.append(service) # 为组件创建插件 build_error_plugin_ids = [] service_plugins = app_plugin_relation_repo.get_service_plugin_relation_by_service_id( service.service_id) for service_plugin in service_plugins: plugin = plugin_repo.get_by_plugin_id( tenant.tenant_id, service_plugin.plugin_id) plugin_version = plugin_repo.get_plugin_buildversion( service_plugin.plugin_id, service_plugin.build_version) # 在数据中心创建插件 try: event_id = make_uuid() plugin_version.event_id = event_id image_tag = (plugin_version.image_tag if plugin_version.image_tag else "latest") plugin_service.create_region_plugin( region_name, tenant, plugin, image_tag=image_tag) ret = plugin_service.build_plugin( region_name, plugin, plugin_version, user, tenant, event_id) plugin_version.build_status = ret.get('bean').get( 'status') plugin_version.save() except Exception as e: logger.debug(e) # 为组件开通插件 try: region_config = app_plugin_service.get_region_config_from_db( service, service_plugin.plugin_id, service_plugin.build_version) data = dict() data["plugin_id"] = service_plugin.plugin_id data["switch"] = True data["version_id"] = service_plugin.build_version data["plugin_cpu"] = service_plugin.min_cpu data["plugin_memory"] = service_plugin.min_memory data.update(region_config) region_api.install_service_plugin( region_name, tenant.tenant_name, service.service_alias, data) except region_api.CallApiError as e: logger.debug(e) build_error_plugin_ids.append(service_plugin.plugin_id) if build_error_plugin_ids: app_plugin_relation_repo.get_service_plugin_relation_by_service_id( service.service_id).filter( plugin_id__in=build_error_plugin_ids).delete() return result
def get(self, request, *args, **kwargs): """ 总览 团队信息 --- parameters: - name: team_name description: 团队名 required: true type: string paramType: path """ overview_detail = dict() users = team_services.get_team_users(self.team) if users: user_nums = len(users) overview_detail["user_nums"] = user_nums team_service_num = service_repo.get_team_service_num_by_team_id( team_id=self.team.tenant_id, region_name=self.response_region) source = common_services.get_current_region_used_resource(self.team, self.response_region) # 获取tcp和http策略数量 region = region_repo.get_region_by_region_name(self.response_region) if not region: overview_detail["region_health"] = False return Response(general_message(200, "success", "查询成功", bean=overview_detail)) total_tcp_domain = tcp_domain.get_all_domain_count_by_tenant_and_region(self.team.tenant_id, region.region_id) overview_detail["total_tcp_domain"] = total_tcp_domain total_http_domain = domain_repo.get_all_domain_count_by_tenant_and_region_id(self.team.tenant_id, region.region_id) overview_detail["total_http_domain"] = total_http_domain # 获取分享应用数量 groups = group_repo.get_tenant_region_groups(self.team.tenant_id, region.region_name) share_app_num = 0 batch_create_app_body = [] if groups: for group in groups: share_record = share_repo.get_service_share_record_by_groupid(group_id=group.ID) if share_record and share_record.step == 3: share_app_num += 1 try: region_app_repo.get_region_app_id(region.region_name, group.ID) except RegionApp.DoesNotExist: create_app_body = dict() group_services = base_service.get_group_services_list(self.team.tenant_id, region.region_name, group.ID) service_ids = [] if group_services: service_ids = [service["service_id"] for service in group_services] create_app_body["app_name"] = group.group_name create_app_body["console_app_id"] = group.ID create_app_body["service_ids"] = service_ids batch_create_app_body.append(create_app_body) if len(batch_create_app_body) > 0: try: body = {"apps_info": batch_create_app_body} applist = region_api.batch_create_application(region.region_name, self.tenant_name, body) app_list = [] if applist: for app in applist: data = RegionApp( app_id=app["app_id"], region_app_id=app["region_app_id"], region_name=region.region_name) app_list.append(data) RegionApp.objects.bulk_create(app_list) except Exception as e: logger.exception(e) team_app_num = group_repo.get_tenant_region_groups_count(self.team.tenant_id, self.response_region) overview_detail["share_app_num"] = share_app_num overview_detail["team_app_num"] = team_app_num overview_detail["team_service_num"] = team_service_num overview_detail["eid"] = self.team.enterprise_id overview_detail["team_service_memory_count"] = 0 overview_detail["team_service_total_disk"] = 0 overview_detail["team_service_total_cpu"] = 0 overview_detail["team_service_total_memory"] = 0 overview_detail["team_service_use_cpu"] = 0 overview_detail["cpu_usage"] = 0 overview_detail["memory_usage"] = 0 if source: try: overview_detail["region_health"] = True overview_detail["team_service_memory_count"] = int(source["memory"]) overview_detail["team_service_total_disk"] = int(source["disk"]) overview_detail["team_service_total_cpu"] = int(source["limit_cpu"]) overview_detail["team_service_total_memory"] = int(source["limit_memory"]) overview_detail["team_service_use_cpu"] = int(source["cpu"]) cpu_usage = 0 memory_usage = 0 if int(source["limit_cpu"]) != 0: cpu_usage = float(int(source["cpu"])) / float(int(source["limit_cpu"])) * 100 if int(source["limit_memory"]) != 0: memory_usage = float(int(source["memory"])) / float(int(source["limit_memory"])) * 100 overview_detail["cpu_usage"] = round(cpu_usage, 2) overview_detail["memory_usage"] = round(memory_usage, 2) except Exception as e: logger.debug(source) logger.exception(e) else: overview_detail["region_health"] = False return Response(general_message(200, "success", "查询成功", bean=overview_detail)) else: data = {"user_nums": 1, "team_service_num": 0, "total_memory": 0, "eid": self.team.enterprise_id} result = general_message(200, "success", "团队信息总览获取成功", bean=data) return Response(result, status=200)