diff options
Diffstat (limited to 'src/buildstream/_cas/casremote.py')
-rw-r--r-- | src/buildstream/_cas/casremote.py | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/src/buildstream/_cas/casremote.py b/src/buildstream/_cas/casremote.py index 1c7e3152d..e1848cd20 100644 --- a/src/buildstream/_cas/casremote.py +++ b/src/buildstream/_cas/casremote.py @@ -11,6 +11,7 @@ import grpc from .._protos.google.rpc import code_pb2 from .._protos.google.bytestream import bytestream_pb2, bytestream_pb2_grpc from .._protos.build.bazel.remote.execution.v2 import remote_execution_pb2, remote_execution_pb2_grpc +from .._protos.build.buildgrid import local_cas_pb2 from .._protos.buildstream.v2 import buildstream_pb2, buildstream_pb2_grpc from .._exceptions import CASRemoteError, LoadError, LoadErrorReason @@ -77,9 +78,10 @@ class BlobNotFound(CASRemoteError): # Represents a single remote CAS cache. # class CASRemote(): - def __init__(self, spec): + def __init__(self, spec, cascache): self.spec = spec self._initialized = False + self.cascache = cascache self.channel = None self.instance_name = None self.bytestream = None @@ -89,12 +91,17 @@ class CASRemote(): self.batch_read_supported = None self.capabilities = None self.max_batch_total_size_bytes = None + self.local_cas_instance_name = None def init(self): if not self._initialized: # gRPC doesn't support fork without exec, which is used in the main process. assert not utils._is_main_process() + server_cert_bytes = None + client_key_bytes = None + client_cert_bytes = None + url = urlparse(self.spec.url) if url.scheme == 'http': port = url.port or 80 @@ -105,20 +112,14 @@ class CASRemote(): if self.spec.server_cert: with open(self.spec.server_cert, 'rb') as f: server_cert_bytes = f.read() - else: - server_cert_bytes = None if self.spec.client_key: with open(self.spec.client_key, 'rb') as f: client_key_bytes = f.read() - else: - client_key_bytes = None if self.spec.client_cert: with open(self.spec.client_cert, 'rb') as f: client_cert_bytes = f.read() - else: - client_cert_bytes = None credentials = grpc.ssl_channel_credentials(root_certificates=server_cert_bytes, private_key=client_key_bytes, @@ -173,6 +174,20 @@ class CASRemote(): e.code() != grpc.StatusCode.PERMISSION_DENIED): raise + local_cas = self.cascache._get_local_cas() + request = local_cas_pb2.GetInstanceNameForRemoteRequest() + request.url = self.spec.url + if self.spec.instance_name: + request.instance_name = self.spec.instance_name + if server_cert_bytes: + request.server_cert = server_cert_bytes + if client_key_bytes: + request.client_key = client_key_bytes + if client_cert_bytes: + request.client_cert = client_cert_bytes + response = local_cas.GetInstanceNameForRemote(request) + self.local_cas_instance_name = response.instance_name + self._initialized = True # check_remote @@ -182,11 +197,11 @@ class CASRemote(): # in the main BuildStream process # See https://github.com/grpc/grpc/blob/master/doc/fork_support.md for details @classmethod - def check_remote(cls, remote_spec, q): + def check_remote(cls, remote_spec, cascache, q): def __check_remote(): try: - remote = cls(remote_spec) + remote = cls(remote_spec, cascache) remote.init() request = buildstream_pb2.StatusRequest() |