tool

215 阅读8分钟
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
import os
import time
import collections
import sys
import logging
import datetime
import math

import json
from unicodedata import name
import requests
from git import Repo
import chinese_calendar
from config import *
import random

import hashlib

logger = logging.getLogger(__name__)
logger.setLevel(level=logging.DEBUG)

# StreamHandler
stream_handler = logging.StreamHandler(sys.stdout)
stream_handler.setLevel(level=logging.INFO)
formatter = logging.Formatter(fmt='%(asctime)s line:%(lineno)s: %(message)s',
                              datefmt='%Y-%m-%d %H:%M:%S')
stream_handler.setFormatter(formatter)
logger.addHandler(stream_handler)

# FileHandler
log_file_name = 'batman_' + time.strftime('%Y%m%d%H%M%S', time.localtime()) + '.log'
file_handler = logging.FileHandler('logs\\' + log_file_name)
file_handler.setLevel(level=logging.DEBUG)
formatter = logging.Formatter(fmt='%(asctime)s-%(levelname)s: %(message)s',
                              datefmt='%Y-%m-%d %H:%M:%S')
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)


RUN_ENV = "online"  # pre | online


def split_http(params):
    param_list = list(params.items())
    # print(params)
    param_list = sorted(param_list, key=lambda x:x[0])
    s = ""
    for param in param_list:
        s += param[0] + param[1]
    secret = "3c8c291f4de3e01381a2ec37b852eb6c"
    s = secret + s + secret
    sign = hashlib.md5(s.encode("utf-8")).hexdigest().upper()
    params["sign"] = sign
    if RUN_ENV == "pre":
        http = "http://140.205.164.4/top/router/rest?method=" + params["method"] + "&"
    elif RUN_ENV == "online":
        http = "http://gw.api.taobao.com/router/rest?method=" + params["method"] + "&"
    else:
        logger.error("请输入正确的运行环境(pre | online)")
    del params["method"]
    for param in params:
        http += param + "=" + params[param] + "&"
    http = http.strip("&")
    # print(http)
    return http

def request_run_task_new(config_id, commit_sha, car_type,dockerNameAsim_value,multi_module_commit_id_map):
    """
    func: 运行任务接口aliyun.adlab.adsim.runrecord.run
    """
    params = {}
    params["creator"] = "matrixTestCI"
    params["app_key"] = "31381770"
    params["format"] = "json"
    params["method"] = "aliyun.adlab.adsim.runrecord.run"
    params["timestamp"] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    params["sign_method"] = "md5"
    params["v"] = "2.0"
    params["sequence_id"] = str(random.randint(1000000,9999999))
    
    params["config_id_list"] = ','.join((str(x) for x in config_id))   #列表转换成拼接的字符串
    params["is_new_framework"] = "true"
    params["map_use_type"] = "map_id_newest"
    params["vehicle_type"] = car_type
    params["test_car_type"] = car_type
    params["had_planning_commit_id"] = str(commit_sha)
    # params["docker_name_asim"] = str(dockerNameAsim_value)
    params["multi_module_commit_id_map"] = json.dumps({"prediction":multi_module_commit_id_map[car_type]})

    http = split_http(params)
    print(http)
    try:
        response = requests.get(url=http)
    except Exception as e:
        logger.exception('Request run task Error!')
    else:
        logger.error(response.text)
        response_content = json.loads(response.text)
        project_id = 0     #给project_id默认值
        run_record_id = -1
        # print(response_content)
        if response_content["aliyun_adlab_adsim_runrecord_run_response"]["result"]["success"]:
            run_record_id = response_content["aliyun_adlab_adsim_runrecord_run_response"]["result"]["data"]["run_record_id"]
            project_id = response_content["aliyun_adlab_adsim_runrecord_run_response"]["result"]["data"]["run_record_res_v_o_list"]["run_record_res_vo_list"][0]["project_id"]
            logger.error('task run_record_id: %s', run_record_id)
        else:
            logger.error('request run task failed: %s', response_content.get('message'))
        return (project_id,run_record_id,)
  

