This is an automated email from the ASF dual-hosted git repository. juergbi pushed a commit to branch jbilleter/action-cache in repository https://gitbox.apache.org/repos/asf/buildstream.git
commit 5d729215b9cdc247cda28bb748b1098e5c90e7c9 Author: Jürg Billeter <[email protected]> AuthorDate: Fri Jun 27 17:34:29 2025 +0200 Require buildbox-casd 1.2.6 This makes it possible to drop the fallback to direct connections to remote servers. --- src/buildstream/_assetcache.py | 21 ++++---------- src/buildstream/_cas/casdprocessmanager.py | 2 +- src/buildstream/_cas/casremote.py | 11 +------- src/buildstream/_remote.py | 5 ---- src/buildstream/_remotespec.py | 37 ------------------------ src/buildstream/sandbox/_sandboxbuildboxrun.py | 3 -- src/buildstream/sandbox/_sandboxremote.py | 39 ++++++-------------------- 7 files changed, 16 insertions(+), 102 deletions(-) diff --git a/src/buildstream/_assetcache.py b/src/buildstream/_assetcache.py index 59fe1506a..62fc8e6bd 100644 --- a/src/buildstream/_assetcache.py +++ b/src/buildstream/_assetcache.py @@ -24,7 +24,7 @@ from ._cas import CASRemote, CASCache, CASDProcessManager from ._exceptions import AssetCacheError, RemoteError from ._remotespec import RemoteSpec, RemoteType from ._remote import BaseRemote -from ._protos.build.bazel.remote.asset.v1 import remote_asset_pb2, remote_asset_pb2_grpc +from ._protos.build.bazel.remote.asset.v1 import remote_asset_pb2 from ._protos.build.buildgrid import local_cas_pb2 from ._protos.google.rpc import code_pb2 @@ -46,21 +46,10 @@ class AssetRemote(BaseRemote): local_cas = self.casd.get_local_cas() request = local_cas_pb2.GetInstanceNameForRemotesRequest() self.spec.to_localcas_remote(request.remote_asset) - try: - response = local_cas.GetInstanceNameForRemotes(request) - self.instance_name = response.instance_name - self.fetch_service = self.casd.get_asset_fetch() - self.push_service = self.casd.get_asset_push() - except grpc.RpcError as e: - if e.code() == grpc.StatusCode.UNIMPLEMENTED or e.code() == grpc.StatusCode.INVALID_ARGUMENT: - # buildbox-casd is too old to support asset-only remotes. - # Fall back to direct connection. - self.instance_name = self.spec.instance_name - self.channel = self.spec.open_channel() - self.fetch_service = remote_asset_pb2_grpc.FetchStub(self.channel) - self.push_service = remote_asset_pb2_grpc.PushStub(self.channel) - else: - raise + response = local_cas.GetInstanceNameForRemotes(request) + self.instance_name = response.instance_name + self.fetch_service = self.casd.get_asset_fetch() + self.push_service = self.casd.get_asset_push() # _check(): # diff --git a/src/buildstream/_cas/casdprocessmanager.py b/src/buildstream/_cas/casdprocessmanager.py index fd1692d9f..5af7b2fac 100644 --- a/src/buildstream/_cas/casdprocessmanager.py +++ b/src/buildstream/_cas/casdprocessmanager.py @@ -47,7 +47,7 @@ _CASD_TIMEOUT = 300 # in seconds # _REQUIRED_CASD_MAJOR = 1 _REQUIRED_CASD_MINOR = 2 -_REQUIRED_CASD_MICRO = 0 +_REQUIRED_CASD_MICRO = 6 # CASDProcessManager diff --git a/src/buildstream/_cas/casremote.py b/src/buildstream/_cas/casremote.py index e7d812167..ae4aa9004 100644 --- a/src/buildstream/_cas/casremote.py +++ b/src/buildstream/_cas/casremote.py @@ -12,8 +12,6 @@ # limitations under the License. # -import grpc - from .._protos.google.rpc import code_pb2 from .._protos.build.buildgrid import local_cas_pb2 @@ -60,14 +58,7 @@ class CASRemote(BaseRemote): local_cas = self.cascache.get_local_cas() request = local_cas_pb2.GetInstanceNameForRemotesRequest() self.spec.to_localcas_remote(request.content_addressable_storage) - try: - response = local_cas.GetInstanceNameForRemotes(request) - except grpc.RpcError as e: - if e.code() == grpc.StatusCode.UNIMPLEMENTED: - raise CASRemoteError( - "Unsupported buildbox-casd version: GetInstanceNameForRemotes unimplemented" - ) from e - raise + response = local_cas.GetInstanceNameForRemotes(request) self.local_cas_instance_name = response.instance_name # push_message(): diff --git a/src/buildstream/_remote.py b/src/buildstream/_remote.py index 32584de09..27b6dde9b 100644 --- a/src/buildstream/_remote.py +++ b/src/buildstream/_remote.py @@ -34,7 +34,6 @@ class BaseRemote: def __init__(self, spec): self.spec = spec - self.channel = None self._initialized = False self._lock = threading.Lock() @@ -72,10 +71,6 @@ class BaseRemote: self._initialized = True def close(self): - if self.channel: - self.channel.close() - self.channel = None - self._initialized = False # check(): diff --git a/src/buildstream/_remotespec.py b/src/buildstream/_remotespec.py index 3c9aa2fa3..1a22ee043 100644 --- a/src/buildstream/_remotespec.py +++ b/src/buildstream/_remotespec.py @@ -14,9 +14,6 @@ import os from typing import Optional, Tuple, List, cast -from urllib.parse import urlparse -import grpc -from grpc import ChannelCredentials, Channel from ._exceptions import LoadError, RemoteError from .exceptions import LoadErrorReason @@ -114,9 +111,6 @@ class RemoteSpec: self._client_cert: Optional[bytes] = None self._cred_files_loaded: bool = False - # The grpc credentials object - self._credentials: Optional[ChannelCredentials] = None - # Various connection parameters for grpc connection self._connection_config: Optional[MappingNode] = connection_config @@ -178,18 +172,6 @@ class RemoteSpec: self._load_credential_files() return self._client_cert - # credentials() - # - @property - def credentials(self) -> ChannelCredentials: - if not self._credentials: - self._credentials = grpc.ssl_channel_credentials( - root_certificates=self.server_cert, - private_key=self.client_key, - certificate_chain=self.client_cert, - ) - return self._credentials - # grpc keepalive time # @property @@ -222,25 +204,6 @@ class RemoteSpec: return self._connection_config.get_int("request-timeout", None) return None - # open_channel() - # - # Opens a gRPC channel based on this spec. - # - def open_channel(self) -> Channel: - url = urlparse(self.url) - - if url.scheme == "http": - channel = grpc.insecure_channel("{}:{}".format(url.hostname, url.port or 80)) - elif url.scheme == "https": - channel = grpc.secure_channel("{}:{}".format(url.hostname, url.port or 443), self.credentials) - else: - message = "Only 'http' and 'https' protocols are supported, but '{}' was supplied.".format(url.scheme) - if self._spec_node: - message = "{}: {}".format(self._spec_node.get_provenance(), message) - raise RemoteError(message) - - return channel - # to_localcas_remote() # # Create a `LocalContentAddressableStorage.Remote` proto from the `RemoteSpec` object. diff --git a/src/buildstream/sandbox/_sandboxbuildboxrun.py b/src/buildstream/sandbox/_sandboxbuildboxrun.py index d4b49860a..d79f54b2f 100644 --- a/src/buildstream/sandbox/_sandboxbuildboxrun.py +++ b/src/buildstream/sandbox/_sandboxbuildboxrun.py @@ -47,9 +47,6 @@ class SandboxBuildBoxRun(SandboxREAPI): if exit_code == 0: # buildbox-run --capabilities prints one capability per line cls._capabilities = set(output.split("\n")) - elif "Invalid option --capabilities" in output: - # buildbox-run is too old to support extra capabilities - cls._capabilities = set() else: # buildbox-run is not functional raise SandboxError( diff --git a/src/buildstream/sandbox/_sandboxremote.py b/src/buildstream/sandbox/_sandboxremote.py index 8abaa2b53..bb185b72b 100644 --- a/src/buildstream/sandbox/_sandboxremote.py +++ b/src/buildstream/sandbox/_sandboxremote.py @@ -21,11 +21,11 @@ import grpc from ._sandboxreapi import SandboxREAPI from .. import _signals from .._remote import BaseRemote -from .._protos.build.bazel.remote.execution.v2 import remote_execution_pb2, remote_execution_pb2_grpc +from .._protos.build.bazel.remote.execution.v2 import remote_execution_pb2 from .._protos.build.buildgrid import local_cas_pb2 from .._protos.google.rpc import code_pb2 from .._exceptions import BstError, SandboxError -from .._protos.google.longrunning import operations_pb2, operations_pb2_grpc +from .._protos.google.longrunning import operations_pb2 from .._cas import CASRemote @@ -46,21 +46,10 @@ class ExecutionRemote(BaseRemote): local_cas = self.casd.get_local_cas() request = local_cas_pb2.GetInstanceNameForRemotesRequest() self.spec.to_localcas_remote(request.execution) - try: - response = local_cas.GetInstanceNameForRemotes(request) - self.instance_name = response.instance_name - self.exec_service = self.casd.get_exec_service() - self.operations_service = self.casd.get_operations_service() - except grpc.RpcError as e: - if e.code() == grpc.StatusCode.UNIMPLEMENTED or e.code() == grpc.StatusCode.INVALID_ARGUMENT: - # buildbox-casd is too old to support execution service remotes. - # Fall back to direct connection. - self.instance_name = self.spec.instance_name - self.channel = self.spec.open_channel() - self.exec_service = remote_execution_pb2_grpc.ExecutionStub(self.channel) - self.operations_service = operations_pb2_grpc.OperationsStub(self.channel) - else: - raise + response = local_cas.GetInstanceNameForRemotes(request) + self.instance_name = response.instance_name + self.exec_service = self.casd.get_exec_service() + self.operations_service = self.casd.get_operations_service() class ActionCacheRemote(BaseRemote): @@ -78,19 +67,9 @@ class ActionCacheRemote(BaseRemote): local_cas = self.casd.get_local_cas() request = local_cas_pb2.GetInstanceNameForRemotesRequest() self.spec.to_localcas_remote(request.action_cache) - try: - response = local_cas.GetInstanceNameForRemotes(request) - self.instance_name = response.instance_name - self.ac_service = self.casd.get_ac_service() - except grpc.RpcError as e: - if e.code() == grpc.StatusCode.UNIMPLEMENTED or e.code() == grpc.StatusCode.INVALID_ARGUMENT: - # buildbox-casd is too old to support action cache remotes. - # Fall back to direct connection. - self.instance_name = self.spec.instance_name - self.channel = self.spec.open_channel() - self.ac_service = remote_execution_pb2_grpc.ActionCacheStub(self.channel) - else: - raise + response = local_cas.GetInstanceNameForRemotes(request) + self.instance_name = response.instance_name + self.ac_service = self.casd.get_ac_service() # SandboxRemote()
