blob: a788672fa89eb9f81a90accfa89eec114269350d [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
Mike Frysingeref94e4c2020-02-10 23:59:54 -050010import sys
11
Alex Klein076841b2019-08-29 15:19:39 -060012from chromite.api import faux
David Burger1e0fe232019-07-01 14:52:07 -060013from chromite.api import validate
Alex Kleineb77ffa2019-05-28 14:47:44 -060014from chromite.api.controller import controller_util
15from chromite.api.gen.chromite.api import binhost_pb2
David Burger1e0fe232019-07-01 14:52:07 -060016from chromite.api.gen.chromiumos import common_pb2
Alex Kleineb77ffa2019-05-28 14:47:44 -060017from chromite.lib import constants
18from chromite.lib import cros_build_lib
Alex Klein445ae3c2020-01-08 16:40:43 -070019from chromite.lib import cros_logging as logging
Michael Mortensenbbce7e42020-05-01 15:03:49 -060020from chromite.lib import portage_util
Alex Klein87531182019-08-12 15:23:37 -060021from chromite.lib.uprev_lib import GitRef
Alex Kleineb77ffa2019-05-28 14:47:44 -060022from chromite.service import packages
23
24
Mike Frysingeref94e4c2020-02-10 23:59:54 -050025assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
26
27
Alex Kleineb77ffa2019-05-28 14:47:44 -060028_OVERLAY_TYPE_TO_NAME = {
29 binhost_pb2.OVERLAYTYPE_PUBLIC: constants.PUBLIC_OVERLAYS,
30 binhost_pb2.OVERLAYTYPE_PRIVATE: constants.PRIVATE_OVERLAYS,
31 binhost_pb2.OVERLAYTYPE_BOTH: constants.BOTH_OVERLAYS,
32}
33
Michael Mortensen2677bf62019-10-29 08:31:25 -060034def _UprevResponse(_input_proto, output_proto, _config):
35 """Add fake paths to a successful uprev response."""
36 output_proto.modified_ebuilds.add().path = '/fake/path1'
37 output_proto.modified_ebuilds.add().path = '/fake/path2'
Alex Kleineb77ffa2019-05-28 14:47:44 -060038
Michael Mortensen2677bf62019-10-29 08:31:25 -060039@faux.success(_UprevResponse)
40@faux.empty_error
Alex Klein231d2da2019-07-22 16:44:45 -060041@validate.require('overlay_type')
42@validate.is_in('overlay_type', _OVERLAY_TYPE_TO_NAME)
43@validate.validation_complete
44def Uprev(input_proto, output_proto, _config):
Alex Kleineb77ffa2019-05-28 14:47:44 -060045 """Uprev all cros workon ebuilds that have changes."""
Alex Klein26e472b2020-03-10 14:35:01 -060046 build_targets = controller_util.ParseBuildTargets(input_proto.build_targets)
Alex Kleineb77ffa2019-05-28 14:47:44 -060047 overlay_type = _OVERLAY_TYPE_TO_NAME[input_proto.overlay_type]
48 chroot = controller_util.ParseChroot(input_proto.chroot)
49 output_dir = input_proto.output_dir or None
50
51 try:
Alex Klein5dd6b1e2019-07-31 15:45:24 -060052 uprevved = packages.uprev_build_targets(build_targets, overlay_type, chroot,
53 output_dir)
Alex Kleineb77ffa2019-05-28 14:47:44 -060054 except packages.Error as e:
55 # Handle module errors nicely, let everything else bubble up.
Mike Frysinger6b5c3cd2019-08-27 16:51:00 -040056 cros_build_lib.Die(e)
David Burger1e0fe232019-07-01 14:52:07 -060057
Alex Klein5dd6b1e2019-07-31 15:45:24 -060058 for path in uprevved:
59 output_proto.modified_ebuilds.add().path = path
60
Alex Klein231d2da2019-07-22 16:44:45 -060061
Michael Mortensen2677bf62019-10-29 08:31:25 -060062def _UprevVersionedPackageResponse(_input_proto, output_proto, _config):
63 """Add fake paths to a successful uprev versioned package response."""
64 uprev_response = output_proto.responses.add()
65 uprev_response.modified_ebuilds.add().path = '/uprev/response/path'
66
67
68@faux.success(_UprevVersionedPackageResponse)
69@faux.empty_error
Alex Klein87531182019-08-12 15:23:37 -060070@validate.require('versions')
71@validate.require('package_info.package_name', 'package_info.category')
Alex Klein231d2da2019-07-22 16:44:45 -060072@validate.validation_complete
Alex Klein87531182019-08-12 15:23:37 -060073def UprevVersionedPackage(input_proto, output_proto, _config):
Evan Hernandez38555d42019-08-05 15:11:54 -060074 """Uprev a versioned package.
75
76 See go/pupr-generator for details about this endpoint.
77 """
Alex Klein87531182019-08-12 15:23:37 -060078 chroot = controller_util.ParseChroot(input_proto.chroot)
79 build_targets = controller_util.ParseBuildTargets(input_proto.build_targets)
80 package = controller_util.PackageInfoToCPV(input_proto.package_info)
81 refs = []
82 for ref in input_proto.versions:
83 refs.append(GitRef(path=ref.repository, ref=ref.ref, revision=ref.revision))
84
85 try:
Alex Klein34afcbc2019-08-22 16:14:31 -060086 result = packages.uprev_versioned_package(package, build_targets, refs,
87 chroot)
Alex Klein87531182019-08-12 15:23:37 -060088 except packages.Error as e:
89 # Handle module errors nicely, let everything else bubble up.
Mike Frysinger6b5c3cd2019-08-27 16:51:00 -040090 cros_build_lib.Die(e)
Alex Klein87531182019-08-12 15:23:37 -060091
Alex Klein34afcbc2019-08-22 16:14:31 -060092 if not result.uprevved:
93 # No uprevs executed, skip the output population.
94 return
95
Yaakov Shaul730814a2019-09-10 13:58:25 -060096 for modified in result.modified:
97 uprev_response = output_proto.responses.add()
98 uprev_response.version = modified.new_version
99 for path in modified.files:
100 uprev_response.modified_ebuilds.add().path = path
101
Alex Klein87531182019-08-12 15:23:37 -0600102
Michael Mortensen2677bf62019-10-29 08:31:25 -0600103def _GetBestVisibleResponse(_input_proto, output_proto, _config):
104 """Add fake paths to a successful GetBestVisible response."""
105 package_info = common_pb2.PackageInfo(
106 category='category',
107 package_name='name',
108 version='1.01',
109 )
110 output_proto.package_info.CopyFrom(package_info)
111
112
113@faux.success(_GetBestVisibleResponse)
114@faux.empty_error
David Burger1e0fe232019-07-01 14:52:07 -0600115@validate.require('atom')
Alex Klein231d2da2019-07-22 16:44:45 -0600116@validate.validation_complete
117def GetBestVisible(input_proto, output_proto, _config):
David Burger1e0fe232019-07-01 14:52:07 -0600118 """Returns the best visible PackageInfo for the indicated atom."""
Alex Kleinbbef2b32019-08-27 10:38:50 -0600119 build_target = None
120 if input_proto.build_target.name:
121 build_target = controller_util.ParseBuildTarget(input_proto.build_target)
122
123 cpv = packages.get_best_visible(input_proto.atom, build_target=build_target)
David Burger1e0fe232019-07-01 14:52:07 -0600124 package_info = common_pb2.PackageInfo()
125 controller_util.CPVToPackageInfo(cpv, package_info)
126 output_proto.package_info.CopyFrom(package_info)
Alex Klein551e8052019-08-29 11:23:48 -0600127
128
Michael Mortensen68abdb72019-10-28 09:43:52 -0600129def _ChromeVersionResponse(_input_proto, output_proto, _config):
130 """Add a fake chrome version to a successful response."""
131 output_proto.version = '78.0.3900.0'
132
133
134@faux.success(_ChromeVersionResponse)
135@faux.empty_error
Alex Klein551e8052019-08-29 11:23:48 -0600136@validate.require('build_target.name')
137@validate.validation_complete
138def GetChromeVersion(input_proto, output_proto, _config):
139 """Returns the chrome version."""
140 build_target = controller_util.ParseBuildTarget(input_proto.build_target)
Michael Mortensen9fe740c2019-10-29 14:42:48 -0600141 chrome_version = packages.determine_chrome_version(build_target)
142 if chrome_version:
143 output_proto.version = chrome_version
Alex Kleinda39c6d2019-09-16 14:36:36 -0600144
145
Michael Mortensen2677bf62019-10-29 08:31:25 -0600146def _GetTargetVersionsResponse(_input_proto, output_proto, _config):
147 """Add fake target version fields to a successful response."""
148 output_proto.android_version = '5812377'
149 output_proto.android_branch_version = 'git_nyc-mr1-arc'
150 output_proto.android_target_version = 'cheets'
151 output_proto.chrome_version = '78.0.3900.0'
152 output_proto.platform_version = '12438.0.0'
153 output_proto.milestone_version = '78'
154 output_proto.full_version = 'R78-12438.0.0'
155
156
157@faux.success(_GetTargetVersionsResponse)
158@faux.empty_error
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600159@validate.require('build_target.name')
160@validate.validation_complete
161def GetTargetVersions(input_proto, output_proto, _config):
162 """Returns the target versions."""
163 build_target = controller_util.ParseBuildTarget(input_proto.build_target)
Alex Klein445ae3c2020-01-08 16:40:43 -0700164 # Android version.
Michael Mortensen027ecd82020-05-05 13:13:40 -0600165 android_version = packages.determine_android_version([build_target.name])
Alex Klein445ae3c2020-01-08 16:40:43 -0700166 logging.info('Found android version: %s', android_version)
Michael Mortensenedf76532019-10-16 14:22:37 -0600167 if android_version:
168 output_proto.android_version = android_version
Alex Klein445ae3c2020-01-08 16:40:43 -0700169 # Android branch version.
Michael Mortensen027ecd82020-05-05 13:13:40 -0600170 android_branch_version = packages.determine_android_branch(build_target.name)
Alex Klein445ae3c2020-01-08 16:40:43 -0700171 logging.info('Found android branch version: %s', android_branch_version)
Michael Mortensenedf76532019-10-16 14:22:37 -0600172 if android_branch_version:
173 output_proto.android_branch_version = android_branch_version
Alex Klein445ae3c2020-01-08 16:40:43 -0700174 # Android target version.
Michael Mortensen027ecd82020-05-05 13:13:40 -0600175 android_target_version = packages.determine_android_target(build_target.name)
Alex Klein445ae3c2020-01-08 16:40:43 -0700176 logging.info('Found android target version: %s', android_target_version)
Michael Mortensenedf76532019-10-16 14:22:37 -0600177 if android_target_version:
178 output_proto.android_target_version = android_target_version
Alex Klein445ae3c2020-01-08 16:40:43 -0700179
Michael Mortensen9fe740c2019-10-29 14:42:48 -0600180 # TODO(crbug/1019770): Investigate cases where builds_chrome is true but
181 # chrome_version is None.
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600182 builds_chrome = packages.builds(constants.CHROME_CP, build_target)
183 if builds_chrome:
Alex Klein445ae3c2020-01-08 16:40:43 -0700184 # Chrome version fetch.
Michael Mortensen9fe740c2019-10-29 14:42:48 -0600185 chrome_version = packages.determine_chrome_version(build_target)
Alex Klein445ae3c2020-01-08 16:40:43 -0700186 logging.info('Found chrome version: %s', chrome_version)
Michael Mortensen9fe740c2019-10-29 14:42:48 -0600187 if chrome_version:
188 output_proto.chrome_version = chrome_version
Alex Klein445ae3c2020-01-08 16:40:43 -0700189
190 # The ChromeOS version info.
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600191 output_proto.platform_version = packages.determine_platform_version()
Michael Mortensen009cb662019-10-21 11:38:43 -0600192 output_proto.milestone_version = packages.determine_milestone_version()
193 output_proto.full_version = packages.determine_full_version()
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600194
195
Michael Mortensenbfc56392020-04-30 15:23:47 -0600196def _GetBuilderMetadataResponse(input_proto, output_proto, _config):
197 """Add fake metadata fields to a successful response."""
198 # Populate only a few fields to validate faux testing.
199 build_target_metadata = output_proto.build_target_metadata.add()
200 build_target_metadata.build_target = input_proto.build_target.name
201 build_target_metadata.android_container_branch = 'git_pi-arc'
202 model_metadata = output_proto.model_metadata.add()
203 model_metadata.model_name = 'astronaut'
204 model_metadata.ec_firmware_version = 'coral_v1.1.1234-56789f'
205
206
207@faux.success(_GetBuilderMetadataResponse)
208@faux.empty_error
209@validate.require('build_target.name')
210@validate.validation_complete
211def GetBuilderMetadata(input_proto, output_proto, _config):
212 """Returns the target builder metadata."""
213 build_target = controller_util.ParseBuildTarget(input_proto.build_target)
214 build_target_metadata = output_proto.build_target_metadata.add()
215 build_target_metadata.build_target = build_target.name
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600216 # Android version.
Michael Mortensen027ecd82020-05-05 13:13:40 -0600217 android_version = packages.determine_android_version([build_target.name])
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600218 logging.info('Found android version: %s', android_version)
219 if android_version:
220 build_target_metadata.android_container_version = android_version
221 # Android branch version.
Michael Mortensen027ecd82020-05-05 13:13:40 -0600222 android_branch_version = packages.determine_android_branch(build_target.name)
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600223 logging.info('Found android branch version: %s', android_branch_version)
224 if android_branch_version:
225 build_target_metadata.android_container_branch = android_branch_version
226 # Android target version.
Michael Mortensen027ecd82020-05-05 13:13:40 -0600227 android_target_version = packages.determine_android_target(build_target.name)
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600228 logging.info('Found android target version: %s', android_target_version)
229 if android_target_version:
230 build_target_metadata.android_container_target = android_target_version
231
232 build_target_metadata.arc_use_set = 'arc' in portage_util.GetBoardUseFlags(
233 build_target.name)
234
Michael Mortensenbfc56392020-04-30 15:23:47 -0600235 # TODO(crbug/1071620): Add service layer calls to fill out the rest of
236 # build_target_metadata and model_metadata.
Michael Mortensena4af79e2020-05-06 16:18:48 -0600237 fw_versions = packages.determine_firmware_versions(build_target)
238 build_target_metadata.main_firmware_version = fw_versions.main_fw_version
239 build_target_metadata.ec_firmware_version = fw_versions.ec_fw_version
240
Michael Mortensenbfc56392020-04-30 15:23:47 -0600241
Alex Klein7d66c092020-03-23 15:13:18 -0600242def _HasPrebuiltSuccess(_input_proto, output_proto, _config):
Michael Mortensen68abdb72019-10-28 09:43:52 -0600243 """The mock success case for HasChromePrebuilt."""
244 output_proto.has_prebuilt = True
245
246
Alex Klein7d66c092020-03-23 15:13:18 -0600247@faux.success(_HasPrebuiltSuccess)
Alex Kleinda39c6d2019-09-16 14:36:36 -0600248@faux.empty_error
249@validate.require('build_target.name')
250@validate.validation_complete
251def HasChromePrebuilt(input_proto, output_proto, _config):
252 """Checks if the most recent version of Chrome has a prebuilt."""
253 build_target = controller_util.ParseBuildTarget(input_proto.build_target)
Alex Klein149fd3b2019-12-16 16:01:05 -0700254 useflags = 'chrome_internal' if input_proto.chrome else None
255 exists = packages.has_prebuilt(constants.CHROME_CP, build_target=build_target,
256 useflags=useflags)
Alex Kleinda39c6d2019-09-16 14:36:36 -0600257
258 output_proto.has_prebuilt = exists
Alex Klein73fb6572019-09-30 16:55:23 -0600259
260
Alex Klein7d66c092020-03-23 15:13:18 -0600261@faux.success(_HasPrebuiltSuccess)
262@faux.empty_error
George Engelbrechtfce26aa2020-03-23 20:53:41 -0600263@validate.require('build_target.name', 'package_info.category',
264 'package_info.package_name')
Alex Klein7d66c092020-03-23 15:13:18 -0600265@validate.validation_complete
266def HasPrebuilt(input_proto, output_proto, _config):
267 """Checks if the most recent version of Chrome has a prebuilt."""
268 build_target = controller_util.ParseBuildTarget(input_proto.build_target)
269 package = controller_util.PackageInfoToCPV(input_proto.package_info).cp
270 useflags = 'chrome_internal' if input_proto.chrome else None
271 exists = packages.has_prebuilt(
272 package, build_target=build_target, useflags=useflags)
273
274 output_proto.has_prebuilt = exists
275
276
Alex Klein73fb6572019-09-30 16:55:23 -0600277def _BuildsChromeSuccess(_input_proto, output_proto, _config):
278 """Mock success case for BuildsChrome."""
279 output_proto.builds_chrome = True
280
281
282@faux.success(_BuildsChromeSuccess)
283@faux.empty_error
284@validate.require('build_target.name')
285@validate.validation_complete
286def BuildsChrome(input_proto, output_proto, _config):
287 """Check if the board builds chrome."""
Alex Kleine65131f2019-10-03 10:34:01 -0600288 build_target = controller_util.ParseBuildTarget(input_proto.build_target)
David Burger0f9dd4e2019-10-08 12:33:42 -0600289 cpvs = [controller_util.PackageInfoToCPV(pi) for pi in input_proto.packages]
290 builds_chrome = packages.builds(constants.CHROME_CP, build_target, cpvs)
Alex Kleine65131f2019-10-03 10:34:01 -0600291 output_proto.builds_chrome = builds_chrome