def request_cancel_task(run_record_id):
    """
    func: 取消任务接口aliyun.adlab.adsim.runrecord.cancel
    """
    params = {}
    params["creator"] = "matrixTestCI"
    params["app_key"] = "31381770"
    params["format"] = "json"
    params["method"] = "aliyun.adlab.adsim.runrecord.cancel"
    params["timestamp"] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    params["sign_method"] = "md5"
    params["v"] = "2.0"
    params["sequence_id"] = str(random.randint(1000000,9999999))

    params["run_record_id"] = str(run_record_id)

    http = split_http(params)
    try:
        response = requests.get(url=http)
    except:
        logger.exception('Request cancel task Error!')
    else:
        logger.debug(response.text)

def request_query_task(run_record_id):
    """
    func: 查询任务接口aliyun.adlab.adsim.runrecord.detail.get
    """
    params = {}
    params["creator"] = "matrixTestCI"
    params["app_key"] = "31381770"
    params["format"] = "json"
    params["method"] = "aliyun.adlab.adsim.runrecord.detail.get"
    params["timestamp"] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    params["sign_method"] = "md5"
    params["v"] = "2.0"
    params["sequence_id"] = str(random.randint(1000000,9999999))

    params["run_record_id"] = str(run_record_id)
    http = split_http(params)
    try:
        response = requests.get(url=http)
    except:
        logger.exception('Request query task error!')
    else:
        logger.debug(response.text)

        return response.json()

def request_add_comments(run_record_id, comments):
    """
    func: 修改运行记录接口aliyun.adlab.adsim.runrecord.info.update
    """
    params = {}
    params["creator"] = "matrixTestCI"
    params["app_key"] = "31381770"
    params["format"] = "json"
    params["method"] = "aliyun.adlab.adsim.runrecord.info.update"
    params["timestamp"] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    params["sign_method"] = "md5"
    params["v"] = "2.0"
    params["sequence_id"] = str(random.randint(1000000,9999999))

    params["request_dto"] = str({"run_record_id":run_record_id,"comments":comments})
    # params["name"] = "Adsim release szl"
    http = split_http(params)
    try:
        response = requests.get(url=http)
    except Exception as e:
        logger.exception('Request add comments error! %s' % e)
    else:
        res = json.loads(response.text)
        logger.debug(res)

def get_prediction_version():
    # 默认版本
    ver_default = {'A1': 'v5.1.9.2', "GX": 'v4.5.6.2', 'B1': 'v5.1.9.2'}
    # 获取 XG 和A1 预测最新版本
    car_type_emu = {'GX': 'GX-4.5', 'A1': 'A1-5.1', 'B1': 'A1-5.1'}
    for k, v in car_type_emu.items():
        resp = requests.get(r'https://cota.cainiao-inc.com/skynet/getNewestVersion?carType={}'
                               r'&module=prediction'.format(v))
        if resp.status_code == 200:
            ver_default[k] = resp.text
    ver_default['A1'] = 'release-v5.1.9.x'
    ver_default['GX'] = 'feature-v4.5.22.x'
    ver_default['B1'] = 'release-v5.1.9.x'
    return ver_default


def start_simulation_task(commit_sha, comments='test', config_id_list=None,dockerNameAsim_value=""):
    logger.info('----------------------------------------------------------------------')
    run_record_id_dict = {}
    for config_id in config_id_list:
        logger.debug('commit id:{} config_id:{}'.format(commit_sha, config_id))
        # 阶梯运行 区分车型
        a1_all_config_list = [config for config_list in A1_FULL_CONFIG_LIST for config in config_list]
        b1_all_config_list = [config for config_list in B1_FULL_CONFIG_LIST for config in config_list]
        for a1_short_config in A1_SHORT_CONFIG_LIST:
            a1_all_config_list.append(a1_short_config)
        if int(config_id) in a1_all_config_list:
            car_type = "A1"
        elif int(config_id) in b1_all_config_list:
            car_type = "B1"
        else:
            car_type = "GX"
        multi_module_commit_id_map = get_prediction_version()
        run_record_id = request_run_task_new(config_id, commit_sha, car_type,dockerNameAsim_value,multi_module_commit_id_map)
        if run_record_id and run_record_id != -1:
            request_add_comments(run_record_id, comments)
            run_record_id_dict[config_id] = run_record_id
            logger.info('run_record_id_dict:' + str(run_record_id_dict))
        # request_cancel_task(run_record_id)
    return run_record_id_dict

