Files
smart-management-auto-test/base_framework/public_tools/eureka_api.py
qiaoxinjiu 6994b185a3 addproject
2026-01-22 19:10:37 +08:00

244 lines
12 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*-coding:utf-8-*-
import requests
import re
import configparser
import time
import os
from base_framework.platform_tools.Message_service.Feishu_api import FeiShuMessage
from base_framework.public_tools.read_config import get_current_config,get_zhyy_config
from base_framework.public_tools.sqlhelper import MySqLHelper
from base_framework.base_config.current_pth import HERE
from bs4 import BeautifulSoup
from base_framework.public_tools.utils import Tools
from lxml import etree
from base_framework.public_tools import log
obj_log = log.get_logger()
obj_tool = Tools()
class EurekaAPI:
def __init__(self):
self.business = get_current_config(section="run_evn_name", key="current_business")
self.team = get_current_config(section="run_evn_name", key="current_team")
self.evn = get_current_config(section="run_evn_name", key="current_evn")
self.jira_id = get_current_config(section="run_jira_id", key="huohua-podenv")
self.is_ip_from_ini = get_current_config(section="is_ip_from_ini", key="is_ip_from_ini")
self.server_list = list()
self.message = FeiShuMessage(team='AUTOMATION')
if self.jira_id == '':
self.jira_id = 'qa'
self.server_to_domain = {"PEPPA-CORE-API": "https://core-api.qa.huohua.cn/"}
self.sim_server_to_domain = {"PEPPA-TEACH-API": "https://teach-api.sim.huohua.cn/"}
def __get_eureka_url_from_db(self, team):
"""
| 功能 | 从DB中获取服务对应的eureka_url供get_container_ip_from_eureka函数使用 |
"""
sql_str = "select eureka_url as hh, eureka_url_hhi as hhi " \
"from sparkatp.swagger_info where team='{}';".format(team)
res = MySqLHelper().select_one(sql=sql_str)
return res[self.business]
def __get_eureka_info_by_type(self, eureka_type):
"""
| 功能 | 根据eureka类型返回对应的url和配置文件名 |
"""
if eureka_type.lower() == "hh":
eureka_url = "http://eureka.{}.huohua.cn/".format(self.evn.lower())
eureka_file_name = "eureka_{}_huohua_cn.ini".format(self.evn.lower())
elif eureka_type.lower() == "vsl":
eureka_url = "http://eureka.{}.visparklearning.com/".format(self.evn.lower())
eureka_file_name = "eureka_{}_visparklearning_com.ini".format(self.evn.lower())
elif eureka_type.lower() == "as":
eureka_url = "http://eureka.{}.allschool.com/".format(self.evn.lower())
eureka_file_name = "eureka_{}_allschool_com.ini".format(self.evn.lower())
elif eureka_type.lower() == "ec":
eureka_url = "http://eureka-core.{}.huohua.cn/".format(self.evn.lower())
eureka_file_name = "eureka_core_{}_huohua_cn.ini".format(self.evn.lower())
elif eureka_type.lower() == "xdu":
eureka_url = "http://eureka.{}.xuedau.com/".format(self.evn.lower())
eureka_file_name = "eureka_{}_xuedau_com.ini".format(self.evn.lower())
else:
raise Exception("eureka类型仅支持HH,VSL,AS,EC和XDU但你的输入的是{}".format(eureka_type))
return eureka_url, eureka_file_name
def get_all_server_ip_from_eureka(self, eureka="HH"):
"""
| 功能说明: | 获取Eureka全部服务的IP并写入对应文件中文件中 |
| 输入参数: | eureka | 类型HH | http://eureka.qa.huohua.cn/ |
| | | 类型VSL | http://eureka.qa.visparklearning.com/ |
| | | 类型AS | http://eureka.qa.allschool.com/ |
| | | 类型EC | http://eureka-core.qa.huohua.cn/ |
| | | 类型XDU | http://eureka.qa.xuedau.com/ |
| 返回参数: | 无 | |
| 作者信息: | 谯新久 | 2022.03.27 |
"""
eureka_url, eureka_file_name = self.__get_eureka_info_by_type(eureka_type=eureka)
server_ip_path = os.path.join(HERE, eureka_file_name)
temp_text = requests.get(url=eureka_url).content
soup = BeautifulSoup(temp_text.decode('utf-8'), "html.parser")
all_container_ip = soup.find_all(href=re.compile("actuator/info"))
tree_dict = dict()
for temp in all_container_ip:
server = list(temp.parent.parent)[1].get_text()
server_ip = list(temp)
if server in tree_dict.keys():
tree_dict[server].extend(server_ip)
else:
tree_dict[server] = server_ip
cof = configparser.ConfigParser()
cof.read(server_ip_path, encoding='utf-8')
eureka_section = self.business
if eureka_section not in cof.sections():
cof.add_section(section=eureka_section)
for svr_name in tree_dict:
cof.set(section=eureka_section, option=svr_name, value=str(tree_dict[svr_name]))
with open(server_ip_path, 'w') as fw: # 循环写入
cof.write(fw)
time.sleep(2) # 等待5s让ip写入到文件中去
def get_server_ip_from_config(self, server_name, eureka="HH"):
"""
| 功能说明: | 获取server_ip.ini文件中获取server_name对应的IP |
| 输入参数: | server_name | 服务名 |
| | eureka | 类型HH | http://eureka.qa.huohua.cn/ |
| | | 类型VSL | http://eureka.qa.visparklearning.com/ |
| | | 类型AS | http://eureka.qa.allschool.com/ |
| | | 类型EC | http://eureka-core.qa.huohua.cn/ |
| 返回参数: | string | 如10.10.10.10:8080 |
| 作者信息: | 谯新久 | 2022.03.27 |
特别说明:
| 1 | 独立环境取startup.py启动时传入的值没有对应的独立环境则取qa的ip返回 |
| 2 | 当同一独立环境存在多个ip时打印error日志后返回第一个ip |
"""
eureka_url, eureka_file_name = self.__get_eureka_info_by_type(eureka_type=eureka)
server_ip_path = os.path.join(HERE, eureka_file_name)
ip_list = get_current_config(file_path=server_ip_path, section=self.business, key=server_name.lower())
if self.evn.lower() == "sim":
ip_list = ip_list.replace("${server.port}", "8080") # 替换成8080端口
if self.jira_id in ip_list:
jira = self.jira_id
elif "sim" in ip_list:
jira = "sim"
elif "no" in ip_list:
jira = "no"
else:
jira = ""
elif self.jira_id in ip_list:
jira = self.jira_id
elif 'qa' in ip_list:
jira = 'qa'
elif 'groot' in ip_list:
jira = 'groot'
else:
jira = 'qa'
if ip_list != 'server not exist':
if jira and jira not in ip_list:
if server_name.lower() not in self.server_list:
self.server_list.append(server_name.lower())
message = "{}在启动startup时发现服务{}在独立环境{}未部署成功,请确认。".format(self.team, server_name, jira)
self.message.send_text(message)
obj_ip = []
ip_str = ip_list.replace('[', '').replace(']', '').replace('\'', '').replace(' ', '')
ip_list = ip_str.split(',')
for ip in ip_list:
if jira and jira in ip: # 找到对应独立环境的ip
if ip.startswith('10.'): # 跳过非
obj_ip.append(ip)
if self.evn.lower() == "sim": # sim环境只有一个ip时直接返回次ip
if not obj_ip and len(ip_list) == 1:
ips = ip_list[0].split(":")
return "{}:{}".format(ips[0], ips[1])
if self.evn.lower() != "sim" and len(obj_ip) > 1: # sim环境不判断是否有多个部署
obj_log.error("eureka中含有{}{}{}环境,请检查.........".format(len(obj_ip), server_name, jira))
elif len(obj_ip) == 0:
obj_log.error("eureka中未找到{}{}相关的ip信息请检查.........".format(server_name, jira))
return "server not exist"
# return obj_ip[0].rstrip("{}".format(jira))[:-1]
return obj_ip[0].split("{}".format(jira))[0].rstrip(":")
else:
obj_log.error("eureka中未找到{}{}相关的ip信息请检查.........".format(server_name, jira))
return "server not exist"
def get_server_url_from_config(self, server_name, eureka="HH", is_domain=True):
"""
| 功能说明: | 从对应文件中获取server_name对应的IP组装成url后返回 |
| 输入参数: | server_name | 服务名 |
| | eureka | 类型HH | http://eureka.qa.huohua.cn/ |
| | | 类型VSL | http://eureka.qa.visparklearning.com/ |
| | | 类型AS | http://eureka.qa.allschool.com/ |
| | | 类型EC | http://eureka-core.qa.huohua.cn/ |
| | | 类型XDU | http://eureka.qa.xuedau.com/ |
| | is_domain | 是否域名True域名False IP |
| 返回参数: | string | 如http://10.10.10.10:8080/ |
| 作者信息: | 谯新久 | 2022.03.27 |
特别说明:
| 1 | 独立环境取startup.py启动时传入的值没有对应的独立环境则取qa的ip返回 |
| 2 | 当同一独立环境存在多个ip时打印error日志后返回第一个ip |
"""
if is_domain:
if self.evn == "SIM":
if server_name.upper() in self.sim_server_to_domain.keys():
return self.sim_server_to_domain[server_name.upper()]
return "https://swagger.sim.huohua.cn/{}/".format(server_name.lower())
if server_name.upper() in self.server_to_domain.keys():
return self.server_to_domain[server_name.upper()]
return "https://swagger.qa.huohua.cn/{}/".format(server_name.lower())
else:
# eureka_url, _ = self.__get_eureka_info_by_type(eureka_type=eureka)
# ip_res = obj_tool.get_container_ip_from_eureka(server_name=server_name, jira_id_dev=self.jira_id,
# eureka_url=eureka_url)
# if ip_res:
# ip_info = ip_res["container_ip"]
# url_info = "http://" + ip_info + ":8080/"
# return url_info
# # if self.is_ip_from_ini == "true":
ip_info = self.get_server_ip_from_config(server_name=server_name.lower(), eureka=eureka)
if ip_info != 'server not exist':
url_info = "http://" + ip_info + "/"
return url_info
else:
raise Exception("eureka中未找到{}{}相关的ip信息请检查.........".format(server_name, self.jira_id))
def get_url_from_config(self, is_domain=True):
"""
| 功能说明: | 从对应文件中获取对应环境的域名组装成url后返回 |
| 输入参数: | 环境 | 服务名 |
| | is_domain | 是否域名True域名False IP |
| 返回参数: | string | 如http://10.10.10.10:8080/ |
| 作者信息: | 谯新久 | 2026.01.15 |
"""
if is_domain:
env = self.evn.upper()
team = self.team.lower()
domain_url = get_zhyy_config(section=env, key=team)
return domain_url
else:
#todo 暂无ip
return
# # if self.is_ip_from_ini == "true":
# ip_info = self.get_server_ip_from_config(server_name=server_name.lower(), eureka=eureka)
# if ip_info != 'server not exist':
# url_info = "http://" + ip_info + "/"
# return url_info
# else:
# raise Exception("eureka中未找到{}的{}相关的ip信息请检查.........".format(server_name, self.jira_id))
if __name__ == '__main__':
er = EurekaAPI()
# er.get_all_server_ip_from_eureka
# er.get_all_server_ip_from_eureka(eureka="VSL")
res = er.get_server_url_from_config(server_name='peppa-scm-server', is_domain=False)
print(res)
# res = er.get_server_url_from_config(server_name='sparkedu-api', eureka="VSL")
# print(res)