123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- #!/usr/bin/env python3
- # Copyright 2023 The ChromiumOS Authors
- # Use of this source code is governed by a BSD-style license that can be
- # found in the LICENSE file.
- import argparse
- import json
- import tempfile
- import os
- import sys
- import time
- import pathlib
- sys.path.append(os.path.dirname(sys.path[0]))
- from impl.common import cwd, CROSVM_ROOT, cmd
- BOT_MASTERS = "crosvm.ci"
- METRIC_NAME = "file_size"
- TEST_SUITE_NAME = "crosvm.binary_output"
- CHROMEPERF_URL = "https://chromeperf.appspot.com"
- # TODO(zihanchen): upload binary size to db for backup
- # TODO(zihanchen): Add usage
- def main():
- parser = argparse.ArgumentParser()
- parser.add_argument(
- "--base-dir",
- help="Base dir of cargo target, used to convert target path to shorter relative path, must "
- "be absolute",
- )
- parser.add_argument(
- "--target-name",
- help="Target name of binary",
- )
- parser.add_argument(
- "--target-path",
- help="Path to binary, must be absolute if base dir is provided",
- required=True,
- )
- parser.add_argument("--upload", action="store_true")
- parser.add_argument(
- "--catapult-tool-path",
- help="Path to catapult dashboard upload tool",
- default="/tools/catapult",
- )
- parser.add_argument(
- "--builder-name",
- help="Name of builder generating binaries",
- )
- parser.add_argument("--log-url", help="Url to build execution")
- parser.add_argument("--build-version", help="Version of crosvm corresponding to the results")
- args = parser.parse_args()
- if args.base_dir:
- if not os.path.isabs(args.base_dir):
- raise AssertionError("Base dir mush be and absolute path")
- if not os.path.isabs(args.target_path):
- raise AssertionError("When base dir is provided, target path must be an absolute path")
- if not os.path.commonpath([args.base_dir, args.target_path]) == os.path.normpath(
- args.base_dir
- ):
- raise AssertionError("Base dir must be a parent directory of target path")
- output_path = (
- os.path.relpath(args.target_path, start=args.base_dir)
- if args.base_dir
- else os.path.normpath(args.target_path)
- )
- # output path can contain duplicated target names, dedup before printing
- if len(output_path.split("/")) > 2 and output_path.split("/")[0] == output_path.split("/")[1]:
- output_path = "/".join(output_path.split("/")[1:])
- file_size = os.path.getsize(args.target_path)
- size_dict_for_gerrit = {output_path: file_size}
- print(json.dumps(size_dict_for_gerrit))
- if not args.upload:
- return
- fuchiaperf_fd, fuchiaperf_file_path = tempfile.mkstemp(suffix=".fuchisaperf.json", text=True)
- fuchiaperf_file = os.fdopen(fuchiaperf_fd, "w")
- fuchsiaperf_data = [
- {
- "test_name": output_path,
- "test_suite": TEST_SUITE_NAME,
- "unit": "bytes",
- "values": [file_size],
- "metric": METRIC_NAME,
- }
- ]
- json.dump(fuchsiaperf_data, fuchiaperf_file)
- fuchiaperf_file.close()
- with open(fuchiaperf_file_path, "r") as f:
- print(f.read(), file=sys.stderr)
- _, catapult_file_path = tempfile.mkstemp(suffix=".json", text=True)
- with cwd(CROSVM_ROOT / "tools" / "impl" / "catapult_converter"):
- cmd(
- "cargo",
- "run",
- "--",
- "--input",
- fuchiaperf_file_path,
- "--execution-timestamp-ms",
- str(int(time.time() * 1000)),
- "--masters",
- BOT_MASTERS,
- "--bots",
- args.builder_name,
- "--log-url",
- args.log_url,
- *(
- (
- "--product-versions",
- args.build_version,
- )
- if args.build_version
- else ()
- )
- ).write_to(pathlib.Path(catapult_file_path))
- # print catapult file to stderr so we retain a copy
- with open(catapult_file_path, "r") as f:
- print(f.read(), file=sys.stderr)
- print(
- cmd(
- args.catapult_tool_path,
- "upload",
- '--service-account-json=":gce"',
- "--url",
- CHROMEPERF_URL,
- catapult_file_path,
- ).stdout(),
- file=sys.stderr,
- )
- if __name__ == "__main__":
- main()
|