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()

Reply via email to