blob: 584a1ae5fa73600fa0bb76d5277cc469681f3397 [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
10from chromite.lib import portage_util
11from chromite.utils import metrics
12
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)
45 timestamp = metrics.current_milli_time()
46 for package_cpv, size in package_sizes:
47 results[package_cpv] = size
Alex Klein8718c032022-04-19 14:06:03 -060048 metrics.append_metrics_log(
49 timestamp,
50 'package_size.%s.%s.%s' % (image_type, partition_name, package_cpv),
51 metrics.OP_GAUGE,
52 arg=size)
Will Bradley333d22c2019-09-11 15:04:59 -060053 total_size += size
54
Alex Klein8718c032022-04-19 14:06:03 -060055 metrics.append_metrics_log(
56 timestamp,
57 'total_size.%s.%s' % (image_type, partition_name),
58 metrics.OP_GAUGE,
59 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))