def get_service_mnt_details(self, tenant, service, volume_types, page=1, page_size=20): all_mnt_relations = mnt_repo.get_service_mnts_filter_volume_type(tenant.tenant_id, service.service_id, volume_types) total = len(all_mnt_relations) mnt_paginator = JuncheePaginator(all_mnt_relations, int(page_size)) mnt_relations = mnt_paginator.page(page) mounted_dependencies = [] if mnt_relations: for mount in mnt_relations: dep_service = service_repo.get_service_by_service_id(mount.dep_service_id) if dep_service: gs_rel = group_service_relation_repo.get_group_by_service_id(dep_service.service_id) group = None if gs_rel: group = group_repo.get_group_by_pk(tenant.tenant_id, service.service_region, gs_rel.group_id) dep_volume = volume_repo.get_service_volume_by_name(dep_service.service_id, mount.mnt_name) if dep_volume: mounted_dependencies.append({ "local_vol_path": mount.mnt_dir, "dep_vol_name": dep_volume.volume_name, "dep_vol_path": dep_volume.volume_path, "dep_vol_type": dep_volume.volume_type, "dep_app_name": dep_service.service_cname, "dep_app_group": group.group_name if group else '未分组', "dep_vol_id": dep_volume.ID, "dep_group_id": group.ID if group else -1, "dep_app_alias": dep_service.service_alias }) return mounted_dependencies, total
def get(self, request, *args, **kwargs): # 获取单个tcp/udp策略信息 try: tcp_rule_id = request.GET.get("tcp_rule_id", None) # 判断参数 if not tcp_rule_id: return Response(general_message(400, "parameters are missing", "参数缺失"), status=400) tcpdomain = tcp_domain.get_service_tcpdomain_by_tcp_rule_id(tcp_rule_id) if tcpdomain: bean = tcpdomain.to_dict() service = service_repo.get_service_by_service_id(tcpdomain.service_id) service_alias = service.service_cname if service else '' group_name = '' g_id = 0 if service: gsr = group_service_relation_repo.get_group_by_service_id(service.service_id) if gsr: group = group_repo.get_group_by_id(int(gsr.group_id)) group_name = group.group_name if group else '' g_id = int(gsr.group_id) bean.update({"service_alias": service_alias}) bean.update({"group_name": group_name}) bean.update({"g_id": g_id}) result = general_message(200, "success", "查询成功", bean=bean) else: bean = dict() result = general_message(200, "success", "查询成功", bean=bean) except Exception as e: logger.exception(e) result = error_message(e.message) return Response(result, status=result["code"])
def get_service_unmnt_details(self, tenant, service, service_ids, page, page_size): services = service_repo.get_services_by_service_ids(*service_ids) current_tenant_services_id = service_ids # 已挂载的服务路径 dep_mnt_names = mnt_repo.get_service_mnts( tenant.tenant_id, service.service_id).values_list('mnt_name', flat=True) # 当前未被挂载的共享路径 service_volumes = volume_repo.get_services_volumes( current_tenant_services_id).filter( volume_type__in=[self.SHARE, self.CONFIG]).exclude( service_id=service.service_id).exclude( volume_name__in=dep_mnt_names) # 只展示无状态的服务组件(有状态服务的存储类型为config-file也可) logger.debug('----------volumes----->{0}'.format( type(service_volumes))) volumes = list(service_volumes) for volume in volumes: service_obj = service_repo.get_service_by_service_id( volume.service_id) if service_obj: if service_obj.extend_method != "stateless" and volume.volume_type != "config-file": volumes.remove(volume) total = len(volumes) volume_paginator = JuncheePaginator(volumes, int(page_size)) page_volumes = volume_paginator.page(page) un_mount_dependencies = [] for volume in page_volumes: gs_rel = group_service_relation_repo.get_group_by_service_id( volume.service_id) group = None if gs_rel: group = group_repo.get_group_by_pk(tenant.tenant_id, service.service_region, gs_rel.group_id) un_mount_dependencies.append({ "dep_app_name": services.get(service_id=volume.service_id).service_cname, "dep_app_group": group.group_name if group else '未分组', "dep_vol_name": volume.volume_name, "dep_vol_path": volume.volume_path, "dep_vol_type": volume.volume_type, "dep_vol_id": volume.ID, "dep_group_id": group.ID if group else -1, "dep_app_alias": services.get(service_id=volume.service_id).service_alias }) return un_mount_dependencies, total
def update_or_create_service_group_relation(self, tenant, service, group_id): gsr = group_service_relation_repo.get_group_by_service_id(service.service_id) if gsr: gsr.group_id = group_id gsr.save() else: params = {"service_id": service.service_id, "group_id": group_id, "tenant_id": tenant.tenant_id, "region_name": service.service_region} group_service_relation_repo.create_service_group_relation(**params) return 200, "success"
def get_service_unmnt_details(self, tenant, service, service_ids, page, page_size, q): services = service_repo.get_services_by_service_ids(service_ids) current_tenant_services_id = service_ids # 已挂载的组件路径 dep_mnts = mnt_repo.get_service_mnts(tenant.tenant_id, service.service_id) dep_volume_ids = [dep_mnt.volume_id for dep_mnt in dep_mnts] # 当前未被挂载的共享路径 service_volumes = volume_repo.get_services_volumes(current_tenant_services_id) \ .filter(volume_type__in=[self.SHARE, self.CONFIG]) \ .exclude(service_id=service.service_id) \ .exclude(ID__in=dep_volume_ids).filter(q) # 只展示无状态的组件(有状态组件的存储类型为config-file也可) volumes = list(service_volumes) copy_volumes = copy.copy(volumes) for volume in copy_volumes: service_obj = service_repo.get_service_by_service_id( volume.service_id) if service_obj: if is_state(service_obj.extend_method): if volume.volume_type != "config-file": volumes.remove(volume) total = len(volumes) volume_paginator = JuncheePaginator(volumes, int(page_size)) page_volumes = volume_paginator.page(page) un_mount_dependencies = [] for volume in page_volumes: gs_rel = group_service_relation_repo.get_group_by_service_id( volume.service_id) group = None if gs_rel: group = group_repo.get_group_by_pk(tenant.tenant_id, service.service_region, gs_rel.group_id) un_mount_dependencies.append({ "dep_app_name": services.get(service_id=volume.service_id).service_cname, "dep_app_group": group.group_name if group else '未分组', "dep_vol_name": volume.volume_name, "dep_vol_path": volume.volume_path, "dep_vol_type": volume.volume_type, "dep_vol_id": volume.ID, "dep_group_id": group.ID if group else -1, "dep_app_alias": services.get(service_id=volume.service_id).service_alias }) return un_mount_dependencies, total
def get_service_unmount_volume_list(self, tenant, service, service_ids, page, page_size, is_config=False): """ 1. 获取租户下其他所有组件列表,方便后续进行名称的冗余 2. 获取其他组件的所有可共享的存储 3. 获取已经使用的存储,方便后续过滤 4. 遍历存储,组装信息 """ for serviceID in service_ids: if serviceID == service.service_id: service_ids.remove(serviceID) services = service_repo.get_services_by_service_ids(service_ids) state_services = [] # 有状态组件 for svc in services: if is_state(svc.extend_method): state_services.append(svc) state_service_ids = [svc.service_id for svc in state_services] current_tenant_services_id = service_ids # 已挂载的组件路径 mounted = mnt_repo.get_service_mnts(tenant.tenant_id, service.service_id) mounted_ids = [mnt.volume_id for mnt in mounted] # 当前未被挂载的共享路径 service_volumes = [] # 配置文件无论组件是否是共享存储都可以共享,只需过滤掉已经挂载的存储;其他存储类型则需要考虑排除有状态组件的存储 if is_config: service_volumes = volume_repo.get_services_volumes(current_tenant_services_id).filter(volume_type=self.CONFIG) \ .exclude(ID__in=mounted_ids) else: service_volumes = volume_repo.get_services_volumes(current_tenant_services_id).filter(volume_type=self.SHARE) \ .exclude(ID__in=mounted_ids).exclude(service_id__in=state_service_ids) # TODO 使用函数进行存储的排查,确定哪些存储不可以进行共享,哪些存储可以共享,而不是现在这样简单的提供一个self.SHARE total = len(service_volumes) volume_paginator = JuncheePaginator(service_volumes, int(page_size)) page_volumes = volume_paginator.page(page) un_mount_dependencies = [] for volume in page_volumes: gs_rel = group_service_relation_repo.get_group_by_service_id(volume.service_id) group = None if gs_rel: group = group_repo.get_group_by_pk(tenant.tenant_id, service.service_region, gs_rel.group_id) un_mount_dependencies.append({ "dep_app_name": services.get(service_id=volume.service_id).service_cname, "dep_app_group": group.group_name if group else '未分组', "dep_vol_name": volume.volume_name, "dep_vol_path": volume.volume_path, "dep_vol_type": volume.volume_type, "dep_vol_id": volume.ID, "dep_group_id": group.ID if group else -1, "dep_app_alias": services.get(service_id=volume.service_id).service_alias }) return un_mount_dependencies, total
def get_service_unmnt_details(self, tenant, service, service_ids, page, page_size): services = service_repo.get_services_by_service_ids(*service_ids) current_tenant_services_id = service_ids # 已挂载的服务路径 dep_mnt_names = mnt_repo.get_service_mnts( tenant.tenant_id, service.service_id).values_list('mnt_name', flat=True) # 当前未被挂载的共享路径 volumes = volume_repo.get_services_volumes( current_tenant_services_id).filter(volume_type=self.SHARE).exclude( service_id=service.service_id).exclude( volume_name__in=dep_mnt_names) total = len(volumes) volume_paginator = JuncheePaginator(volumes, int(page_size)) page_volumes = volume_paginator.page(page) un_mount_dependencies = [] for volume in page_volumes: gs_rel = group_service_relation_repo.get_group_by_service_id( volume.service_id) group = None if gs_rel: group = group_repo.get_group_by_pk(tenant.tenant_id, service.service_region, gs_rel.group_id) un_mount_dependencies.append({ "dep_app_name": services.get(service_id=volume.service_id).service_cname, "dep_app_group": group.group_name if group else '未分组', "dep_vol_name": volume.volume_name, "dep_vol_path": volume.volume_path, "dep_vol_type": volume.volume_type, "dep_vol_id": volume.ID, "dep_group_id": group.ID if group else -1, "dep_app_alias": services.get(service_id=volume.service_id).service_alias }) return un_mount_dependencies, total
def get(self, request, *args, **kwargs): """ 获取单个http策略 """ try: http_rule_id = request.GET.get("http_rule_id", None) # 判断参数 if not http_rule_id: return Response(general_message(400, "parameters are missing", "参数缺失"), status=400) domain = domain_repo.get_service_domain_by_http_rule_id( http_rule_id) if domain: bean = domain.to_dict() if domain.certificate_id: certificate_info = domain_repo.get_certificate_by_pk( int(domain.certificate_id)) service = service_repo.get_service_by_service_id( domain.service_id) service_alias = service.service_cname if service else '' group_name = '' if service: gsr = group_service_relation_repo.get_group_by_service_id( service.service_id) group = group_repo.get_group_by_id(int(gsr.group_id)) group_name = group.group_name if group else '' bean.update({"certificate_name": certificate_info.alias}) bean.update({"service_alias": service_alias}) bean.update({"group_name": group_name}) else: bean = dict() result = general_message(200, "success", "查询成功", bean=bean) except Exception as e: logger.exception(e) result = error_message(e.message) return Response(result, status=result["code"])
def get(self, request, tenantName, *args, **kwargs): try: page = int(request.GET.get("page", 1)) page_size = int(request.GET.get("page_size", 10)) search_conditions = request.GET.get("search_conditions", None) tenant = team_services.get_tenant_by_tenant_name(tenantName) region = region_repo.get_region_by_region_name(self.response_region) total = tcp_domain.get_all_domain_count_by_tenant_and_region(tenant.tenant_id, region.region_id) start = (page - 1) * page_size remaining_num = total - (page - 1) * page_size end = page_size if remaining_num < page_size: end = remaining_num try: # 查询分页排序 if search_conditions: cursor = connection.cursor() cursor.execute( "select end_point, type, protocol, service_name, service_alias, container_port, tcp_rule_id, service_id, is_outer_service from service_tcp_domain where tenant_id='{0}' and region_id='{1}' and end_point like '%{2}%' or service_alias like '%{3}%' or group_name like '%{4}%' order by type desc LIMIT {5},{6};".format( tenant.tenant_id, region.region_id, search_conditions, search_conditions, search_conditions, start, end)) tenant_tuples = cursor.fetchall() else: cursor = connection.cursor() cursor.execute( "select end_point, type, protocol, service_name, service_alias, container_port, tcp_rule_id, service_id, is_outer_service from service_tcp_domain where tenant_id='{0}' and region_id='{1}' order by type desc LIMIT {2},{3};".format( tenant.tenant_id, region.region_id, start, end)) tenant_tuples = cursor.fetchall() except Exception as e: logger.exception(e) result = general_message(405, "faild", "查询数据库失败") return Response(result) # 拼接展示数据 domain_list = list() for tenant_tuple in tenant_tuples: service = service_repo.get_service_by_service_id(tenant_tuple[7]) service_alias = service.service_cname if service else '' group_name = '' group_id = 0 if service: gsr = group_service_relation_repo.get_group_by_service_id(service.service_id) if gsr: group = group_repo.get_group_by_id(int(gsr.group_id)) group_name = group.group_name if group else '' group_id = int(gsr.group_id) domain_dict = dict() domain_dict["end_point"] = tenant_tuple[0] domain_dict["type"] = tenant_tuple[1] domain_dict["protocol"] = tenant_tuple[2] domain_dict["group_name"] = group_name domain_dict["service_alias"] = tenant_tuple[3] domain_dict["container_port"] = tenant_tuple[5] domain_dict["service_cname"] = service_alias domain_dict["tcp_rule_id"] = tenant_tuple[6] domain_dict["service_id"] = tenant_tuple[7] domain_dict["is_outer_service"] = tenant_tuple[8] domain_dict["group_id"] = group_id domain_list.append(domain_dict) bean = dict() bean["total"] = total result = general_message(200, "success", "查询成功", list=domain_list, bean=bean) except Exception as e: logger.exception(e) result = error_message(e.message) return Response(result)
def get(self, request, tenantName, *args, **kwargs): try: page = int(request.GET.get("page", 1)) page_size = int(request.GET.get("page_size", 10)) search_conditions = request.GET.get("search_conditions", None) tenant = team_services.get_tenant_by_tenant_name(tenantName) region = region_repo.get_region_by_region_name( self.response_region) total = domain_repo.get_all_domain_count_by_tenant_and_region_id( tenant.tenant_id, region.region_id) start = (page - 1) * page_size remaining_num = total - (page - 1) * page_size end = page_size if remaining_num < page_size: end = remaining_num try: # 查询分页排序 if search_conditions: cursor = connection.cursor() cursor.execute( "select domain_name, type, is_senior, certificate_id, group_name, service_alias, protocol, service_name, container_port, http_rule_id, service_id, domain_path, domain_cookie, domain_heander, the_weight, is_outer_service, g_id from service_domain where tenant_id='{0}' and region_id='{1}' and domain_name like '%{2}%' or service_alias like '%{3}%' or group_name like '%{4}%' order by type desc LIMIT {5},{6};" .format(tenant.tenant_id, region.region_id, search_conditions, search_conditions, search_conditions, start, end)) tenant_tuples = cursor.fetchall() else: cursor = connection.cursor() cursor.execute( "select domain_name, type, is_senior, certificate_id, group_name, service_alias, protocol, service_name, container_port, http_rule_id, service_id, domain_path, domain_cookie, domain_heander, the_weight, is_outer_service, g_id from service_domain where tenant_id='{0}' and region_id='{1}' order by type desc LIMIT {2},{3};" .format(tenant.tenant_id, region.region_id, start, end)) tenant_tuples = cursor.fetchall() except Exception as e: logger.exception(e) result = general_message(405, "faild", "查询数据库失败") return Response(result) # 拼接展示数据 domain_list = list() for tenant_tuple in tenant_tuples: service = service_repo.get_service_by_service_id( tenant_tuple[10]) service_alias = service.service_cname if service else '' group_name = '' if service: gsr = group_service_relation_repo.get_group_by_service_id( service.service_id) group = group_repo.get_group_by_id(int(gsr.group_id)) group_name = group.group_name if group else '' domain_dict = dict() certificate_info = domain_repo.get_certificate_by_pk( int(tenant_tuple[3])) if not certificate_info: domain_dict["certificate_alias"] = '' else: domain_dict["certificate_alias"] = certificate_info.alias domain_dict[ "domain_name"] = tenant_tuple[6] + "://" + tenant_tuple[0] domain_dict["type"] = tenant_tuple[1] domain_dict["is_senior"] = tenant_tuple[2] domain_dict["group_name"] = group_name domain_dict["service_cname"] = service_alias domain_dict["service_alias"] = tenant_tuple[7] domain_dict["container_port"] = tenant_tuple[8] domain_dict["http_rule_id"] = tenant_tuple[9] domain_dict["service_id"] = tenant_tuple[10] domain_dict["domain_path"] = tenant_tuple[11] domain_dict["domain_cookie"] = tenant_tuple[12] domain_dict["domain_heander"] = tenant_tuple[13] domain_dict["the_weight"] = tenant_tuple[14] domain_dict["is_outer_service"] = tenant_tuple[15] domain_dict["group_id"] = int(tenant_tuple[16]) domain_list.append(domain_dict) bean = dict() bean["total"] = total result = general_message(200, "success", "查询成功", list=domain_list, bean=bean) except Exception as e: logger.exception(e) result = error_message(e.message) return Response(result)
def __open_outer(self, tenant, service, region, deal_port): if deal_port.protocol != "http": if self.is_open_outer_steam_port(tenant.tenant_id, service.service_id, deal_port.container_port): return 412, u"非http协议端口只能对外开放一个" if deal_port.protocol == "http": service_domains = domain_repo.get_service_domain_by_container_port( service.service_id, deal_port.container_port) # 在domain表中保存数据 if service_domains: for service_domain in service_domains: service_domain.is_outer_service = True service_domain.save() else: # 在service_domain表中保存数据 gsr = group_service_relation_repo.get_group_by_service_id( service.service_id) group_obj = group_repo.get_group_by_id(gsr.group_id) service_id = service.service_id service_name = service.service_alias group_name = group_obj.group_name container_port = deal_port.container_port domain_name = str(container_port) + "." + str( service_name) + "." + str(tenant.tenant_name) + "." + str( region.httpdomain) create_time = datetime.datetime.now().strftime( '%Y-%m-%d %H:%M:%S') protocol = "http" http_rule_id = make_uuid(domain_name) tenant_id = tenant.tenant_id service_alias = service.service_cname g_id = str(gsr.group_id) region_id = region.region_id domain_repo.create_service_domains(service_id, service_name, domain_name, create_time, container_port, protocol, http_rule_id, group_name, tenant_id, service_alias, g_id, region_id) # 给数据中心发请求添加默认域名 data = dict() data["domain"] = domain_name data["service_id"] = service.service_id data["tenant_id"] = tenant.tenant_id data["tenant_name"] = tenant.tenant_name data["protocol"] = protocol data["container_port"] = int(container_port) data["http_rule_id"] = http_rule_id try: region_api.bind_http_domain(service.service_region, tenant.tenant_name, data) except Exception as e: logger.exception(e) domain_repo.delete_http_domains(http_rule_id) return 412, u"数据中心添加策略失败" else: service_tcp_domains = tcp_domain.get_service_tcp_domains_by_service_id_and_port( service.service_id, deal_port.container_port) if service_tcp_domains: for service_tcp_domain in service_tcp_domains: # 改变tcpdomain表中状态 service_tcp_domain.is_outer_service = True service_tcp_domain.save() else: # ip+port # 在service_tcp_domain表中保存数据 res, data = region_api.get_port(region.region_name, tenant.tenant_name) if int(res.status) != 200: return 400, u"请求数据中心异常" end_point = str(region.tcpdomain) + ":" + str(data["bean"]) gsr = group_service_relation_repo.get_group_by_service_id( service.service_id) group_obj = group_repo.get_group_by_id(gsr.group_id) service_id = service.service_id service_name = service.service_alias create_time = datetime.datetime.now().strftime( '%Y-%m-%d %H:%M:%S') container_port = deal_port.container_port protocol = deal_port.protocol group_name = group_obj.group_name service_alias = service.service_cname tcp_rule_id = make_uuid(end_point) tenant_id = tenant.tenant_id g_id = str(gsr.group_id) region_id = region.region_id tcp_domain.create_service_tcp_domains( service_id, service_name, end_point, create_time, container_port, protocol, service_alias, group_name, tcp_rule_id, tenant_id, g_id, region_id) # 默认ip不需要传给数据中心 # ip = end_point.split(":")[0] port = end_point.split(":")[1] data = dict() data["service_id"] = service.service_id data["container_port"] = int(container_port) # data["ip"] = ip data["port"] = int(port) data["tcp_rule_id"] = tcp_rule_id logger.debug('--------------------------------->{0}'.format( data["port"])) try: # 给数据中心传送数据添加策略 region_api.bindTcpDomain(service.service_region, tenant.tenant_name, data) except Exception as e: logger.exception(e) tcp_domain.delete_tcp_domain(tcp_rule_id) return 412, u"数据中心添加策略失败" deal_port.is_outer_service = True if service.create_status == "complete": body = region_api.manage_outer_port( service.service_region, tenant.tenant_name, service.service_alias, deal_port.container_port, { "operation": "open", "enterprise_id": tenant.enterprise_id }) logger.debug("open outer port body {}".format(body)) lb_mapping_port = body["bean"]["port"] deal_port.lb_mapping_port = lb_mapping_port deal_port.save() return 200, "success"