# 已弃用
def send_notification_bydingding(message):
    headers = {
        'Content-Type': 'application/json',
    }
    params = (
        # ('access_token', '79920332f3507bdeef87632b05b2523448d4e3d339414c9125eb3947c3bf143b'),
        ('access_token', 'e682c0fda908839df0f76a74d881acb5f93f7d847d4d9152ce0021dd0aff460e'),
    )
    content = '"content": "[MR]:{}"'.format(message)
    content = '{' + content + '}'
    at_msg = '"atMobiles": ["18358102120"],"isAtAll": false'
    at_msg = '{' + at_msg + '}'
    at_msg = '{}'
    data = '"msgtype": "text","text": {},"at": {}'.format(content, at_msg)
    data = '{' + data + '}'
    #data = data.encode('utf-8')
    logger.info(data)
    try:
        response = requests.post('https://oapi.dingtalk.com/robot/send', headers=headers, params=params,data=data)
        logger.info(response)
        logger.info(response.text)
    except:
        logger.exception('Send notification error!')
    else:
        logger.debug(response.text)


def send_notification_by_ding_talk(msg, phone_list=[], user_ids=[], msg_type='text'):
    """
    func: 钉钉发送消息
    [仿真]3D全链路发版: https://oapi.dingtalk.com/robot/send?access_token=e68da3c585f9da3e6c354a6245254dfe0e4765694c7f6a7a3653467fcd82d360
    """

    # 测试
    # access_token = '7c9796141ac00910178fd6f317e0393eb53b81de272a8369b9232ad6b5402250'
    # 正式发版群,关键字:PDC发版
    # access_token = '75a8a510ffd1022fd7d6edf57dca89747a9aa26159c3cee9ab99384e3871eb74'

    #3D全链路发版
    access_token = 'e68da3c585f9da3e6c354a6245254dfe0e4765694c7f6a7a3653467fcd82d360'
    test_url = r'https://oapi.dingtalk.com/robot/send?access_token=%s' % access_token

    header = {
        'Content-Type': 'application/json',
    }
    is_at_all = 'false' if phone_list or user_ids else 'true'
    post_msg = '''
        {
            "at": {
                "atMobiles": "%s",
                "atUserIds": "%s",
                "isAtAll": "%s"
            },
            "text": {
                "content": "[仿真]3D全链路发版提醒: %s"
            },
            "msgtype": "%s"
        }''' % (phone_list, user_ids, is_at_all, msg, msg_type)

    rep = requests.post(test_url, headers=header, data=post_msg)
    if rep.json() and int(rep.json()['errcode']) == 0:
        logger.info("send dingtalk msg success")
        return True
    else:
        return False


def send_ding_talk_notification_on_workday(msg):
    is_workday = chinese_calendar.is_workday(datetime.datetime.now())
    rep = None
    if is_workday:
        rep = send_notification_by_ding_talk(msg)
        logger.info("send timer msg success")


