| #!/usr/bin/python3 |
| |
| import argparse |
| import os |
| import stat |
| import subprocess |
| import yaml |
| import requests |
| import time |
| |
| URL_RUNS="https://api.github.com/repos/{repo}/actions/runs?head-sha={head_sha}&head-branch={head_branch}&per_page=2" |
| URL_RUN="https://api.github.com/repos/{repo}/actions/runs/{run_id}" |
| |
| def run_fluster(codec, test_suite, skips, single_thread): |
| print(f" {codec} -> {test_suite} (skip: {skips})") |
| cmd = ['python3', '/usr/bin/fluster_parser.py', '-ts', test_suite, '-d', f"ccdec-{codec}", '-t' '300'] |
| |
| if single_thread: |
| cmd.extend(['-j', '1']) |
| if skips: |
| for index, skip in enumerate(skips): |
| cmd.extend(['-sv', skip] if not index else [skip]) |
| |
| print(cmd) |
| subprocess.run(cmd, check=False) |
| |
| def retrieve_ccdec_github(sha, branch, repo, token): |
| if os.path.exists("/opt/cros-codecs/ccdec"): |
| os.environ['PATH'] = os.environ['PATH'] + ":/opt/cros-codecs" |
| return True |
| |
| runs = requests.get(URL_RUNS.format(head_sha=sha, head_branch=branch, repo=repo), headers={"Accept": "application/vnd.github+json", "X-GitHub-Api-Version": "2022-11-28", "Authorization": f"Bearer {token}"}).json() |
| |
| found = False |
| |
| for run in runs['workflow_runs']: |
| if run['name'] != 'Health check': |
| continue |
| |
| artifacts = requests.get(run['artifacts_url'], headers={"Accept": "application/vnd.github+json", "X-GitHub-Api-Version": "2022-11-28", "Authorization": f"Bearer {token}"}).json() |
| |
| if artifacts['total_count'] == 0: |
| break |
| |
| for artifact in artifacts['artifacts']: |
| if artifact['name'] != 'ccdec-bin': |
| continue |
| |
| r = requests.get(artifact['archive_download_url'], headers={"Accept": "application/vnd.github+json", "X-GitHub-Api-Version": "2022-11-28", "Authorization": f"Bearer {token}"}, stream=True) |
| |
| if not os.path.exists("/opt/cros-codecs"): |
| os.mkdir("/opt/cros-codecs") |
| |
| with open("/opt/cros-codecs/ccdec.zip", 'wb') as fd: |
| for chunk in r.iter_content(chunk_size=128): |
| fd.write(chunk) |
| |
| subprocess.run(['unzip', '/opt/cros-codecs/ccdec.zip', '-d', '/opt/cros-codecs/']) |
| os.chmod("/opt/cros-codecs/ccdec", mode=(stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)) |
| os.environ['PATH'] = os.environ['PATH'] + ":/opt/cros-codecs" |
| |
| found = True |
| |
| break |
| |
| break |
| |
| return found |
| |
| def retrieve_ccdec(run_id, repo, token): |
| # Retrieve built sha and branch |
| run = requests.get(URL_RUN.format(run_id=run_id, repo=repo), headers={"Accept": "application/vnd.github+json", "X-GitHub-Api-Version": "2022-11-28", "Authorization": f"Bearer {token}"}).json() |
| sha = run['head_sha'] |
| branch = run['head_branch'] |
| |
| # Retrieve the artifact |
| for i in range(30): |
| try: |
| if retrieve_ccdec_github(sha, branch, repo, token): |
| break |
| time.sleep(10) |
| except Exception as e: |
| print(e) |
| |
| |
| argparser = argparse.ArgumentParser() |
| argparser.add_argument('--arch', choices=['amd', 'intel'], help='Architecture', required=True) |
| argparser.add_argument('--config-file', help='Configuration file', required=True) |
| argparser.add_argument('--ccdec-build-id', help='ccded binary build id', required=True) |
| argparser.add_argument('--token', help='Github read token', required=True) |
| argparser.add_argument('--repo', help='Github git repository', required=True) |
| argparser.add_argument('--single', help='Run in a single thread', action='store_true') |
| args = argparser.parse_args() |
| |
| retrieve_ccdec(args.ccdec_build_id, args.repo, args.token) |
| |
| with open(args.config_file, "r") as stream: |
| try: |
| config = yaml.safe_load(stream) |
| for arch, arch_info in config.items(): |
| if arch != args.arch: |
| continue |
| device_type=arch_info['device_type'] |
| for c in arch_info['codecs']: |
| for codec, test_suites in c.items(): |
| for ts in test_suites['test-suites']: |
| for test_suite in ts: |
| skips=ts[test_suite]["skip-vectors"] |
| run_fluster(codec, test_suite, skips, args.single) |
| break |
| except yaml.YAMLError as exc: |
| print(exc) |