blob: 96ed70e3c1ea9c7c931721234b12ce78ba8fa50d [file] [log] [blame]
Mike Frysingerf1ba7ad2022-09-12 05:42:57 -04001# Copyright 2019 The ChromiumOS Authors
Alex Klein19c4cc42019-02-27 14:47:57 -07002# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5"""SDK chroot operations."""
6
Alex Klein19c4cc42019-02-27 14:47:57 -07007import os
Greg Edelston9dcdc8a2023-01-11 17:07:10 -07008from typing import Dict, Union
Alex Klein19c4cc42019-02-27 14:47:57 -07009
Alex Klein231d2da2019-07-22 16:44:45 -060010from chromite.api import controller
Alex Klein076841b2019-08-29 15:19:39 -060011from chromite.api import faux
Alex Klein231d2da2019-07-22 16:44:45 -060012from chromite.api import validate
Alex Klein71a9a1d2019-10-28 15:45:10 -060013from chromite.api.controller import controller_util
Bob Haarman0853ce92022-12-13 18:11:53 +000014from chromite.api.gen.chromiumos import common_pb2
Alex Klein19c4cc42019-02-27 14:47:57 -070015from chromite.lib import cros_build_lib
16from chromite.service import sdk
17
18
Alex Klein076841b2019-08-29 15:19:39 -060019def _ChrootVersionResponse(_input_proto, output_proto, _config):
Alex Klein1699fab2022-09-08 08:46:06 -060020 """Add a fake chroot version to a successful response."""
21 output_proto.version.version = 168
Alex Klein076841b2019-08-29 15:19:39 -060022
23
Bob Haarman171d4092023-01-10 16:44:19 +000024def _BinhostCLs(_input_proto, output_proto, _config):
25 """Add fake CL identifiers to a successful response."""
Bob Haarmanc0082602022-09-20 16:12:43 -070026 output_proto.cls = [
Bob Haarman171d4092023-01-10 16:44:19 +000027 "fakecl:1",
28 "fakecl:2",
Bob Haarmanc0082602022-09-20 16:12:43 -070029 ]
30
31
Bob Haarman0853ce92022-12-13 18:11:53 +000032def _BuildSdkTarballResponse(_input_proto, output_proto, _config):
33 """Populate a fake BuildSdkTarballResponse."""
34 output_proto.sdk_tarball_path.path = "/fake/sdk/tarball.tar.gz"
35 output_proto.sdk_tarball_path.location = common_pb2.Path.OUTSIDE
36
37
38@faux.success(_BuildSdkTarballResponse)
39@validate.require("chroot")
40@validate.validation_complete
41def BuildSdkTarball(
42 input_proto: "BuildSdkTarballRequest",
43 output_proto: "BuildSdkTarballResponse",
44 _config: "api_config.ApiConfig",
45) -> None:
46 chroot = controller_util.ParseChroot(input_proto.chroot)
47 output_proto.sdk_tarball_path.path = str(sdk.BuildSdkTarball(chroot))
48 output_proto.sdk_tarball_path.location = common_pb2.Path.OUTSIDE
49
50
Alex Klein076841b2019-08-29 15:19:39 -060051@faux.success(_ChrootVersionResponse)
52@faux.empty_error
Alex Klein1699fab2022-09-08 08:46:06 -060053def Create(
54 input_proto: "CreateRequest",
55 output_proto: "CreateResponse",
56 config: "api_config.ApiConfig",
57) -> Union[int, None]:
58 """Chroot creation, includes support for replacing an existing chroot.
Alex Klein19c4cc42019-02-27 14:47:57 -070059
Alex Klein1699fab2022-09-08 08:46:06 -060060 Args:
Alex Klein611dddd2022-10-11 17:02:01 -060061 input_proto: The input proto.
62 output_proto: The output proto.
63 config: The API call config.
Kevin Shelton50dabff2022-04-09 11:29:53 -070064
Alex Klein1699fab2022-09-08 08:46:06 -060065 Returns:
Alex Klein611dddd2022-10-11 17:02:01 -060066 An error code, None otherwise.
Alex Klein1699fab2022-09-08 08:46:06 -060067 """
68 replace = not input_proto.flags.no_replace
69 bootstrap = input_proto.flags.bootstrap
70 use_image = not input_proto.flags.no_use_image
Alex Klein19c4cc42019-02-27 14:47:57 -070071
Alex Klein1699fab2022-09-08 08:46:06 -060072 chroot_path = input_proto.chroot.path
73 cache_dir = input_proto.chroot.cache_dir
74 sdk_version = input_proto.sdk_version
75 skip_chroot_upgrade = input_proto.skip_chroot_upgrade
Alex Klein19c4cc42019-02-27 14:47:57 -070076
Alex Klein1699fab2022-09-08 08:46:06 -060077 if chroot_path and not os.path.isabs(chroot_path):
78 cros_build_lib.Die("The chroot path must be absolute.")
Alex Klein19c4cc42019-02-27 14:47:57 -070079
Alex Klein1699fab2022-09-08 08:46:06 -060080 if config.validate_only:
81 return controller.RETURN_CODE_VALID_INPUT
Alex Klein231d2da2019-07-22 16:44:45 -060082
Alex Klein1699fab2022-09-08 08:46:06 -060083 args = sdk.CreateArguments(
84 replace=replace,
85 bootstrap=bootstrap,
86 use_image=use_image,
87 cache_dir=cache_dir,
88 chroot_path=chroot_path,
89 sdk_version=sdk_version,
90 skip_chroot_upgrade=skip_chroot_upgrade,
91 )
Alex Klein19c4cc42019-02-27 14:47:57 -070092
Alex Klein1699fab2022-09-08 08:46:06 -060093 version = sdk.Create(args)
Alex Klein19c4cc42019-02-27 14:47:57 -070094
Alex Klein1699fab2022-09-08 08:46:06 -060095 if version:
96 output_proto.version.version = version
97 else:
98 # This should be very rare, if ever used, but worth noting.
99 cros_build_lib.Die(
100 "No chroot version could be found. There was likely an"
101 "error creating the chroot that was not detected."
102 )
Alex Kleinaa5c4172019-02-27 17:12:20 -0700103
104
Alex Klein076841b2019-08-29 15:19:39 -0600105@faux.success(_ChrootVersionResponse)
106@faux.empty_error
Alex Klein1699fab2022-09-08 08:46:06 -0600107@validate.require_each("toolchain_targets", ["name"])
Alex Klein231d2da2019-07-22 16:44:45 -0600108@validate.validation_complete
Alex Klein1699fab2022-09-08 08:46:06 -0600109def Update(
110 input_proto: "UpdateRequest",
111 output_proto: "UpdateResponse",
112 _config: "api_config.ApiConfig",
113):
114 """Update the chroot.
Alex Kleinaa5c4172019-02-27 17:12:20 -0700115
Alex Klein1699fab2022-09-08 08:46:06 -0600116 Args:
Alex Klein611dddd2022-10-11 17:02:01 -0600117 input_proto: The input proto.
118 output_proto: The output proto.
119 _config: The API call config.
Alex Klein1699fab2022-09-08 08:46:06 -0600120 """
121 build_source = input_proto.flags.build_source
122 targets = [target.name for target in input_proto.toolchain_targets]
123 toolchain_changed = input_proto.flags.toolchain_changed
Alex Kleinaa5c4172019-02-27 17:12:20 -0700124
Alex Klein1699fab2022-09-08 08:46:06 -0600125 args = sdk.UpdateArguments(
126 build_source=build_source,
127 toolchain_targets=targets,
128 toolchain_changed=toolchain_changed,
129 )
Chris McDonald68faa2a2020-01-13 12:23:05 -0700130
Alex Klein1699fab2022-09-08 08:46:06 -0600131 version = sdk.Update(args)
Alex Kleinaa5c4172019-02-27 17:12:20 -0700132
Alex Klein1699fab2022-09-08 08:46:06 -0600133 if version:
134 output_proto.version.version = version
135 else:
136 # This should be very rare, if ever used, but worth noting.
137 cros_build_lib.Die(
138 "No chroot version could be found. There was likely an"
139 "error creating the chroot that was not detected."
140 )
Alex Klein730cf552019-10-16 11:28:22 -0600141
142
143@faux.all_empty
144@validate.validation_complete
145def Delete(input_proto, _output_proto, _config):
Alex Klein1699fab2022-09-08 08:46:06 -0600146 """Delete a chroot."""
147 chroot = controller_util.ParseChroot(input_proto.chroot)
148 sdk.Delete(chroot, force=True)
Chris McDonald53ad5442020-01-17 14:11:55 -0700149
150
151@faux.all_empty
152@validate.validation_complete
153def Unmount(input_proto, _output_proto, _config):
Alex Klein1699fab2022-09-08 08:46:06 -0600154 """Unmount a chroot"""
155 chroot = controller_util.ParseChroot(input_proto.chroot)
156 sdk.Unmount(chroot)
Chris McDonaldf48ea202020-01-29 13:19:23 -0700157
158
159@faux.all_empty
Alex Klein1699fab2022-09-08 08:46:06 -0600160@validate.require("path.path")
Michael Mortensen52a98ac2020-07-28 16:00:18 -0600161@validate.validation_complete
162def UnmountPath(input_proto, _output_proto, _config):
Alex Klein1699fab2022-09-08 08:46:06 -0600163 """Unmount a path"""
164 sdk.UnmountPath(input_proto.path.path)
Michael Mortensen52a98ac2020-07-28 16:00:18 -0600165
166
167@faux.all_empty
Chris McDonaldf48ea202020-01-29 13:19:23 -0700168@validate.validation_complete
169def Clean(input_proto, _output_proto, _config):
Alex Klein1699fab2022-09-08 08:46:06 -0600170 """Clean unneeded files from a chroot."""
171 chroot = controller_util.ParseChroot(input_proto.chroot)
172 sdk.Clean(chroot, safe=True, sysroots=True)
Chris McDonald9d486802020-01-29 15:57:22 -0700173
174
175@faux.all_empty
176@validate.validation_complete
177def CreateSnapshot(input_proto, output_proto, _config):
Alex Kleinab87ceb2023-01-24 12:00:51 -0700178 """Create a chroot snapshot and return a corresponding opaque key."""
Alex Klein1699fab2022-09-08 08:46:06 -0600179 chroot = controller_util.ParseChroot(input_proto.chroot)
180 token = sdk.CreateSnapshot(chroot, replace_if_needed=True)
181 output_proto.snapshot_token.value = token
Chris McDonald9d486802020-01-29 15:57:22 -0700182
183
184@faux.all_empty
185@validate.validation_complete
186def RestoreSnapshot(input_proto, _output_proto, _config):
Alex Klein1699fab2022-09-08 08:46:06 -0600187 """Restore a chroot snapshot from a snapshot key."""
188 chroot = controller_util.ParseChroot(input_proto.chroot)
189 token = input_proto.snapshot_token.value
190 sdk.RestoreSnapshot(token, chroot)
Bob Haarmand1225ea2022-01-19 22:01:42 +0000191
192
193@faux.all_empty
194@validate.validation_complete
195def BuildPrebuilts(input_proto, _output_proto, _config):
Greg Edelston9dcdc8a2023-01-11 17:07:10 -0700196 """Build the binary packages that comprise the Chromium OS SDK."""
Alex Klein1699fab2022-09-08 08:46:06 -0600197 chroot = controller_util.ParseChroot(input_proto.chroot)
Greg Edelston199c5362023-01-04 12:29:07 -0700198 sdk.BuildPrebuilts(chroot, board=input_proto.build_target.name)
Bob Haarmand1225ea2022-01-19 22:01:42 +0000199
200
Bob Haarman171d4092023-01-10 16:44:19 +0000201@faux.success(_BinhostCLs)
Bob Haarmanc0082602022-09-20 16:12:43 -0700202@faux.empty_error
Bob Haarman0853ce92022-12-13 18:11:53 +0000203@validate.require(
204 "prepend_version", "version", "upload_location", "sdk_tarball_template"
205)
Bob Haarmand1225ea2022-01-19 22:01:42 +0000206@validate.validation_complete
Bob Haarmanc0082602022-09-20 16:12:43 -0700207def CreateBinhostCLs(
208 input_proto: "CreateBinhostCLsRequest",
209 output_proto: "CreateBinhostCLsResponse",
210 _config: "api_config.ApiConfig",
211) -> None:
Alex Klein1699fab2022-09-08 08:46:06 -0600212 """Create CLs to update the binhost to point at uploaded prebuilts."""
Bob Haarman171d4092023-01-10 16:44:19 +0000213 output_proto.cls.extend(
214 sdk.CreateBinhostCLs(
215 input_proto.prepend_version,
216 input_proto.version,
217 input_proto.upload_location,
218 input_proto.sdk_tarball_template,
219 )
Alex Klein1699fab2022-09-08 08:46:06 -0600220 )
Bob Haarman338f8b72022-02-04 01:02:46 +0000221
222
223@faux.all_empty
Alex Klein1699fab2022-09-08 08:46:06 -0600224@validate.require("prepend_version", "version", "upload_location")
Bob Haarman338f8b72022-02-04 01:02:46 +0000225@validate.validation_complete
Bob Haarmand1225ea2022-01-19 22:01:42 +0000226def UploadPrebuiltPackages(input_proto, _output_proto, _config):
Greg Edelston9dcdc8a2023-01-11 17:07:10 -0700227 """Upload prebuilt packages."""
Alex Klein1699fab2022-09-08 08:46:06 -0600228 sdk.UploadPrebuiltPackages(
229 controller_util.ParseChroot(input_proto.chroot),
230 input_proto.prepend_version,
231 input_proto.version,
232 input_proto.upload_location,
233 )
Greg Edelston9dcdc8a2023-01-11 17:07:10 -0700234
235
236@faux.all_empty
237@validate.require("chroot")
238@validate.validation_complete
239def BuildSdkToolchain(input_proto, output_proto, _config):
240 """Build cross-compiler packages for the SDK."""
241 chroot = controller_util.ParseChroot(input_proto.chroot)
242 extra_env: Dict[str, str] = {}
243 if input_proto.use_flags:
244 extra_env["USE"] = " ".join(use.flag for use in input_proto.use_flags)
245 generated_files = sdk.BuildSdkToolchain(chroot, extra_env=extra_env)
246 output_proto.generated_files.extend(generated_files)