def autotest_by_commit_id(comments, commit_sha, CONFIG_ID_DICT,dockerNameAsim_value=""):

    config_id_list = list(CONFIG_ID_DICT.keys())
    
    logger.info('start simulation tasks...'+str(config_id_list))
    # exit(1)
    run_record_id_dict = start_simulation_task(commit_sha, comments, config_id_list,dockerNameAsim_value)
    if len(run_record_id_dict) == 0:
        logger.error('start simulation task failed!')
        return
    logger.info('waiting for simulation finished...')
    pass_rate_dict = collections.OrderedDict()
    run_time = 0.0
    run_record_id_list = []
    while True:
        time.sleep(30)
        run_time += 0.5
        # 开始查询仿真任务的运行结果
        for config_id in config_id_list:
            task_id = run_record_id_dict[config_id]
            if task_id not in run_record_id_list:
                run_record_id_list.append(task_id)
            logger.info(str(run_record_id_list)+' '+str(comments))
            task_info = request_query_task(task_id)
            if task_info is None:
                break
            # logger.info("task_info:"+json.dumps(task_info))
            task_status = task_info.get('data').get('runRecordStatus')
            task_pass_rate = task_info.get('data').get('runRecordCountVO').get('passRate')
            task_progress_rate = task_info.get('data').get('runRecordCountVO').get('progressRate')
            logger.info(
                '[Query task] task_id:{}, config:{}, run status:{}, progress rate:{}, run time:{}'.format(
                    task_id, config_id, task_status, task_progress_rate, run_time))
            if task_status != 'finish':
                break
            pass_rate_dict[CONFIG_ID_DICT[config_id]] = task_pass_rate
        else:
            logger.info('All simulation config are done!')
            break
    
    file_name = './run_records/'+str(datetime.datetime.now()) +'|'+ str(comments)
    file = open(file_name, 'w')
    file.write(str(run_record_id_list))
    file.close()
    logger.info(pass_rate_dict)
    return pass_rate_dict


def automerge_by_branch_list(repo, comments, MR_BRANCH_NAME_LIST, check_branch=None):
    git = repo.git
    mr_branch_seq = 0
    for MR_BRANCH in MR_BRANCH_NAME_LIST:
        mr_branch_seq += 1
        # 开始尝试合并该MR分支
        logger.info('fetch branch {}: {}'.format(mr_branch_seq, MR_BRANCH))
        git.fetch('origin', '{}:{}'.format(MR_BRANCH, MR_BRANCH))
        git.merge('--squash', MR_BRANCH)
        # repo.index.commit('merge {} to {}.'.format(MR_BRANCH, TEST_BRANCH_NAME))
        git.commit('-m', 'merge ' + MR_BRANCH + ' for testing')
        if check_branch is not None:
            branch_name = check_branch
        else:
            branch_name = repo.active_branch
        # logger.info('push [{}] to remote.'.format(branch_name))
    # git.push('-uf', 'origin', branch_name)
    logger.info('Congratulations! Merge all branches done and No conflicts detected.')
    return True


def git_clone(REPO_PATH):
    if not os.path.exists(REPO_PATH):
        logger.info('The Repo {} does not exists. Clone from gitlab...'.format(REPO_PATH))
        # os.makedirs(REPO_PATH)
        Repo.clone_from(url='git@gitlab.alibaba-inc.com:ai-xlab.had-planning/pdc.git',
                        to_path=REPO_PATH)
        logger.info('clone done!')
    else:
        logger.info('The Repo  exists')


'''
car_type : "a1","xg","all"
'''


def request_run_performance_task(commit_id, car_type, remark):

    car_list = PERFORMANCE_CARS[car_type]
    result_list = []

    for vehicle_id in car_list:
        re_try = 0
        # DX-971 使用预发1,其他车型使用预发2
        url_host = 'pre' if vehicle_id == 'DX-971' else 'pre2'
        if 'A1' in vehicle_id:
            project = 'A1-5.1'
        else:
            project = 'GX-4.5'
        performance_test_url = 'https://{}-cota.cainiao-inc.com/skynet/startPdcGXPerformanceTest?commitId={}' \
                               '&runTime=2&remark={}&vehicleId={}&project={}'.format(url_host, commit_id, remark,
                                                                                     vehicle_id, project)
        response = requests.get(performance_test_url)
        if response.status_code == 200:
            result_list.append(vehicle_id)
        else:
            while re_try < 3:
                response = requests.get(performance_test_url)
                if response.status_code == 200:
                    result_list.append(vehicle_id)
                    break
                else:
                    re_try += 1
    if result_list == car_list:
        return True
    else:
        return False

