|  | @@ -1,349 +0,0 @@
 | 
	
		
			
				|  |  | -import asyncio
 | 
	
		
			
				|  |  | -import sys
 | 
	
		
			
				|  |  | -import time
 | 
	
		
			
				|  |  | -import requests
 | 
	
		
			
				|  |  | -import alb_utils
 | 
	
		
			
				|  |  | -import logging
 | 
	
		
			
				|  |  | -import os
 | 
	
		
			
				|  |  | -import docker
 | 
	
		
			
				|  |  | -import longvideoapi_config
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -from concurrent.futures import ThreadPoolExecutor
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -from gateway.gateway_config import server_group_id_list
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -health_instances = []
 | 
	
		
			
				|  |  | -ess_instances = []
 | 
	
		
			
				|  |  | -remove_container_instances = []
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -def server_health_check(ecs_client, instance_id):
 | 
	
		
			
				|  |  | -    """
 | 
	
		
			
				|  |  | -    服务健康检查
 | 
	
		
			
				|  |  | -    :param ecs_client: 客户端连接
 | 
	
		
			
				|  |  | -    :param instance_id: instanceId
 | 
	
		
			
				|  |  | -    :return:
 | 
	
		
			
				|  |  | -    """
 | 
	
		
			
				|  |  | -    global health_instances
 | 
	
		
			
				|  |  | -    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:
 | 
	
		
			
				|  |  | -            http_code = requests.get(health_check_url).status_code
 | 
	
		
			
				|  |  | -        except:
 | 
	
		
			
				|  |  | -            logging.info(f"images is downloading ip:{ip_address}")
 | 
	
		
			
				|  |  | -            http_code = 0
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        if http_code == 200:
 | 
	
		
			
				|  |  | -            health_instances.append((instance_id, ip_address))
 | 
	
		
			
				|  |  | -            logging.info(f"health check success, instance: {instance_id}/{ip_address}")
 | 
	
		
			
				|  |  | -            break
 | 
	
		
			
				|  |  | -        else:
 | 
	
		
			
				|  |  | -            time.sleep(10)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -async def ess_instance(ecs_client, alb_client, ess_count, max_workers, version, port):
 | 
	
		
			
				|  |  | -    """
 | 
	
		
			
				|  |  | -    扩容机器并运行新服务
 | 
	
		
			
				|  |  | -    :param ecs_client: 购买机器客户端连接
 | 
	
		
			
				|  |  | -    :param alb_client: 修改负载均衡权限
 | 
	
		
			
				|  |  | -    :param ess_count: 扩容数量
 | 
	
		
			
				|  |  | -    :param max_workers: 线程数
 | 
	
		
			
				|  |  | -    :param version: 版本标记
 | 
	
		
			
				|  |  | -    :param port: 后端服务器使用的端口
 | 
	
		
			
				|  |  | -    :return:
 | 
	
		
			
				|  |  | -    """
 | 
	
		
			
				|  |  | -    # 1. 购买机器并启动
 | 
	
		
			
				|  |  | -    ess_instance_ids = alb_utils.create_multiple_instances(
 | 
	
		
			
				|  |  | -        amount=ess_count,
 | 
	
		
			
				|  |  | -        ecs_client=ecs_client,
 | 
	
		
			
				|  |  | -        **longvideoapi_config.instance_config_k,
 | 
	
		
			
				|  |  | -    )
 | 
	
		
			
				|  |  | -    time.sleep(60)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    # 2. 发送启动脚本到机器上
 | 
	
		
			
				|  |  | -    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}"
 | 
	
		
			
				|  |  | -    alb_utils.run_command(ecs_client=ecs_client, instance_ids=ess_instance_ids, command=server_start_commend)
 | 
	
		
			
				|  |  | -    # 4. 异步探活
 | 
	
		
			
				|  |  | -    global health_instances
 | 
	
		
			
				|  |  | -    health_instances = []
 | 
	
		
			
				|  |  | -    loop = asyncio.get_running_loop()
 | 
	
		
			
				|  |  | -    executor = ThreadPoolExecutor(max_workers=max_workers)
 | 
	
		
			
				|  |  | -    tasks = [
 | 
	
		
			
				|  |  | -        loop.run_in_executor(executor, server_health_check, *args) for args in
 | 
	
		
			
				|  |  | -        [(alb_client, instance_id) for instance_id in ess_instance_ids]
 | 
	
		
			
				|  |  | -    ]
 | 
	
		
			
				|  |  | -    await asyncio.wait(tasks)
 | 
	
		
			
				|  |  | -    logging.info(f"health instances count: {len(health_instances)}, {health_instances}")
 | 
	
		
			
				|  |  | -    # 5. 挂载流量
 | 
	
		
			
				|  |  | -    if len(health_instances) == len(ess_instance_ids):
 | 
	
		
			
				|  |  | -        # 所有机器探活成功
 | 
	
		
			
				|  |  | -        time.sleep(20)
 | 
	
		
			
				|  |  | -        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:
 | 
	
		
			
				|  |  | -                alb_utils.add_servers_to_server_group(alb_client, server_group_id, instance_id, weight=0, port=port)
 | 
	
		
			
				|  |  | -                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)]
 | 
	
		
			
				|  |  | -        alb_utils.update_server_group_servers_attribute(alb_client,
 | 
	
		
			
				|  |  | -                                                   server_group_id_list=longvideoapi_config.server_group_id_list,
 | 
	
		
			
				|  |  | -                                                   instance_id_list=health_instance_ids,
 | 
	
		
			
				|  |  | -                                                   weight_list=add_weight_list,
 | 
	
		
			
				|  |  | -                                                   port=port)
 | 
	
		
			
				|  |  | -        global ess_instances
 | 
	
		
			
				|  |  | -        ess_instances.extend(health_instance_ids)
 | 
	
		
			
				|  |  | -        logging.info(f"ess count: {ess_count}, "
 | 
	
		
			
				|  |  | -                     f"create count: {len(ess_instance_ids)}, "
 | 
	
		
			
				|  |  | -                     f"finished count: {len(health_instance_ids)}")
 | 
	
		
			
				|  |  | -    else:
 | 
	
		
			
				|  |  | -        logging.info(f"ess count: {ess_count}, "
 | 
	
		
			
				|  |  | -                     f"create count: {len(ess_instance_ids)}, "
 | 
	
		
			
				|  |  | -                     f"health count: {len(health_instances)}")
 | 
	
		
			
				|  |  | -        sys.exit()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -def remove_container_image(ecs_client, instance_id, container_name_list):
 | 
	
		
			
				|  |  | -    """
 | 
	
		
			
				|  |  | -    移除旧容器并删除旧镜像
 | 
	
		
			
				|  |  | -    :param ecs_client: 客户端连接
 | 
	
		
			
				|  |  | -    :param instance_id: instanceId type-string
 | 
	
		
			
				|  |  | -    :param container_name: 容器名称 type-string
 | 
	
		
			
				|  |  | -    :return:
 | 
	
		
			
				|  |  | -    """
 | 
	
		
			
				|  |  | -    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)
 | 
	
		
			
				|  |  | -    # 移除旧的容器
 | 
	
		
			
				|  |  | -    container_remove_retry = 3
 | 
	
		
			
				|  |  | -    i = 0
 | 
	
		
			
				|  |  | -    while True:
 | 
	
		
			
				|  |  | -        if i >= container_remove_retry:
 | 
	
		
			
				|  |  | -            logging.error(f"容器不存在或者无法删除当前容器, instance = {instance_id}/{ip_address}")
 | 
	
		
			
				|  |  | -            sys.exit()
 | 
	
		
			
				|  |  | -        try:
 | 
	
		
			
				|  |  | -            flag = False
 | 
	
		
			
				|  |  | -            for container_name in container_name_list:
 | 
	
		
			
				|  |  | -                try:
 | 
	
		
			
				|  |  | -                    container_id = client.containers.get(container_name)
 | 
	
		
			
				|  |  | -                    container_id.remove(force=True)
 | 
	
		
			
				|  |  | -                    flag = True
 | 
	
		
			
				|  |  | -                    break
 | 
	
		
			
				|  |  | -                except:
 | 
	
		
			
				|  |  | -                    continue
 | 
	
		
			
				|  |  | -            if flag:
 | 
	
		
			
				|  |  | -                break
 | 
	
		
			
				|  |  | -        except Exception as e:
 | 
	
		
			
				|  |  | -            i += 1
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    # 删除旧镜像
 | 
	
		
			
				|  |  | -    images_remove_retry = 3
 | 
	
		
			
				|  |  | -    j = 0
 | 
	
		
			
				|  |  | -    while True:
 | 
	
		
			
				|  |  | -        if j >= images_remove_retry:
 | 
	
		
			
				|  |  | -            logging.error(f"镜像不存在,无法获取到镜像ID, instance = {instance_id}/{ip_address}")
 | 
	
		
			
				|  |  | -            sys.exit()
 | 
	
		
			
				|  |  | -        try:
 | 
	
		
			
				|  |  | -            images = client.images.list()
 | 
	
		
			
				|  |  | -            for image in images:
 | 
	
		
			
				|  |  | -                client.images.remove(force=True, image=image.tags[0])
 | 
	
		
			
				|  |  | -                time.sleep(2)
 | 
	
		
			
				|  |  | -            global remove_container_instances
 | 
	
		
			
				|  |  | -            remove_container_instances.append(instance_id)
 | 
	
		
			
				|  |  | -            break
 | 
	
		
			
				|  |  | -        except Exception as e:
 | 
	
		
			
				|  |  | -            i += 1
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -async def update_instance(ecs_client, alb_client, instance_ids, max_workers, version, port):
 | 
	
		
			
				|  |  | -    """
 | 
	
		
			
				|  |  | -    线上机器更新
 | 
	
		
			
				|  |  | -    :param ecs_client:
 | 
	
		
			
				|  |  | -    :param alb_client: alb客户端连接
 | 
	
		
			
				|  |  | -    :param instance_ids: instanceId type-list
 | 
	
		
			
				|  |  | -    :param max_workers:
 | 
	
		
			
				|  |  | -    :param version: 版本标记
 | 
	
		
			
				|  |  | -    :param port: 后端服务器使用的端口
 | 
	
		
			
				|  |  | -    :return:
 | 
	
		
			
				|  |  | -    """
 | 
	
		
			
				|  |  | -    media_index = len(instance_ids)//2
 | 
	
		
			
				|  |  | -    instance_ids_group = [instance_ids[:media_index], instance_ids[media_index:]]
 | 
	
		
			
				|  |  | -    update_finished_count = 0
 | 
	
		
			
				|  |  | -    for instance_id_list in instance_ids_group:
 | 
	
		
			
				|  |  | -        logging.info(f"update instances: {instance_id_list}")
 | 
	
		
			
				|  |  | -        # 1. 摘流量
 | 
	
		
			
				|  |  | -        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)],
 | 
	
		
			
				|  |  | -                                                    port=port)
 | 
	
		
			
				|  |  | -        logging.info(f"set weight with 0 finished, instances: {instance_id_list}")
 | 
	
		
			
				|  |  | -        # 2. 异步移除旧容器并删除旧镜像
 | 
	
		
			
				|  |  | -        global remove_container_instances
 | 
	
		
			
				|  |  | -        remove_container_instances = []
 | 
	
		
			
				|  |  | -        # container_name = 'longvideoapi'
 | 
	
		
			
				|  |  | -        container_name_list = ['vlogapi', 'longvideoapi']
 | 
	
		
			
				|  |  | -        loop = asyncio.get_running_loop()
 | 
	
		
			
				|  |  | -        executor = ThreadPoolExecutor(max_workers=max_workers)
 | 
	
		
			
				|  |  | -        tasks = [
 | 
	
		
			
				|  |  | -            loop.run_in_executor(executor, remove_container_image, *args) for args in
 | 
	
		
			
				|  |  | -            [(alb_client, instance_id, container_name_list) for instance_id in instance_id_list]
 | 
	
		
			
				|  |  | -        ]
 | 
	
		
			
				|  |  | -        await asyncio.wait(tasks)
 | 
	
		
			
				|  |  | -        logging.info(f"remove container & images finished, instances: {remove_container_instances},"
 | 
	
		
			
				|  |  | -                     f" count: {len(remove_container_instances)}")
 | 
	
		
			
				|  |  | -        if len(remove_container_instances) < len(instance_id_list):
 | 
	
		
			
				|  |  | -            logging.error(f"remove container image failed| "
 | 
	
		
			
				|  |  | -                          f"request count: {len(instance_id_list)}, removed count: {len(remove_container_instances)}")
 | 
	
		
			
				|  |  | -            sys.exit()
 | 
	
		
			
				|  |  | -        # 3. 发送启动脚本到机器上
 | 
	
		
			
				|  |  | -        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}"
 | 
	
		
			
				|  |  | -        alb_utils.run_command(ecs_client=ecs_client, instance_ids=instance_id_list, command=server_start_commend)
 | 
	
		
			
				|  |  | -        # 5. 异步探活
 | 
	
		
			
				|  |  | -        global health_instances
 | 
	
		
			
				|  |  | -        health_instances = []
 | 
	
		
			
				|  |  | -        loop = asyncio.get_running_loop()
 | 
	
		
			
				|  |  | -        executor = ThreadPoolExecutor(max_workers=max_workers)
 | 
	
		
			
				|  |  | -        tasks = [
 | 
	
		
			
				|  |  | -            loop.run_in_executor(executor, server_health_check, *args) for args in
 | 
	
		
			
				|  |  | -            [(alb_client, instance_id) for instance_id in instance_id_list]
 | 
	
		
			
				|  |  | -        ]
 | 
	
		
			
				|  |  | -        await asyncio.wait(tasks)
 | 
	
		
			
				|  |  | -        logging.info(f"health instances: {health_instances}, count: {len(health_instances)}")
 | 
	
		
			
				|  |  | -        # 6. 挂载流量
 | 
	
		
			
				|  |  | -        if len(health_instances) == len(instance_id_list):
 | 
	
		
			
				|  |  | -            # 所有机器探活成功
 | 
	
		
			
				|  |  | -            time.sleep(10)
 | 
	
		
			
				|  |  | -            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)]
 | 
	
		
			
				|  |  | -            alb_utils.update_server_group_servers_attribute(alb_client,
 | 
	
		
			
				|  |  | -                                                       server_group_id_list=longvideoapi_config.server_group_id_list,
 | 
	
		
			
				|  |  | -                                                       instance_id_list=health_instance_ids,
 | 
	
		
			
				|  |  | -                                                       weight_list=add_weight_list,
 | 
	
		
			
				|  |  | -                                                       port=port)
 | 
	
		
			
				|  |  | -            logging.info(f"finished instances: {health_instances}, count: {len(health_instances)}")
 | 
	
		
			
				|  |  | -            update_finished_count += len(health_instances)
 | 
	
		
			
				|  |  | -            logging.info(f"update finished: {update_finished_count}/{len(instance_ids)}")
 | 
	
		
			
				|  |  | -        else:
 | 
	
		
			
				|  |  | -            logging.info(f"health instances: {health_instances}, count: {len(health_instances)}")
 | 
	
		
			
				|  |  | -            sys.exit()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -def remove_instances(ecs_client, alb_client, instance_ids, port):
 | 
	
		
			
				|  |  | -    """
 | 
	
		
			
				|  |  | -    停止并释放机器
 | 
	
		
			
				|  |  | -    :param ecs_client:
 | 
	
		
			
				|  |  | -    :param alb_client:
 | 
	
		
			
				|  |  | -    :param instance_ids: instanceId type-list
 | 
	
		
			
				|  |  | -    :param port: 后端服务器使用的端口
 | 
	
		
			
				|  |  | -    :return: None
 | 
	
		
			
				|  |  | -    """
 | 
	
		
			
				|  |  | -    # 1. 摘流量
 | 
	
		
			
				|  |  | -    weight_list = [(0, 20)]  # 设置权重为0,等待20秒
 | 
	
		
			
				|  |  | -    try:
 | 
	
		
			
				|  |  | -        alb_utils.update_server_group_servers_attribute(alb_client,
 | 
	
		
			
				|  |  | -                                                   server_group_id_list=longvideoapi_config.server_group_id_list,
 | 
	
		
			
				|  |  | -                                                   instance_id_list=instance_ids,
 | 
	
		
			
				|  |  | -                                                   weight_list=weight_list,
 | 
	
		
			
				|  |  | -                                                   port=port)
 | 
	
		
			
				|  |  | -    except Exception as e:
 | 
	
		
			
				|  |  | -        logging.error(f"Failed to set instance weight: {e}")
 | 
	
		
			
				|  |  | -        sys.exit()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    time.sleep(10)
 | 
	
		
			
				|  |  | -    # 2.移除alb
 | 
	
		
			
				|  |  | -    for server_group_id in longvideoapi_config.server_group_id_list:
 | 
	
		
			
				|  |  | -        try:
 | 
	
		
			
				|  |  | -            alb_utils.remove_servers_from_server_group(alb_client=alb_client, server_group_id=server_group_id,
 | 
	
		
			
				|  |  | -                                                   instance_ids=instance_ids, port=port)
 | 
	
		
			
				|  |  | -            logging.info(f"Successfully removed instances from server group {server_group_id}.")
 | 
	
		
			
				|  |  | -        except Exception as e:
 | 
	
		
			
				|  |  | -            logging.error(f"Failed to remove instances from server group {server_group_id}: {e}")
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    logging.info(f"Remove from ALB finished, instances: {instance_ids}")
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    # 3. 停止机器
 | 
	
		
			
				|  |  | -    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:
 | 
	
		
			
				|  |  | -        logging.error(f"Failed to stop instances: {stop_response}")
 | 
	
		
			
				|  |  | -        sys.exit()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    # 4. 判断机器运行状态是否为Stopped
 | 
	
		
			
				|  |  | -    while True:
 | 
	
		
			
				|  |  | -        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
 | 
	
		
			
				|  |  | -                                 instance.get('Status') == 'Stopped']
 | 
	
		
			
				|  |  | -            if len(stopped_instances) == len(instance_ids):
 | 
	
		
			
				|  |  | -                logging.info(f"Instances stopped status set success, instances: {stopped_instances}")
 | 
	
		
			
				|  |  | -                break
 | 
	
		
			
				|  |  | -            else:
 | 
	
		
			
				|  |  | -                logging.info(f"Stopped instances count = {len(stopped_instances)}, instances: {stopped_instances}")
 | 
	
		
			
				|  |  | -                time.sleep(5)
 | 
	
		
			
				|  |  | -        else:
 | 
	
		
			
				|  |  | -            logging.error(response)
 | 
	
		
			
				|  |  | -            sys.exit()
 | 
	
		
			
				|  |  | -    # 5. 释放机器
 | 
	
		
			
				|  |  | -    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:
 | 
	
		
			
				|  |  | -        logging.error(f"Release instances fail!!!")
 | 
	
		
			
				|  |  | -        sys.exit()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -def main():
 | 
	
		
			
				|  |  | -    try:
 | 
	
		
			
				|  |  | -        version = sys.argv[1]
 | 
	
		
			
				|  |  | -        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 = 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 = 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}")
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        # 2. 扩容机器并启动新服务 扩容数量:线上机器数量//2
 | 
	
		
			
				|  |  | -        logging.info(f"ess instances start ...")
 | 
	
		
			
				|  |  | -        ess_instance_count = online_instance_count // 2
 | 
	
		
			
				|  |  | -        logging.info(f"ess instance count: {ess_instance_count}")
 | 
	
		
			
				|  |  | -        asyncio.run(ess_instance(ecs_client=ecs_client, alb_client=alb_client,
 | 
	
		
			
				|  |  | -                                 ess_count=ess_instance_count, max_workers=2, version=version, port=longvideoapi_config.port))
 | 
	
		
			
				|  |  | -        logging.info(f"ess instances end!")
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        # 3. 原有机器进行更新
 | 
	
		
			
				|  |  | -        logging.info(f"update online instances start ...")
 | 
	
		
			
				|  |  | -        asyncio.run(update_instance(ecs_client=ecs_client, alb_client=alb_client,
 | 
	
		
			
				|  |  | -                                    instance_ids=online_instance_ids, max_workers=8, version=version, port=longvideoapi_config.port))
 | 
	
		
			
				|  |  | -        logging.info(f"update online instances end!")
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        # 4. 停止并释放扩容机器
 | 
	
		
			
				|  |  | -        logging.info(f"stop & release instances start ...")
 | 
	
		
			
				|  |  | -        remove_instances(ecs_client=ecs_client, alb_client=alb_client, instance_ids=ess_instances, port=longvideoapi_config.port)
 | 
	
		
			
				|  |  | -        logging.info(f"stop & release instances end!")
 | 
	
		
			
				|  |  | -    except Exception as e:
 | 
	
		
			
				|  |  | -        logging.error(e)
 | 
	
		
			
				|  |  | -        sys.exit()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -if __name__ == '__main__':
 | 
	
		
			
				|  |  | -    main()
 |