This is an automated email from the ASF dual-hosted git repository.

juergbi pushed a commit to branch jbilleter/action-cache-service
in repository https://gitbox.apache.org/repos/asf/buildstream.git

commit c26c43dbe4a355c662728f87c300d562081d02f0
Author: Jürg Billeter <[email protected]>
AuthorDate: Fri Jun 13 17:25:13 2025 +0200

    Add `action-cache-service` support
---
 src/buildstream/_cas/casdprocessmanager.py     | 26 ++++++++++++++++++++++++++
 src/buildstream/_context.py                    | 23 ++++++++++++++++++++++-
 src/buildstream/_frontend/widget.py            |  2 ++
 src/buildstream/sandbox/_sandboxbuildboxrun.py |  6 ++++--
 4 files changed, 54 insertions(+), 3 deletions(-)

diff --git a/src/buildstream/_cas/casdprocessmanager.py 
b/src/buildstream/_cas/casdprocessmanager.py
index fd1692d9f..50a89124c 100644
--- a/src/buildstream/_cas/casdprocessmanager.py
+++ b/src/buildstream/_cas/casdprocessmanager.py
@@ -61,6 +61,7 @@ _REQUIRED_CASD_MICRO = 0
 #     cache_quota (int): User configured cache quota
 #     reserved (int): User configured reserved disk space
 #     remote_cache_spec (RemoteSpec): Optional remote cache server
+#     remote_action_cache_spec (RemoteSpec): Optional remote action cache 
server
 #     protect_session_blobs (bool): Disable expiry for blobs used in the 
current session
 #     messenger (Messenger): The messenger to report warnings through the UI
 #
@@ -72,6 +73,7 @@ class CASDProcessManager:
         log_level,
         cache_quota,
         remote_cache_spec,
+        remote_action_cache_spec,
         protect_session_blobs,
         messenger,
         *,
@@ -140,6 +142,30 @@ class CASDProcessManager:
             if remote_cache_spec.request_timeout is not None:
                 
casd_args.append("--cas-request-timeout={}".format(remote_cache_spec.request_timeout))
 
+        if remote_action_cache_spec:
+            
casd_args.append("--ac-remote={}".format(remote_action_cache_spec.url))
+            if remote_action_cache_spec.instance_name:
+                
casd_args.append("--ac-instance={}".format(remote_action_cache_spec.instance_name))
+            if remote_action_cache_spec.server_cert_file:
+                
casd_args.append("--ac-server-cert={}".format(remote_action_cache_spec.server_cert_file))
+            if remote_action_cache_spec.client_key_file:
+                
casd_args.append("--ac-client-key={}".format(remote_action_cache_spec.client_key_file))
+                
casd_args.append("--ac-client-cert={}".format(remote_action_cache_spec.client_cert_file))
+            if remote_action_cache_spec.access_token_file:
+                
casd_args.append("--ac-access-token={}".format(remote_action_cache_spec.access_token_file))
+                if remote_action_cache_spec.access_token_reload_interval is 
not None:
+                    casd_args.append(
+                        
"--ac-token-reload-interval={}".format(remote_action_cache_spec.access_token_reload_interval)
+                    )
+            if remote_action_cache_spec.keepalive_time is not None:
+                
casd_args.append("--ac-keepalive-time={}".format(remote_action_cache_spec.keepalive_time))
+            if remote_action_cache_spec.retry_limit is not None:
+                
casd_args.append("--ac-retry-limit={}".format(remote_action_cache_spec.retry_limit))
+            if remote_action_cache_spec.retry_delay is not None:
+                
casd_args.append("--ac-retry-delay={}".format(remote_action_cache_spec.retry_delay))
+            if remote_action_cache_spec.request_timeout is not None:
+                
casd_args.append("--ac-request-timeout={}".format(remote_action_cache_spec.request_timeout))
+
         casd_args.append(path)
 
         self._start_time = time.time()