def query_task_list_total(current_page,page_size,run_record_id):
    """
    func: 查询任务列表名称:aliyun.adlab.adsim.task.list.get
    获取run_record_id下的任务total
    """
    params = {}
    params["creator"] = "matrixTestCI"
    params["app_key"] = "31381770"
    params["format"] = "json"
    params["method"] = "aliyun.adlab.adsim.task.list.get"
    params["timestamp"] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    params["sign_method"] = "md5"
    params["v"] = "2.0"
    params["sequence_id"] = str(random.randint(1000000,9999999))

    params["current_page"] = str(current_page)
    params["page_size"] = str(page_size)
    params["run_record_id"] = str(run_record_id)
    http = split_http(params)
    try:
        res = requests.get(url = http)
        res_data = json.loads(res.text)
        if res_data.get("aliyun_adlab_adsim_task_list_get_response").get("result").get("success"):
            return res_data.get("aliyun_adlab_adsim_task_list_get_response").get("result").get("data").get("total")
    except Exception as e:
        logger.error(e)

def query_task_list(current_page,page_size,run_record_id):
    """
    func: 查询任务列表名称:aliyun.adlab.adsim.task.list.get
    获取run_record_id下的任务total
    """
    params = {}
    params["creator"] = "matrixTestCI"
    params["app_key"] = "31381770"
    params["format"] = "json"
    params["method"] = "aliyun.adlab.adsim.task.list.get"
    params["timestamp"] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    params["sign_method"] = "md5"
    params["v"] = "2.0"
    params["sequence_id"] = str(random.randint(1000000,9999999))

    params["current_page"] = str(current_page)
    params["page_size"] = str(page_size)
    params["run_record_id"] = str(run_record_id)
    http = split_http(params)
    try:
        res = requests.get(url = http)
        res_data = json.loads(res.text)
        if res_data.get("aliyun_adlab_adsim_task_list_get_response").get("result").get("success"):
            return res_data.get("aliyun_adlab_adsim_task_list_get_response").get("result").get("data").get("list").get("task_list_vo")
    except Exception as e:
        logger.error(e)
    
def page_task_all(total,page_size,run_record_id):
    """
    func: 获取所有页的总数
    """
    task_data_list = []
    for i in range(1,math.ceil(total/page_size) + 1):
        page_tasks = query_task_list(i,page_size,run_record_id)
        if not page_tasks:
            continue
        task_data_list += page_tasks
        i += 1
    return task_data_list

def run_state_classify(datas):
    """
    func: 根据运行状态分类并返回字典的形式
    """
    li = []
    for data in datas:
        if not data:
            continue
        status = data.get("status")
        li.append(status)
    
    #获取所有运行状态列表
    status_list = list(set(li))

    dic = {}
    for status_li in status_list:
        lis = []
        for data in datas:
            if not data:
                continue
            case_id = data.get("case_id")
            status = data.get("status")
            if status in status_li:
                lis.append(case_id)
        dic[status_li] = lis

    return dic,status_list

def case_update(case_id):
    """
    修改case 接口:alibaba.adlab.adsim.case.update
    """
    params = {}
    params["creator"] = "matrixTestCI"
    params["app_key"] = "31381770"
    params["format"] = "json"
    params["method"] = "alibaba.adlab.adsim.case.update"
    params["timestamp"] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    params["sign_method"] = "md5"
    params["v"] = "2.0"
    params["sequence_id"] = str(random.randint(1000000,9999999))
    #enable:1:可用,0:删除
    params["case_id"] = str(case_id)
    params["enable"] = "0"
    http = split_http(params)
    try:
        res = requests.get(url = http)
        res_data = json.loads(res.text)

        if res_data.get("alibaba_adlab_adsim_case_update_response").get("result").get("success"):
            logger.info(" 删除case:{} ok".format(case_id))
    except Exception as e:
        logger.error(e)

def loop_del(case_id_lists):
    """
    func: for循环遍历删除已经成功copy走的case
    """
    for case_id in case_id_lists:
        case_update(case_id)

