blob: 1a7e84596cd4f55f5ea6bf14b020ac2d5f0bb0e9 [file] [log] [blame]
Will Bradley333d22c2019-09-11 15:04:59 -06001# -*- coding: utf-8 -*-
2# Copyright 2019 The Chromium OS Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6"""The Package Size Reporting CLI entry point."""
7
8from __future__ import print_function
9
10import json
11
12from chromite.lib import commandline
13from chromite.lib import portage_util
14from chromite.utils import metrics
15
16
17def _get_parser():
18 """Create an argument parser for this script."""
19 parser = commandline.ArgumentParser(description=__doc__)
20 parser.add_argument('--root', required=True, type='path',
21 help='Specify the rootfs to investigate.')
22 parser.add_argument('--image-type',
23 help='Specify the type of image being investigated. '
24 'e.g. [base, dev, test]')
25 parser.add_argument('--partition-name',
26 help='Specify the partition name. '
27 'e.g. [rootfs, stateful]')
28 parser.add_argument('packages', nargs='*',
29 help='Names of packages to investigate. Must be '
30 'specified as category/package-version.')
31 return parser
32
33
34def generate_package_size_report(db, root, image_type, partition_name,
35 installed_packages):
36 """Collect package sizes and generate a report."""
37 results = {}
38 total_size = 0
39 package_sizes = portage_util.GeneratePackageSizes(db, root,
40 installed_packages)
41 timestamp = metrics.current_milli_time()
42 for package_cpv, size in package_sizes:
43 results[package_cpv] = size
44 metrics.append_metrics_log(timestamp,
45 'package_size.%s.%s.%s' % (image_type,
46 partition_name,
47 package_cpv),
48 metrics.OP_GAUGE,
49 arg=size)
50 total_size += size
51
52 metrics.append_metrics_log(timestamp,
53 'total_size.%s.%s' % (image_type, partition_name),
54 metrics.OP_GAUGE,
55 arg=total_size)
56 return {'root': root, 'package_sizes': results, 'total_size': total_size}
57
58
59def main(argv):
60 """Find and report approximate size info for a particular built package."""
61 commandline.RunInsideChroot()
62
63 parser = _get_parser()
64 opts = parser.parse_args(argv)
65 opts.Freeze()
66
67 db = portage_util.PortageDB(root=opts.root)
68
69 if opts.packages:
70 installed_packages = portage_util.GenerateInstalledPackages(db, opts.root,
71 opts.packages)
72 else:
73 installed_packages = db.InstalledPackages()
74
75 results = generate_package_size_report(db, opts.root, opts.image_type,
76 opts.partition_name,
77 installed_packages)
78 print(json.dumps(results))