blob: 8ef3103c07370d341da59c415279b6c3023b44bf [file] [log] [blame]
Alex Klein19c4cc42019-02-27 14:47:57 -07001# 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"""SDK chroot operations."""
6
Alex Klein19c4cc42019-02-27 14:47:57 -07007import os
8
Alex Klein231d2da2019-07-22 16:44:45 -06009from chromite.api import controller
Alex Klein076841b2019-08-29 15:19:39 -060010from chromite.api import faux
Alex Klein231d2da2019-07-22 16:44:45 -060011from chromite.api import validate
Alex Klein71a9a1d2019-10-28 15:45:10 -060012from chromite.api.controller import controller_util
Alex Klein19c4cc42019-02-27 14:47:57 -070013from chromite.lib import cros_build_lib
14from chromite.service import sdk
15
16
Alex Klein076841b2019-08-29 15:19:39 -060017def _ChrootVersionResponse(_input_proto, output_proto, _config):
18 """Add a fake chroot version to a successful response."""
19 output_proto.version.version = 168
20
21
22@faux.success(_ChrootVersionResponse)
23@faux.empty_error
Alex Klein231d2da2019-07-22 16:44:45 -060024def Create(input_proto, output_proto, config):
Alex Klein19c4cc42019-02-27 14:47:57 -070025 """Chroot creation, includes support for replacing an existing chroot.
26
27 Args:
28 input_proto (CreateRequest): The input proto.
29 output_proto (CreateResponse): The output proto.
Alex Klein231d2da2019-07-22 16:44:45 -060030 config (api_config.ApiConfig): The API call config.
Alex Klein19c4cc42019-02-27 14:47:57 -070031 """
32 replace = not input_proto.flags.no_replace
33 bootstrap = input_proto.flags.bootstrap
34 use_image = not input_proto.flags.no_use_image
35
Alex Klein00aa8072019-04-15 16:36:00 -060036 chroot_path = input_proto.chroot.path
37 cache_dir = input_proto.chroot.cache_dir
Jack Neus99be8bf2022-02-01 19:56:58 +000038 sdk_version = input_proto.sdk_version
Alex Klein19c4cc42019-02-27 14:47:57 -070039
40 if chroot_path and not os.path.isabs(chroot_path):
41 cros_build_lib.Die('The chroot path must be absolute.')
42
Alex Klein231d2da2019-07-22 16:44:45 -060043 if config.validate_only:
44 return controller.RETURN_CODE_VALID_INPUT
45
Chris McDonald5dcdb892020-02-07 15:10:46 -070046 args = sdk.CreateArguments(
47 replace=replace,
48 bootstrap=bootstrap,
49 use_image=use_image,
50 cache_dir=cache_dir,
Jack Neus99be8bf2022-02-01 19:56:58 +000051 chroot_path=chroot_path,
52 sdk_version=sdk_version)
Alex Klein19c4cc42019-02-27 14:47:57 -070053
54 version = sdk.Create(args)
55
56 if version:
57 output_proto.version.version = version
58 else:
59 # This should be very rare, if ever used, but worth noting.
60 cros_build_lib.Die('No chroot version could be found. There was likely an'
61 'error creating the chroot that was not detected.')
Alex Kleinaa5c4172019-02-27 17:12:20 -070062
63
Alex Klein076841b2019-08-29 15:19:39 -060064@faux.success(_ChrootVersionResponse)
65@faux.empty_error
Alex Klein45b73432020-09-23 13:51:20 -060066@validate.require_each('toolchain_targets', ['name'])
Alex Klein231d2da2019-07-22 16:44:45 -060067@validate.validation_complete
68def Update(input_proto, output_proto, _config):
Alex Kleinaa5c4172019-02-27 17:12:20 -070069 """Update the chroot.
70
71 Args:
72 input_proto (UpdateRequest): The input proto.
73 output_proto (UpdateResponse): The output proto.
Alex Klein231d2da2019-07-22 16:44:45 -060074 _config (api_config.ApiConfig): The API call config.
Alex Kleinaa5c4172019-02-27 17:12:20 -070075 """
76 build_source = input_proto.flags.build_source
77 targets = [target.name for target in input_proto.toolchain_targets]
Chris McDonald68faa2a2020-01-13 12:23:05 -070078 toolchain_changed = input_proto.flags.toolchain_changed
Alex Kleinaa5c4172019-02-27 17:12:20 -070079
Chris McDonald68faa2a2020-01-13 12:23:05 -070080 args = sdk.UpdateArguments(
81 build_source=build_source,
82 toolchain_targets=targets,
83 toolchain_changed=toolchain_changed)
84
Alex Kleinaa5c4172019-02-27 17:12:20 -070085 version = sdk.Update(args)
86
87 if version:
88 output_proto.version.version = version
89 else:
90 # This should be very rare, if ever used, but worth noting.
91 cros_build_lib.Die('No chroot version could be found. There was likely an'
92 'error creating the chroot that was not detected.')
Alex Klein730cf552019-10-16 11:28:22 -060093
94
95@faux.all_empty
96@validate.validation_complete
97def Delete(input_proto, _output_proto, _config):
98 """Delete a chroot."""
Alex Klein71a9a1d2019-10-28 15:45:10 -060099 chroot = controller_util.ParseChroot(input_proto.chroot)
Michael Mortensen42a700e2020-07-01 12:50:45 -0600100 sdk.Delete(chroot, force=True)
Chris McDonald53ad5442020-01-17 14:11:55 -0700101
102
103@faux.all_empty
104@validate.validation_complete
105def Unmount(input_proto, _output_proto, _config):
106 """Unmount a chroot"""
107 chroot = controller_util.ParseChroot(input_proto.chroot)
108 sdk.Unmount(chroot)
Chris McDonaldf48ea202020-01-29 13:19:23 -0700109
110
111@faux.all_empty
Michael Mortensen52a98ac2020-07-28 16:00:18 -0600112@validate.require('path.path')
113@validate.validation_complete
114def UnmountPath(input_proto, _output_proto, _config):
115 """Unmount a path"""
Alex Kleinb44a6af2020-08-05 15:57:12 -0600116 sdk.UnmountPath(input_proto.path.path)
Michael Mortensen52a98ac2020-07-28 16:00:18 -0600117
118
119@faux.all_empty
Chris McDonaldf48ea202020-01-29 13:19:23 -0700120@validate.validation_complete
121def Clean(input_proto, _output_proto, _config):
122 """Clean unneeded files from a chroot."""
123 chroot = controller_util.ParseChroot(input_proto.chroot)
Alex Kleinb2919e82022-02-23 10:55:36 -0700124 sdk.Clean(chroot, safe=True, sysroots=True)
Chris McDonald9d486802020-01-29 15:57:22 -0700125
126
127@faux.all_empty
128@validate.validation_complete
129def CreateSnapshot(input_proto, output_proto, _config):
130 """Create a chroot snapshot and return a corresponding opaque snapshot key."""
131 chroot = controller_util.ParseChroot(input_proto.chroot)
132 token = sdk.CreateSnapshot(chroot, replace_if_needed=True)
133 output_proto.snapshot_token.value = token
134
135
136@faux.all_empty
137@validate.validation_complete
138def RestoreSnapshot(input_proto, _output_proto, _config):
139 """Restore a chroot snapshot from a snapshot key."""
140 chroot = controller_util.ParseChroot(input_proto.chroot)
141 token = input_proto.snapshot_token.value
142 sdk.RestoreSnapshot(token, chroot)
Bob Haarmand1225ea2022-01-19 22:01:42 +0000143
144
145@faux.all_empty
146@validate.validation_complete
147def BuildPrebuilts(input_proto, _output_proto, _config):
148 """Builds the binary packages that comprise the Chromium OS SDK."""
149 chroot = controller_util.ParseChroot(input_proto.chroot)
150 sdk.BuildPrebuilts(chroot)
151
152
153@faux.all_empty
154@validate.require('prepend_version', 'version', 'upload_location')
155@validate.validation_complete
156def UploadPrebuiltPackages(input_proto, _output_proto, _config):
157 """Uploads prebuilt packages."""
158 sdk.UploadPrebuiltPackages(controller_util.ParseChroot(input_proto.chroot),
159 input_proto.prepend_version,
160 input_proto.version,
161 input_proto.upload_location)