def case_copy(from_case_id_list,to_case_set_id):
    """
    func: 场景复制接口:alibaba.adlab.adsim.case.copy
    入参:from_case_id_list,to_case_set_id
    出参:
    """
    params = {}
    params["creator"] = "matrixTestCI"
    params["app_key"] = "31381770"
    params["format"] = "json"
    params["method"] = "alibaba.adlab.adsim.case.copy"
    params["timestamp"] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    params["sign_method"] = "md5"
    params["v"] = "2.0"
    params["sequence_id"] = str(random.randint(1000000,9999999))

    params["request_dto"] = str({"to_case_set_id":to_case_set_id, "from_case_id_list":from_case_id_list,"copy_type":"hard","repeat_strategy":"cover"})
    http = split_http(params)
    try:
        res = requests.get(url = http)
        res_data = json.loads(res.text)
        if res_data.get("alibaba_adlab_adsim_case_copy_response").get("result").get("success"):
            logger.info("copy {} case to {} success".format(from_case_id_list,to_case_set_id))
            loop_del(from_case_id_list)
    except Exception as e:
        logger.error(e)

def paging_query_caseset_list_total(current_page,page_size,project_id):
    """
    func: 分页查询场景集列表接口:alibaba.adlab.adsim.caseset.casesetlist.get 获取总页数
    入参:page_size,current_page,project_id
    出参:caseset total
    """
    params = {}
    params["creator"] = "matrixTestCI"  #Matrix测试CI
    params["app_key"] = "31381770"
    params["format"] = "json"
    params["method"] = "alibaba.adlab.adsim.caseset.casesetlist.get"
    params["timestamp"] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    params["sign_method"] = "md5"
    params["v"] = "2.0"
    params["sequence_id"] = str(random.randint(1000000,9999999))

    params["page_size"] = str(page_size)
    params["current_page"] = str(current_page)
    params["project_id"] = str(project_id)
    http = split_http(params)
    try:
        res = requests.get(url = http)
        res_data = json.loads(res.text)
        if res_data.get("alibaba_adlab_adsim_caseset_casesetlist_get_response").get("result").get("success"):
            return res_data.get("alibaba_adlab_adsim_caseset_casesetlist_get_response").get("result").get("data").get("total")
    except Exception as e:
        logger.error(e)

def paging_query_caseset_list(current_page,page_size,project_id):
    """
    func: 分页查询场景集列表接口:alibaba.adlab.adsim.caseset.casesetlist.get
    入参:page_size,current_page,project_id
    出参:caseset list
    """
    params = {}
    params["creator"] = "matrixTestCI"
    params["app_key"] = "31381770"
    params["format"] = "json"
    params["method"] = "alibaba.adlab.adsim.caseset.casesetlist.get"
    params["timestamp"] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    params["sign_method"] = "md5"
    params["v"] = "2.0"
    params["sequence_id"] = str(random.randint(1000000,9999999))

    params["page_size"] = str(page_size)
    params["current_page"] = str(current_page)
    params["project_id"] = str(project_id)
    http = split_http(params)
    try:
        res = requests.get(url = http)
        res_data = json.loads(res.text)
        if res_data.get("alibaba_adlab_adsim_caseset_casesetlist_get_response").get("result").get("success"):
            return res_data.get("alibaba_adlab_adsim_caseset_casesetlist_get_response").get("result").get("data").get("list").get("adsim_case_set_vo")
    except Exception as e:
        logger.error(e)

def page_caseset_all(total,page_size,project_id):
    """
    func: 获取project_id下所有的数据集信息
    """
    task_data_list = []
    for i in range(1,math.ceil(total/page_size) + 1):
        page_tasks = paging_query_caseset_list(i,page_size,project_id)
        if not page_tasks:
            continue
        task_data_list += page_tasks
        i += 1
    return task_data_list

def transform_center(datas_dic,caseset_lis):

    task_state_enum  = [("lining", "队列中"),
                        ("preparing", "准备中"),
                        ("downloading", "docker镜像下载中"),
                        ("launching", "待测对象及仿真引擎启动中"),
                        ("running", "任务执行中"),
                        ("canceling", "任务取消中"),
                        ("cleaning", "清理执行中"),
                        ("evaluating","评价中"),
                        ("uploading","文件上传中"),
                        ("canceled", "任务已取消"),
                        ("finish_with_success", "仿真成功"),
                        ("finish_with_algo_failed", "评价判定未通过"),
                        ("finish_with_sim_exception", "引擎异常"),
                        ("finish_with_server_exception", "服务端异常"),
                        ("finish_with_data_error","数据异常"),
                        ("rerun", "任务已重跑"),
                        ("finish_with_timeout", "仿真超时")]

    for item in datas_dic.items():
        for state in task_state_enum:
            if item[0] in state[0]:
                for caseset_li in caseset_lis:
                    case_set_id = caseset_li['case_set_id']
                    name = caseset_li['name']
                    if state[1] in name or name in state[1]:
                        case_copy(item[1],case_set_id)

