xref: /aosp_15_r20/external/angle/build/fuchsia/test/serve_repo.py (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1# Copyright 2022 The Chromium Authors
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4"""Implements commands for serving a TUF repository."""
5
6import argparse
7import contextlib
8
9from typing import Iterator, Optional
10
11from common import REPO_ALIAS, run_ffx_command
12
13_REPO_NAME = 'chromium-test-package-server'
14
15
16def _stop_serving(repo_name: str, target: Optional[str]) -> None:
17    """Stop serving a repository."""
18
19    # Attempt to clean up.
20    run_ffx_command(
21        cmd=['target', 'repository', 'deregister', '-r', repo_name],
22        target_id=target,
23        check=False)
24    run_ffx_command(cmd=['repository', 'remove', repo_name], check=False)
25    run_ffx_command(cmd=['repository', 'server', 'stop'], check=False)
26
27
28def _start_serving(repo_dir: str, repo_name: str,
29                   target: Optional[str]) -> None:
30    """Start serving a repository to a target device.
31
32    Args:
33        repo_dir: directory the repository is served from.
34        repo_name: repository name.
35        target: Fuchsia device the repository is served to.
36    """
37
38    run_ffx_command(cmd=('config', 'set', 'repository.server.mode', '\"ffx\"'))
39
40    run_ffx_command(cmd=['repository', 'server', 'start'])
41    run_ffx_command(
42        cmd=['repository', 'add-from-pm', repo_dir, '-r', repo_name])
43    run_ffx_command(cmd=[
44        'target', 'repository', 'register', '-r', repo_name, '--alias',
45        REPO_ALIAS
46    ],
47                    target_id=target)
48
49
50def register_serve_args(arg_parser: argparse.ArgumentParser) -> None:
51    """Register common arguments for repository serving."""
52
53    serve_args = arg_parser.add_argument_group('serve',
54                                               'repo serving arguments')
55    serve_args.add_argument('--serve-repo',
56                            dest='repo',
57                            help='Directory the repository is served from.')
58    serve_args.add_argument('--repo-name',
59                            default=_REPO_NAME,
60                            help='Name of the repository.')
61
62
63@contextlib.contextmanager
64def serve_repository(args: argparse.Namespace) -> Iterator[None]:
65    """Context manager for serving a repository."""
66    _start_serving(args.repo, args.repo_name, args.target_id)
67    try:
68        yield None
69    finally:
70        _stop_serving(args.repo_name, args.target_id)
71