xuekailun пре 4 месеци
родитељ
комит
7d6a32f4a9

+ 293 - 315
utils.py → alb_utils.py

@@ -2,9 +2,13 @@ import logging
 import json
 import sys
 import time
+from asyncio import wait_for
+
 import requests
 import asyncio
+import time
 
+from alibabacloud_tea_util.client import Client as UtilClient
 from aliyunsdkcore.client import AcsClient
 from aliyunsdkslb.request.v20140515.AddBackendServersRequest import AddBackendServersRequest
 from aliyunsdkslb.request.v20140515.RemoveBackendServersRequest import RemoveBackendServersRequest
@@ -23,6 +27,9 @@ from alibabacloud_tea_openapi import models as open_api_models
 from alibabacloud_alb20200616 import models as alb_models
 from alibabacloud_alb20200616 import models as alb_20200616_models
 from alibabacloud_tea_util import models as util_models
+from aliyunsdkalb.request.v20200616.ListServerGroupServersRequest import ListServerGroupServersRequest
+from aliyunsdkcore.acs_exception.exceptions import ClientException, ServerException
+
 
 logging.basicConfig(level=logging.INFO,
                     format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
@@ -59,6 +66,25 @@ def connect_client(access_key_id, access_key_secret, region_id):
         sys.exit()
 
 
+def connect_alb_client(access_key_id, access_key_secret, endpoint):
+    """
+    初始化ALB客户端
+    :param access_key_id: access key Id, type-string
+    :param access_key_secret: access key secret, type-string
+    :return: alb_client
+    """
+    config = open_api_models.Config(
+        access_key_id=access_key_id,
+        access_key_secret=access_key_secret,
+        endpoint=endpoint
+    )
+    alb_client = Alb20200616Client(config)
+    return alb_client
+
+
+
+
+
 def build_create_instances_request(image_id, vswitch_id, security_group_id, zone_id, instance_type, instance_name,
                                    disk_size, disk_category, key_pair_name, tags):
     """
@@ -89,25 +115,6 @@ def build_create_instances_request(image_id, vswitch_id, security_group_id, zone
     return request
 
 
-def send_request(ecs_client, request):
-    """
-    发送API请求
-    :param ecs_client: 客户端连接
-    :param request: 请求配置
-    :return: response
-    """
-    request.set_accept_format('json')
-    try:
-        response = ecs_client.do_action_with_exception(request)
-        response = json.loads(response)
-        # logging.info(response)
-        return response
-    except Exception as e:
-        # 失败,记录报错信息,发送通知,停止并退出
-        logging.error(e)
-        sys.exit()
-
-
 def send_req(client, request):
     """
     发送API请求
@@ -128,6 +135,7 @@ def send_req(client, request):
     #logging.error(e)
     #sys.exit()
 
+
 def check_instance_running(ecs_client, instance_ids):
     """
     检查服务器运行状态
@@ -159,6 +167,22 @@ def check_instance_running(ecs_client, instance_ids):
         sys.exit()
 
 
+def get_ip_address(ecs_client, instance_id):
+    """
+    获取实例IP地址
+    :param ecs_client: 客户端连接
+    :param instance_id: 实例id, type-string
+    :return: ip_address, type-string
+    """
+    request = DescribeNetworkInterfacesRequest()
+    request.set_accept_format('json')
+    request.set_InstanceId(instance_id)
+    response = send_request(ecs_client=ecs_client, request=request)
+    ip_address = response['NetworkInterfaceSets']['NetworkInterfaceSet'][0]['PrivateIpAddress']
+    return ip_address
+
+
+
 def create_multiple_instances(amount, ecs_client,
                               image_id, vswitch_id, security_group_id, zone_id, instance_type, instance_name,
                               disk_size, disk_category, key_pair_name, tags):
@@ -208,116 +232,128 @@ def create_multiple_instances(amount, ecs_client,
         sys.exit()
 
 
-def run_command(ecs_client, instance_ids, command):
+
+def release_instances(ecs_client, instance_ids, force=False):
     """
-    批量执行命令
-    :param ecs_client: 客户端连接
-    :param instance_ids: 实例id列表, type-list, 最多能指定50台ECS实例ID
-    :param command: 命令 type-string
+    释放实例
+    :param ecs_client:
+    :param instance_ids: instance_id, type-list
+    :param force: 是否强制释放, True-强制释放, False-正常释放, type-bool
     :return:
     """
-    for i in range(len(instance_ids) // 50 + 1):
-        instance_id_list = instance_ids[i * 50:(i + 1) * 50]
-        if len(instance_id_list) == 0:
-            return
-        request = RunCommandRequest()
-        request.set_accept_format('json')
-        request.set_Type("RunShellScript")
-        request.set_CommandContent(command)
-        request.set_InstanceIds(instance_id_list)
-        response = send_request(ecs_client=ecs_client, request=request)
-        logging.info(response)
+    request = DeleteInstancesRequest()
+    request.set_InstanceIds(instance_ids)
+    request.set_Force(force)
+    response = send_request(ecs_client=ecs_client, request=request)
+    return response
+
+
 
-def run_per_command(client, instance, command):
+def get_instances_status(ecs_client, instance_ids):
     """
-    批量执行命令
-    :param client: 客户端连接
-    :param instance_ids: 实例id列表, type-list, 最多能指定50台ECS实例ID
-    :param command: 命令 type-string
+    获取实例运行状态
+    :param ecs_client:
+    :param instance_ids: instance_id, type-liist
     :return:
     """
-    #for i in range(len(instance_ids) // 50 + 1)
-    request = RunCommandRequest()
-    request.set_accept_format('json')
-    request.set_Type("RunShellScript")
-    request.set_CommandContent(command)
-    request.set_InstanceIds([instance])
-    response = send_req(client=client, request=request)
-    logging.info(response)
+    request = DescribeInstanceStatusRequest()
+    request.set_InstanceIds(instance_ids)
+    request.set_PageSize(50)
+    response = send_request(ecs_client=ecs_client, request=request)
     return response
 
 
-def get_instance_ids(alb_client, server_group_id):
+
+def stop_instances(ecs_client, instance_ids, force_stop=False):
     """
-    获取指定服务器组下所有服务器的instanceId
-    :param alb_client: 客户端连接
-    :param server_group_id: 服务器组ID type-string
-    :return: instance_ids type-list
+    停止实例
+    :param ecs_client:
+    :param instance_ids: 实例ID, type-list
+    :param force_stop: 是否强制关机, True-强制关机, False-正常关机, type-bool
+    :return:
     """
-    request = alb_20200616_models.ListServerGroupServersRequest(
-        server_group_id=server_group_id
-    )
-    runtime = util_models.RuntimeOptions()
-    response = alb_client.list_server_group_servers_with_options(request, runtime)
+    request = StopInstancesRequest()
+    request.set_InstanceIds(instance_ids)
+    request.set_ForceStop(force_stop)
+    response = send_request(ecs_client=ecs_client, request=request)
+    return response
 
-    instance_ids = [server["ServerId"] for server in response["Servers"]["Server"]]
-    return instance_ids
 
 
-def get_ip_address(ecs_client, instance_id):
+
+def send_request(ecs_client, request):
     """
-    获取实例IP地址
+    发送API请求
     :param ecs_client: 客户端连接
-    :param instance_id: 实例id, type-string
-    :return: ip_address, type-string
+    :param request: 请求配置
+    :return: response
     """
-    request = DescribeNetworkInterfacesRequest()
     request.set_accept_format('json')
-    request.set_InstanceId(instance_id)
-    response = send_request(ecs_client=ecs_client, request=request)
-    ip_address = response['NetworkInterfaceSets']['NetworkInterfaceSet'][0]['PrivateIpAddress']
-    return ip_address
+    try:
+        response = ecs_client.do_action_with_exception(request)
+        response = json.loads(response)
+        # logging.info(response)
+        return response
+    except Exception as e:
+        # 失败,记录报错信息,发送通知,停止并退出
+        logging.error(e)
+        sys.exit()
 
 
-# def set_weight_for_instances(client, slb_id, instance_id_list, weight):
-#     """
-#     同时设置多台服务器的slb权重,权重一样
-#     :param client: 客户端连接
-#     :param slb_id: slb_id
-#     :param instance_id_list: 服务器id list
-#     :param weight: 权重值
-#     :return: None
-#     """
-#     for i in range(len(instance_id_list) // 20 + 1):
-#         instances_list = instance_id_list[i * 20:(i + 1) * 20]
-#         if len(instances_list) == 0:
-#             return
-#         BackendServers = [{"ServerId": instance_id, "Weight": weight} for instance_id in instances_list]
-#         request = CommonRequest()
-#         request.set_accept_format('json')
-#         request.set_domain('slb.aliyuncs.com')
-#         request.set_version('2014-05-15')
-#         request.set_method('POST')
-#         request.set_action_name('SetBackendServers')
-#         request.add_query_param('BackendServers', BackendServers)
-#         request.add_query_param('LoadBalancerId', slb_id)
-#         response = send_request(client=client, request=request)
+
+def run_command(ecs_client, instance_ids, command):
+    """
+    批量执行命令
+    :param ecs_client: 客户端连接
+    :param instance_ids: 实例id列表, type-list, 最多能指定50台ECS实例ID
+    :param command: 命令 type-string
+    :return:
+    """
+    for i in range(len(instance_ids) // 50 + 1):
+        instance_id_list = instance_ids[i * 50:(i + 1) * 50]
+        if len(instance_id_list) == 0:
+            return
+        request = RunCommandRequest()
+        request.set_accept_format('json')
+        request.set_Type("RunShellScript")
+        request.set_CommandContent(command)
+        request.set_InstanceIds(instance_id_list)
+        response = send_request(ecs_client=ecs_client, request=request)
+        logging.info(response)
 
 
-def connect_alb_client(access_key_id, access_key_secret, endpoint):
+def send_file_to_ecs(ecs_client, instance_id_list, target_dir, name, content):
     """
-    初始化ALB客户端
-    :param access_key_id: access key Id, type-string
-    :param access_key_secret: access key secret, type-string
-    :return: alb_client
+    发送文件到ecs;alb应用,区分上方clb
+    :param ecs_client:
+    :param instance_id_list: 最多能指定50台ECS实例ID
+    :param target_dir: 文件存放目录 type-string
+    :param name: 文件名 type-string
+    :param content: 文件内容 type-string
+    :return:
     """
-    config = open_api_models.Config(
-        access_key_id=access_key_id,
-        access_key_secret=access_key_secret,
-        endpoint=endpoint
-    )
-    alb_client = Alb20200616Client(config)
-    return alb_client
+    if not instance_id_list:
+        logging.warning("实例ID列表为空,无法发送文件。")
+        return
+
+    for i in range(len(instance_id_list) // 50 + 1):
+        instance_ids = instance_id_list[i * 50:(i + 1) * 50]
+        if len(instance_ids) == 0:
+            logging.info("没有更多的实例ID需要发送文件,退出。")
+            return
+        request = SendFileRequest()
+        request.set_Content(content)
+        request.set_TargetDir(target_dir)
+        request.set_Name(name)
+        request.set_Overwrite(True)
+        request.set_InstanceIds(instance_ids)
+        try:
+            logging.info(f"正在向实例 {instance_ids} 发送文件 '{name}' 到目录 '{target_dir}'")
+            response = send_request(ecs_client=ecs_client, request=request)
+            logging.info(f"成功发送文件到实例 {instance_ids},响应: {response}")
+        except Exception as e:
+            logging.error(f"发送文件到实例 {instance_ids} 失败,错误: {str(e)}")
+
 
 
 def add_servers_to_server_group(alb_client, server_group_id, instance_id, weight):
@@ -345,6 +381,8 @@ def add_servers_to_server_group(alb_client, server_group_id, instance_id, weight
     except Exception as e:
         logging.error(f"Failed to add server {instance_id} to server group {server_group_id}: {str(e)}")
 
+
+
 def remove_servers_from_server_group(alb_client, server_group_id, instance_id):
     """
     从ALB服务器组中移除服务器
@@ -368,235 +406,175 @@ def remove_servers_from_server_group(alb_client, server_group_id, instance_id):
     except Exception as e:
         logging.error(f"Failed to remove server {instance_id} from server group {server_group_id}: {str(e)}")
 
-
-def send_file_to_ecs(ecs_client, instance_id_list, target_dir, name, content):
-    """
-    发送文件到ecs
-    :param ecs_client:
-    :param instance_id_list: 最多能指定50台ECS实例ID
-    :param target_dir: 文件存放目录 type-string
-    :param name: 文件名 type-string
-    :param content: 文件内容 type-string
-    :return:
-    """
-    if not instance_id_list:
-        logging.warning("实例ID列表为空,无法发送文件。")
-        return
-
-    for i in range(len(instance_id_list) // 50 + 1):
-        instance_ids = instance_id_list[i * 50:(i + 1) * 50]
-        if len(instance_ids) == 0:
-            logging.info("没有更多的实例ID可供处理,退出。")
-            return
-        request = SendFileRequest()
-        request.set_Content(content)
-        request.set_TargetDir(target_dir)
-        request.set_Name(name)
-        request.set_Overwrite(True)
-        request.set_InstanceIds(instance_ids)
-        try:
-            logging.info(f"正在向实例 {instance_ids} 发送文件 '{name}' 到目录 '{target_dir}'")
-            response = send_request(ecs_client=ecs_client, request=request)
-            logging.info(f"成功发送文件到实例 {instance_ids},响应: {response}")
-        except Exception as e:
-            logging.error(f"发送文件到实例 {instance_ids} 失败,错误: {str(e)}")
-
-
-# def send_file_to_ecs(ecs_client, instance_id_list, target_dir, name, content):
+#
+# def set_weight_for_instances_alb(alb_client, server_group_id, instance_id_list, weights):
 #     """
-#     发送文件到ecs
-#     :param ecs_client:
-#     :param instance_id_list: 最多能指定50台ECS实例ID
-#     :param target_dir: 文件存放目录 type-string
-#     :param name: 文件名 type-string
-#     :param content: 文件内容 type-string
-#     :return:
+#     设置ALB服务器组中实例的权重
+#     :param alb_client: ALB客户端连接
+#     :param server_group_id: 服务器组ID
+#     :param instance_id_list: 实例ID列表
+#     :param weights: 权重列表
+#     :return: None
 #     """
-#     for i in range(len(instance_id_list) // 50 + 1):
-#         instance_ids = instance_id_list[i * 50:(i + 1) * 50]
-#         if len(instance_ids) == 0:
-#             return
-#         request = SendFileRequest()
-#         request.set_Content(content)
-#         request.set_TargetDir(target_dir)
-#         request.set_Name(name)
-#         request.set_Overwrite(True)
-#         request.set_InstanceIds(instance_ids)
-#         response = send_request(ecs_client=ecs_client, request=request)
-
-
-def stop_instances(ecs_client, instance_ids, force_stop=False):
-    """
-    停止实例
-    :param ecs_client:
-    :param instance_ids: 实例ID, type-list
-    :param force_stop: 是否强制关机, True-强制关机, False-正常关机, type-bool
-    :return:
-    """
-    request = StopInstancesRequest()
-    request.set_InstanceIds(instance_ids)
-    request.set_ForceStop(force_stop)
-    response = send_request(ecs_client=ecs_client, request=request)
-    return response
-
-
-def release_instances(ecs_client, instance_ids, force=False):
-    """
-    释放实例
-    :param ecs_client:
-    :param instance_ids: instance_id, type-list
-    :param force: 是否强制释放, True-强制释放, False-正常释放, type-bool
-    :return:
-    """
-    request = DeleteInstancesRequest()
-    request.set_InstanceIds(instance_ids)
-    request.set_Force(force)
-    response = send_request(ecs_client=ecs_client, request=request)
-    return response
-
-
-def get_instances_status(ecs_client, instance_ids):
-    """
-    获取实例运行状态
-    :param ecs_client:
-    :param instance_ids: instance_id, type-list
-    :return:
-    """
-    request = DescribeInstanceStatusRequest()
-    request.set_InstanceIds(instance_ids)
-    request.set_PageSize(50)
-    response = send_request(ecs_client=ecs_client, request=request)
-    return response
-
-
-# def set_instance_weight_process(client, slb_id, instance_id_list, weight_list):
+#     servers = []
+#     for instance_id, weight in zip(instance_id_list, weights):
+#         server = alb_models.AddServersToServerGroupRequestServers(   # todo update
+#             port=80,   # todo
+#             server_id=instance_id,
+#             server_type='ecs',
+#             weight=weight
+#         )
+#         servers.append(server)
+#
+#     request = alb_models.AddServersToServerGroupRequest(
+#         server_group_id=server_group_id,
+#         servers=servers
+#     )
+#
+#     runtime = util_models.RuntimeOptions()
+#     try:
+#         alb_client.add_servers_to_server_group_with_options(request, runtime)
+#         logging.info(f"Successfully set weights for instances in server group {server_group_id}.")
+#     except Exception as e:
+#         logging.error(f"Failed to set weights for instances: {str(e)}")
+#
+#
+# def set_instance_weight_process_with_alb(alb_client, server_group_id_list, instance_id_list, weight_list):
 #     """
-#     修改服务器的权重值
-#     :param client: slb客户端连接·
-#     :param slb_id: slb id
-#     :param instance_id_list: instance id list
+#     修改ALB服务器组中实例的权重值
+#     :param alb_client: ALB客户端连接
+#     :param server_group_id_list: 服务器组ID列表
+#     :param instance_id_list: 实例ID列表
 #     :param weight_list: 权重修改列表 type-list [(weight, sleep_time), ...]
 #     :return:
 #     """
 #     for weight, sleep_time in weight_list:
-#         logging.info(f"weight = {weight}")
-#         flag = True
-#         while flag:
-#             try:
-#                 set_weight_for_instances(client=client, slb_id=slb_id, instance_id_list=instance_id_list, weight=weight)
-#                 time.sleep(sleep_time)
-#                 flag = False
-#             except Exception as e:
-#                 time.sleep(10)
-#                 continue
-
-
-# def add_backend_servers(client, slb_id, instances):
-#     """
-#     服务器挂载到负载均衡(必须是状态为运行中的后端服务器才可以加入负载均衡实例,每次调用最多可添加20个后端服务器)
-#     :param client:
-#     :param slb_id:
-#     :param instances: 实例列表 [(instance_id, ip), ...]
-#     :return:
-#     """
-#     try:
-#         for i in range(len(instances) // 20 + 1):
-#             instances_list = instances[i * 20:(i + 1) * 20]
-#             if len(instances_list) == 0:
-#                 return
-#             request = AddBackendServersRequest()
-#             request.set_accept_format('json')
-#             request.set_LoadBalancerId(slb_id)
-#             backend_servers = [
-#                 {"ServerId": instance_id, "Weight": "0", "Type": "ecs", "ServerIp": ip_address}
-#                 for instance_id, ip_address in instances_list]
-#             request.set_BackendServers(backend_servers)
-#             response = client.do_action_with_exception(request)
-#             return response
-#     except Exception as e:
-#         logging.error(e)
-#         sys.exit()
-
+#         logging.info(f"修改权重中: weight = {weight}")
+#         for server_group_id in server_group_id_list:
+#             flag = True
+#             while flag:
+#                 try:
+#                     # 使用新的权重设置函数
+#                     set_weight_for_instances_alb(alb_client, server_group_id, instance_id_list, [weight] * len(instance_id_list))
+#                     logging.info(f"服务器组: {server_group_id} 权重设置完成!")
+#                     flag = False
+#                 except Exception as e:
+#                     logging.error(f"更新权重失败: {e}, 将重试...")
+#                     time.sleep(10)
+#                     continue
+#         time.sleep(sleep_time)
+
+
+def list_server_group_servers(alb_client, server_group_id):
+    """
+    列出服务器组中的服务器并返回实例ID列表
+    @param alb_client: ALB客户端
+    @param server_group_id: 服务器组ID
+    @return: 实例ID列表
+    """
+    list_server_group_servers_request = alb_20200616_models.ListServerGroupServersRequest(
+        server_group_id=server_group_id
+    )
+    runtime = util_models.RuntimeOptions()
 
-# def remove_backend_servers(client, slb_id, instances):
-#     """
-#     服务器从负载均衡移除(一次调用最多可以移除20个后端服务器)
-#     :param client:
-#     :param slb_id:
-#     :param instances: 实例列表 [instance_id, ...]
-#     :return:
-#     """
-#     try:
-#         for i in range(len(instances) // 20 + 1):
-#             instances_list = instances[i * 20:(i + 1) * 20]
-#             if len(instances_list) == 0:
-#                 return
-#             request = RemoveBackendServersRequest()
-#             request.set_accept_format('json')
-#             request.set_LoadBalancerId(slb_id)
-#             backend_servers = [
-#                 {"ServerId": instance_id, "Weight": "0", "Type": "ecs"}
-#                 for instance_id in instances_list]
-#             request.set_BackendServers(backend_servers)
-#             response = client.do_action_with_exception(request)
-#             return response
-#     except Exception as e:
-#         logging.error(e)
-#         sys.exit()
+    try:
+        response = alb_client.list_server_group_servers_with_options(list_server_group_servers_request, runtime)
+        instance_ids = [server.server_id for server in response.body.servers]
+        if instance_ids:
+            return instance_ids[0]
+        else:
+            return None
+        # return instance_ids
+    except Exception as error:
+        print(error.message)
+        print(error.data.get("Recommend"))
+        UtilClient.assert_as_string(error.message)
+        return []
 
 
-def set_weight_for_instances_alb(alb_client, server_group_id, instance_id_list, weights):
+async def list_server_group_servers_async(alb_client, server_group_id):
     """
-    设置ALB服务器组中实例的权重
-    :param alb_client: ALB客户端连接
-    :param server_group_id: 服务器组ID
-    :param instance_id_list: 实例ID列表
-    :param weights: 权重列表
-    :return: None
-    """
-    servers = []
-    for instance_id, weight in zip(instance_id_list, weights):
-        server = alb_models.AddServersToServerGroupRequestServers(
-            port=80,
-            server_id=instance_id,
-            server_type='ecs',
-            weight=weight
-        )
-        servers.append(server)
-
-    request = alb_models.AddServersToServerGroupRequest(
-        server_group_id=server_group_id,
-        servers=servers
+    异步列出指定服务器组中的服务器并返回实例ID列表
+    @param alb_client: ALB客户端
+    @param server_group_id: 服务器组ID
+    @return: 实例ID列表
+    """
+    list_server_group_servers_request = alb_20200616_models.ListServerGroupServersRequest(
+        server_group_id=server_group_id
     )
-
     runtime = util_models.RuntimeOptions()
+
     try:
-        alb_client.add_servers_to_server_group_with_options(request, runtime)
-        logging.info(f"Successfully set weights for instances in server group {server_group_id}.")
-    except Exception as e:
-        logging.error(f"Failed to set weights for instances: {str(e)}")
+        response = await alb_client.list_server_group_servers_with_options_async(list_server_group_servers_request,
+                                                                                 runtime)
+        instance_ids = [server.server_id for server in response.body.servers]
+        return instance_ids
+    except Exception as error:
+        print(error.message)
+        print(error.data.get("Recommend"))
+        UtilClient.assert_as_string(error.message)
+        return []
 
-def set_instance_weight_process_with_alb(alb_client, server_group_id_list, instance_id_list, weight_list):
+
+def update_server_group_servers_attribute(alb_client, server_group_id_list, instance_id_list, weight_list):
     """
-    修改ALB服务器组中实例的权重值
-    :param alb_client: ALB客户端连接
+    更新服务器组中的服务器权重
+    :param alb_client: ALB客户端
     :param server_group_id_list: 服务器组ID列表
     :param instance_id_list: 实例ID列表
     :param weight_list: 权重修改列表 type-list [(weight, sleep_time), ...]
-    :return:
     """
-    for weight, sleep_time in weight_list:
-        logging.info(f"修改权重中: weight = {weight}")
-        for server_group_id in server_group_id_list:
-            flag = True
-            while flag:
+    for server_group_id in server_group_id_list:
+        for instance_id in instance_id_list:
+            for weight, sleep_time in weight_list:
+                server = alb_20200616_models.UpdateServerGroupServersAttributeRequestServers(
+                    server_type='Ecs',
+                    server_id=instance_id,
+                    weight=weight,
+                    port=80
+                )
+                request = alb_20200616_models.UpdateServerGroupServersAttributeRequest(
+                    servers=[server],
+                    server_group_id=server_group_id
+                )
+                runtime = util_models.RuntimeOptions()
+                try:
+                    alb_client.update_server_group_servers_attribute_with_options(request, runtime)
+                    print(f"Successfully updated server {instance_id} in group {server_group_id} to weight {weight}.")
+                except Exception as error:
+                    print(error.message)
+                    print(error.data.get("Recommend"))
+                    UtilClient.assert_as_string(error.message)
+                time.sleep(sleep_time)
+
+
+async def update_server_group_servers_attribute_async(alb_client, server_group_id_list, instance_ids, weight_list):
+    """
+    异步更新服务器组中的服务器属性
+    :param alb_client: ALB客户端
+    :param server_group_id_list: 服务器组ID列表
+    :param instance_ids: 实例ID列表
+    :param weight_list: 权重修改列表 type-list [(weight, sleep_time), ...]
+    """
+    for server_group_id in server_group_id_list:
+        for instance_id in instance_ids:
+            for weight, sleep_time in weight_list:
+                server = alb_20200616_models.UpdateServerGroupServersAttributeRequestServers(
+                    server_type='Ecs',
+                    server_id=instance_id,
+                    weight=weight,
+                    port=80
+                )
+                request = alb_20200616_models.UpdateServerGroupServersAttributeRequest(
+                    servers=[server],
+                    server_group_id=server_group_id
+                )
+                runtime = util_models.RuntimeOptions()
                 try:
-                    # 使用新的权重设置函数
-                    set_weight_for_instances_alb(alb_client, server_group_id, instance_id_list, [weight] * len(instance_id_list))
-                    logging.info(f"服务器组: {server_group_id} 权重设置完成!")
-                    flag = False
-                except Exception as e:
-                    logging.error(f"更新权重失败: {e}, 将重试...")
-                    time.sleep(10)
-                    continue
-        time.sleep(sleep_time)
+                    await alb_client.update_server_group_servers_attribute_with_options_async(request, runtime)
+                    print(f"Successfully updated server {instance_id} in group {server_group_id} to weight {weight} asynchronously.")
+                except Exception as error:
+                    print(error.message)
+                    print(error.data.get("Recommend"))
+                    UtilClient.assert_as_string(error.message)
+                await asyncio.sleep(sleep_time)

+ 19 - 8
albtest.py

@@ -2,12 +2,14 @@ import unittest
 import os
 import sys
 import logging
-import utils
+import alb_utils
 from aliyunsdkcore.client import AcsClient
 from alibabacloud_alb20200616.client import Client as Alb20200616Client
 from alibabacloud_tea_openapi import models as open_api_models
 from alibabacloud_alb20200616 import models as alb_models
 from alibabacloud_alb20200616 import models as alb_20200616_models
+from aliyunsdkalb.request.v20200616.ListServerGroupServersRequest import ListServerGroupServersRequest
+
 
 # 配置客户端参数
 alb_client_params = {
@@ -59,16 +61,25 @@ class MyTestCase(unittest.TestCase):
 
 
     def test_add_servers_to_server_group(self):
-        weight = 0
-        utils.add_servers_to_server_group(self.alb_client, server_group_id, instance_id, weight)
+        weight=0
+        server_group_id = "sgp-ec4gopoclruofsfmxu"
+        instance_id = "i-bp19n839usecekzn2ig9"
+        alb_utils.add_servers_to_server_group(self.alb_client, server_group_id, instance_id, weight)
+
+    def test_list_server_group_servers(self):
+        instance_ids = alb_utils.list_server_group_servers(self.alb_client, server_group_id)
+        print(instance_ids)
 
     def test_remove_servers_from_server_group(self):
-        utils.remove_servers_from_server_group(self.alb_client, server_group_id, instance_id)
+        alb_utils.remove_servers_from_server_group(self.alb_client, server_group_id, instance_id)
+
+    def test_update_server_group_servers_attribute(self):
+        instance_id = ["i-bp19n839usecekzn2ig9"]
+        server_group_id = "sgp-ec4gopoclruofsfmxu"
+        add_weight_list = [(10, 3), (0, 1)]
+        alb_utils.update_server_group_servers_attribute(self.alb_client, [server_group_id], instance_id, add_weight_list)
+
 
-    def test_set_instance_weight_process_with_alb(self):
-        instance_ids = ["i-bp19n839usecekzn2ig9"]  # PaddlePaddle_k8s集群登陆实例,不影响线上服务
-        weight_list = [(10, 1)]  # 权重和sleep时间
-        utils.set_instance_weight_process_with_alb(self.alb_client, [server_group_id], instance_ids, weight_list)
 
 if __name__ == '__main__':
     unittest.main()

+ 8 - 8
gateway/gateway_update.py

@@ -10,7 +10,7 @@ import time
 from aliyunsdkcore import client
 from aliyunsdkecs.request.v20140526.DescribeNetworkInterfacesRequest import DescribeNetworkInterfacesRequest
 import gateway_config
-import utils
+import alb_utils
 
 # 从配置文件中获取应用程序名称和容器仓库地址
 apps = gateway_config.apps
@@ -47,7 +47,7 @@ def update(instance_id):
     time.sleep(10)  # 等待10秒钟
     global success_count
 
-    ipadd = utils.get_ip_address(ecs_client, instance_id)  # 使用 utils 获取实例的 IP 地址
+    ipadd = alb_utils.get_ip_address(ecs_client, instance_id)  # 使用 utils 获取实例的 IP 地址
     print("服务器信息:" + "%s/%s" % (instance_id, ipadd))
     client = docker.DockerClient(base_url='tcp://%s:2375' % (ipadd), timeout=60)
 
@@ -72,7 +72,7 @@ def update(instance_id):
 
         weight_list = [(10, 5), (20, 5), (40, 5), (60, 5), (80, 5), (100, 5)]
         for server_group_id in gateway_config.server_group_id_list:
-            utils.set_instance_weight_process_with_alb(alb_client, [server_group_id],   [instance_id], weight_list)
+            alb_utils.update_server_group_servers_attribute(alb_client, [server_group_id],   [instance_id], weight_list)
 
         success_count += 1
         print("更新进度" + "%s/%s" % (success_count, total))
@@ -84,7 +84,7 @@ def update(instance_id):
 def pull_image():
     """从镜像仓库中拉取指定版本的镜像"""
     instanceId = q1.get()
-    ipaddr = utils.get_ip_address(ecs_client, instanceId)
+    ipaddr = alb_utils.get_ip_address(ecs_client, instanceId)
     cd_url = "tcp://{}:2375".format(ipaddr)
     client = docker.DockerClient(base_url=cd_url, timeout=30)
 
@@ -99,12 +99,12 @@ def pull_image():
 
 if __name__ == '__main__':
     # 初始化 ECS 客户端
-    ecs_client = utils.connect_client(access_key_id=gateway_config.ecs_client_params['access_key_id'],
+    ecs_client = alb_utils.connect_client(access_key_id=gateway_config.ecs_client_params['access_key_id'],
                                       access_key_secret=gateway_config.ecs_client_params['access_key_secret'],
                                       region_id=gateway_config.ecs_client_params['region_id'])
 
     # 初始化 ALB 客户端
-    alb_client = utils.connect_alb_client(gateway_config.alb_client_params['access_key_id'],
+    alb_client = alb_utils.connect_alb_client(gateway_config.alb_client_params['access_key_id'],
                                           gateway_config.alb_client_params['access_key_secret'],
                                           endpoint=gateway_config.alb_client_params['endpoint']
                                           )
@@ -116,7 +116,7 @@ if __name__ == '__main__':
     q1 = queue.Queue()
 
     # 获取 ALB 下服务器组的实例 ID
-    res = utils.get_instance_ids(alb_client=alb_client, server_group_id=gateway_config.server_group_id_list[0])
+    res = alb_utils.list_server_group_servers(alb_client=alb_client, server_group_id=gateway_config.server_group_id_list[0])
     total += len(res)
     InstanceIDs.extend(res)
     print(InstanceIDs)
@@ -137,6 +137,6 @@ if __name__ == '__main__':
     # 更新每个实例
     for instanceID in InstanceIDs:
         for server_group_id in gateway_config.server_group_id_list:
-            utils.set_instance_weight_process_with_alb(alb_client, [server_group_id], [instanceID],
+            alb_utils.update_server_group_servers_attribute(alb_client, [server_group_id], [instanceID],
                                                        [(0, 20)])  # 设置初始权重为0
         update(instanceID)

+ 1 - 1
longvideoapi/longvideoapi_config.py

@@ -170,7 +170,7 @@ instance_config_k_alb = {
 
 # 服务启动脚本
 start_sh_dir = os.path.dirname(os.path.realpath(__file__))
-start_sh_filename = 'longvideo_start.sh'
+start_sh_filename = 'longvideo_start.sh'      #  todo   脚本不存在,copy后维护两个路径,是否合并
 with open(file=os.path.join(start_sh_dir, start_sh_filename), mode='r', encoding='utf-8') as rf:
     file_content = rf.read()
     logging.info(f"start sh file content: {file_content}")

+ 12 - 18
longvideoapi/longvideoapi_grayscale_update.py

@@ -2,7 +2,7 @@ import asyncio
 import sys
 import time
 import requests
-import utils
+import alb_utils
 import logging
 import os
 import docker
@@ -23,7 +23,7 @@ def server_health_check(ecs_client, instance_id):
     :return:
     """
     global health_instances
-    ip_address = utils.get_ip_address(ecs_client=ecs_client, instance_id=instance_id)
+    ip_address = alb_utils.get_ip_address(ecs_client=ecs_client, instance_id=instance_id)
     while True:
         health_check_url = f"http://{ip_address}:8080/longvideoapi/test"
         try:
@@ -48,7 +48,7 @@ def remove_container_image(ecs_client, instance_id, container_name_list):
     :param container_name_list: 容器名称 type-list
     :return:
     """
-    ip_address = utils.get_ip_address(ecs_client=ecs_client, instance_id=instance_id)
+    ip_address = alb_utils.get_ip_address(ecs_client=ecs_client, instance_id=instance_id)
     logging.info(f"服务器信息:{instance_id}/{ip_address}")
     client = docker.DockerClient(base_url=f'tcp://{ip_address}:2375', timeout=60)
 
@@ -105,7 +105,7 @@ def update_instance(ecs_client, alb_client, instance_id, version):
     # 1. 摘流量,将权重降为0
     health_instance_ids = [instance_id]
     weight_list = [(0, 20)]  # 设置权重为0,等待20秒
-    utils.set_instance_weight_process_with_alb(alb_client,
+    alb_utils.update_server_group_servers_attribute(alb_client,
                                                longvideoapi_config.server_group_id_list,
                                                health_instance_ids,
                                                weight_list)
@@ -115,7 +115,7 @@ def update_instance(ecs_client, alb_client, instance_id, version):
     global remove_container_instances
     remove_container_instances = []
     container_name_list = ['vlogapi', 'longvideoapi']
-    remove_container_image(alb_client, instance_id, container_name_list)
+    remove_container_image(ecs_client, instance_id, container_name_list)
     logging.info(f"remove container & images finished, instance: {remove_container_instances},"
                  f" count: {len(remove_container_instances)}")
     if len(remove_container_instances) == 0:
@@ -123,18 +123,18 @@ def update_instance(ecs_client, alb_client, instance_id, version):
         sys.exit()
 
     # 3. 发送启动脚本到机器上
-    utils.send_file_to_ecs(ecs_client=ecs_client, instance_id_list=[instance_id], **longvideoapi_config.start_sh)
+    alb_utils.send_file_to_ecs(ecs_client=ecs_client, instance_id_list=[instance_id], **longvideoapi_config.start_sh)
     logging.info(f"send start shell file finished, instance: {instance_id}")
 
     # 4. 启动服务
     server_start_sh = os.path.join(longvideoapi_config.start_sh['target_dir'], longvideoapi_config.start_sh['name'])
     server_start_command = f"sh {server_start_sh} {version}"
-    utils.run_command(ecs_client=ecs_client, instance_ids=[instance_id], command=server_start_command)
+    alb_utils.run_command(ecs_client=ecs_client, instance_ids=[instance_id], command=server_start_command)
 
     # 5. 探活
     global health_instances
     health_instances = []
-    server_health_check(alb_client, instance_id)
+    server_health_check(ecs_client, instance_id)
     logging.info(f"health instances: {health_instances}, count: {len(health_instances)}")
 
     # 6. 挂载流量
@@ -143,15 +143,9 @@ def update_instance(ecs_client, alb_client, instance_id, version):
         sys.exit()
     # 机器探活成功
     time.sleep(20)
-    # 使用 ALB 的函数挂载实例
-    # health_instance_ids = [instance_id for instance_id, _ in health_instances]
-    # for server_group_id in longvideoapi_config.server_group_id_list:
-    #     for instance_id in health_instance_ids:
-    #         utils.add_servers_to_server_group(alb_client, server_group_id, instance_id, weight=0)
-    #         logging.info(f"Successfully added instance {instance_id} to server group {server_group_id}.")
 
     add_weight_list = [(10, 5), (20, 5), (40, 5), (60, 5), (80, 5), (100, 5)]
-    utils.set_instance_weight_process_with_alb(alb_client,
+    alb_utils.update_server_group_servers_attribute(alb_client,
                                                longvideoapi_config.server_group_id_list,
                                                health_instance_ids,
                                                add_weight_list)
@@ -161,19 +155,19 @@ def update_instance(ecs_client, alb_client, instance_id, version):
 def main():
     try:
         version = sys.argv[1]
-        alb_client = utils.connect_alb_client(
+        alb_client = alb_utils.connect_alb_client(
             access_key_id=longvideoapi_config.alb_client_params['access_key_id'],
             access_key_secret=longvideoapi_config.alb_client_params['access_key_secret'],
             endpoint=longvideoapi_config.alb_client_params['endpoint']
         )
 
-        ecs_client = utils.connect_client(access_key_id=longvideoapi_config.ecs_client_params['access_key_id'],
+        ecs_client = alb_utils.connect_client(access_key_id=longvideoapi_config.ecs_client_params['access_key_id'],
                                              access_key_secret=longvideoapi_config.ecs_client_params[
                                                  'access_key_secret'],
                                              region_id=longvideoapi_config.ecs_client_params['region_id'])
 
         # 1. 获取ALB下所有机器
-        online_instance_ids = utils.get_instance_ids(alb_client=alb_client,
+        online_instance_ids = alb_utils.list_server_group_servers(alb_client=alb_client,
                                                      server_group_id=longvideoapi_config.server_group_id_list[0])
         online_instance_count = len(online_instance_ids)
         logging.info(f"online instance count: {online_instance_count}.")

+ 9 - 9
longvideoapi/longvideoapi_reduce_with_count.py

@@ -1,6 +1,6 @@
 import sys
 import time
-import utils
+import alb_utils
 import longvideoapi_config
 import logging
 
@@ -20,7 +20,7 @@ def remove_instances(ecs_client, alb_client, instance_ids):
     # 1. 摘除流量
     weight_list = [(0, 20)]  # 设置权重为0,等待20秒
     try:
-        utils.set_instance_weight_process_with_alb(alb_client,
+        alb_utils.update_server_group_servers_attribute(alb_client,
                                                    longvideoapi_config.server_group_id_list,
                                                    instance_ids,
                                                    weight_list)
@@ -34,7 +34,7 @@ def remove_instances(ecs_client, alb_client, instance_ids):
     # 2. 从 ALB 服务器组中移除实例
     for server_group_id in longvideoapi_config.server_group_id_list:
         try:
-            utils.remove_servers_from_server_group(alb_client=alb_client, server_group_id=server_group_id,
+            alb_utils.remove_servers_from_server_group(alb_client=alb_client, server_group_id=server_group_id,
                                                    instance_id=instance_ids)
             logging.info(f"Successfully removed instances from server group {server_group_id}.")
         except Exception as e:
@@ -43,7 +43,7 @@ def remove_instances(ecs_client, alb_client, instance_ids):
     logging.info(f"Remove from ALB finished, instances: {instance_ids}")
 
     # 3. 停止机器
-    stop_response = utils.stop_instances(ecs_client=ecs_client, instance_ids=instance_ids)
+    stop_response = alb_utils.stop_instances(ecs_client=ecs_client, instance_ids=instance_ids)
     if stop_response.get('Code') is None:
         logging.info(f"Instances stop finished, instances: {instance_ids}")
     else:
@@ -52,7 +52,7 @@ def remove_instances(ecs_client, alb_client, instance_ids):
 
     # 4. 判断机器运行状态是否为 Stopped
     while True:
-        response = utils.get_instances_status(ecs_client=ecs_client, instance_ids=instance_ids)
+        response = alb_utils.get_instances_status(ecs_client=ecs_client, instance_ids=instance_ids)
         if response.get('Code') is None:
             instances_list = response.get('InstanceStatuses').get('InstanceStatus')
             stopped_instances = [instance.get('InstanceId') for instance in instances_list if
@@ -68,7 +68,7 @@ def remove_instances(ecs_client, alb_client, instance_ids):
             sys.exit()
 
     # 5. 释放机器
-    release_response = utils.release_instances(ecs_client=ecs_client, instance_ids=stopped_instances)
+    release_response = alb_utils.release_instances(ecs_client=ecs_client, instance_ids=stopped_instances)
     if release_response.get('Code') is None:
         logging.info(f"Release instances finished, instances: {stopped_instances}")
     else:
@@ -78,13 +78,13 @@ def remove_instances(ecs_client, alb_client, instance_ids):
 
 def main():
     try:
-        alb_client = utils.connect_alb_client(
+        alb_client = alb_utils.connect_alb_client(
             access_key_id=longvideoapi_config.alb_client_params['access_key_id'],
             access_key_secret=longvideoapi_config.alb_client_params['access_key_secret'],
             endpoint=longvideoapi_config.alb_client_params['endpoint']
         )
 
-        ecs_client = utils.connect_client(
+        ecs_client = alb_utils.connect_client(
             access_key_id=longvideoapi_config.ecs_client_params['access_key_id'],
             access_key_secret=longvideoapi_config.ecs_client_params['access_key_secret'],
             region_id=longvideoapi_config.ecs_client_params['region_id']
@@ -95,7 +95,7 @@ def main():
         logging.info(f"reduce instances count: {reduce_count}")
 
         # 获取 ALB 下所有机器
-        online_instance_ids = utils.get_instance_ids(alb_client=alb_client, server_group_id=longvideoapi_config.server_group_id_list[0])
+        online_instance_ids = alb_utils.list_server_group_servers(alb_client=alb_client, server_group_id=longvideoapi_config.server_group_id_list[0])
         online_instance_count = len(online_instance_ids)
         logging.info(f"online instance count: {online_instance_count}.")
         logging.info(f"online instance ids: {online_instance_ids}")

+ 7 - 7
longvideoapi/longvideoapi_restart.py

@@ -2,7 +2,7 @@ import logging
 import time
 import docker
 import longvideoapi_config
-import utils
+import alb_utils
 from longvideoapi_update_k import server_health_check
 
 logging.basicConfig(level=logging.INFO,
@@ -13,11 +13,11 @@ def server_restart(ecs_client, alb_client, instance_id, image_name):
     try:
         logging.info(f"Restarting instance: {instance_id}")
         # 获取ip
-        ip_address = utils.get_ip_address(ecs_client=ecs_client, instance_id=instance_id)
+        ip_address = alb_utils.get_ip_address(ecs_client=ecs_client, instance_id=instance_id)
         logging.info(f"IP address: {instance_id}/{ip_address}")
 
         # 摘流量
-        utils.set_instance_weight_process_with_alb(alb_client=alb_client,
+        alb_utils.update_server_group_servers_attribute(alb_client=alb_client,
                                                    server_group_id_list=longvideoapi_config.server_group_id_list,
                                                    instance_id_list=instance_id,
                                                    weight_list=[(0, 20)])
@@ -36,7 +36,7 @@ def server_restart(ecs_client, alb_client, instance_id, image_name):
 
         # 设置权重
         add_weight_list = [(10, 5), (20, 5), (40, 5), (60, 5), (80, 5), (100, 5)]
-        utils.set_instance_weight_process_with_alb(alb_client,
+        alb_utils.update_server_group_servers_attribute(alb_client,
                                                    longvideoapi_config.server_group_id_list,
                                                    instance_id,
                                                    add_weight_list)
@@ -48,18 +48,18 @@ def server_restart(ecs_client, alb_client, instance_id, image_name):
 
 def main():
     try:
-        ecs_client = utils.connect_client(access_key_id=longvideoapi_config.ecs_client_params['access_key_id'],
+        ecs_client = alb_utils.connect_client(access_key_id=longvideoapi_config.ecs_client_params['access_key_id'],
                                           access_key_secret=longvideoapi_config.ecs_client_params['access_key_secret'],
                                           region_id=longvideoapi_config.ecs_client_params['region_id'])
 
-        alb_client = utils.connect_alb_client(
+        alb_client = alb_utils.connect_alb_client(
             access_key_id=longvideoapi_config.alb_client_params['access_key_id'],
             access_key_secret=longvideoapi_config.alb_client_params['access_key_secret'],
             endpoint=longvideoapi_config.alb_client_params['endpoint']
         )
 
         # 获取 ALB 下所有机器
-        online_instance_ids = utils.get_instance_ids(alb_client=alb_client,
+        online_instance_ids = alb_utils.list_server_group_servers(alb_client=alb_client,
                                                      server_group_id=longvideoapi_config.server_group_id_list[0])
         online_instance_count = len(online_instance_ids)
         logging.info(f"Online instance count: {online_instance_count}.")

+ 8 - 8
longvideoapi/longvideoapi_scaling_k_count.py

@@ -5,7 +5,7 @@ import logging
 import time
 import requests
 
-import utils
+import alb_utils
 import longvideoapi_config
 
 from concurrent.futures import ThreadPoolExecutor
@@ -25,7 +25,7 @@ def longvideoapi_health_check(ecs_client, instance_id, max_wait_time=None):
     """
     global health_instances
     start_time = time.time()
-    ip_address = utils.get_ip_address(ecs_client=ecs_client, instance_id=instance_id)
+    ip_address = alb_utils.get_ip_address(ecs_client=ecs_client, instance_id=instance_id)
     while True:
         health_check_url = f"http://{ip_address}:8080/longvideoapi/test"
         try:
@@ -59,7 +59,7 @@ async def ess_instance(ecs_client, alb_client, ess_count, max_workers):
     :return:
     """
     # 1. 购买机器并启动
-    ess_instance_ids = utils.create_multiple_instances(
+    ess_instance_ids = alb_utils.create_multiple_instances(
         amount=ess_count,
         ecs_client=ecs_client,
         **longvideoapi_config.instance_config_k,
@@ -67,13 +67,13 @@ async def ess_instance(ecs_client, alb_client, ess_count, max_workers):
     time.sleep(60)
 
     # 2. 发送启动脚本到机器上
-    utils.send_file_to_ecs(ecs_client=ecs_client, instance_id_list=ess_instance_ids, **longvideoapi_config.start_sh)
+    alb_utils.send_file_to_ecs(ecs_client=ecs_client, instance_id_list=ess_instance_ids, **longvideoapi_config.start_sh)
     logging.info(f"send start shell file finished, instances: {ess_instance_ids}")
     # 3. 启动服务
     start_sh_param = "latest"
     server_start_sh = os.path.join(longvideoapi_config.start_sh['target_dir'], longvideoapi_config.start_sh['name'])
     server_start_commend = f"sh {server_start_sh} {start_sh_param}"
-    utils.run_command(ecs_client=ecs_client, instance_ids=ess_instance_ids, command=server_start_commend)
+    alb_utils.run_command(ecs_client=ecs_client, instance_ids=ess_instance_ids, command=server_start_commend)
     # 4. 异步探活
     global health_instances
     health_instances = []
@@ -93,7 +93,7 @@ async def ess_instance(ecs_client, alb_client, ess_count, max_workers):
         time.sleep(20)
         for instance_id, ip in health_instances:
             for server_group_id in longvideoapi_config.server_group_id_list:
-                utils.add_servers_to_server_group(alb_client, server_group_id, instance_id, weight=100)
+                alb_utils.add_servers_to_server_group(alb_client, server_group_id, instance_id, weight=100)
         logging.info(f"ess count: {ess_count}, "
                      f"create count: {len(ess_instance_ids)}, "
                      f"finished count: {len(health_instances)}")
@@ -107,10 +107,10 @@ async def ess_instance(ecs_client, alb_client, ess_count, max_workers):
 
 def main():
     try:
-        ecs_client = utils.connect_client(access_key_id=longvideoapi_config.ecs_client_params['access_key_id'],
+        ecs_client = alb_utils.connect_client(access_key_id=longvideoapi_config.ecs_client_params['access_key_id'],
                                              access_key_secret=longvideoapi_config.ecs_client_params['access_key_secret'],
                                              region_id=longvideoapi_config.ecs_client_params['region_id'])
-        alb_client = utils.connect_alb_client(
+        alb_client = alb_utils.connect_alb_client(
             access_key_id=longvideoapi_config.alb_client_params['access_key_id'],
             access_key_secret=longvideoapi_config.alb_client_params['access_key_secret'],
             endpoint=longvideoapi_config.alb_client_params['endpoint']

+ 20 - 20
longvideoapi/longvideoapi_update_k.py

@@ -2,7 +2,7 @@ import asyncio
 import sys
 import time
 import requests
-import utils
+import alb_utils
 import logging
 import os
 import docker
@@ -24,7 +24,7 @@ def server_health_check(ecs_client, instance_id):
     :return:
     """
     global health_instances
-    ip_address = utils.get_ip_address(ecs_client=ecs_client, instance_id=instance_id)
+    ip_address = alb_utils.get_ip_address(ecs_client=ecs_client, instance_id=instance_id)
     while True:
         health_check_url = f"http://{ip_address}:8080/longvideoapi/test"
         try:
@@ -52,7 +52,7 @@ async def ess_instance(ecs_client, alb_client, ess_count, max_workers, version):
     :return:
     """
     # 1. 购买机器并启动
-    ess_instance_ids = utils.create_multiple_instances(
+    ess_instance_ids = alb_utils.create_multiple_instances(
         amount=ess_count,
         ecs_client=ecs_client,
         **longvideoapi_config.instance_config_k,
@@ -60,12 +60,12 @@ async def ess_instance(ecs_client, alb_client, ess_count, max_workers, version):
     time.sleep(60)
 
     # 2. 发送启动脚本到机器上
-    utils.send_file_to_ecs(ecs_client=ecs_client, instance_id_list=ess_instance_ids, **longvideoapi_config.start_sh)
+    alb_utils.send_file_to_ecs(ecs_client=ecs_client, instance_id_list=ess_instance_ids, **longvideoapi_config.start_sh)
     logging.info(f"send start shell file finished, instances: {ess_instance_ids}")
     # 3. 启动服务
     server_start_sh = os.path.join(longvideoapi_config.start_sh['target_dir'], longvideoapi_config.start_sh['name'])
     server_start_commend = f"sh {server_start_sh} {version}"
-    utils.run_command(ecs_client=ecs_client, instance_ids=ess_instance_ids, command=server_start_commend)
+    alb_utils.run_command(ecs_client=ecs_client, instance_ids=ess_instance_ids, command=server_start_commend)
     # 4. 异步探活
     global health_instances
     health_instances = []
@@ -84,11 +84,11 @@ async def ess_instance(ecs_client, alb_client, ess_count, max_workers, version):
         health_instance_ids = [instance_id for instance_id, _ in health_instances]
         for server_group_id in longvideoapi_config.server_group_id_list:
             for instance_id in health_instance_ids:
-                utils.add_servers_to_server_group(alb_client, server_group_id, instance_id, weight=0)
+                alb_utils.add_servers_to_server_group(alb_client, server_group_id, instance_id, weight=0)
                 logging.info(f"Successfully added instance {instance_id} to server group {server_group_id}.")
 
         add_weight_list = [(10, 5), (20, 5), (40, 5), (60, 5), (80, 5), (100, 5)]
-        utils.set_instance_weight_process_with_alb(alb_client,
+        alb_utils.update_server_group_servers_attribute(alb_client,
                                                    longvideoapi_config.server_group_id_list,
                                                    health_instance_ids,
                                                    add_weight_list)
@@ -104,7 +104,7 @@ def remove_container_image(ecs_client, instance_id, container_name_list):
     :param container_name: 容器名称 type-string
     :return:
     """
-    ip_address = utils.get_ip_address(ecs_client=ecs_client, instance_id=instance_id)
+    ip_address = alb_utils.get_ip_address(ecs_client=ecs_client, instance_id=instance_id)
     logging.info(f"服务器信息:{instance_id}/{ip_address}")
     client = docker.DockerClient(base_url=f'tcp://{ip_address}:2375', timeout=60)
     # 移除旧的容器
@@ -164,7 +164,7 @@ async def update_instance(ecs_client, alb_client, instance_ids, max_workers, ver
     for instance_id_list in instance_ids_group:
         logging.info(f"update instances: {instance_id_list}")
         # 1. 摘流量
-        utils.set_instance_weight_process_with_alb(alb_client=alb_client,
+        alb_utils.update_server_group_servers_attribute(alb_client=alb_client,
                                                     server_group_id_list=longvideoapi_config.server_group_id_list,
                                                     instance_id_list=instance_id_list,
                                                     weight_list=[(0, 20)])
@@ -188,12 +188,12 @@ async def update_instance(ecs_client, alb_client, instance_ids, max_workers, ver
                           f"request count: {len(instance_id_list)}, removed count: {len(remove_container_instances)}")
             sys.exit()
         # 3. 发送启动脚本到机器上
-        utils.send_file_to_ecs(ecs_client=ecs_client, instance_id_list=instance_id_list, **longvideoapi_config.start_sh)
+        alb_utils.send_file_to_ecs(ecs_client=ecs_client, instance_id_list=instance_id_list, **longvideoapi_config.start_sh)
         logging.info(f"send start shell file finished, instances: {instance_id_list}, count: {len(instance_id_list)}")
         # 4. 启动服务
         server_start_sh = os.path.join(longvideoapi_config.start_sh['target_dir'], longvideoapi_config.start_sh['name'])
         server_start_commend = f"sh {server_start_sh} {version}"
-        utils.run_command(ecs_client=ecs_client, instance_ids=instance_id_list, command=server_start_commend)
+        alb_utils.run_command(ecs_client=ecs_client, instance_ids=instance_id_list, command=server_start_commend)
         # 5. 异步探活
         global health_instances
         health_instances = []
@@ -212,7 +212,7 @@ async def update_instance(ecs_client, alb_client, instance_ids, max_workers, ver
             health_instance_ids = [instance_id for instance_id, _ in health_instances]
 
             add_weight_list = [(10, 5), (20, 5), (40, 5), (60, 5), (80, 5), (100, 5)]
-            utils.set_instance_weight_process_with_alb(alb_client,
+            alb_utils.update_server_group_servers_attribute(alb_client,
                                                        longvideoapi_config.server_group_id_list,
                                                        health_instance_ids,
                                                        add_weight_list)
@@ -235,7 +235,7 @@ def remove_instances(ecs_client, alb_client, instance_ids):
     # 1. 摘流量
     weight_list = [(0, 20)]  # 设置权重为0,等待20秒
     try:
-        utils.set_instance_weight_process_with_alb(alb_client,
+        alb_utils.update_server_group_servers_attribute(alb_client,
                                                    longvideoapi_config.server_group_id_list,
                                                    instance_ids,
                                                    weight_list)
@@ -247,7 +247,7 @@ def remove_instances(ecs_client, alb_client, instance_ids):
     # 2.移除alb
     for server_group_id in longvideoapi_config.server_group_id_list:
         try:
-            utils.remove_servers_from_server_group(alb_client=alb_client, server_group_id=server_group_id,
+            alb_utils.remove_servers_from_server_group(alb_client=alb_client, server_group_id=server_group_id,
                                                    instance_id=instance_ids)
             logging.info(f"Successfully removed instances from server group {server_group_id}.")
         except Exception as e:
@@ -256,7 +256,7 @@ def remove_instances(ecs_client, alb_client, instance_ids):
     logging.info(f"Remove from ALB finished, instances: {instance_ids}")
 
     # 3. 停止机器
-    stop_response = utils.stop_instances(ecs_client=ecs_client, instance_ids=instance_ids)
+    stop_response = alb_utils.stop_instances(ecs_client=ecs_client, instance_ids=instance_ids)
     if stop_response.get('Code') is None:
         logging.info(f"Instances stop finished, instances: {instance_ids}")
     else:
@@ -265,7 +265,7 @@ def remove_instances(ecs_client, alb_client, instance_ids):
 
     # 4. 判断机器运行状态是否为Stopped
     while True:
-        response = utils.get_instances_status(ecs_client=ecs_client, instance_ids=instance_ids)
+        response = alb_utils.get_instances_status(ecs_client=ecs_client, instance_ids=instance_ids)
         if response.get('Code') is None:
             instances_list = response.get('InstanceStatuses').get('InstanceStatus')
             stopped_instances = [instance.get('InstanceId') for instance in instances_list if
@@ -280,7 +280,7 @@ def remove_instances(ecs_client, alb_client, instance_ids):
             logging.error(response)
             sys.exit()
     # 5. 释放机器
-    release_response = utils.release_instances(ecs_client=ecs_client, instance_ids=stopped_instances)
+    release_response = alb_utils.release_instances(ecs_client=ecs_client, instance_ids=stopped_instances)
     if release_response.get('Code') is None:
         logging.info(f"Release instances finished, instances: {stopped_instances}")
     else:
@@ -291,17 +291,17 @@ def remove_instances(ecs_client, alb_client, instance_ids):
 def main():
     try:
         version = sys.argv[1]
-        alb_client = utils.connect_alb_client(
+        alb_client = alb_utils.connect_alb_client(
             access_key_id=longvideoapi_config.alb_client_params['access_key_id'],
             access_key_secret=longvideoapi_config.alb_client_params['access_key_secret'],
             endpoint=longvideoapi_config.alb_client_params['endpoint']
         )
-        ecs_client = utils.connect_client(access_key_id=longvideoapi_config.ecs_client_params['access_key_id'],
+        ecs_client = alb_utils.connect_client(access_key_id=longvideoapi_config.ecs_client_params['access_key_id'],
                                              access_key_secret=longvideoapi_config.ecs_client_params['access_key_secret'],
                                              region_id=longvideoapi_config.ecs_client_params['region_id'])
 
         # 1. 获取alb下所有机器
-        online_instance_ids = utils.get_instance_ids(alb_client=alb_client, server_group_id=longvideoapi_config.server_group_id_list[0])
+        online_instance_ids = alb_utils.list_server_group_servers(alb_client=alb_client, server_group_id=longvideoapi_config.server_group_id_list[0])
         online_instance_count = len(online_instance_ids)
         logging.info(f"online instance count: {online_instance_count}.")
         logging.info(f"online instance ids: {online_instance_ids}")