def query_runcord_list(project_id):
    """
    func:  查询运行记录列表接口:aliyun.adlab.adsim.runrecord.list.get
    """
    params = {}
    params["creator"] = "matrixTestCI"
    params["app_key"] = "31381770"
    params["format"] = "json"
    params["method"] = "aliyun.adlab.adsim.runrecord.list.get"
    params["timestamp"] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    params["sign_method"] = "md5"
    params["v"] = "2.0"
    params["sequence_id"] = str(random.randint(1000000,9999999))

    params["project_id"] = str(project_id)
    http = split_http(params)
    # print(http)
    try:
        res = requests.get(url = http)
        res_data = json.loads(res.text)
        if res_data.get("aliyun_adlab_adsim_runrecord_list_get_response").get("result").get("success"):
            runcord_list = res_data.get("aliyun_adlab_adsim_runrecord_list_get_response").get("result").get("data").get("list")
            if not runcord_list:
                logger.info("runcord_list为空:{}".format(runcord_list))
                return
            return res_data.get("aliyun_adlab_adsim_runrecord_list_get_response").get("result").get("data").get("list").get("adsim_run_record_v_o")
    except Exception as e:
        logger.error(e)

def query_runrecord_detail(runrecord_id):
    """
    func: 查询运行记录详情接口:aliyun.adlab.adsim.runrecord.detail.get
    """
    params = {}
    params["creator"] = "matrixTestCI"
    params["app_key"] = "31381770"
    params["format"] = "json"
    params["method"] = "aliyun.adlab.adsim.runrecord.detail.get"
    params["timestamp"] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    params["sign_method"] = "md5"
    params["v"] = "2.0"
    params["sequence_id"] = str(random.randint(1000000,9999999))

    params["run_record_id"] = str(runrecord_id)
    http = split_http(params)
    # print(http)
    try:
        res = requests.get(url = http)
        res_data = json.loads(res.text)
        if res_data.get("aliyun_adlab_adsim_runrecord_detail_get_response").get("result").get("success"):
            return res_data.get("aliyun_adlab_adsim_runrecord_detail_get_response").get("result").get("data").get("run_record_status")
    except Exception as e:
        logger.error(e)

def run_record_ids_trans_dic(run_record_ids):
    #遍历run_record_ids中的字典
    run_record_dic = {}
    for run_record_id in run_record_ids:
        run_record_dic.update(run_record_id)
    return run_record_dic



if __name__ == '__main__':

    # multi_module_commit_id_map = get_prediction_version()
    # ret = request_run_task_new([6576, 6577, 6578, 6579], "68f42d34e512877d769c1712b5240a4047ddfe1b", "A1","adsim_release_v4.5.0.49",multi_module_commit_id_map)
    # print(ret)
    #运行脚本命令行模式
    #python new_mergeall_ci.py -c "v4.5.45.2" --commit_id v4.5.45.2  --car_type B1  --dockerNameAsim_value adsim_release_v4.5.0.49

    run_record_id = 967310
    #获取total然后分页获取所有的task数据
    run_record_total = query_task_list_total(1,1,run_record_id)
    all_task_data = page_task_all(run_record_total,100,run_record_id)

    #根据运行状态分类并字典形式返回分类完成的数据
    complete_classify_dic,diff_run_state = run_state_classify(all_task_data)

    project_id = 5263
    #获取caseset的总页数
    caseset_total = paging_query_caseset_list_total(1,1,project_id)
    all_caseset_data = page_caseset_all(caseset_total,10,project_id)

    #完成名称转换并执行copy
    # transform_center(complete_classify_dic,all_caseset_data)

    # project_id = 1665
    # runcord_lists = query_runcord_list(project_id)
    # print(runcord_lists)