blob: 276d515f78ccbf763dd621e620d4bc30ffd0ae3b [file] [log] [blame]
Will Bradley333d22c2019-09-11 15:04:59 -06001# Copyright 2019 The Chromium OS Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5"""The Package Size Reporting CLI entry point."""
6
Will Bradley333d22c2019-09-11 15:04:59 -06007import json
8
9from chromite.lib import commandline
Alex Kleinaef41942022-04-19 14:13:17 -060010from chromite.lib import metrics_lib
Will Bradley333d22c2019-09-11 15:04:59 -060011from chromite.lib import portage_util
Will Bradley333d22c2019-09-11 15:04:59 -060012
13
Will Bradley333d22c2019-09-11 15:04:59 -060014def _get_parser():
15 """Create an argument parser for this script."""
16 parser = commandline.ArgumentParser(description=__doc__)
Alex Klein8718c032022-04-19 14:06:03 -060017 parser.add_argument(
18 '--root',
19 required=True,
20 type='path',
21 help='Specify the rootfs to investigate.')
22 parser.add_argument(
23 '--image-type',
24 help='Specify the type of image being investigated. '
25 'e.g. [base, dev, test]')
26 parser.add_argument(
27 '--partition-name',
28 help='Specify the partition name. '
29 'e.g. [rootfs, stateful]')
30 parser.add_argument(
31 'packages',
32 nargs='*',
33 help='Names of packages to investigate. Must be '
34 'specified as category/package-version.')
Will Bradley333d22c2019-09-11 15:04:59 -060035 return parser
36
37
38def generate_package_size_report(db, root, image_type, partition_name,
39 installed_packages):
40 """Collect package sizes and generate a report."""
41 results = {}
42 total_size = 0
43 package_sizes = portage_util.GeneratePackageSizes(db, root,
44 installed_packages)
Alex Kleinaef41942022-04-19 14:13:17 -060045 timestamp = metrics_lib.current_milli_time()
Will Bradley333d22c2019-09-11 15:04:59 -060046 for package_cpv, size in package_sizes:
47 results[package_cpv] = size
Alex Kleinaef41942022-04-19 14:13:17 -060048 metrics_lib.append_metrics_log(
Alex Klein8718c032022-04-19 14:06:03 -060049 timestamp,
50 'package_size.%s.%s.%s' % (image_type, partition_name, package_cpv),
Alex Kleinaef41942022-04-19 14:13:17 -060051 metrics_lib.OP_GAUGE,
Alex Klein8718c032022-04-19 14:06:03 -060052 arg=size)
Will Bradley333d22c2019-09-11 15:04:59 -060053 total_size += size
54
Alex Kleinaef41942022-04-19 14:13:17 -060055 metrics_lib.append_metrics_log(
Alex Klein8718c032022-04-19 14:06:03 -060056 timestamp,
57 'total_size.%s.%s' % (image_type, partition_name),
Alex Kleinaef41942022-04-19 14:13:17 -060058 metrics_lib.OP_GAUGE,
Alex Klein8718c032022-04-19 14:06:03 -060059 arg=total_size)
Will Bradley333d22c2019-09-11 15:04:59 -060060 return {'root': root, 'package_sizes': results, 'total_size': total_size}
61
62
63def main(argv):
64 """Find and report approximate size info for a particular built package."""
65 commandline.RunInsideChroot()
66
67 parser = _get_parser()
68 opts = parser.parse_args(argv)
69 opts.Freeze()
70
71 db = portage_util.PortageDB(root=opts.root)
72
73 if opts.packages:
Alex Klein8718c032022-04-19 14:06:03 -060074 installed_packages = portage_util.GenerateInstalledPackages(
75 db, opts.root, opts.packages)
Will Bradley333d22c2019-09-11 15:04:59 -060076 else:
77 installed_packages = db.InstalledPackages()
78
79 results = generate_package_size_report(db, opts.root, opts.image_type,
80 opts.partition_name,
81 installed_packages)
82 print(json.dumps(results))