blob: 04f87bf76503c3e956535e94a494396fa6f53349 [file] [log] [blame]
Alex Kleineb77ffa2019-05-28 14:47:44 -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"""Package related functionality."""
7
8from __future__ import print_function
9
Alex Klein076841b2019-08-29 15:19:39 -060010from chromite.api import faux
David Burger1e0fe232019-07-01 14:52:07 -060011from chromite.api import validate
Alex Kleineb77ffa2019-05-28 14:47:44 -060012from chromite.api.controller import controller_util
13from chromite.api.gen.chromite.api import binhost_pb2
David Burger1e0fe232019-07-01 14:52:07 -060014from chromite.api.gen.chromiumos import common_pb2
Alex Kleineb77ffa2019-05-28 14:47:44 -060015from chromite.lib import build_target_util
16from chromite.lib import constants
17from chromite.lib import cros_build_lib
Alex Klein87531182019-08-12 15:23:37 -060018from chromite.lib.uprev_lib import GitRef
Alex Kleineb77ffa2019-05-28 14:47:44 -060019from chromite.service import packages
20
21
22_OVERLAY_TYPE_TO_NAME = {
23 binhost_pb2.OVERLAYTYPE_PUBLIC: constants.PUBLIC_OVERLAYS,
24 binhost_pb2.OVERLAYTYPE_PRIVATE: constants.PRIVATE_OVERLAYS,
25 binhost_pb2.OVERLAYTYPE_BOTH: constants.BOTH_OVERLAYS,
26}
27
28
Alex Klein076841b2019-08-29 15:19:39 -060029@faux.all_empty
Alex Klein231d2da2019-07-22 16:44:45 -060030@validate.require('overlay_type')
31@validate.is_in('overlay_type', _OVERLAY_TYPE_TO_NAME)
32@validate.validation_complete
33def Uprev(input_proto, output_proto, _config):
Alex Kleineb77ffa2019-05-28 14:47:44 -060034 """Uprev all cros workon ebuilds that have changes."""
Alex Kleineb77ffa2019-05-28 14:47:44 -060035 target_names = [t.name for t in input_proto.build_targets]
36 build_targets = [build_target_util.BuildTarget(t) for t in target_names]
37 overlay_type = _OVERLAY_TYPE_TO_NAME[input_proto.overlay_type]
38 chroot = controller_util.ParseChroot(input_proto.chroot)
39 output_dir = input_proto.output_dir or None
40
41 try:
Alex Klein5dd6b1e2019-07-31 15:45:24 -060042 uprevved = packages.uprev_build_targets(build_targets, overlay_type, chroot,
43 output_dir)
Alex Kleineb77ffa2019-05-28 14:47:44 -060044 except packages.Error as e:
45 # Handle module errors nicely, let everything else bubble up.
Mike Frysinger6b5c3cd2019-08-27 16:51:00 -040046 cros_build_lib.Die(e)
David Burger1e0fe232019-07-01 14:52:07 -060047
Alex Klein5dd6b1e2019-07-31 15:45:24 -060048 for path in uprevved:
49 output_proto.modified_ebuilds.add().path = path
50
Alex Klein231d2da2019-07-22 16:44:45 -060051
Alex Klein076841b2019-08-29 15:19:39 -060052@faux.all_empty
Alex Klein87531182019-08-12 15:23:37 -060053@validate.require('versions')
54@validate.require('package_info.package_name', 'package_info.category')
Alex Klein231d2da2019-07-22 16:44:45 -060055@validate.validation_complete
Alex Klein87531182019-08-12 15:23:37 -060056def UprevVersionedPackage(input_proto, output_proto, _config):
Evan Hernandez38555d42019-08-05 15:11:54 -060057 """Uprev a versioned package.
58
59 See go/pupr-generator for details about this endpoint.
60 """
Alex Klein87531182019-08-12 15:23:37 -060061 chroot = controller_util.ParseChroot(input_proto.chroot)
62 build_targets = controller_util.ParseBuildTargets(input_proto.build_targets)
63 package = controller_util.PackageInfoToCPV(input_proto.package_info)
64 refs = []
65 for ref in input_proto.versions:
66 refs.append(GitRef(path=ref.repository, ref=ref.ref, revision=ref.revision))
67
68 try:
Alex Klein34afcbc2019-08-22 16:14:31 -060069 result = packages.uprev_versioned_package(package, build_targets, refs,
70 chroot)
Alex Klein87531182019-08-12 15:23:37 -060071 except packages.Error as e:
72 # Handle module errors nicely, let everything else bubble up.
Mike Frysinger6b5c3cd2019-08-27 16:51:00 -040073 cros_build_lib.Die(e)
Alex Klein87531182019-08-12 15:23:37 -060074
Alex Klein34afcbc2019-08-22 16:14:31 -060075 if not result.uprevved:
76 # No uprevs executed, skip the output population.
77 return
78
Yaakov Shaul730814a2019-09-10 13:58:25 -060079 for modified in result.modified:
80 uprev_response = output_proto.responses.add()
81 uprev_response.version = modified.new_version
82 for path in modified.files:
83 uprev_response.modified_ebuilds.add().path = path
84
Alex Klein87531182019-08-12 15:23:37 -060085
Evan Hernandez38555d42019-08-05 15:11:54 -060086
Alex Klein076841b2019-08-29 15:19:39 -060087@faux.all_empty
David Burger1e0fe232019-07-01 14:52:07 -060088@validate.require('atom')
Alex Klein231d2da2019-07-22 16:44:45 -060089@validate.validation_complete
90def GetBestVisible(input_proto, output_proto, _config):
David Burger1e0fe232019-07-01 14:52:07 -060091 """Returns the best visible PackageInfo for the indicated atom."""
Alex Kleinbbef2b32019-08-27 10:38:50 -060092 build_target = None
93 if input_proto.build_target.name:
94 build_target = controller_util.ParseBuildTarget(input_proto.build_target)
95
96 cpv = packages.get_best_visible(input_proto.atom, build_target=build_target)
David Burger1e0fe232019-07-01 14:52:07 -060097 package_info = common_pb2.PackageInfo()
98 controller_util.CPVToPackageInfo(cpv, package_info)
99 output_proto.package_info.CopyFrom(package_info)
Alex Klein551e8052019-08-29 11:23:48 -0600100
101
Alex Klein076841b2019-08-29 15:19:39 -0600102@faux.all_empty
Alex Klein551e8052019-08-29 11:23:48 -0600103@validate.require('build_target.name')
104@validate.validation_complete
105def GetChromeVersion(input_proto, output_proto, _config):
106 """Returns the chrome version."""
107 build_target = controller_util.ParseBuildTarget(input_proto.build_target)
108 cpv = packages.get_best_visible(
109 constants.CHROME_CP, build_target=build_target)
110
111 # Something like 1.2.3.4_rc -> 1.2.3.4.
112 output_proto.version = cpv.version_no_rev.split('_')[0]
Alex Kleinda39c6d2019-09-16 14:36:36 -0600113
114
115def _HasChromePrebuiltSuccess(_input_proto, output_proto, _config):
116 """The mock success case for HasChromePrebuilt."""
117 output_proto.has_prebuilt = True
118
119
120@faux.success(_HasChromePrebuiltSuccess)
121@faux.empty_error
122@validate.require('build_target.name')
123@validate.validation_complete
124def HasChromePrebuilt(input_proto, output_proto, _config):
125 """Checks if the most recent version of Chrome has a prebuilt."""
126 build_target = controller_util.ParseBuildTarget(input_proto.build_target)
127 exists = packages.has_prebuilt(constants.CHROME_CP, build_target=build_target)
128
129 output_proto.has_prebuilt = exists
Alex Klein73fb6572019-09-30 16:55:23 -0600130
131
132def _BuildsChromeSuccess(_input_proto, output_proto, _config):
133 """Mock success case for BuildsChrome."""
134 output_proto.builds_chrome = True
135
136
137@faux.success(_BuildsChromeSuccess)
138@faux.empty_error
139@validate.require('build_target.name')
140@validate.validation_complete
141def BuildsChrome(input_proto, output_proto, _config):
142 """Check if the board builds chrome."""
Alex Kleine65131f2019-10-03 10:34:01 -0600143 build_target = controller_util.ParseBuildTarget(input_proto.build_target)
David Burger0f9dd4e2019-10-08 12:33:42 -0600144 cpvs = [controller_util.PackageInfoToCPV(pi) for pi in input_proto.packages]
145 builds_chrome = packages.builds(constants.CHROME_CP, build_target, cpvs)
Alex Kleine65131f2019-10-03 10:34:01 -0600146 output_proto.builds_chrome = builds_chrome