blob: 9404d8a2cb63187abb6521f95a7cd34819b6387a [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__)
17 parser.add_argument('--root', required=True, type='path',
18 help='Specify the rootfs to investigate.')
19 parser.add_argument('--image-type',
20 help='Specify the type of image being investigated. '
21 'e.g. [base, dev, test]')
22 parser.add_argument('--partition-name',
23 help='Specify the partition name. '
24 'e.g. [rootfs, stateful]')
25 parser.add_argument('packages', nargs='*',
26 help='Names of packages to investigate. Must be '
27 'specified as category/package-version.')
28 return parser
29
30
31def generate_package_size_report(db, root, image_type, partition_name,
32 installed_packages):
33 """Collect package sizes and generate a report."""
34 results = {}
35 total_size = 0
36 package_sizes = portage_util.GeneratePackageSizes(db, root,
37 installed_packages)
38 timestamp = metrics.current_milli_time()
39 for package_cpv, size in package_sizes:
40 results[package_cpv] = size
41 metrics.append_metrics_log(timestamp,
42 'package_size.%s.%s.%s' % (image_type,
43 partition_name,
44 package_cpv),
45 metrics.OP_GAUGE,
46 arg=size)
47 total_size += size
48
49 metrics.append_metrics_log(timestamp,
50 'total_size.%s.%s' % (image_type, partition_name),
51 metrics.OP_GAUGE,
52 arg=total_size)
53 return {'root': root, 'package_sizes': results, 'total_size': total_size}
54
55
56def main(argv):
57 """Find and report approximate size info for a particular built package."""
58 commandline.RunInsideChroot()
59
60 parser = _get_parser()
61 opts = parser.parse_args(argv)
62 opts.Freeze()
63
64 db = portage_util.PortageDB(root=opts.root)
65
66 if opts.packages:
67 installed_packages = portage_util.GenerateInstalledPackages(db, opts.root,
68 opts.packages)
69 else:
70 installed_packages = db.InstalledPackages()
71
72 results = generate_package_size_report(db, opts.root, opts.image_type,
73 opts.partition_name,
74 installed_packages)
75 print(json.dumps(results))