diff --git a/src/buildstream/_context.py b/src/buildstream/_context.py
index 02942c8b0..85d72b82d 100644
--- a/src/buildstream/_context.py
+++ b/src/buildstream/_context.py
@@ -194,6 +194,9 @@ class Context:
         # Remote cache server
         self.remote_cache_spec: Optional[RemoteSpec] = None
 
+        # Remote action cache server
+        self.remote_action_cache_spec: Optional[RemoteSpec] = None
+
         # Whether or not to attempt to pull build trees globally
         self.pull_buildtrees: Optional[bool] = None
 
@@ -369,7 +372,15 @@ class Context:
         # casdir - the casdir may not have been created yet.
         cache = defaults.get_mapping("cache")
         cache.validate_keys(
-            ["quota", "reserved-disk-space", "low-watermark", 
"storage-service", "pull-buildtrees", "cache-buildtrees"]
+            [
+                "quota",
+                "reserved-disk-space",
+                "low-watermark",
+                "storage-service",
+                "action-cache-service",
+                "pull-buildtrees",
+                "cache-buildtrees",
+            ]
         )
 
         cas_volume = self.casdir
@@ -416,6 +427,15 @@ class Context:
         if remote_cache:
             self.remote_cache_spec = RemoteSpec.new_from_node(remote_cache)
 
+        remote_action_cache = cache.get_mapping("action-cache-service", 
default=None)
+        if remote_action_cache:
+            if not remote_cache:
+                raise LoadError(
+                    "{}: 'action-cache-service' cannot be configured without 
'storage-service'.".format(provenance),
+                    LoadErrorReason.INVALID_DATA,
+                )
+            self.remote_action_cache_spec = 
RemoteSpec.new_from_node(remote_action_cache)
+
         # Load global artifact cache configuration
         cache_config = defaults.get_mapping("artifacts", default={})
         self._global_artifact_cache_config = 
_CacheConfig.new_from_node(cache_config)
@@ -741,6 +761,7 @@ class Context:
                 log_level,
                 self.config_cache_quota,
                 self.remote_cache_spec,
+                self.remote_action_cache_spec,
                 protect_session_blobs=True,
                 messenger=self.messenger,
                 reserved=self.config_cache_reserved,
diff --git a/src/buildstream/_frontend/widget.py 
b/src/buildstream/_frontend/widget.py
index 09b824ff3..b9c90f1e0 100644
--- a/src/buildstream/_frontend/widget.py
+++ b/src/buildstream/_frontend/widget.py
@@ -525,6 +525,8 @@ class LogLine(Widget):
 
         if context.remote_cache_spec:
             values["Cache Storage Service"] = 
format_spec(context.remote_cache_spec)
+        if context.remote_action_cache_spec:
+            values["Action Cache Service"] = 
format_spec(context.remote_action_cache_spec)
 
         text += self._format_values(values)
 
diff --git a/src/buildstream/sandbox/_sandboxbuildboxrun.py 
b/src/buildstream/sandbox/_sandboxbuildboxrun.py
index d4b49860a..2f2735c0c 100644
--- a/src/buildstream/sandbox/_sandboxbuildboxrun.py
+++ b/src/buildstream/sandbox/_sandboxbuildboxrun.py
@@ -94,8 +94,10 @@ class SandboxBuildBoxRun(SandboxREAPI):
         casd = cascache.get_casd()
         config = self._get_config()
 
-        if config.remote_apis_socket_path and context.remote_cache_spec:
-            raise SandboxError("'remote-apis-socket' is not currently 
supported with 'storage-service'.")
+        if config.remote_apis_socket_path and context.remote_cache_spec and 
not context.remote_action_cache_spec:
+            raise SandboxError(
+                "'remote-apis-socket' is not supported with 'storage-service' 
without 'action-cache-service'."
+            )
 
         with utils._tempnamedfile() as action_file, utils._tempnamedfile() as 
result_file:
             action_file.write(action.SerializeToString())

Reply via email to