Rebuild pb2 with protobuf 3.20.1

This bumps protobuf requirement to 3.19
diff --git a/buildstream/_protos/build/bazel/remote/asset/v1/remote_asset_pb2.py b/buildstream/_protos/build/bazel/remote/asset/v1/remote_asset_pb2.py
index c40df64..145f001 100644
--- a/buildstream/_protos/build/bazel/remote/asset/v1/remote_asset_pb2.py
+++ b/buildstream/_protos/build/bazel/remote/asset/v1/remote_asset_pb2.py
@@ -1,8 +1,9 @@
 # -*- coding: utf-8 -*-
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: build/bazel/remote/asset/v1/remote_asset.proto
-
+"""Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
@@ -18,520 +19,19 @@
 from buildstream._protos.google.rpc import status_pb2 as google_dot_rpc_dot_status__pb2
 
 
-DESCRIPTOR = _descriptor.FileDescriptor(
-  name='build/bazel/remote/asset/v1/remote_asset.proto',
-  package='build.bazel.remote.asset.v1',
-  syntax='proto3',
-  serialized_options=b'\n\033build.bazel.remote.asset.v1B\020RemoteAssetProtoP\001Z\013remoteasset\242\002\002RA\252\002\033Build.Bazel.Remote.Asset.v1',
-  serialized_pb=b'\n.build/bazel/remote/asset/v1/remote_asset.proto\x12\x1b\x62uild.bazel.remote.asset.v1\x1a\x36\x62uild/bazel/remote/execution/v2/remote_execution.proto\x1a\x1cgoogle/api/annotations.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x17google/rpc/status.proto\"(\n\tQualifier\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"\xdc\x01\n\x10\x46\x65tchBlobRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12*\n\x07timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12;\n\x17oldest_content_accepted\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0c\n\x04uris\x18\x04 \x03(\t\x12:\n\nqualifiers\x18\x05 \x03(\x0b\x32&.build.bazel.remote.asset.v1.Qualifier\"\xee\x01\n\x11\x46\x65tchBlobResponse\x12\"\n\x06status\x18\x01 \x01(\x0b\x32\x12.google.rpc.Status\x12\x0b\n\x03uri\x18\x02 \x01(\t\x12:\n\nqualifiers\x18\x03 \x03(\x0b\x32&.build.bazel.remote.asset.v1.Qualifier\x12.\n\nexpires_at\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12<\n\x0b\x62lob_digest\x18\x05 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"\xe1\x01\n\x15\x46\x65tchDirectoryRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12*\n\x07timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12;\n\x17oldest_content_accepted\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0c\n\x04uris\x18\x04 \x03(\t\x12:\n\nqualifiers\x18\x05 \x03(\x0b\x32&.build.bazel.remote.asset.v1.Qualifier\"\xfd\x01\n\x16\x46\x65tchDirectoryResponse\x12\"\n\x06status\x18\x01 \x01(\x0b\x32\x12.google.rpc.Status\x12\x0b\n\x03uri\x18\x02 \x01(\t\x12:\n\nqualifiers\x18\x03 \x03(\x0b\x32&.build.bazel.remote.asset.v1.Qualifier\x12.\n\nexpires_at\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x46\n\x15root_directory_digest\x18\x05 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"\xeb\x02\n\x0fPushBlobRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12\x0c\n\x04uris\x18\x02 \x03(\t\x12:\n\nqualifiers\x18\x03 \x03(\x0b\x32&.build.bazel.remote.asset.v1.Qualifier\x12-\n\texpire_at\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12<\n\x0b\x62lob_digest\x18\x05 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x41\n\x10references_blobs\x18\x06 \x03(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12G\n\x16references_directories\x18\x07 \x03(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"\x12\n\x10PushBlobResponse\"\xfa\x02\n\x14PushDirectoryRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12\x0c\n\x04uris\x18\x02 \x03(\t\x12:\n\nqualifiers\x18\x03 \x03(\x0b\x32&.build.bazel.remote.asset.v1.Qualifier\x12-\n\texpire_at\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x46\n\x15root_directory_digest\x18\x05 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x41\n\x10references_blobs\x18\x06 \x03(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12G\n\x16references_directories\x18\x07 \x03(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"\x17\n\x15PushDirectoryResponse2\xdd\x02\n\x05\x46\x65tch\x12\x9e\x01\n\tFetchBlob\x12-.build.bazel.remote.asset.v1.FetchBlobRequest\x1a..build.bazel.remote.asset.v1.FetchBlobResponse\"2\x82\xd3\xe4\x93\x02,\"\'/v1/{instance_name=**}/assets:fetchBlob:\x01*\x12\xb2\x01\n\x0e\x46\x65tchDirectory\x12\x32.build.bazel.remote.asset.v1.FetchDirectoryRequest\x1a\x33.build.bazel.remote.asset.v1.FetchDirectoryResponse\"7\x82\xd3\xe4\x93\x02\x31\",/v1/{instance_name=**}/assets:fetchDirectory:\x01*2\xd4\x02\n\x04Push\x12\x9a\x01\n\x08PushBlob\x12,.build.bazel.remote.asset.v1.PushBlobRequest\x1a-.build.bazel.remote.asset.v1.PushBlobResponse\"1\x82\xd3\xe4\x93\x02+\"&/v1/{instance_name=**}/assets:pushBlob:\x01*\x12\xae\x01\n\rPushDirectory\x12\x31.build.bazel.remote.asset.v1.PushDirectoryRequest\x1a\x32.build.bazel.remote.asset.v1.PushDirectoryResponse\"6\x82\xd3\xe4\x93\x02\x30\"+/v1/{instance_name=**}/assets:pushDirectory:\x01*Ba\n\x1b\x62uild.bazel.remote.asset.v1B\x10RemoteAssetProtoP\x01Z\x0bremoteasset\xa2\x02\x02RA\xaa\x02\x1b\x42uild.Bazel.Remote.Asset.v1b\x06proto3'
-  ,
-  dependencies=[build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.DESCRIPTOR,google_dot_api_dot_annotations__pb2.DESCRIPTOR,google_dot_protobuf_dot_duration__pb2.DESCRIPTOR,google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,google_dot_rpc_dot_status__pb2.DESCRIPTOR,])
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n.build/bazel/remote/asset/v1/remote_asset.proto\x12\x1b\x62uild.bazel.remote.asset.v1\x1a\x36\x62uild/bazel/remote/execution/v2/remote_execution.proto\x1a\x1cgoogle/api/annotations.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x17google/rpc/status.proto\"(\n\tQualifier\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"\xdc\x01\n\x10\x46\x65tchBlobRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12*\n\x07timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12;\n\x17oldest_content_accepted\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0c\n\x04uris\x18\x04 \x03(\t\x12:\n\nqualifiers\x18\x05 \x03(\x0b\x32&.build.bazel.remote.asset.v1.Qualifier\"\xee\x01\n\x11\x46\x65tchBlobResponse\x12\"\n\x06status\x18\x01 \x01(\x0b\x32\x12.google.rpc.Status\x12\x0b\n\x03uri\x18\x02 \x01(\t\x12:\n\nqualifiers\x18\x03 \x03(\x0b\x32&.build.bazel.remote.asset.v1.Qualifier\x12.\n\nexpires_at\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12<\n\x0b\x62lob_digest\x18\x05 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"\xe1\x01\n\x15\x46\x65tchDirectoryRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12*\n\x07timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12;\n\x17oldest_content_accepted\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0c\n\x04uris\x18\x04 \x03(\t\x12:\n\nqualifiers\x18\x05 \x03(\x0b\x32&.build.bazel.remote.asset.v1.Qualifier\"\xfd\x01\n\x16\x46\x65tchDirectoryResponse\x12\"\n\x06status\x18\x01 \x01(\x0b\x32\x12.google.rpc.Status\x12\x0b\n\x03uri\x18\x02 \x01(\t\x12:\n\nqualifiers\x18\x03 \x03(\x0b\x32&.build.bazel.remote.asset.v1.Qualifier\x12.\n\nexpires_at\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x46\n\x15root_directory_digest\x18\x05 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"\xeb\x02\n\x0fPushBlobRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12\x0c\n\x04uris\x18\x02 \x03(\t\x12:\n\nqualifiers\x18\x03 \x03(\x0b\x32&.build.bazel.remote.asset.v1.Qualifier\x12-\n\texpire_at\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12<\n\x0b\x62lob_digest\x18\x05 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x41\n\x10references_blobs\x18\x06 \x03(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12G\n\x16references_directories\x18\x07 \x03(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"\x12\n\x10PushBlobResponse\"\xfa\x02\n\x14PushDirectoryRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12\x0c\n\x04uris\x18\x02 \x03(\t\x12:\n\nqualifiers\x18\x03 \x03(\x0b\x32&.build.bazel.remote.asset.v1.Qualifier\x12-\n\texpire_at\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x46\n\x15root_directory_digest\x18\x05 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x41\n\x10references_blobs\x18\x06 \x03(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12G\n\x16references_directories\x18\x07 \x03(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"\x17\n\x15PushDirectoryResponse2\xdd\x02\n\x05\x46\x65tch\x12\x9e\x01\n\tFetchBlob\x12-.build.bazel.remote.asset.v1.FetchBlobRequest\x1a..build.bazel.remote.asset.v1.FetchBlobResponse\"2\x82\xd3\xe4\x93\x02,\"\'/v1/{instance_name=**}/assets:fetchBlob:\x01*\x12\xb2\x01\n\x0e\x46\x65tchDirectory\x12\x32.build.bazel.remote.asset.v1.FetchDirectoryRequest\x1a\x33.build.bazel.remote.asset.v1.FetchDirectoryResponse\"7\x82\xd3\xe4\x93\x02\x31\",/v1/{instance_name=**}/assets:fetchDirectory:\x01*2\xd4\x02\n\x04Push\x12\x9a\x01\n\x08PushBlob\x12,.build.bazel.remote.asset.v1.PushBlobRequest\x1a-.build.bazel.remote.asset.v1.PushBlobResponse\"1\x82\xd3\xe4\x93\x02+\"&/v1/{instance_name=**}/assets:pushBlob:\x01*\x12\xae\x01\n\rPushDirectory\x12\x31.build.bazel.remote.asset.v1.PushDirectoryRequest\x1a\x32.build.bazel.remote.asset.v1.PushDirectoryResponse\"6\x82\xd3\xe4\x93\x02\x30\"+/v1/{instance_name=**}/assets:pushDirectory:\x01*Ba\n\x1b\x62uild.bazel.remote.asset.v1B\x10RemoteAssetProtoP\x01Z\x0bremoteasset\xa2\x02\x02RA\xaa\x02\x1b\x42uild.Bazel.Remote.Asset.v1b\x06proto3')
 
 
 
-
-_QUALIFIER = _descriptor.Descriptor(
-  name='Qualifier',
-  full_name='build.bazel.remote.asset.v1.Qualifier',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='name', full_name='build.bazel.remote.asset.v1.Qualifier.name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='value', full_name='build.bazel.remote.asset.v1.Qualifier.value', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=255,
-  serialized_end=295,
-)
-
-
-_FETCHBLOBREQUEST = _descriptor.Descriptor(
-  name='FetchBlobRequest',
-  full_name='build.bazel.remote.asset.v1.FetchBlobRequest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='instance_name', full_name='build.bazel.remote.asset.v1.FetchBlobRequest.instance_name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='timeout', full_name='build.bazel.remote.asset.v1.FetchBlobRequest.timeout', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='oldest_content_accepted', full_name='build.bazel.remote.asset.v1.FetchBlobRequest.oldest_content_accepted', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='uris', full_name='build.bazel.remote.asset.v1.FetchBlobRequest.uris', index=3,
-      number=4, type=9, cpp_type=9, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='qualifiers', full_name='build.bazel.remote.asset.v1.FetchBlobRequest.qualifiers', index=4,
-      number=5, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=298,
-  serialized_end=518,
-)
-
-
-_FETCHBLOBRESPONSE = _descriptor.Descriptor(
-  name='FetchBlobResponse',
-  full_name='build.bazel.remote.asset.v1.FetchBlobResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='status', full_name='build.bazel.remote.asset.v1.FetchBlobResponse.status', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='uri', full_name='build.bazel.remote.asset.v1.FetchBlobResponse.uri', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='qualifiers', full_name='build.bazel.remote.asset.v1.FetchBlobResponse.qualifiers', index=2,
-      number=3, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='expires_at', full_name='build.bazel.remote.asset.v1.FetchBlobResponse.expires_at', index=3,
-      number=4, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='blob_digest', full_name='build.bazel.remote.asset.v1.FetchBlobResponse.blob_digest', index=4,
-      number=5, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=521,
-  serialized_end=759,
-)
-
-
-_FETCHDIRECTORYREQUEST = _descriptor.Descriptor(
-  name='FetchDirectoryRequest',
-  full_name='build.bazel.remote.asset.v1.FetchDirectoryRequest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='instance_name', full_name='build.bazel.remote.asset.v1.FetchDirectoryRequest.instance_name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='timeout', full_name='build.bazel.remote.asset.v1.FetchDirectoryRequest.timeout', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='oldest_content_accepted', full_name='build.bazel.remote.asset.v1.FetchDirectoryRequest.oldest_content_accepted', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='uris', full_name='build.bazel.remote.asset.v1.FetchDirectoryRequest.uris', index=3,
-      number=4, type=9, cpp_type=9, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='qualifiers', full_name='build.bazel.remote.asset.v1.FetchDirectoryRequest.qualifiers', index=4,
-      number=5, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=762,
-  serialized_end=987,
-)
-
-
-_FETCHDIRECTORYRESPONSE = _descriptor.Descriptor(
-  name='FetchDirectoryResponse',
-  full_name='build.bazel.remote.asset.v1.FetchDirectoryResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='status', full_name='build.bazel.remote.asset.v1.FetchDirectoryResponse.status', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='uri', full_name='build.bazel.remote.asset.v1.FetchDirectoryResponse.uri', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='qualifiers', full_name='build.bazel.remote.asset.v1.FetchDirectoryResponse.qualifiers', index=2,
-      number=3, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='expires_at', full_name='build.bazel.remote.asset.v1.FetchDirectoryResponse.expires_at', index=3,
-      number=4, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='root_directory_digest', full_name='build.bazel.remote.asset.v1.FetchDirectoryResponse.root_directory_digest', index=4,
-      number=5, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=990,
-  serialized_end=1243,
-)
-
-
-_PUSHBLOBREQUEST = _descriptor.Descriptor(
-  name='PushBlobRequest',
-  full_name='build.bazel.remote.asset.v1.PushBlobRequest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='instance_name', full_name='build.bazel.remote.asset.v1.PushBlobRequest.instance_name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='uris', full_name='build.bazel.remote.asset.v1.PushBlobRequest.uris', index=1,
-      number=2, type=9, cpp_type=9, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='qualifiers', full_name='build.bazel.remote.asset.v1.PushBlobRequest.qualifiers', index=2,
-      number=3, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='expire_at', full_name='build.bazel.remote.asset.v1.PushBlobRequest.expire_at', index=3,
-      number=4, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='blob_digest', full_name='build.bazel.remote.asset.v1.PushBlobRequest.blob_digest', index=4,
-      number=5, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='references_blobs', full_name='build.bazel.remote.asset.v1.PushBlobRequest.references_blobs', index=5,
-      number=6, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='references_directories', full_name='build.bazel.remote.asset.v1.PushBlobRequest.references_directories', index=6,
-      number=7, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1246,
-  serialized_end=1609,
-)
-
-
-_PUSHBLOBRESPONSE = _descriptor.Descriptor(
-  name='PushBlobResponse',
-  full_name='build.bazel.remote.asset.v1.PushBlobResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1611,
-  serialized_end=1629,
-)
-
-
-_PUSHDIRECTORYREQUEST = _descriptor.Descriptor(
-  name='PushDirectoryRequest',
-  full_name='build.bazel.remote.asset.v1.PushDirectoryRequest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='instance_name', full_name='build.bazel.remote.asset.v1.PushDirectoryRequest.instance_name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='uris', full_name='build.bazel.remote.asset.v1.PushDirectoryRequest.uris', index=1,
-      number=2, type=9, cpp_type=9, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='qualifiers', full_name='build.bazel.remote.asset.v1.PushDirectoryRequest.qualifiers', index=2,
-      number=3, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='expire_at', full_name='build.bazel.remote.asset.v1.PushDirectoryRequest.expire_at', index=3,
-      number=4, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='root_directory_digest', full_name='build.bazel.remote.asset.v1.PushDirectoryRequest.root_directory_digest', index=4,
-      number=5, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='references_blobs', full_name='build.bazel.remote.asset.v1.PushDirectoryRequest.references_blobs', index=5,
-      number=6, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='references_directories', full_name='build.bazel.remote.asset.v1.PushDirectoryRequest.references_directories', index=6,
-      number=7, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1632,
-  serialized_end=2010,
-)
-
-
-_PUSHDIRECTORYRESPONSE = _descriptor.Descriptor(
-  name='PushDirectoryResponse',
-  full_name='build.bazel.remote.asset.v1.PushDirectoryResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=2012,
-  serialized_end=2035,
-)
-
-_FETCHBLOBREQUEST.fields_by_name['timeout'].message_type = google_dot_protobuf_dot_duration__pb2._DURATION
-_FETCHBLOBREQUEST.fields_by_name['oldest_content_accepted'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
-_FETCHBLOBREQUEST.fields_by_name['qualifiers'].message_type = _QUALIFIER
-_FETCHBLOBRESPONSE.fields_by_name['status'].message_type = google_dot_rpc_dot_status__pb2._STATUS
-_FETCHBLOBRESPONSE.fields_by_name['qualifiers'].message_type = _QUALIFIER
-_FETCHBLOBRESPONSE.fields_by_name['expires_at'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
-_FETCHBLOBRESPONSE.fields_by_name['blob_digest'].message_type = build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2._DIGEST
-_FETCHDIRECTORYREQUEST.fields_by_name['timeout'].message_type = google_dot_protobuf_dot_duration__pb2._DURATION
-_FETCHDIRECTORYREQUEST.fields_by_name['oldest_content_accepted'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
-_FETCHDIRECTORYREQUEST.fields_by_name['qualifiers'].message_type = _QUALIFIER
-_FETCHDIRECTORYRESPONSE.fields_by_name['status'].message_type = google_dot_rpc_dot_status__pb2._STATUS
-_FETCHDIRECTORYRESPONSE.fields_by_name['qualifiers'].message_type = _QUALIFIER
-_FETCHDIRECTORYRESPONSE.fields_by_name['expires_at'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
-_FETCHDIRECTORYRESPONSE.fields_by_name['root_directory_digest'].message_type = build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2._DIGEST
-_PUSHBLOBREQUEST.fields_by_name['qualifiers'].message_type = _QUALIFIER
-_PUSHBLOBREQUEST.fields_by_name['expire_at'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
-_PUSHBLOBREQUEST.fields_by_name['blob_digest'].message_type = build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2._DIGEST
-_PUSHBLOBREQUEST.fields_by_name['references_blobs'].message_type = build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2._DIGEST
-_PUSHBLOBREQUEST.fields_by_name['references_directories'].message_type = build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2._DIGEST
-_PUSHDIRECTORYREQUEST.fields_by_name['qualifiers'].message_type = _QUALIFIER
-_PUSHDIRECTORYREQUEST.fields_by_name['expire_at'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
-_PUSHDIRECTORYREQUEST.fields_by_name['root_directory_digest'].message_type = build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2._DIGEST
-_PUSHDIRECTORYREQUEST.fields_by_name['references_blobs'].message_type = build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2._DIGEST
-_PUSHDIRECTORYREQUEST.fields_by_name['references_directories'].message_type = build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2._DIGEST
-DESCRIPTOR.message_types_by_name['Qualifier'] = _QUALIFIER
-DESCRIPTOR.message_types_by_name['FetchBlobRequest'] = _FETCHBLOBREQUEST
-DESCRIPTOR.message_types_by_name['FetchBlobResponse'] = _FETCHBLOBRESPONSE
-DESCRIPTOR.message_types_by_name['FetchDirectoryRequest'] = _FETCHDIRECTORYREQUEST
-DESCRIPTOR.message_types_by_name['FetchDirectoryResponse'] = _FETCHDIRECTORYRESPONSE
-DESCRIPTOR.message_types_by_name['PushBlobRequest'] = _PUSHBLOBREQUEST
-DESCRIPTOR.message_types_by_name['PushBlobResponse'] = _PUSHBLOBRESPONSE
-DESCRIPTOR.message_types_by_name['PushDirectoryRequest'] = _PUSHDIRECTORYREQUEST
-DESCRIPTOR.message_types_by_name['PushDirectoryResponse'] = _PUSHDIRECTORYRESPONSE
-_sym_db.RegisterFileDescriptor(DESCRIPTOR)
-
+_QUALIFIER = DESCRIPTOR.message_types_by_name['Qualifier']
+_FETCHBLOBREQUEST = DESCRIPTOR.message_types_by_name['FetchBlobRequest']
+_FETCHBLOBRESPONSE = DESCRIPTOR.message_types_by_name['FetchBlobResponse']
+_FETCHDIRECTORYREQUEST = DESCRIPTOR.message_types_by_name['FetchDirectoryRequest']
+_FETCHDIRECTORYRESPONSE = DESCRIPTOR.message_types_by_name['FetchDirectoryResponse']
+_PUSHBLOBREQUEST = DESCRIPTOR.message_types_by_name['PushBlobRequest']
+_PUSHBLOBRESPONSE = DESCRIPTOR.message_types_by_name['PushBlobResponse']
+_PUSHDIRECTORYREQUEST = DESCRIPTOR.message_types_by_name['PushDirectoryRequest']
+_PUSHDIRECTORYRESPONSE = DESCRIPTOR.message_types_by_name['PushDirectoryResponse']
 Qualifier = _reflection.GeneratedProtocolMessageType('Qualifier', (_message.Message,), {
   'DESCRIPTOR' : _QUALIFIER,
   '__module__' : 'build.bazel.remote.asset.v1.remote_asset_pb2'
@@ -595,72 +95,40 @@
   })
 _sym_db.RegisterMessage(PushDirectoryResponse)
 
+_FETCH = DESCRIPTOR.services_by_name['Fetch']
+_PUSH = DESCRIPTOR.services_by_name['Push']
+if _descriptor._USE_C_DESCRIPTORS == False:
 
-DESCRIPTOR._options = None
-
-_FETCH = _descriptor.ServiceDescriptor(
-  name='Fetch',
-  full_name='build.bazel.remote.asset.v1.Fetch',
-  file=DESCRIPTOR,
-  index=0,
-  serialized_options=None,
-  serialized_start=2038,
-  serialized_end=2387,
-  methods=[
-  _descriptor.MethodDescriptor(
-    name='FetchBlob',
-    full_name='build.bazel.remote.asset.v1.Fetch.FetchBlob',
-    index=0,
-    containing_service=None,
-    input_type=_FETCHBLOBREQUEST,
-    output_type=_FETCHBLOBRESPONSE,
-    serialized_options=b'\202\323\344\223\002,\"\'/v1/{instance_name=**}/assets:fetchBlob:\001*',
-  ),
-  _descriptor.MethodDescriptor(
-    name='FetchDirectory',
-    full_name='build.bazel.remote.asset.v1.Fetch.FetchDirectory',
-    index=1,
-    containing_service=None,
-    input_type=_FETCHDIRECTORYREQUEST,
-    output_type=_FETCHDIRECTORYRESPONSE,
-    serialized_options=b'\202\323\344\223\0021\",/v1/{instance_name=**}/assets:fetchDirectory:\001*',
-  ),
-])
-_sym_db.RegisterServiceDescriptor(_FETCH)
-
-DESCRIPTOR.services_by_name['Fetch'] = _FETCH
-
-
-_PUSH = _descriptor.ServiceDescriptor(
-  name='Push',
-  full_name='build.bazel.remote.asset.v1.Push',
-  file=DESCRIPTOR,
-  index=1,
-  serialized_options=None,
-  serialized_start=2390,
-  serialized_end=2730,
-  methods=[
-  _descriptor.MethodDescriptor(
-    name='PushBlob',
-    full_name='build.bazel.remote.asset.v1.Push.PushBlob',
-    index=0,
-    containing_service=None,
-    input_type=_PUSHBLOBREQUEST,
-    output_type=_PUSHBLOBRESPONSE,
-    serialized_options=b'\202\323\344\223\002+\"&/v1/{instance_name=**}/assets:pushBlob:\001*',
-  ),
-  _descriptor.MethodDescriptor(
-    name='PushDirectory',
-    full_name='build.bazel.remote.asset.v1.Push.PushDirectory',
-    index=1,
-    containing_service=None,
-    input_type=_PUSHDIRECTORYREQUEST,
-    output_type=_PUSHDIRECTORYRESPONSE,
-    serialized_options=b'\202\323\344\223\0020\"+/v1/{instance_name=**}/assets:pushDirectory:\001*',
-  ),
-])
-_sym_db.RegisterServiceDescriptor(_PUSH)
-
-DESCRIPTOR.services_by_name['Push'] = _PUSH
-
+  DESCRIPTOR._options = None
+  DESCRIPTOR._serialized_options = b'\n\033build.bazel.remote.asset.v1B\020RemoteAssetProtoP\001Z\013remoteasset\242\002\002RA\252\002\033Build.Bazel.Remote.Asset.v1'
+  _FETCH.methods_by_name['FetchBlob']._options = None
+  _FETCH.methods_by_name['FetchBlob']._serialized_options = b'\202\323\344\223\002,\"\'/v1/{instance_name=**}/assets:fetchBlob:\001*'
+  _FETCH.methods_by_name['FetchDirectory']._options = None
+  _FETCH.methods_by_name['FetchDirectory']._serialized_options = b'\202\323\344\223\0021\",/v1/{instance_name=**}/assets:fetchDirectory:\001*'
+  _PUSH.methods_by_name['PushBlob']._options = None
+  _PUSH.methods_by_name['PushBlob']._serialized_options = b'\202\323\344\223\002+\"&/v1/{instance_name=**}/assets:pushBlob:\001*'
+  _PUSH.methods_by_name['PushDirectory']._options = None
+  _PUSH.methods_by_name['PushDirectory']._serialized_options = b'\202\323\344\223\0020\"+/v1/{instance_name=**}/assets:pushDirectory:\001*'
+  _QUALIFIER._serialized_start=255
+  _QUALIFIER._serialized_end=295
+  _FETCHBLOBREQUEST._serialized_start=298
+  _FETCHBLOBREQUEST._serialized_end=518
+  _FETCHBLOBRESPONSE._serialized_start=521
+  _FETCHBLOBRESPONSE._serialized_end=759
+  _FETCHDIRECTORYREQUEST._serialized_start=762
+  _FETCHDIRECTORYREQUEST._serialized_end=987
+  _FETCHDIRECTORYRESPONSE._serialized_start=990
+  _FETCHDIRECTORYRESPONSE._serialized_end=1243
+  _PUSHBLOBREQUEST._serialized_start=1246
+  _PUSHBLOBREQUEST._serialized_end=1609
+  _PUSHBLOBRESPONSE._serialized_start=1611
+  _PUSHBLOBRESPONSE._serialized_end=1629
+  _PUSHDIRECTORYREQUEST._serialized_start=1632
+  _PUSHDIRECTORYREQUEST._serialized_end=2010
+  _PUSHDIRECTORYRESPONSE._serialized_start=2012
+  _PUSHDIRECTORYRESPONSE._serialized_end=2035
+  _FETCH._serialized_start=2038
+  _FETCH._serialized_end=2387
+  _PUSH._serialized_start=2390
+  _PUSH._serialized_end=2730
 # @@protoc_insertion_point(module_scope)
diff --git a/buildstream/_protos/build/bazel/remote/asset/v1/remote_asset_pb2_grpc.py b/buildstream/_protos/build/bazel/remote/asset/v1/remote_asset_pb2_grpc.py
index 38d31a2..203e3d9 100644
--- a/buildstream/_protos/build/bazel/remote/asset/v1/remote_asset_pb2_grpc.py
+++ b/buildstream/_protos/build/bazel/remote/asset/v1/remote_asset_pb2_grpc.py
@@ -1,4 +1,5 @@
 # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
 import grpc
 
 from buildstream._protos.build.bazel.remote.asset.v1 import remote_asset_pb2 as build_dot_bazel_dot_remote_dot_asset_dot_v1_dot_remote__asset__pb2
@@ -108,7 +109,7 @@
         raise NotImplementedError('Method not implemented!')
 
     def FetchDirectory(self, request, context):
-        """Missing associated documentation comment in .proto file"""
+        """Missing associated documentation comment in .proto file."""
         context.set_code(grpc.StatusCode.UNIMPLEMENTED)
         context.set_details('Method not implemented!')
         raise NotImplementedError('Method not implemented!')
@@ -150,6 +151,7 @@
             options=(),
             channel_credentials=None,
             call_credentials=None,
+            insecure=False,
             compression=None,
             wait_for_ready=None,
             timeout=None,
@@ -158,7 +160,7 @@
             build_dot_bazel_dot_remote_dot_asset_dot_v1_dot_remote__asset__pb2.FetchBlobRequest.SerializeToString,
             build_dot_bazel_dot_remote_dot_asset_dot_v1_dot_remote__asset__pb2.FetchBlobResponse.FromString,
             options, channel_credentials,
-            call_credentials, compression, wait_for_ready, timeout, metadata)
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
     @staticmethod
     def FetchDirectory(request,
@@ -166,6 +168,7 @@
             options=(),
             channel_credentials=None,
             call_credentials=None,
+            insecure=False,
             compression=None,
             wait_for_ready=None,
             timeout=None,
@@ -174,7 +177,7 @@
             build_dot_bazel_dot_remote_dot_asset_dot_v1_dot_remote__asset__pb2.FetchDirectoryRequest.SerializeToString,
             build_dot_bazel_dot_remote_dot_asset_dot_v1_dot_remote__asset__pb2.FetchDirectoryResponse.FromString,
             options, channel_credentials,
-            call_credentials, compression, wait_for_ready, timeout, metadata)
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
 
 class PushStub(object):
@@ -256,7 +259,7 @@
         raise NotImplementedError('Method not implemented!')
 
     def PushDirectory(self, request, context):
-        """Missing associated documentation comment in .proto file"""
+        """Missing associated documentation comment in .proto file."""
         context.set_code(grpc.StatusCode.UNIMPLEMENTED)
         context.set_details('Method not implemented!')
         raise NotImplementedError('Method not implemented!')
@@ -297,6 +300,7 @@
             options=(),
             channel_credentials=None,
             call_credentials=None,
+            insecure=False,
             compression=None,
             wait_for_ready=None,
             timeout=None,
@@ -305,7 +309,7 @@
             build_dot_bazel_dot_remote_dot_asset_dot_v1_dot_remote__asset__pb2.PushBlobRequest.SerializeToString,
             build_dot_bazel_dot_remote_dot_asset_dot_v1_dot_remote__asset__pb2.PushBlobResponse.FromString,
             options, channel_credentials,
-            call_credentials, compression, wait_for_ready, timeout, metadata)
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
     @staticmethod
     def PushDirectory(request,
@@ -313,6 +317,7 @@
             options=(),
             channel_credentials=None,
             call_credentials=None,
+            insecure=False,
             compression=None,
             wait_for_ready=None,
             timeout=None,
@@ -321,4 +326,4 @@
             build_dot_bazel_dot_remote_dot_asset_dot_v1_dot_remote__asset__pb2.PushDirectoryRequest.SerializeToString,
             build_dot_bazel_dot_remote_dot_asset_dot_v1_dot_remote__asset__pb2.PushDirectoryResponse.FromString,
             options, channel_credentials,
-            call_credentials, compression, wait_for_ready, timeout, metadata)
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/buildstream/_protos/build/bazel/remote/execution/v2/remote_execution_pb2.py b/buildstream/_protos/build/bazel/remote/execution/v2/remote_execution_pb2.py
index 46d59b1..ce56fcc 100644
--- a/buildstream/_protos/build/bazel/remote/execution/v2/remote_execution_pb2.py
+++ b/buildstream/_protos/build/bazel/remote/execution/v2/remote_execution_pb2.py
@@ -1,14 +1,13 @@
+# -*- coding: utf-8 -*-
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: build/bazel/remote/execution/v2/remote_execution.proto
-
-import sys
-_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+"""Generated protocol buffer code."""
 from google.protobuf.internal import enum_type_wrapper
 from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
-from google.protobuf import descriptor_pb2
 # @@protoc_insertion_point(imports)
 
 _sym_db = _symbol_database.Default()
@@ -22,44 +21,9 @@
 from buildstream._protos.google.rpc import status_pb2 as google_dot_rpc_dot_status__pb2
 
 
-DESCRIPTOR = _descriptor.FileDescriptor(
-  name='build/bazel/remote/execution/v2/remote_execution.proto',
-  package='build.bazel.remote.execution.v2',
-  syntax='proto3',
-  serialized_pb=_b('\n6build/bazel/remote/execution/v2/remote_execution.proto\x12\x1f\x62uild.bazel.remote.execution.v2\x1a\x1f\x62uild/bazel/semver/semver.proto\x1a\x1cgoogle/api/annotations.proto\x1a#google/longrunning/operations.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x17google/rpc/status.proto\"\xd5\x01\n\x06\x41\x63tion\x12?\n\x0e\x63ommand_digest\x18\x01 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x42\n\x11input_root_digest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12*\n\x07timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x14\n\x0c\x64o_not_cache\x18\x07 \x01(\x08J\x04\x08\x03\x10\x06\"\xb7\x02\n\x07\x43ommand\x12\x11\n\targuments\x18\x01 \x03(\t\x12[\n\x15\x65nvironment_variables\x18\x02 \x03(\x0b\x32<.build.bazel.remote.execution.v2.Command.EnvironmentVariable\x12\x14\n\x0coutput_files\x18\x03 \x03(\t\x12\x1a\n\x12output_directories\x18\x04 \x03(\t\x12;\n\x08platform\x18\x05 \x01(\x0b\x32).build.bazel.remote.execution.v2.Platform\x12\x19\n\x11working_directory\x18\x06 \x01(\t\x1a\x32\n\x13\x45nvironmentVariable\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"{\n\x08Platform\x12\x46\n\nproperties\x18\x01 \x03(\x0b\x32\x32.build.bazel.remote.execution.v2.Platform.Property\x1a\'\n\x08Property\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"\xca\x01\n\tDirectory\x12\x38\n\x05\x66iles\x18\x01 \x03(\x0b\x32).build.bazel.remote.execution.v2.FileNode\x12\x43\n\x0b\x64irectories\x18\x02 \x03(\x0b\x32..build.bazel.remote.execution.v2.DirectoryNode\x12>\n\x08symlinks\x18\x03 \x03(\x0b\x32,.build.bazel.remote.execution.v2.SymlinkNode\"n\n\x08\x46ileNode\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x37\n\x06\x64igest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x15\n\ris_executable\x18\x04 \x01(\x08J\x04\x08\x03\x10\x04\"V\n\rDirectoryNode\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x37\n\x06\x64igest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"+\n\x0bSymlinkNode\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06target\x18\x02 \x01(\t\"*\n\x06\x44igest\x12\x0c\n\x04hash\x18\x01 \x01(\t\x12\x12\n\nsize_bytes\x18\x02 \x01(\x03\"\xec\x04\n\x16\x45xecutedActionMetadata\x12\x0e\n\x06worker\x18\x01 \x01(\t\x12\x34\n\x10queued_timestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12:\n\x16worker_start_timestamp\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x1aworker_completed_timestamp\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12?\n\x1binput_fetch_start_timestamp\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x43\n\x1finput_fetch_completed_timestamp\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12=\n\x19\x65xecution_start_timestamp\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x1d\x65xecution_completed_timestamp\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x1doutput_upload_start_timestamp\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n!output_upload_completed_timestamp\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\xb5\x03\n\x0c\x41\x63tionResult\x12\x41\n\x0coutput_files\x18\x02 \x03(\x0b\x32+.build.bazel.remote.execution.v2.OutputFile\x12L\n\x12output_directories\x18\x03 \x03(\x0b\x32\x30.build.bazel.remote.execution.v2.OutputDirectory\x12\x11\n\texit_code\x18\x04 \x01(\x05\x12\x12\n\nstdout_raw\x18\x05 \x01(\x0c\x12>\n\rstdout_digest\x18\x06 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x12\n\nstderr_raw\x18\x07 \x01(\x0c\x12>\n\rstderr_digest\x18\x08 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12S\n\x12\x65xecution_metadata\x18\t \x01(\x0b\x32\x37.build.bazel.remote.execution.v2.ExecutedActionMetadataJ\x04\x08\x01\x10\x02\"p\n\nOutputFile\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x37\n\x06\x64igest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x15\n\ris_executable\x18\x04 \x01(\x08J\x04\x08\x03\x10\x04\"~\n\x04Tree\x12\x38\n\x04root\x18\x01 \x01(\x0b\x32*.build.bazel.remote.execution.v2.Directory\x12<\n\x08\x63hildren\x18\x02 \x03(\x0b\x32*.build.bazel.remote.execution.v2.Directory\"c\n\x0fOutputDirectory\x12\x0c\n\x04path\x18\x01 \x01(\t\x12<\n\x0btree_digest\x18\x03 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.DigestJ\x04\x08\x02\x10\x03\"#\n\x0f\x45xecutionPolicy\x12\x10\n\x08priority\x18\x01 \x01(\x05\"&\n\x12ResultsCachePolicy\x12\x10\n\x08priority\x18\x01 \x01(\x05\"\xb3\x02\n\x0e\x45xecuteRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12\x19\n\x11skip_cache_lookup\x18\x03 \x01(\x08\x12>\n\raction_digest\x18\x06 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12J\n\x10\x65xecution_policy\x18\x07 \x01(\x0b\x32\x30.build.bazel.remote.execution.v2.ExecutionPolicy\x12Q\n\x14results_cache_policy\x18\x08 \x01(\x0b\x32\x33.build.bazel.remote.execution.v2.ResultsCachePolicyJ\x04\x08\x02\x10\x03J\x04\x08\x04\x10\x05J\x04\x08\x05\x10\x06\"Z\n\x07LogFile\x12\x37\n\x06\x64igest\x18\x01 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x16\n\x0ehuman_readable\x18\x02 \x01(\x08\"\xbf\x02\n\x0f\x45xecuteResponse\x12=\n\x06result\x18\x01 \x01(\x0b\x32-.build.bazel.remote.execution.v2.ActionResult\x12\x15\n\rcached_result\x18\x02 \x01(\x08\x12\"\n\x06status\x18\x03 \x01(\x0b\x32\x12.google.rpc.Status\x12U\n\x0bserver_logs\x18\x04 \x03(\x0b\x32@.build.bazel.remote.execution.v2.ExecuteResponse.ServerLogsEntry\x1a[\n\x0fServerLogsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x37\n\x05value\x18\x02 \x01(\x0b\x32(.build.bazel.remote.execution.v2.LogFile:\x02\x38\x01\"\xb3\x02\n\x18\x45xecuteOperationMetadata\x12N\n\x05stage\x18\x01 \x01(\x0e\x32?.build.bazel.remote.execution.v2.ExecuteOperationMetadata.Stage\x12>\n\raction_digest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x1a\n\x12stdout_stream_name\x18\x03 \x01(\t\x12\x1a\n\x12stderr_stream_name\x18\x04 \x01(\t\"O\n\x05Stage\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x0f\n\x0b\x43\x41\x43HE_CHECK\x10\x01\x12\n\n\x06QUEUED\x10\x02\x12\r\n\tEXECUTING\x10\x03\x12\r\n\tCOMPLETED\x10\x04\"$\n\x14WaitExecutionRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"o\n\x16GetActionResultRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12>\n\raction_digest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"\x8b\x02\n\x19UpdateActionResultRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12>\n\raction_digest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x44\n\raction_result\x18\x03 \x01(\x0b\x32-.build.bazel.remote.execution.v2.ActionResult\x12Q\n\x14results_cache_policy\x18\x04 \x01(\x0b\x32\x33.build.bazel.remote.execution.v2.ResultsCachePolicy\"o\n\x17\x46indMissingBlobsRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12=\n\x0c\x62lob_digests\x18\x02 \x03(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"a\n\x18\x46indMissingBlobsResponse\x12\x45\n\x14missing_blob_digests\x18\x02 \x03(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"\xd6\x01\n\x17\x42\x61tchUpdateBlobsRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12R\n\x08requests\x18\x02 \x03(\x0b\x32@.build.bazel.remote.execution.v2.BatchUpdateBlobsRequest.Request\x1aP\n\x07Request\x12\x37\n\x06\x64igest\x18\x01 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\"\xda\x01\n\x18\x42\x61tchUpdateBlobsResponse\x12U\n\tresponses\x18\x01 \x03(\x0b\x32\x42.build.bazel.remote.execution.v2.BatchUpdateBlobsResponse.Response\x1ag\n\x08Response\x12\x37\n\x06\x64igest\x18\x01 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\"\n\x06status\x18\x02 \x01(\x0b\x32\x12.google.rpc.Status\"h\n\x15\x42\x61tchReadBlobsRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12\x38\n\x07\x64igests\x18\x02 \x03(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"\xe4\x01\n\x16\x42\x61tchReadBlobsResponse\x12S\n\tresponses\x18\x01 \x03(\x0b\x32@.build.bazel.remote.execution.v2.BatchReadBlobsResponse.Response\x1au\n\x08Response\x12\x37\n\x06\x64igest\x18\x01 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x12\"\n\x06status\x18\x03 \x01(\x0b\x32\x12.google.rpc.Status\"\x8c\x01\n\x0eGetTreeRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12<\n\x0broot_digest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x11\n\tpage_size\x18\x03 \x01(\x05\x12\x12\n\npage_token\x18\x04 \x01(\t\"k\n\x0fGetTreeResponse\x12?\n\x0b\x64irectories\x18\x01 \x03(\x0b\x32*.build.bazel.remote.execution.v2.Directory\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\t\"/\n\x16GetCapabilitiesRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\"\xe3\x02\n\x12ServerCapabilities\x12N\n\x12\x63\x61\x63he_capabilities\x18\x01 \x01(\x0b\x32\x32.build.bazel.remote.execution.v2.CacheCapabilities\x12V\n\x16\x65xecution_capabilities\x18\x02 \x01(\x0b\x32\x36.build.bazel.remote.execution.v2.ExecutionCapabilities\x12:\n\x16\x64\x65precated_api_version\x18\x03 \x01(\x0b\x32\x1a.build.bazel.semver.SemVer\x12\x33\n\x0flow_api_version\x18\x04 \x01(\x0b\x32\x1a.build.bazel.semver.SemVer\x12\x34\n\x10high_api_version\x18\x05 \x01(\x0b\x32\x1a.build.bazel.semver.SemVer\"7\n\x1d\x41\x63tionCacheUpdateCapabilities\x12\x16\n\x0eupdate_enabled\x18\x01 \x01(\x08\"\xac\x01\n\x14PriorityCapabilities\x12W\n\npriorities\x18\x01 \x03(\x0b\x32\x43.build.bazel.remote.execution.v2.PriorityCapabilities.PriorityRange\x1a;\n\rPriorityRange\x12\x14\n\x0cmin_priority\x18\x01 \x01(\x05\x12\x14\n\x0cmax_priority\x18\x02 \x01(\x05\"\x88\x04\n\x11\x43\x61\x63heCapabilities\x12H\n\x0f\x64igest_function\x18\x01 \x03(\x0e\x32/.build.bazel.remote.execution.v2.DigestFunction\x12h\n action_cache_update_capabilities\x18\x02 \x01(\x0b\x32>.build.bazel.remote.execution.v2.ActionCacheUpdateCapabilities\x12Z\n\x1b\x63\x61\x63he_priority_capabilities\x18\x03 \x01(\x0b\x32\x35.build.bazel.remote.execution.v2.PriorityCapabilities\x12\"\n\x1amax_batch_total_size_bytes\x18\x04 \x01(\x03\x12v\n\x1esymlink_absolute_path_strategy\x18\x05 \x01(\x0e\x32N.build.bazel.remote.execution.v2.CacheCapabilities.SymlinkAbsolutePathStrategy\"G\n\x1bSymlinkAbsolutePathStrategy\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x0e\n\nDISALLOWED\x10\x01\x12\x0b\n\x07\x41LLOWED\x10\x02\"\xd7\x01\n\x15\x45xecutionCapabilities\x12H\n\x0f\x64igest_function\x18\x01 \x01(\x0e\x32/.build.bazel.remote.execution.v2.DigestFunction\x12\x14\n\x0c\x65xec_enabled\x18\x02 \x01(\x08\x12^\n\x1f\x65xecution_priority_capabilities\x18\x03 \x01(\x0b\x32\x35.build.bazel.remote.execution.v2.PriorityCapabilities\"6\n\x0bToolDetails\x12\x11\n\ttool_name\x18\x01 \x01(\t\x12\x14\n\x0ctool_version\x18\x02 \x01(\t\"\xa7\x01\n\x0fRequestMetadata\x12\x42\n\x0ctool_details\x18\x01 \x01(\x0b\x32,.build.bazel.remote.execution.v2.ToolDetails\x12\x11\n\taction_id\x18\x02 \x01(\t\x12\x1a\n\x12tool_invocation_id\x18\x03 \x01(\t\x12!\n\x19\x63orrelated_invocations_id\x18\x04 \x01(\t*<\n\x0e\x44igestFunction\x12\x0b\n\x07UNKNOWN\x10\x00\x12\n\n\x06SHA256\x10\x01\x12\x08\n\x04SHA1\x10\x02\x12\x07\n\x03MD5\x10\x03\x32\xb9\x02\n\tExecution\x12\x8e\x01\n\x07\x45xecute\x12/.build.bazel.remote.execution.v2.ExecuteRequest\x1a\x1d.google.longrunning.Operation\"1\x82\xd3\xe4\x93\x02+\"&/v2/{instance_name=**}/actions:execute:\x01*0\x01\x12\x9a\x01\n\rWaitExecution\x12\x35.build.bazel.remote.execution.v2.WaitExecutionRequest\x1a\x1d.google.longrunning.Operation\"1\x82\xd3\xe4\x93\x02+\"&/v2/{name=operations/**}:waitExecution:\x01*0\x01\x32\xd6\x03\n\x0b\x41\x63tionCache\x12\xd7\x01\n\x0fGetActionResult\x12\x37.build.bazel.remote.execution.v2.GetActionResultRequest\x1a-.build.bazel.remote.execution.v2.ActionResult\"\\\x82\xd3\xe4\x93\x02V\x12T/v2/{instance_name=**}/actionResults/{action_digest.hash}/{action_digest.size_bytes}\x12\xec\x01\n\x12UpdateActionResult\x12:.build.bazel.remote.execution.v2.UpdateActionResultRequest\x1a-.build.bazel.remote.execution.v2.ActionResult\"k\x82\xd3\xe4\x93\x02\x65\x1aT/v2/{instance_name=**}/actionResults/{action_digest.hash}/{action_digest.size_bytes}:\raction_result2\x9b\x06\n\x19\x43ontentAddressableStorage\x12\xbc\x01\n\x10\x46indMissingBlobs\x12\x38.build.bazel.remote.execution.v2.FindMissingBlobsRequest\x1a\x39.build.bazel.remote.execution.v2.FindMissingBlobsResponse\"3\x82\xd3\xe4\x93\x02-\"(/v2/{instance_name=**}/blobs:findMissing:\x01*\x12\xbc\x01\n\x10\x42\x61tchUpdateBlobs\x12\x38.build.bazel.remote.execution.v2.BatchUpdateBlobsRequest\x1a\x39.build.bazel.remote.execution.v2.BatchUpdateBlobsResponse\"3\x82\xd3\xe4\x93\x02-\"(/v2/{instance_name=**}/blobs:batchUpdate:\x01*\x12\xb4\x01\n\x0e\x42\x61tchReadBlobs\x12\x36.build.bazel.remote.execution.v2.BatchReadBlobsRequest\x1a\x37.build.bazel.remote.execution.v2.BatchReadBlobsResponse\"1\x82\xd3\xe4\x93\x02+\"&/v2/{instance_name=**}/blobs:batchRead:\x01*\x12\xc8\x01\n\x07GetTree\x12/.build.bazel.remote.execution.v2.GetTreeRequest\x1a\x30.build.bazel.remote.execution.v2.GetTreeResponse\"X\x82\xd3\xe4\x93\x02R\x12P/v2/{instance_name=**}/blobs/{root_digest.hash}/{root_digest.size_bytes}:getTree0\x01\x32\xbd\x01\n\x0c\x43\x61pabilities\x12\xac\x01\n\x0fGetCapabilities\x12\x37.build.bazel.remote.execution.v2.GetCapabilitiesRequest\x1a\x33.build.bazel.remote.execution.v2.ServerCapabilities\"+\x82\xd3\xe4\x93\x02%\x12#/v2/{instance_name=**}/capabilitiesBr\n\x1f\x62uild.bazel.remote.execution.v2B\x14RemoteExecutionProtoP\x01Z\x0fremoteexecution\xa2\x02\x03REX\xaa\x02\x1f\x42uild.Bazel.Remote.Execution.V2b\x06proto3')
-  ,
-  dependencies=[build_dot_bazel_dot_semver_dot_semver__pb2.DESCRIPTOR,google_dot_api_dot_annotations__pb2.DESCRIPTOR,google_dot_longrunning_dot_operations__pb2.DESCRIPTOR,google_dot_protobuf_dot_duration__pb2.DESCRIPTOR,google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,google_dot_rpc_dot_status__pb2.DESCRIPTOR,])
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n6build/bazel/remote/execution/v2/remote_execution.proto\x12\x1f\x62uild.bazel.remote.execution.v2\x1a\x1f\x62uild/bazel/semver/semver.proto\x1a\x1cgoogle/api/annotations.proto\x1a#google/longrunning/operations.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x17google/rpc/status.proto\"\xd5\x01\n\x06\x41\x63tion\x12?\n\x0e\x63ommand_digest\x18\x01 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x42\n\x11input_root_digest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12*\n\x07timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x14\n\x0c\x64o_not_cache\x18\x07 \x01(\x08J\x04\x08\x03\x10\x06\"\xb7\x02\n\x07\x43ommand\x12\x11\n\targuments\x18\x01 \x03(\t\x12[\n\x15\x65nvironment_variables\x18\x02 \x03(\x0b\x32<.build.bazel.remote.execution.v2.Command.EnvironmentVariable\x12\x14\n\x0coutput_files\x18\x03 \x03(\t\x12\x1a\n\x12output_directories\x18\x04 \x03(\t\x12;\n\x08platform\x18\x05 \x01(\x0b\x32).build.bazel.remote.execution.v2.Platform\x12\x19\n\x11working_directory\x18\x06 \x01(\t\x1a\x32\n\x13\x45nvironmentVariable\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"{\n\x08Platform\x12\x46\n\nproperties\x18\x01 \x03(\x0b\x32\x32.build.bazel.remote.execution.v2.Platform.Property\x1a\'\n\x08Property\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"\xca\x01\n\tDirectory\x12\x38\n\x05\x66iles\x18\x01 \x03(\x0b\x32).build.bazel.remote.execution.v2.FileNode\x12\x43\n\x0b\x64irectories\x18\x02 \x03(\x0b\x32..build.bazel.remote.execution.v2.DirectoryNode\x12>\n\x08symlinks\x18\x03 \x03(\x0b\x32,.build.bazel.remote.execution.v2.SymlinkNode\"n\n\x08\x46ileNode\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x37\n\x06\x64igest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x15\n\ris_executable\x18\x04 \x01(\x08J\x04\x08\x03\x10\x04\"V\n\rDirectoryNode\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x37\n\x06\x64igest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"+\n\x0bSymlinkNode\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06target\x18\x02 \x01(\t\"*\n\x06\x44igest\x12\x0c\n\x04hash\x18\x01 \x01(\t\x12\x12\n\nsize_bytes\x18\x02 \x01(\x03\"\xec\x04\n\x16\x45xecutedActionMetadata\x12\x0e\n\x06worker\x18\x01 \x01(\t\x12\x34\n\x10queued_timestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12:\n\x16worker_start_timestamp\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x1aworker_completed_timestamp\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12?\n\x1binput_fetch_start_timestamp\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x43\n\x1finput_fetch_completed_timestamp\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12=\n\x19\x65xecution_start_timestamp\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x1d\x65xecution_completed_timestamp\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x1doutput_upload_start_timestamp\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n!output_upload_completed_timestamp\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\xb5\x03\n\x0c\x41\x63tionResult\x12\x41\n\x0coutput_files\x18\x02 \x03(\x0b\x32+.build.bazel.remote.execution.v2.OutputFile\x12L\n\x12output_directories\x18\x03 \x03(\x0b\x32\x30.build.bazel.remote.execution.v2.OutputDirectory\x12\x11\n\texit_code\x18\x04 \x01(\x05\x12\x12\n\nstdout_raw\x18\x05 \x01(\x0c\x12>\n\rstdout_digest\x18\x06 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x12\n\nstderr_raw\x18\x07 \x01(\x0c\x12>\n\rstderr_digest\x18\x08 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12S\n\x12\x65xecution_metadata\x18\t \x01(\x0b\x32\x37.build.bazel.remote.execution.v2.ExecutedActionMetadataJ\x04\x08\x01\x10\x02\"p\n\nOutputFile\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x37\n\x06\x64igest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x15\n\ris_executable\x18\x04 \x01(\x08J\x04\x08\x03\x10\x04\"~\n\x04Tree\x12\x38\n\x04root\x18\x01 \x01(\x0b\x32*.build.bazel.remote.execution.v2.Directory\x12<\n\x08\x63hildren\x18\x02 \x03(\x0b\x32*.build.bazel.remote.execution.v2.Directory\"c\n\x0fOutputDirectory\x12\x0c\n\x04path\x18\x01 \x01(\t\x12<\n\x0btree_digest\x18\x03 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.DigestJ\x04\x08\x02\x10\x03\"#\n\x0f\x45xecutionPolicy\x12\x10\n\x08priority\x18\x01 \x01(\x05\"&\n\x12ResultsCachePolicy\x12\x10\n\x08priority\x18\x01 \x01(\x05\"\xb3\x02\n\x0e\x45xecuteRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12\x19\n\x11skip_cache_lookup\x18\x03 \x01(\x08\x12>\n\raction_digest\x18\x06 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12J\n\x10\x65xecution_policy\x18\x07 \x01(\x0b\x32\x30.build.bazel.remote.execution.v2.ExecutionPolicy\x12Q\n\x14results_cache_policy\x18\x08 \x01(\x0b\x32\x33.build.bazel.remote.execution.v2.ResultsCachePolicyJ\x04\x08\x02\x10\x03J\x04\x08\x04\x10\x05J\x04\x08\x05\x10\x06\"Z\n\x07LogFile\x12\x37\n\x06\x64igest\x18\x01 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x16\n\x0ehuman_readable\x18\x02 \x01(\x08\"\xbf\x02\n\x0f\x45xecuteResponse\x12=\n\x06result\x18\x01 \x01(\x0b\x32-.build.bazel.remote.execution.v2.ActionResult\x12\x15\n\rcached_result\x18\x02 \x01(\x08\x12\"\n\x06status\x18\x03 \x01(\x0b\x32\x12.google.rpc.Status\x12U\n\x0bserver_logs\x18\x04 \x03(\x0b\x32@.build.bazel.remote.execution.v2.ExecuteResponse.ServerLogsEntry\x1a[\n\x0fServerLogsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x37\n\x05value\x18\x02 \x01(\x0b\x32(.build.bazel.remote.execution.v2.LogFile:\x02\x38\x01\"\xb3\x02\n\x18\x45xecuteOperationMetadata\x12N\n\x05stage\x18\x01 \x01(\x0e\x32?.build.bazel.remote.execution.v2.ExecuteOperationMetadata.Stage\x12>\n\raction_digest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x1a\n\x12stdout_stream_name\x18\x03 \x01(\t\x12\x1a\n\x12stderr_stream_name\x18\x04 \x01(\t\"O\n\x05Stage\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x0f\n\x0b\x43\x41\x43HE_CHECK\x10\x01\x12\n\n\x06QUEUED\x10\x02\x12\r\n\tEXECUTING\x10\x03\x12\r\n\tCOMPLETED\x10\x04\"$\n\x14WaitExecutionRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"o\n\x16GetActionResultRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12>\n\raction_digest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"\x8b\x02\n\x19UpdateActionResultRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12>\n\raction_digest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x44\n\raction_result\x18\x03 \x01(\x0b\x32-.build.bazel.remote.execution.v2.ActionResult\x12Q\n\x14results_cache_policy\x18\x04 \x01(\x0b\x32\x33.build.bazel.remote.execution.v2.ResultsCachePolicy\"o\n\x17\x46indMissingBlobsRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12=\n\x0c\x62lob_digests\x18\x02 \x03(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"a\n\x18\x46indMissingBlobsResponse\x12\x45\n\x14missing_blob_digests\x18\x02 \x03(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"\xd6\x01\n\x17\x42\x61tchUpdateBlobsRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12R\n\x08requests\x18\x02 \x03(\x0b\x32@.build.bazel.remote.execution.v2.BatchUpdateBlobsRequest.Request\x1aP\n\x07Request\x12\x37\n\x06\x64igest\x18\x01 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\"\xda\x01\n\x18\x42\x61tchUpdateBlobsResponse\x12U\n\tresponses\x18\x01 \x03(\x0b\x32\x42.build.bazel.remote.execution.v2.BatchUpdateBlobsResponse.Response\x1ag\n\x08Response\x12\x37\n\x06\x64igest\x18\x01 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\"\n\x06status\x18\x02 \x01(\x0b\x32\x12.google.rpc.Status\"h\n\x15\x42\x61tchReadBlobsRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12\x38\n\x07\x64igests\x18\x02 \x03(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"\xe4\x01\n\x16\x42\x61tchReadBlobsResponse\x12S\n\tresponses\x18\x01 \x03(\x0b\x32@.build.bazel.remote.execution.v2.BatchReadBlobsResponse.Response\x1au\n\x08Response\x12\x37\n\x06\x64igest\x18\x01 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x12\"\n\x06status\x18\x03 \x01(\x0b\x32\x12.google.rpc.Status\"\x8c\x01\n\x0eGetTreeRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12<\n\x0broot_digest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x11\n\tpage_size\x18\x03 \x01(\x05\x12\x12\n\npage_token\x18\x04 \x01(\t\"k\n\x0fGetTreeResponse\x12?\n\x0b\x64irectories\x18\x01 \x03(\x0b\x32*.build.bazel.remote.execution.v2.Directory\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\t\"/\n\x16GetCapabilitiesRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\"\xe3\x02\n\x12ServerCapabilities\x12N\n\x12\x63\x61\x63he_capabilities\x18\x01 \x01(\x0b\x32\x32.build.bazel.remote.execution.v2.CacheCapabilities\x12V\n\x16\x65xecution_capabilities\x18\x02 \x01(\x0b\x32\x36.build.bazel.remote.execution.v2.ExecutionCapabilities\x12:\n\x16\x64\x65precated_api_version\x18\x03 \x01(\x0b\x32\x1a.build.bazel.semver.SemVer\x12\x33\n\x0flow_api_version\x18\x04 \x01(\x0b\x32\x1a.build.bazel.semver.SemVer\x12\x34\n\x10high_api_version\x18\x05 \x01(\x0b\x32\x1a.build.bazel.semver.SemVer\"7\n\x1d\x41\x63tionCacheUpdateCapabilities\x12\x16\n\x0eupdate_enabled\x18\x01 \x01(\x08\"\xac\x01\n\x14PriorityCapabilities\x12W\n\npriorities\x18\x01 \x03(\x0b\x32\x43.build.bazel.remote.execution.v2.PriorityCapabilities.PriorityRange\x1a;\n\rPriorityRange\x12\x14\n\x0cmin_priority\x18\x01 \x01(\x05\x12\x14\n\x0cmax_priority\x18\x02 \x01(\x05\"\x88\x04\n\x11\x43\x61\x63heCapabilities\x12H\n\x0f\x64igest_function\x18\x01 \x03(\x0e\x32/.build.bazel.remote.execution.v2.DigestFunction\x12h\n action_cache_update_capabilities\x18\x02 \x01(\x0b\x32>.build.bazel.remote.execution.v2.ActionCacheUpdateCapabilities\x12Z\n\x1b\x63\x61\x63he_priority_capabilities\x18\x03 \x01(\x0b\x32\x35.build.bazel.remote.execution.v2.PriorityCapabilities\x12\"\n\x1amax_batch_total_size_bytes\x18\x04 \x01(\x03\x12v\n\x1esymlink_absolute_path_strategy\x18\x05 \x01(\x0e\x32N.build.bazel.remote.execution.v2.CacheCapabilities.SymlinkAbsolutePathStrategy\"G\n\x1bSymlinkAbsolutePathStrategy\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x0e\n\nDISALLOWED\x10\x01\x12\x0b\n\x07\x41LLOWED\x10\x02\"\xd7\x01\n\x15\x45xecutionCapabilities\x12H\n\x0f\x64igest_function\x18\x01 \x01(\x0e\x32/.build.bazel.remote.execution.v2.DigestFunction\x12\x14\n\x0c\x65xec_enabled\x18\x02 \x01(\x08\x12^\n\x1f\x65xecution_priority_capabilities\x18\x03 \x01(\x0b\x32\x35.build.bazel.remote.execution.v2.PriorityCapabilities\"6\n\x0bToolDetails\x12\x11\n\ttool_name\x18\x01 \x01(\t\x12\x14\n\x0ctool_version\x18\x02 \x01(\t\"\xa7\x01\n\x0fRequestMetadata\x12\x42\n\x0ctool_details\x18\x01 \x01(\x0b\x32,.build.bazel.remote.execution.v2.ToolDetails\x12\x11\n\taction_id\x18\x02 \x01(\t\x12\x1a\n\x12tool_invocation_id\x18\x03 \x01(\t\x12!\n\x19\x63orrelated_invocations_id\x18\x04 \x01(\t*<\n\x0e\x44igestFunction\x12\x0b\n\x07UNKNOWN\x10\x00\x12\n\n\x06SHA256\x10\x01\x12\x08\n\x04SHA1\x10\x02\x12\x07\n\x03MD5\x10\x03\x32\xb9\x02\n\tExecution\x12\x8e\x01\n\x07\x45xecute\x12/.build.bazel.remote.execution.v2.ExecuteRequest\x1a\x1d.google.longrunning.Operation\"1\x82\xd3\xe4\x93\x02+\"&/v2/{instance_name=**}/actions:execute:\x01*0\x01\x12\x9a\x01\n\rWaitExecution\x12\x35.build.bazel.remote.execution.v2.WaitExecutionRequest\x1a\x1d.google.longrunning.Operation\"1\x82\xd3\xe4\x93\x02+\"&/v2/{name=operations/**}:waitExecution:\x01*0\x01\x32\xd6\x03\n\x0b\x41\x63tionCache\x12\xd7\x01\n\x0fGetActionResult\x12\x37.build.bazel.remote.execution.v2.GetActionResultRequest\x1a-.build.bazel.remote.execution.v2.ActionResult\"\\\x82\xd3\xe4\x93\x02V\x12T/v2/{instance_name=**}/actionResults/{action_digest.hash}/{action_digest.size_bytes}\x12\xec\x01\n\x12UpdateActionResult\x12:.build.bazel.remote.execution.v2.UpdateActionResultRequest\x1a-.build.bazel.remote.execution.v2.ActionResult\"k\x82\xd3\xe4\x93\x02\x65\x1aT/v2/{instance_name=**}/actionResults/{action_digest.hash}/{action_digest.size_bytes}:\raction_result2\x9b\x06\n\x19\x43ontentAddressableStorage\x12\xbc\x01\n\x10\x46indMissingBlobs\x12\x38.build.bazel.remote.execution.v2.FindMissingBlobsRequest\x1a\x39.build.bazel.remote.execution.v2.FindMissingBlobsResponse\"3\x82\xd3\xe4\x93\x02-\"(/v2/{instance_name=**}/blobs:findMissing:\x01*\x12\xbc\x01\n\x10\x42\x61tchUpdateBlobs\x12\x38.build.bazel.remote.execution.v2.BatchUpdateBlobsRequest\x1a\x39.build.bazel.remote.execution.v2.BatchUpdateBlobsResponse\"3\x82\xd3\xe4\x93\x02-\"(/v2/{instance_name=**}/blobs:batchUpdate:\x01*\x12\xb4\x01\n\x0e\x42\x61tchReadBlobs\x12\x36.build.bazel.remote.execution.v2.BatchReadBlobsRequest\x1a\x37.build.bazel.remote.execution.v2.BatchReadBlobsResponse\"1\x82\xd3\xe4\x93\x02+\"&/v2/{instance_name=**}/blobs:batchRead:\x01*\x12\xc8\x01\n\x07GetTree\x12/.build.bazel.remote.execution.v2.GetTreeRequest\x1a\x30.build.bazel.remote.execution.v2.GetTreeResponse\"X\x82\xd3\xe4\x93\x02R\x12P/v2/{instance_name=**}/blobs/{root_digest.hash}/{root_digest.size_bytes}:getTree0\x01\x32\xbd\x01\n\x0c\x43\x61pabilities\x12\xac\x01\n\x0fGetCapabilities\x12\x37.build.bazel.remote.execution.v2.GetCapabilitiesRequest\x1a\x33.build.bazel.remote.execution.v2.ServerCapabilities\"+\x82\xd3\xe4\x93\x02%\x12#/v2/{instance_name=**}/capabilitiesBr\n\x1f\x62uild.bazel.remote.execution.v2B\x14RemoteExecutionProtoP\x01Z\x0fremoteexecution\xa2\x02\x03REX\xaa\x02\x1f\x42uild.Bazel.Remote.Execution.V2b\x06proto3')
 
-_DIGESTFUNCTION = _descriptor.EnumDescriptor(
-  name='DigestFunction',
-  full_name='build.bazel.remote.execution.v2.DigestFunction',
-  filename=None,
-  file=DESCRIPTOR,
-  values=[
-    _descriptor.EnumValueDescriptor(
-      name='UNKNOWN', index=0, number=0,
-      options=None,
-      type=None),
-    _descriptor.EnumValueDescriptor(
-      name='SHA256', index=1, number=1,
-      options=None,
-      type=None),
-    _descriptor.EnumValueDescriptor(
-      name='SHA1', index=2, number=2,
-      options=None,
-      type=None),
-    _descriptor.EnumValueDescriptor(
-      name='MD5', index=3, number=3,
-      options=None,
-      type=None),
-  ],
-  containing_type=None,
-  options=None,
-  serialized_start=7213,
-  serialized_end=7273,
-)
-_sym_db.RegisterEnumDescriptor(_DIGESTFUNCTION)
-
+_DIGESTFUNCTION = DESCRIPTOR.enum_types_by_name['DigestFunction']
 DigestFunction = enum_type_wrapper.EnumTypeWrapper(_DIGESTFUNCTION)
 UNKNOWN = 0
 SHA256 = 1
@@ -67,2594 +31,505 @@
 MD5 = 3
 
 
-_EXECUTEOPERATIONMETADATA_STAGE = _descriptor.EnumDescriptor(
-  name='Stage',
-  full_name='build.bazel.remote.execution.v2.ExecuteOperationMetadata.Stage',
-  filename=None,
-  file=DESCRIPTOR,
-  values=[
-    _descriptor.EnumValueDescriptor(
-      name='UNKNOWN', index=0, number=0,
-      options=None,
-      type=None),
-    _descriptor.EnumValueDescriptor(
-      name='CACHE_CHECK', index=1, number=1,
-      options=None,
-      type=None),
-    _descriptor.EnumValueDescriptor(
-      name='QUEUED', index=2, number=2,
-      options=None,
-      type=None),
-    _descriptor.EnumValueDescriptor(
-      name='EXECUTING', index=3, number=3,
-      options=None,
-      type=None),
-    _descriptor.EnumValueDescriptor(
-      name='COMPLETED', index=4, number=4,
-      options=None,
-      type=None),
-  ],
-  containing_type=None,
-  options=None,
-  serialized_start=3866,
-  serialized_end=3945,
-)
-_sym_db.RegisterEnumDescriptor(_EXECUTEOPERATIONMETADATA_STAGE)
-
-_CACHECAPABILITIES_SYMLINKABSOLUTEPATHSTRATEGY = _descriptor.EnumDescriptor(
-  name='SymlinkAbsolutePathStrategy',
-  full_name='build.bazel.remote.execution.v2.CacheCapabilities.SymlinkAbsolutePathStrategy',
-  filename=None,
-  file=DESCRIPTOR,
-  values=[
-    _descriptor.EnumValueDescriptor(
-      name='UNKNOWN', index=0, number=0,
-      options=None,
-      type=None),
-    _descriptor.EnumValueDescriptor(
-      name='DISALLOWED', index=1, number=1,
-      options=None,
-      type=None),
-    _descriptor.EnumValueDescriptor(
-      name='ALLOWED', index=2, number=2,
-      options=None,
-      type=None),
-  ],
-  containing_type=None,
-  options=None,
-  serialized_start=6696,
-  serialized_end=6767,
-)
-_sym_db.RegisterEnumDescriptor(_CACHECAPABILITIES_SYMLINKABSOLUTEPATHSTRATEGY)
-
-
-_ACTION = _descriptor.Descriptor(
-  name='Action',
-  full_name='build.bazel.remote.execution.v2.Action',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='command_digest', full_name='build.bazel.remote.execution.v2.Action.command_digest', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='input_root_digest', full_name='build.bazel.remote.execution.v2.Action.input_root_digest', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='timeout', full_name='build.bazel.remote.execution.v2.Action.timeout', index=2,
-      number=6, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='do_not_cache', full_name='build.bazel.remote.execution.v2.Action.do_not_cache', index=3,
-      number=7, type=8, cpp_type=7, label=1,
-      has_default_value=False, default_value=False,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=282,
-  serialized_end=495,
-)
-
-
-_COMMAND_ENVIRONMENTVARIABLE = _descriptor.Descriptor(
-  name='EnvironmentVariable',
-  full_name='build.bazel.remote.execution.v2.Command.EnvironmentVariable',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='name', full_name='build.bazel.remote.execution.v2.Command.EnvironmentVariable.name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='value', full_name='build.bazel.remote.execution.v2.Command.EnvironmentVariable.value', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=759,
-  serialized_end=809,
-)
-
-_COMMAND = _descriptor.Descriptor(
-  name='Command',
-  full_name='build.bazel.remote.execution.v2.Command',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='arguments', full_name='build.bazel.remote.execution.v2.Command.arguments', index=0,
-      number=1, type=9, cpp_type=9, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='environment_variables', full_name='build.bazel.remote.execution.v2.Command.environment_variables', index=1,
-      number=2, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='output_files', full_name='build.bazel.remote.execution.v2.Command.output_files', index=2,
-      number=3, type=9, cpp_type=9, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='output_directories', full_name='build.bazel.remote.execution.v2.Command.output_directories', index=3,
-      number=4, type=9, cpp_type=9, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='platform', full_name='build.bazel.remote.execution.v2.Command.platform', index=4,
-      number=5, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='working_directory', full_name='build.bazel.remote.execution.v2.Command.working_directory', index=5,
-      number=6, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[_COMMAND_ENVIRONMENTVARIABLE, ],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=498,
-  serialized_end=809,
-)
-
-
-_PLATFORM_PROPERTY = _descriptor.Descriptor(
-  name='Property',
-  full_name='build.bazel.remote.execution.v2.Platform.Property',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='name', full_name='build.bazel.remote.execution.v2.Platform.Property.name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='value', full_name='build.bazel.remote.execution.v2.Platform.Property.value', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=895,
-  serialized_end=934,
-)
-
-_PLATFORM = _descriptor.Descriptor(
-  name='Platform',
-  full_name='build.bazel.remote.execution.v2.Platform',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='properties', full_name='build.bazel.remote.execution.v2.Platform.properties', index=0,
-      number=1, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[_PLATFORM_PROPERTY, ],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=811,
-  serialized_end=934,
-)
-
-
-_DIRECTORY = _descriptor.Descriptor(
-  name='Directory',
-  full_name='build.bazel.remote.execution.v2.Directory',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='files', full_name='build.bazel.remote.execution.v2.Directory.files', index=0,
-      number=1, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='directories', full_name='build.bazel.remote.execution.v2.Directory.directories', index=1,
-      number=2, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='symlinks', full_name='build.bazel.remote.execution.v2.Directory.symlinks', index=2,
-      number=3, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=937,
-  serialized_end=1139,
-)
-
-
-_FILENODE = _descriptor.Descriptor(
-  name='FileNode',
-  full_name='build.bazel.remote.execution.v2.FileNode',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='name', full_name='build.bazel.remote.execution.v2.FileNode.name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='digest', full_name='build.bazel.remote.execution.v2.FileNode.digest', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='is_executable', full_name='build.bazel.remote.execution.v2.FileNode.is_executable', index=2,
-      number=4, type=8, cpp_type=7, label=1,
-      has_default_value=False, default_value=False,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1141,
-  serialized_end=1251,
-)
-
-
-_DIRECTORYNODE = _descriptor.Descriptor(
-  name='DirectoryNode',
-  full_name='build.bazel.remote.execution.v2.DirectoryNode',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='name', full_name='build.bazel.remote.execution.v2.DirectoryNode.name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='digest', full_name='build.bazel.remote.execution.v2.DirectoryNode.digest', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1253,
-  serialized_end=1339,
-)
-
-
-_SYMLINKNODE = _descriptor.Descriptor(
-  name='SymlinkNode',
-  full_name='build.bazel.remote.execution.v2.SymlinkNode',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='name', full_name='build.bazel.remote.execution.v2.SymlinkNode.name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='target', full_name='build.bazel.remote.execution.v2.SymlinkNode.target', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1341,
-  serialized_end=1384,
-)
-
-
-_DIGEST = _descriptor.Descriptor(
-  name='Digest',
-  full_name='build.bazel.remote.execution.v2.Digest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='hash', full_name='build.bazel.remote.execution.v2.Digest.hash', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='size_bytes', full_name='build.bazel.remote.execution.v2.Digest.size_bytes', index=1,
-      number=2, type=3, cpp_type=2, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1386,
-  serialized_end=1428,
-)
-
-
-_EXECUTEDACTIONMETADATA = _descriptor.Descriptor(
-  name='ExecutedActionMetadata',
-  full_name='build.bazel.remote.execution.v2.ExecutedActionMetadata',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='worker', full_name='build.bazel.remote.execution.v2.ExecutedActionMetadata.worker', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='queued_timestamp', full_name='build.bazel.remote.execution.v2.ExecutedActionMetadata.queued_timestamp', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='worker_start_timestamp', full_name='build.bazel.remote.execution.v2.ExecutedActionMetadata.worker_start_timestamp', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='worker_completed_timestamp', full_name='build.bazel.remote.execution.v2.ExecutedActionMetadata.worker_completed_timestamp', index=3,
-      number=4, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='input_fetch_start_timestamp', full_name='build.bazel.remote.execution.v2.ExecutedActionMetadata.input_fetch_start_timestamp', index=4,
-      number=5, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='input_fetch_completed_timestamp', full_name='build.bazel.remote.execution.v2.ExecutedActionMetadata.input_fetch_completed_timestamp', index=5,
-      number=6, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='execution_start_timestamp', full_name='build.bazel.remote.execution.v2.ExecutedActionMetadata.execution_start_timestamp', index=6,
-      number=7, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='execution_completed_timestamp', full_name='build.bazel.remote.execution.v2.ExecutedActionMetadata.execution_completed_timestamp', index=7,
-      number=8, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='output_upload_start_timestamp', full_name='build.bazel.remote.execution.v2.ExecutedActionMetadata.output_upload_start_timestamp', index=8,
-      number=9, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='output_upload_completed_timestamp', full_name='build.bazel.remote.execution.v2.ExecutedActionMetadata.output_upload_completed_timestamp', index=9,
-      number=10, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1431,
-  serialized_end=2051,
-)
-
-
-_ACTIONRESULT = _descriptor.Descriptor(
-  name='ActionResult',
-  full_name='build.bazel.remote.execution.v2.ActionResult',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='output_files', full_name='build.bazel.remote.execution.v2.ActionResult.output_files', index=0,
-      number=2, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='output_directories', full_name='build.bazel.remote.execution.v2.ActionResult.output_directories', index=1,
-      number=3, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='exit_code', full_name='build.bazel.remote.execution.v2.ActionResult.exit_code', index=2,
-      number=4, type=5, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='stdout_raw', full_name='build.bazel.remote.execution.v2.ActionResult.stdout_raw', index=3,
-      number=5, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b(""),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='stdout_digest', full_name='build.bazel.remote.execution.v2.ActionResult.stdout_digest', index=4,
-      number=6, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='stderr_raw', full_name='build.bazel.remote.execution.v2.ActionResult.stderr_raw', index=5,
-      number=7, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b(""),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='stderr_digest', full_name='build.bazel.remote.execution.v2.ActionResult.stderr_digest', index=6,
-      number=8, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='execution_metadata', full_name='build.bazel.remote.execution.v2.ActionResult.execution_metadata', index=7,
-      number=9, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=2054,
-  serialized_end=2491,
-)
-
-
-_OUTPUTFILE = _descriptor.Descriptor(
-  name='OutputFile',
-  full_name='build.bazel.remote.execution.v2.OutputFile',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='path', full_name='build.bazel.remote.execution.v2.OutputFile.path', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='digest', full_name='build.bazel.remote.execution.v2.OutputFile.digest', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='is_executable', full_name='build.bazel.remote.execution.v2.OutputFile.is_executable', index=2,
-      number=4, type=8, cpp_type=7, label=1,
-      has_default_value=False, default_value=False,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=2493,
-  serialized_end=2605,
-)
-
-
-_TREE = _descriptor.Descriptor(
-  name='Tree',
-  full_name='build.bazel.remote.execution.v2.Tree',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='root', full_name='build.bazel.remote.execution.v2.Tree.root', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='children', full_name='build.bazel.remote.execution.v2.Tree.children', index=1,
-      number=2, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=2607,
-  serialized_end=2733,
-)
-
-
-_OUTPUTDIRECTORY = _descriptor.Descriptor(
-  name='OutputDirectory',
-  full_name='build.bazel.remote.execution.v2.OutputDirectory',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='path', full_name='build.bazel.remote.execution.v2.OutputDirectory.path', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='tree_digest', full_name='build.bazel.remote.execution.v2.OutputDirectory.tree_digest', index=1,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=2735,
-  serialized_end=2834,
-)
-
-
-_EXECUTIONPOLICY = _descriptor.Descriptor(
-  name='ExecutionPolicy',
-  full_name='build.bazel.remote.execution.v2.ExecutionPolicy',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='priority', full_name='build.bazel.remote.execution.v2.ExecutionPolicy.priority', index=0,
-      number=1, type=5, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=2836,
-  serialized_end=2871,
-)
-
-
-_RESULTSCACHEPOLICY = _descriptor.Descriptor(
-  name='ResultsCachePolicy',
-  full_name='build.bazel.remote.execution.v2.ResultsCachePolicy',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='priority', full_name='build.bazel.remote.execution.v2.ResultsCachePolicy.priority', index=0,
-      number=1, type=5, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=2873,
-  serialized_end=2911,
-)
-
-
-_EXECUTEREQUEST = _descriptor.Descriptor(
-  name='ExecuteRequest',
-  full_name='build.bazel.remote.execution.v2.ExecuteRequest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='instance_name', full_name='build.bazel.remote.execution.v2.ExecuteRequest.instance_name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='skip_cache_lookup', full_name='build.bazel.remote.execution.v2.ExecuteRequest.skip_cache_lookup', index=1,
-      number=3, type=8, cpp_type=7, label=1,
-      has_default_value=False, default_value=False,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='action_digest', full_name='build.bazel.remote.execution.v2.ExecuteRequest.action_digest', index=2,
-      number=6, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='execution_policy', full_name='build.bazel.remote.execution.v2.ExecuteRequest.execution_policy', index=3,
-      number=7, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='results_cache_policy', full_name='build.bazel.remote.execution.v2.ExecuteRequest.results_cache_policy', index=4,
-      number=8, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=2914,
-  serialized_end=3221,
-)
-
-
-_LOGFILE = _descriptor.Descriptor(
-  name='LogFile',
-  full_name='build.bazel.remote.execution.v2.LogFile',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='digest', full_name='build.bazel.remote.execution.v2.LogFile.digest', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='human_readable', full_name='build.bazel.remote.execution.v2.LogFile.human_readable', index=1,
-      number=2, type=8, cpp_type=7, label=1,
-      has_default_value=False, default_value=False,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=3223,
-  serialized_end=3313,
-)
-
-
-_EXECUTERESPONSE_SERVERLOGSENTRY = _descriptor.Descriptor(
-  name='ServerLogsEntry',
-  full_name='build.bazel.remote.execution.v2.ExecuteResponse.ServerLogsEntry',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='key', full_name='build.bazel.remote.execution.v2.ExecuteResponse.ServerLogsEntry.key', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='value', full_name='build.bazel.remote.execution.v2.ExecuteResponse.ServerLogsEntry.value', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001')),
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=3544,
-  serialized_end=3635,
-)
-
-_EXECUTERESPONSE = _descriptor.Descriptor(
-  name='ExecuteResponse',
-  full_name='build.bazel.remote.execution.v2.ExecuteResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='result', full_name='build.bazel.remote.execution.v2.ExecuteResponse.result', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='cached_result', full_name='build.bazel.remote.execution.v2.ExecuteResponse.cached_result', index=1,
-      number=2, type=8, cpp_type=7, label=1,
-      has_default_value=False, default_value=False,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='status', full_name='build.bazel.remote.execution.v2.ExecuteResponse.status', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='server_logs', full_name='build.bazel.remote.execution.v2.ExecuteResponse.server_logs', index=3,
-      number=4, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[_EXECUTERESPONSE_SERVERLOGSENTRY, ],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=3316,
-  serialized_end=3635,
-)
-
-
-_EXECUTEOPERATIONMETADATA = _descriptor.Descriptor(
-  name='ExecuteOperationMetadata',
-  full_name='build.bazel.remote.execution.v2.ExecuteOperationMetadata',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='stage', full_name='build.bazel.remote.execution.v2.ExecuteOperationMetadata.stage', index=0,
-      number=1, type=14, cpp_type=8, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='action_digest', full_name='build.bazel.remote.execution.v2.ExecuteOperationMetadata.action_digest', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='stdout_stream_name', full_name='build.bazel.remote.execution.v2.ExecuteOperationMetadata.stdout_stream_name', index=2,
-      number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='stderr_stream_name', full_name='build.bazel.remote.execution.v2.ExecuteOperationMetadata.stderr_stream_name', index=3,
-      number=4, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-    _EXECUTEOPERATIONMETADATA_STAGE,
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=3638,
-  serialized_end=3945,
-)
-
-
-_WAITEXECUTIONREQUEST = _descriptor.Descriptor(
-  name='WaitExecutionRequest',
-  full_name='build.bazel.remote.execution.v2.WaitExecutionRequest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='name', full_name='build.bazel.remote.execution.v2.WaitExecutionRequest.name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=3947,
-  serialized_end=3983,
-)
-
-
-_GETACTIONRESULTREQUEST = _descriptor.Descriptor(
-  name='GetActionResultRequest',
-  full_name='build.bazel.remote.execution.v2.GetActionResultRequest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='instance_name', full_name='build.bazel.remote.execution.v2.GetActionResultRequest.instance_name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='action_digest', full_name='build.bazel.remote.execution.v2.GetActionResultRequest.action_digest', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=3985,
-  serialized_end=4096,
-)
-
-
-_UPDATEACTIONRESULTREQUEST = _descriptor.Descriptor(
-  name='UpdateActionResultRequest',
-  full_name='build.bazel.remote.execution.v2.UpdateActionResultRequest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='instance_name', full_name='build.bazel.remote.execution.v2.UpdateActionResultRequest.instance_name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='action_digest', full_name='build.bazel.remote.execution.v2.UpdateActionResultRequest.action_digest', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='action_result', full_name='build.bazel.remote.execution.v2.UpdateActionResultRequest.action_result', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='results_cache_policy', full_name='build.bazel.remote.execution.v2.UpdateActionResultRequest.results_cache_policy', index=3,
-      number=4, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=4099,
-  serialized_end=4366,
-)
-
-
-_FINDMISSINGBLOBSREQUEST = _descriptor.Descriptor(
-  name='FindMissingBlobsRequest',
-  full_name='build.bazel.remote.execution.v2.FindMissingBlobsRequest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='instance_name', full_name='build.bazel.remote.execution.v2.FindMissingBlobsRequest.instance_name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='blob_digests', full_name='build.bazel.remote.execution.v2.FindMissingBlobsRequest.blob_digests', index=1,
-      number=2, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=4368,
-  serialized_end=4479,
-)
-
-
-_FINDMISSINGBLOBSRESPONSE = _descriptor.Descriptor(
-  name='FindMissingBlobsResponse',
-  full_name='build.bazel.remote.execution.v2.FindMissingBlobsResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='missing_blob_digests', full_name='build.bazel.remote.execution.v2.FindMissingBlobsResponse.missing_blob_digests', index=0,
-      number=2, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=4481,
-  serialized_end=4578,
-)
-
-
-_BATCHUPDATEBLOBSREQUEST_REQUEST = _descriptor.Descriptor(
-  name='Request',
-  full_name='build.bazel.remote.execution.v2.BatchUpdateBlobsRequest.Request',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='digest', full_name='build.bazel.remote.execution.v2.BatchUpdateBlobsRequest.Request.digest', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='data', full_name='build.bazel.remote.execution.v2.BatchUpdateBlobsRequest.Request.data', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b(""),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=4715,
-  serialized_end=4795,
-)
-
-_BATCHUPDATEBLOBSREQUEST = _descriptor.Descriptor(
-  name='BatchUpdateBlobsRequest',
-  full_name='build.bazel.remote.execution.v2.BatchUpdateBlobsRequest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='instance_name', full_name='build.bazel.remote.execution.v2.BatchUpdateBlobsRequest.instance_name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='requests', full_name='build.bazel.remote.execution.v2.BatchUpdateBlobsRequest.requests', index=1,
-      number=2, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[_BATCHUPDATEBLOBSREQUEST_REQUEST, ],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=4581,
-  serialized_end=4795,
-)
-
-
-_BATCHUPDATEBLOBSRESPONSE_RESPONSE = _descriptor.Descriptor(
-  name='Response',
-  full_name='build.bazel.remote.execution.v2.BatchUpdateBlobsResponse.Response',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='digest', full_name='build.bazel.remote.execution.v2.BatchUpdateBlobsResponse.Response.digest', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='status', full_name='build.bazel.remote.execution.v2.BatchUpdateBlobsResponse.Response.status', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=4913,
-  serialized_end=5016,
-)
-
-_BATCHUPDATEBLOBSRESPONSE = _descriptor.Descriptor(
-  name='BatchUpdateBlobsResponse',
-  full_name='build.bazel.remote.execution.v2.BatchUpdateBlobsResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='responses', full_name='build.bazel.remote.execution.v2.BatchUpdateBlobsResponse.responses', index=0,
-      number=1, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[_BATCHUPDATEBLOBSRESPONSE_RESPONSE, ],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=4798,
-  serialized_end=5016,
-)
-
-
-_BATCHREADBLOBSREQUEST = _descriptor.Descriptor(
-  name='BatchReadBlobsRequest',
-  full_name='build.bazel.remote.execution.v2.BatchReadBlobsRequest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='instance_name', full_name='build.bazel.remote.execution.v2.BatchReadBlobsRequest.instance_name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='digests', full_name='build.bazel.remote.execution.v2.BatchReadBlobsRequest.digests', index=1,
-      number=2, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=5018,
-  serialized_end=5122,
-)
-
-
-_BATCHREADBLOBSRESPONSE_RESPONSE = _descriptor.Descriptor(
-  name='Response',
-  full_name='build.bazel.remote.execution.v2.BatchReadBlobsResponse.Response',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='digest', full_name='build.bazel.remote.execution.v2.BatchReadBlobsResponse.Response.digest', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='data', full_name='build.bazel.remote.execution.v2.BatchReadBlobsResponse.Response.data', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b(""),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='status', full_name='build.bazel.remote.execution.v2.BatchReadBlobsResponse.Response.status', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=5236,
-  serialized_end=5353,
-)
-
-_BATCHREADBLOBSRESPONSE = _descriptor.Descriptor(
-  name='BatchReadBlobsResponse',
-  full_name='build.bazel.remote.execution.v2.BatchReadBlobsResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='responses', full_name='build.bazel.remote.execution.v2.BatchReadBlobsResponse.responses', index=0,
-      number=1, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[_BATCHREADBLOBSRESPONSE_RESPONSE, ],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=5125,
-  serialized_end=5353,
-)
-
-
-_GETTREEREQUEST = _descriptor.Descriptor(
-  name='GetTreeRequest',
-  full_name='build.bazel.remote.execution.v2.GetTreeRequest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='instance_name', full_name='build.bazel.remote.execution.v2.GetTreeRequest.instance_name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='root_digest', full_name='build.bazel.remote.execution.v2.GetTreeRequest.root_digest', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='page_size', full_name='build.bazel.remote.execution.v2.GetTreeRequest.page_size', index=2,
-      number=3, type=5, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='page_token', full_name='build.bazel.remote.execution.v2.GetTreeRequest.page_token', index=3,
-      number=4, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=5356,
-  serialized_end=5496,
-)
-
-
-_GETTREERESPONSE = _descriptor.Descriptor(
-  name='GetTreeResponse',
-  full_name='build.bazel.remote.execution.v2.GetTreeResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='directories', full_name='build.bazel.remote.execution.v2.GetTreeResponse.directories', index=0,
-      number=1, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='next_page_token', full_name='build.bazel.remote.execution.v2.GetTreeResponse.next_page_token', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=5498,
-  serialized_end=5605,
-)
-
-
-_GETCAPABILITIESREQUEST = _descriptor.Descriptor(
-  name='GetCapabilitiesRequest',
-  full_name='build.bazel.remote.execution.v2.GetCapabilitiesRequest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='instance_name', full_name='build.bazel.remote.execution.v2.GetCapabilitiesRequest.instance_name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=5607,
-  serialized_end=5654,
-)
-
-
-_SERVERCAPABILITIES = _descriptor.Descriptor(
-  name='ServerCapabilities',
-  full_name='build.bazel.remote.execution.v2.ServerCapabilities',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='cache_capabilities', full_name='build.bazel.remote.execution.v2.ServerCapabilities.cache_capabilities', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='execution_capabilities', full_name='build.bazel.remote.execution.v2.ServerCapabilities.execution_capabilities', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='deprecated_api_version', full_name='build.bazel.remote.execution.v2.ServerCapabilities.deprecated_api_version', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='low_api_version', full_name='build.bazel.remote.execution.v2.ServerCapabilities.low_api_version', index=3,
-      number=4, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='high_api_version', full_name='build.bazel.remote.execution.v2.ServerCapabilities.high_api_version', index=4,
-      number=5, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=5657,
-  serialized_end=6012,
-)
-
-
-_ACTIONCACHEUPDATECAPABILITIES = _descriptor.Descriptor(
-  name='ActionCacheUpdateCapabilities',
-  full_name='build.bazel.remote.execution.v2.ActionCacheUpdateCapabilities',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='update_enabled', full_name='build.bazel.remote.execution.v2.ActionCacheUpdateCapabilities.update_enabled', index=0,
-      number=1, type=8, cpp_type=7, label=1,
-      has_default_value=False, default_value=False,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=6014,
-  serialized_end=6069,
-)
-
-
-_PRIORITYCAPABILITIES_PRIORITYRANGE = _descriptor.Descriptor(
-  name='PriorityRange',
-  full_name='build.bazel.remote.execution.v2.PriorityCapabilities.PriorityRange',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='min_priority', full_name='build.bazel.remote.execution.v2.PriorityCapabilities.PriorityRange.min_priority', index=0,
-      number=1, type=5, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='max_priority', full_name='build.bazel.remote.execution.v2.PriorityCapabilities.PriorityRange.max_priority', index=1,
-      number=2, type=5, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=6185,
-  serialized_end=6244,
-)
-
-_PRIORITYCAPABILITIES = _descriptor.Descriptor(
-  name='PriorityCapabilities',
-  full_name='build.bazel.remote.execution.v2.PriorityCapabilities',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='priorities', full_name='build.bazel.remote.execution.v2.PriorityCapabilities.priorities', index=0,
-      number=1, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[_PRIORITYCAPABILITIES_PRIORITYRANGE, ],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=6072,
-  serialized_end=6244,
-)
-
-
-_CACHECAPABILITIES = _descriptor.Descriptor(
-  name='CacheCapabilities',
-  full_name='build.bazel.remote.execution.v2.CacheCapabilities',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='digest_function', full_name='build.bazel.remote.execution.v2.CacheCapabilities.digest_function', index=0,
-      number=1, type=14, cpp_type=8, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='action_cache_update_capabilities', full_name='build.bazel.remote.execution.v2.CacheCapabilities.action_cache_update_capabilities', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='cache_priority_capabilities', full_name='build.bazel.remote.execution.v2.CacheCapabilities.cache_priority_capabilities', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='max_batch_total_size_bytes', full_name='build.bazel.remote.execution.v2.CacheCapabilities.max_batch_total_size_bytes', index=3,
-      number=4, type=3, cpp_type=2, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='symlink_absolute_path_strategy', full_name='build.bazel.remote.execution.v2.CacheCapabilities.symlink_absolute_path_strategy', index=4,
-      number=5, type=14, cpp_type=8, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-    _CACHECAPABILITIES_SYMLINKABSOLUTEPATHSTRATEGY,
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=6247,
-  serialized_end=6767,
-)
-
-
-_EXECUTIONCAPABILITIES = _descriptor.Descriptor(
-  name='ExecutionCapabilities',
-  full_name='build.bazel.remote.execution.v2.ExecutionCapabilities',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='digest_function', full_name='build.bazel.remote.execution.v2.ExecutionCapabilities.digest_function', index=0,
-      number=1, type=14, cpp_type=8, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='exec_enabled', full_name='build.bazel.remote.execution.v2.ExecutionCapabilities.exec_enabled', index=1,
-      number=2, type=8, cpp_type=7, label=1,
-      has_default_value=False, default_value=False,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='execution_priority_capabilities', full_name='build.bazel.remote.execution.v2.ExecutionCapabilities.execution_priority_capabilities', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=6770,
-  serialized_end=6985,
-)
-
-
-_TOOLDETAILS = _descriptor.Descriptor(
-  name='ToolDetails',
-  full_name='build.bazel.remote.execution.v2.ToolDetails',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='tool_name', full_name='build.bazel.remote.execution.v2.ToolDetails.tool_name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='tool_version', full_name='build.bazel.remote.execution.v2.ToolDetails.tool_version', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=6987,
-  serialized_end=7041,
-)
-
-
-_REQUESTMETADATA = _descriptor.Descriptor(
-  name='RequestMetadata',
-  full_name='build.bazel.remote.execution.v2.RequestMetadata',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='tool_details', full_name='build.bazel.remote.execution.v2.RequestMetadata.tool_details', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='action_id', full_name='build.bazel.remote.execution.v2.RequestMetadata.action_id', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='tool_invocation_id', full_name='build.bazel.remote.execution.v2.RequestMetadata.tool_invocation_id', index=2,
-      number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='correlated_invocations_id', full_name='build.bazel.remote.execution.v2.RequestMetadata.correlated_invocations_id', index=3,
-      number=4, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=7044,
-  serialized_end=7211,
-)
-
-_ACTION.fields_by_name['command_digest'].message_type = _DIGEST
-_ACTION.fields_by_name['input_root_digest'].message_type = _DIGEST
-_ACTION.fields_by_name['timeout'].message_type = google_dot_protobuf_dot_duration__pb2._DURATION
-_COMMAND_ENVIRONMENTVARIABLE.containing_type = _COMMAND
-_COMMAND.fields_by_name['environment_variables'].message_type = _COMMAND_ENVIRONMENTVARIABLE
-_COMMAND.fields_by_name['platform'].message_type = _PLATFORM
-_PLATFORM_PROPERTY.containing_type = _PLATFORM
-_PLATFORM.fields_by_name['properties'].message_type = _PLATFORM_PROPERTY
-_DIRECTORY.fields_by_name['files'].message_type = _FILENODE
-_DIRECTORY.fields_by_name['directories'].message_type = _DIRECTORYNODE
-_DIRECTORY.fields_by_name['symlinks'].message_type = _SYMLINKNODE
-_FILENODE.fields_by_name['digest'].message_type = _DIGEST
-_DIRECTORYNODE.fields_by_name['digest'].message_type = _DIGEST
-_EXECUTEDACTIONMETADATA.fields_by_name['queued_timestamp'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
-_EXECUTEDACTIONMETADATA.fields_by_name['worker_start_timestamp'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
-_EXECUTEDACTIONMETADATA.fields_by_name['worker_completed_timestamp'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
-_EXECUTEDACTIONMETADATA.fields_by_name['input_fetch_start_timestamp'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
-_EXECUTEDACTIONMETADATA.fields_by_name['input_fetch_completed_timestamp'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
-_EXECUTEDACTIONMETADATA.fields_by_name['execution_start_timestamp'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
-_EXECUTEDACTIONMETADATA.fields_by_name['execution_completed_timestamp'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
-_EXECUTEDACTIONMETADATA.fields_by_name['output_upload_start_timestamp'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
-_EXECUTEDACTIONMETADATA.fields_by_name['output_upload_completed_timestamp'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
-_ACTIONRESULT.fields_by_name['output_files'].message_type = _OUTPUTFILE
-_ACTIONRESULT.fields_by_name['output_directories'].message_type = _OUTPUTDIRECTORY
-_ACTIONRESULT.fields_by_name['stdout_digest'].message_type = _DIGEST
-_ACTIONRESULT.fields_by_name['stderr_digest'].message_type = _DIGEST
-_ACTIONRESULT.fields_by_name['execution_metadata'].message_type = _EXECUTEDACTIONMETADATA
-_OUTPUTFILE.fields_by_name['digest'].message_type = _DIGEST
-_TREE.fields_by_name['root'].message_type = _DIRECTORY
-_TREE.fields_by_name['children'].message_type = _DIRECTORY
-_OUTPUTDIRECTORY.fields_by_name['tree_digest'].message_type = _DIGEST
-_EXECUTEREQUEST.fields_by_name['action_digest'].message_type = _DIGEST
-_EXECUTEREQUEST.fields_by_name['execution_policy'].message_type = _EXECUTIONPOLICY
-_EXECUTEREQUEST.fields_by_name['results_cache_policy'].message_type = _RESULTSCACHEPOLICY
-_LOGFILE.fields_by_name['digest'].message_type = _DIGEST
-_EXECUTERESPONSE_SERVERLOGSENTRY.fields_by_name['value'].message_type = _LOGFILE
-_EXECUTERESPONSE_SERVERLOGSENTRY.containing_type = _EXECUTERESPONSE
-_EXECUTERESPONSE.fields_by_name['result'].message_type = _ACTIONRESULT
-_EXECUTERESPONSE.fields_by_name['status'].message_type = google_dot_rpc_dot_status__pb2._STATUS
-_EXECUTERESPONSE.fields_by_name['server_logs'].message_type = _EXECUTERESPONSE_SERVERLOGSENTRY
-_EXECUTEOPERATIONMETADATA.fields_by_name['stage'].enum_type = _EXECUTEOPERATIONMETADATA_STAGE
-_EXECUTEOPERATIONMETADATA.fields_by_name['action_digest'].message_type = _DIGEST
-_EXECUTEOPERATIONMETADATA_STAGE.containing_type = _EXECUTEOPERATIONMETADATA
-_GETACTIONRESULTREQUEST.fields_by_name['action_digest'].message_type = _DIGEST
-_UPDATEACTIONRESULTREQUEST.fields_by_name['action_digest'].message_type = _DIGEST
-_UPDATEACTIONRESULTREQUEST.fields_by_name['action_result'].message_type = _ACTIONRESULT
-_UPDATEACTIONRESULTREQUEST.fields_by_name['results_cache_policy'].message_type = _RESULTSCACHEPOLICY
-_FINDMISSINGBLOBSREQUEST.fields_by_name['blob_digests'].message_type = _DIGEST
-_FINDMISSINGBLOBSRESPONSE.fields_by_name['missing_blob_digests'].message_type = _DIGEST
-_BATCHUPDATEBLOBSREQUEST_REQUEST.fields_by_name['digest'].message_type = _DIGEST
-_BATCHUPDATEBLOBSREQUEST_REQUEST.containing_type = _BATCHUPDATEBLOBSREQUEST
-_BATCHUPDATEBLOBSREQUEST.fields_by_name['requests'].message_type = _BATCHUPDATEBLOBSREQUEST_REQUEST
-_BATCHUPDATEBLOBSRESPONSE_RESPONSE.fields_by_name['digest'].message_type = _DIGEST
-_BATCHUPDATEBLOBSRESPONSE_RESPONSE.fields_by_name['status'].message_type = google_dot_rpc_dot_status__pb2._STATUS
-_BATCHUPDATEBLOBSRESPONSE_RESPONSE.containing_type = _BATCHUPDATEBLOBSRESPONSE
-_BATCHUPDATEBLOBSRESPONSE.fields_by_name['responses'].message_type = _BATCHUPDATEBLOBSRESPONSE_RESPONSE
-_BATCHREADBLOBSREQUEST.fields_by_name['digests'].message_type = _DIGEST
-_BATCHREADBLOBSRESPONSE_RESPONSE.fields_by_name['digest'].message_type = _DIGEST
-_BATCHREADBLOBSRESPONSE_RESPONSE.fields_by_name['status'].message_type = google_dot_rpc_dot_status__pb2._STATUS
-_BATCHREADBLOBSRESPONSE_RESPONSE.containing_type = _BATCHREADBLOBSRESPONSE
-_BATCHREADBLOBSRESPONSE.fields_by_name['responses'].message_type = _BATCHREADBLOBSRESPONSE_RESPONSE
-_GETTREEREQUEST.fields_by_name['root_digest'].message_type = _DIGEST
-_GETTREERESPONSE.fields_by_name['directories'].message_type = _DIRECTORY
-_SERVERCAPABILITIES.fields_by_name['cache_capabilities'].message_type = _CACHECAPABILITIES
-_SERVERCAPABILITIES.fields_by_name['execution_capabilities'].message_type = _EXECUTIONCAPABILITIES
-_SERVERCAPABILITIES.fields_by_name['deprecated_api_version'].message_type = build_dot_bazel_dot_semver_dot_semver__pb2._SEMVER
-_SERVERCAPABILITIES.fields_by_name['low_api_version'].message_type = build_dot_bazel_dot_semver_dot_semver__pb2._SEMVER
-_SERVERCAPABILITIES.fields_by_name['high_api_version'].message_type = build_dot_bazel_dot_semver_dot_semver__pb2._SEMVER
-_PRIORITYCAPABILITIES_PRIORITYRANGE.containing_type = _PRIORITYCAPABILITIES
-_PRIORITYCAPABILITIES.fields_by_name['priorities'].message_type = _PRIORITYCAPABILITIES_PRIORITYRANGE
-_CACHECAPABILITIES.fields_by_name['digest_function'].enum_type = _DIGESTFUNCTION
-_CACHECAPABILITIES.fields_by_name['action_cache_update_capabilities'].message_type = _ACTIONCACHEUPDATECAPABILITIES
-_CACHECAPABILITIES.fields_by_name['cache_priority_capabilities'].message_type = _PRIORITYCAPABILITIES
-_CACHECAPABILITIES.fields_by_name['symlink_absolute_path_strategy'].enum_type = _CACHECAPABILITIES_SYMLINKABSOLUTEPATHSTRATEGY
-_CACHECAPABILITIES_SYMLINKABSOLUTEPATHSTRATEGY.containing_type = _CACHECAPABILITIES
-_EXECUTIONCAPABILITIES.fields_by_name['digest_function'].enum_type = _DIGESTFUNCTION
-_EXECUTIONCAPABILITIES.fields_by_name['execution_priority_capabilities'].message_type = _PRIORITYCAPABILITIES
-_REQUESTMETADATA.fields_by_name['tool_details'].message_type = _TOOLDETAILS
-DESCRIPTOR.message_types_by_name['Action'] = _ACTION
-DESCRIPTOR.message_types_by_name['Command'] = _COMMAND
-DESCRIPTOR.message_types_by_name['Platform'] = _PLATFORM
-DESCRIPTOR.message_types_by_name['Directory'] = _DIRECTORY
-DESCRIPTOR.message_types_by_name['FileNode'] = _FILENODE
-DESCRIPTOR.message_types_by_name['DirectoryNode'] = _DIRECTORYNODE
-DESCRIPTOR.message_types_by_name['SymlinkNode'] = _SYMLINKNODE
-DESCRIPTOR.message_types_by_name['Digest'] = _DIGEST
-DESCRIPTOR.message_types_by_name['ExecutedActionMetadata'] = _EXECUTEDACTIONMETADATA
-DESCRIPTOR.message_types_by_name['ActionResult'] = _ACTIONRESULT
-DESCRIPTOR.message_types_by_name['OutputFile'] = _OUTPUTFILE
-DESCRIPTOR.message_types_by_name['Tree'] = _TREE
-DESCRIPTOR.message_types_by_name['OutputDirectory'] = _OUTPUTDIRECTORY
-DESCRIPTOR.message_types_by_name['ExecutionPolicy'] = _EXECUTIONPOLICY
-DESCRIPTOR.message_types_by_name['ResultsCachePolicy'] = _RESULTSCACHEPOLICY
-DESCRIPTOR.message_types_by_name['ExecuteRequest'] = _EXECUTEREQUEST
-DESCRIPTOR.message_types_by_name['LogFile'] = _LOGFILE
-DESCRIPTOR.message_types_by_name['ExecuteResponse'] = _EXECUTERESPONSE
-DESCRIPTOR.message_types_by_name['ExecuteOperationMetadata'] = _EXECUTEOPERATIONMETADATA
-DESCRIPTOR.message_types_by_name['WaitExecutionRequest'] = _WAITEXECUTIONREQUEST
-DESCRIPTOR.message_types_by_name['GetActionResultRequest'] = _GETACTIONRESULTREQUEST
-DESCRIPTOR.message_types_by_name['UpdateActionResultRequest'] = _UPDATEACTIONRESULTREQUEST
-DESCRIPTOR.message_types_by_name['FindMissingBlobsRequest'] = _FINDMISSINGBLOBSREQUEST
-DESCRIPTOR.message_types_by_name['FindMissingBlobsResponse'] = _FINDMISSINGBLOBSRESPONSE
-DESCRIPTOR.message_types_by_name['BatchUpdateBlobsRequest'] = _BATCHUPDATEBLOBSREQUEST
-DESCRIPTOR.message_types_by_name['BatchUpdateBlobsResponse'] = _BATCHUPDATEBLOBSRESPONSE
-DESCRIPTOR.message_types_by_name['BatchReadBlobsRequest'] = _BATCHREADBLOBSREQUEST
-DESCRIPTOR.message_types_by_name['BatchReadBlobsResponse'] = _BATCHREADBLOBSRESPONSE
-DESCRIPTOR.message_types_by_name['GetTreeRequest'] = _GETTREEREQUEST
-DESCRIPTOR.message_types_by_name['GetTreeResponse'] = _GETTREERESPONSE
-DESCRIPTOR.message_types_by_name['GetCapabilitiesRequest'] = _GETCAPABILITIESREQUEST
-DESCRIPTOR.message_types_by_name['ServerCapabilities'] = _SERVERCAPABILITIES
-DESCRIPTOR.message_types_by_name['ActionCacheUpdateCapabilities'] = _ACTIONCACHEUPDATECAPABILITIES
-DESCRIPTOR.message_types_by_name['PriorityCapabilities'] = _PRIORITYCAPABILITIES
-DESCRIPTOR.message_types_by_name['CacheCapabilities'] = _CACHECAPABILITIES
-DESCRIPTOR.message_types_by_name['ExecutionCapabilities'] = _EXECUTIONCAPABILITIES
-DESCRIPTOR.message_types_by_name['ToolDetails'] = _TOOLDETAILS
-DESCRIPTOR.message_types_by_name['RequestMetadata'] = _REQUESTMETADATA
-DESCRIPTOR.enum_types_by_name['DigestFunction'] = _DIGESTFUNCTION
-_sym_db.RegisterFileDescriptor(DESCRIPTOR)
-
-Action = _reflection.GeneratedProtocolMessageType('Action', (_message.Message,), dict(
-  DESCRIPTOR = _ACTION,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+_ACTION = DESCRIPTOR.message_types_by_name['Action']
+_COMMAND = DESCRIPTOR.message_types_by_name['Command']
+_COMMAND_ENVIRONMENTVARIABLE = _COMMAND.nested_types_by_name['EnvironmentVariable']
+_PLATFORM = DESCRIPTOR.message_types_by_name['Platform']
+_PLATFORM_PROPERTY = _PLATFORM.nested_types_by_name['Property']
+_DIRECTORY = DESCRIPTOR.message_types_by_name['Directory']
+_FILENODE = DESCRIPTOR.message_types_by_name['FileNode']
+_DIRECTORYNODE = DESCRIPTOR.message_types_by_name['DirectoryNode']
+_SYMLINKNODE = DESCRIPTOR.message_types_by_name['SymlinkNode']
+_DIGEST = DESCRIPTOR.message_types_by_name['Digest']
+_EXECUTEDACTIONMETADATA = DESCRIPTOR.message_types_by_name['ExecutedActionMetadata']
+_ACTIONRESULT = DESCRIPTOR.message_types_by_name['ActionResult']
+_OUTPUTFILE = DESCRIPTOR.message_types_by_name['OutputFile']
+_TREE = DESCRIPTOR.message_types_by_name['Tree']
+_OUTPUTDIRECTORY = DESCRIPTOR.message_types_by_name['OutputDirectory']
+_EXECUTIONPOLICY = DESCRIPTOR.message_types_by_name['ExecutionPolicy']
+_RESULTSCACHEPOLICY = DESCRIPTOR.message_types_by_name['ResultsCachePolicy']
+_EXECUTEREQUEST = DESCRIPTOR.message_types_by_name['ExecuteRequest']
+_LOGFILE = DESCRIPTOR.message_types_by_name['LogFile']
+_EXECUTERESPONSE = DESCRIPTOR.message_types_by_name['ExecuteResponse']
+_EXECUTERESPONSE_SERVERLOGSENTRY = _EXECUTERESPONSE.nested_types_by_name['ServerLogsEntry']
+_EXECUTEOPERATIONMETADATA = DESCRIPTOR.message_types_by_name['ExecuteOperationMetadata']
+_WAITEXECUTIONREQUEST = DESCRIPTOR.message_types_by_name['WaitExecutionRequest']
+_GETACTIONRESULTREQUEST = DESCRIPTOR.message_types_by_name['GetActionResultRequest']
+_UPDATEACTIONRESULTREQUEST = DESCRIPTOR.message_types_by_name['UpdateActionResultRequest']
+_FINDMISSINGBLOBSREQUEST = DESCRIPTOR.message_types_by_name['FindMissingBlobsRequest']
+_FINDMISSINGBLOBSRESPONSE = DESCRIPTOR.message_types_by_name['FindMissingBlobsResponse']
+_BATCHUPDATEBLOBSREQUEST = DESCRIPTOR.message_types_by_name['BatchUpdateBlobsRequest']
+_BATCHUPDATEBLOBSREQUEST_REQUEST = _BATCHUPDATEBLOBSREQUEST.nested_types_by_name['Request']
+_BATCHUPDATEBLOBSRESPONSE = DESCRIPTOR.message_types_by_name['BatchUpdateBlobsResponse']
+_BATCHUPDATEBLOBSRESPONSE_RESPONSE = _BATCHUPDATEBLOBSRESPONSE.nested_types_by_name['Response']
+_BATCHREADBLOBSREQUEST = DESCRIPTOR.message_types_by_name['BatchReadBlobsRequest']
+_BATCHREADBLOBSRESPONSE = DESCRIPTOR.message_types_by_name['BatchReadBlobsResponse']
+_BATCHREADBLOBSRESPONSE_RESPONSE = _BATCHREADBLOBSRESPONSE.nested_types_by_name['Response']
+_GETTREEREQUEST = DESCRIPTOR.message_types_by_name['GetTreeRequest']
+_GETTREERESPONSE = DESCRIPTOR.message_types_by_name['GetTreeResponse']
+_GETCAPABILITIESREQUEST = DESCRIPTOR.message_types_by_name['GetCapabilitiesRequest']
+_SERVERCAPABILITIES = DESCRIPTOR.message_types_by_name['ServerCapabilities']
+_ACTIONCACHEUPDATECAPABILITIES = DESCRIPTOR.message_types_by_name['ActionCacheUpdateCapabilities']
+_PRIORITYCAPABILITIES = DESCRIPTOR.message_types_by_name['PriorityCapabilities']
+_PRIORITYCAPABILITIES_PRIORITYRANGE = _PRIORITYCAPABILITIES.nested_types_by_name['PriorityRange']
+_CACHECAPABILITIES = DESCRIPTOR.message_types_by_name['CacheCapabilities']
+_EXECUTIONCAPABILITIES = DESCRIPTOR.message_types_by_name['ExecutionCapabilities']
+_TOOLDETAILS = DESCRIPTOR.message_types_by_name['ToolDetails']
+_REQUESTMETADATA = DESCRIPTOR.message_types_by_name['RequestMetadata']
+_EXECUTEOPERATIONMETADATA_STAGE = _EXECUTEOPERATIONMETADATA.enum_types_by_name['Stage']
+_CACHECAPABILITIES_SYMLINKABSOLUTEPATHSTRATEGY = _CACHECAPABILITIES.enum_types_by_name['SymlinkAbsolutePathStrategy']
+Action = _reflection.GeneratedProtocolMessageType('Action', (_message.Message,), {
+  'DESCRIPTOR' : _ACTION,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.Action)
-  ))
+  })
 _sym_db.RegisterMessage(Action)
 
-Command = _reflection.GeneratedProtocolMessageType('Command', (_message.Message,), dict(
+Command = _reflection.GeneratedProtocolMessageType('Command', (_message.Message,), {
 
-  EnvironmentVariable = _reflection.GeneratedProtocolMessageType('EnvironmentVariable', (_message.Message,), dict(
-    DESCRIPTOR = _COMMAND_ENVIRONMENTVARIABLE,
-    __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+  'EnvironmentVariable' : _reflection.GeneratedProtocolMessageType('EnvironmentVariable', (_message.Message,), {
+    'DESCRIPTOR' : _COMMAND_ENVIRONMENTVARIABLE,
+    '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
     # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.Command.EnvironmentVariable)
-    ))
+    })
   ,
-  DESCRIPTOR = _COMMAND,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+  'DESCRIPTOR' : _COMMAND,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.Command)
-  ))
+  })
 _sym_db.RegisterMessage(Command)
 _sym_db.RegisterMessage(Command.EnvironmentVariable)
 
-Platform = _reflection.GeneratedProtocolMessageType('Platform', (_message.Message,), dict(
+Platform = _reflection.GeneratedProtocolMessageType('Platform', (_message.Message,), {
 
-  Property = _reflection.GeneratedProtocolMessageType('Property', (_message.Message,), dict(
-    DESCRIPTOR = _PLATFORM_PROPERTY,
-    __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+  'Property' : _reflection.GeneratedProtocolMessageType('Property', (_message.Message,), {
+    'DESCRIPTOR' : _PLATFORM_PROPERTY,
+    '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
     # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.Platform.Property)
-    ))
+    })
   ,
-  DESCRIPTOR = _PLATFORM,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+  'DESCRIPTOR' : _PLATFORM,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.Platform)
-  ))
+  })
 _sym_db.RegisterMessage(Platform)
 _sym_db.RegisterMessage(Platform.Property)
 
-Directory = _reflection.GeneratedProtocolMessageType('Directory', (_message.Message,), dict(
-  DESCRIPTOR = _DIRECTORY,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+Directory = _reflection.GeneratedProtocolMessageType('Directory', (_message.Message,), {
+  'DESCRIPTOR' : _DIRECTORY,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.Directory)
-  ))
+  })
 _sym_db.RegisterMessage(Directory)
 
-FileNode = _reflection.GeneratedProtocolMessageType('FileNode', (_message.Message,), dict(
-  DESCRIPTOR = _FILENODE,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+FileNode = _reflection.GeneratedProtocolMessageType('FileNode', (_message.Message,), {
+  'DESCRIPTOR' : _FILENODE,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.FileNode)
-  ))
+  })
 _sym_db.RegisterMessage(FileNode)
 
-DirectoryNode = _reflection.GeneratedProtocolMessageType('DirectoryNode', (_message.Message,), dict(
-  DESCRIPTOR = _DIRECTORYNODE,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+DirectoryNode = _reflection.GeneratedProtocolMessageType('DirectoryNode', (_message.Message,), {
+  'DESCRIPTOR' : _DIRECTORYNODE,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.DirectoryNode)
-  ))
+  })
 _sym_db.RegisterMessage(DirectoryNode)
 
-SymlinkNode = _reflection.GeneratedProtocolMessageType('SymlinkNode', (_message.Message,), dict(
-  DESCRIPTOR = _SYMLINKNODE,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+SymlinkNode = _reflection.GeneratedProtocolMessageType('SymlinkNode', (_message.Message,), {
+  'DESCRIPTOR' : _SYMLINKNODE,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.SymlinkNode)
-  ))
+  })
 _sym_db.RegisterMessage(SymlinkNode)
 
-Digest = _reflection.GeneratedProtocolMessageType('Digest', (_message.Message,), dict(
-  DESCRIPTOR = _DIGEST,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+Digest = _reflection.GeneratedProtocolMessageType('Digest', (_message.Message,), {
+  'DESCRIPTOR' : _DIGEST,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.Digest)
-  ))
+  })
 _sym_db.RegisterMessage(Digest)
 
-ExecutedActionMetadata = _reflection.GeneratedProtocolMessageType('ExecutedActionMetadata', (_message.Message,), dict(
-  DESCRIPTOR = _EXECUTEDACTIONMETADATA,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+ExecutedActionMetadata = _reflection.GeneratedProtocolMessageType('ExecutedActionMetadata', (_message.Message,), {
+  'DESCRIPTOR' : _EXECUTEDACTIONMETADATA,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.ExecutedActionMetadata)
-  ))
+  })
 _sym_db.RegisterMessage(ExecutedActionMetadata)
 
-ActionResult = _reflection.GeneratedProtocolMessageType('ActionResult', (_message.Message,), dict(
-  DESCRIPTOR = _ACTIONRESULT,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+ActionResult = _reflection.GeneratedProtocolMessageType('ActionResult', (_message.Message,), {
+  'DESCRIPTOR' : _ACTIONRESULT,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.ActionResult)
-  ))
+  })
 _sym_db.RegisterMessage(ActionResult)
 
-OutputFile = _reflection.GeneratedProtocolMessageType('OutputFile', (_message.Message,), dict(
-  DESCRIPTOR = _OUTPUTFILE,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+OutputFile = _reflection.GeneratedProtocolMessageType('OutputFile', (_message.Message,), {
+  'DESCRIPTOR' : _OUTPUTFILE,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.OutputFile)
-  ))
+  })
 _sym_db.RegisterMessage(OutputFile)
 
-Tree = _reflection.GeneratedProtocolMessageType('Tree', (_message.Message,), dict(
-  DESCRIPTOR = _TREE,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+Tree = _reflection.GeneratedProtocolMessageType('Tree', (_message.Message,), {
+  'DESCRIPTOR' : _TREE,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.Tree)
-  ))
+  })
 _sym_db.RegisterMessage(Tree)
 
-OutputDirectory = _reflection.GeneratedProtocolMessageType('OutputDirectory', (_message.Message,), dict(
-  DESCRIPTOR = _OUTPUTDIRECTORY,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+OutputDirectory = _reflection.GeneratedProtocolMessageType('OutputDirectory', (_message.Message,), {
+  'DESCRIPTOR' : _OUTPUTDIRECTORY,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.OutputDirectory)
-  ))
+  })
 _sym_db.RegisterMessage(OutputDirectory)
 
-ExecutionPolicy = _reflection.GeneratedProtocolMessageType('ExecutionPolicy', (_message.Message,), dict(
-  DESCRIPTOR = _EXECUTIONPOLICY,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+ExecutionPolicy = _reflection.GeneratedProtocolMessageType('ExecutionPolicy', (_message.Message,), {
+  'DESCRIPTOR' : _EXECUTIONPOLICY,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.ExecutionPolicy)
-  ))
+  })
 _sym_db.RegisterMessage(ExecutionPolicy)
 
-ResultsCachePolicy = _reflection.GeneratedProtocolMessageType('ResultsCachePolicy', (_message.Message,), dict(
-  DESCRIPTOR = _RESULTSCACHEPOLICY,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+ResultsCachePolicy = _reflection.GeneratedProtocolMessageType('ResultsCachePolicy', (_message.Message,), {
+  'DESCRIPTOR' : _RESULTSCACHEPOLICY,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.ResultsCachePolicy)
-  ))
+  })
 _sym_db.RegisterMessage(ResultsCachePolicy)
 
-ExecuteRequest = _reflection.GeneratedProtocolMessageType('ExecuteRequest', (_message.Message,), dict(
-  DESCRIPTOR = _EXECUTEREQUEST,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+ExecuteRequest = _reflection.GeneratedProtocolMessageType('ExecuteRequest', (_message.Message,), {
+  'DESCRIPTOR' : _EXECUTEREQUEST,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.ExecuteRequest)
-  ))
+  })
 _sym_db.RegisterMessage(ExecuteRequest)
 
-LogFile = _reflection.GeneratedProtocolMessageType('LogFile', (_message.Message,), dict(
-  DESCRIPTOR = _LOGFILE,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+LogFile = _reflection.GeneratedProtocolMessageType('LogFile', (_message.Message,), {
+  'DESCRIPTOR' : _LOGFILE,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.LogFile)
-  ))
+  })
 _sym_db.RegisterMessage(LogFile)
 
-ExecuteResponse = _reflection.GeneratedProtocolMessageType('ExecuteResponse', (_message.Message,), dict(
+ExecuteResponse = _reflection.GeneratedProtocolMessageType('ExecuteResponse', (_message.Message,), {
 
-  ServerLogsEntry = _reflection.GeneratedProtocolMessageType('ServerLogsEntry', (_message.Message,), dict(
-    DESCRIPTOR = _EXECUTERESPONSE_SERVERLOGSENTRY,
-    __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+  'ServerLogsEntry' : _reflection.GeneratedProtocolMessageType('ServerLogsEntry', (_message.Message,), {
+    'DESCRIPTOR' : _EXECUTERESPONSE_SERVERLOGSENTRY,
+    '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
     # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.ExecuteResponse.ServerLogsEntry)
-    ))
+    })
   ,
-  DESCRIPTOR = _EXECUTERESPONSE,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+  'DESCRIPTOR' : _EXECUTERESPONSE,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.ExecuteResponse)
-  ))
+  })
 _sym_db.RegisterMessage(ExecuteResponse)
 _sym_db.RegisterMessage(ExecuteResponse.ServerLogsEntry)
 
-ExecuteOperationMetadata = _reflection.GeneratedProtocolMessageType('ExecuteOperationMetadata', (_message.Message,), dict(
-  DESCRIPTOR = _EXECUTEOPERATIONMETADATA,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+ExecuteOperationMetadata = _reflection.GeneratedProtocolMessageType('ExecuteOperationMetadata', (_message.Message,), {
+  'DESCRIPTOR' : _EXECUTEOPERATIONMETADATA,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.ExecuteOperationMetadata)
-  ))
+  })
 _sym_db.RegisterMessage(ExecuteOperationMetadata)
 
-WaitExecutionRequest = _reflection.GeneratedProtocolMessageType('WaitExecutionRequest', (_message.Message,), dict(
-  DESCRIPTOR = _WAITEXECUTIONREQUEST,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+WaitExecutionRequest = _reflection.GeneratedProtocolMessageType('WaitExecutionRequest', (_message.Message,), {
+  'DESCRIPTOR' : _WAITEXECUTIONREQUEST,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.WaitExecutionRequest)
-  ))
+  })
 _sym_db.RegisterMessage(WaitExecutionRequest)
 
-GetActionResultRequest = _reflection.GeneratedProtocolMessageType('GetActionResultRequest', (_message.Message,), dict(
-  DESCRIPTOR = _GETACTIONRESULTREQUEST,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+GetActionResultRequest = _reflection.GeneratedProtocolMessageType('GetActionResultRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETACTIONRESULTREQUEST,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.GetActionResultRequest)
-  ))
+  })
 _sym_db.RegisterMessage(GetActionResultRequest)
 
-UpdateActionResultRequest = _reflection.GeneratedProtocolMessageType('UpdateActionResultRequest', (_message.Message,), dict(
-  DESCRIPTOR = _UPDATEACTIONRESULTREQUEST,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+UpdateActionResultRequest = _reflection.GeneratedProtocolMessageType('UpdateActionResultRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATEACTIONRESULTREQUEST,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.UpdateActionResultRequest)
-  ))
+  })
 _sym_db.RegisterMessage(UpdateActionResultRequest)
 
-FindMissingBlobsRequest = _reflection.GeneratedProtocolMessageType('FindMissingBlobsRequest', (_message.Message,), dict(
-  DESCRIPTOR = _FINDMISSINGBLOBSREQUEST,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+FindMissingBlobsRequest = _reflection.GeneratedProtocolMessageType('FindMissingBlobsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _FINDMISSINGBLOBSREQUEST,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.FindMissingBlobsRequest)
-  ))
+  })
 _sym_db.RegisterMessage(FindMissingBlobsRequest)
 
-FindMissingBlobsResponse = _reflection.GeneratedProtocolMessageType('FindMissingBlobsResponse', (_message.Message,), dict(
-  DESCRIPTOR = _FINDMISSINGBLOBSRESPONSE,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+FindMissingBlobsResponse = _reflection.GeneratedProtocolMessageType('FindMissingBlobsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _FINDMISSINGBLOBSRESPONSE,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.FindMissingBlobsResponse)
-  ))
+  })
 _sym_db.RegisterMessage(FindMissingBlobsResponse)
 
-BatchUpdateBlobsRequest = _reflection.GeneratedProtocolMessageType('BatchUpdateBlobsRequest', (_message.Message,), dict(
+BatchUpdateBlobsRequest = _reflection.GeneratedProtocolMessageType('BatchUpdateBlobsRequest', (_message.Message,), {
 
-  Request = _reflection.GeneratedProtocolMessageType('Request', (_message.Message,), dict(
-    DESCRIPTOR = _BATCHUPDATEBLOBSREQUEST_REQUEST,
-    __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+  'Request' : _reflection.GeneratedProtocolMessageType('Request', (_message.Message,), {
+    'DESCRIPTOR' : _BATCHUPDATEBLOBSREQUEST_REQUEST,
+    '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
     # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.BatchUpdateBlobsRequest.Request)
-    ))
+    })
   ,
-  DESCRIPTOR = _BATCHUPDATEBLOBSREQUEST,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+  'DESCRIPTOR' : _BATCHUPDATEBLOBSREQUEST,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.BatchUpdateBlobsRequest)
-  ))
+  })
 _sym_db.RegisterMessage(BatchUpdateBlobsRequest)
 _sym_db.RegisterMessage(BatchUpdateBlobsRequest.Request)
 
-BatchUpdateBlobsResponse = _reflection.GeneratedProtocolMessageType('BatchUpdateBlobsResponse', (_message.Message,), dict(
+BatchUpdateBlobsResponse = _reflection.GeneratedProtocolMessageType('BatchUpdateBlobsResponse', (_message.Message,), {
 
-  Response = _reflection.GeneratedProtocolMessageType('Response', (_message.Message,), dict(
-    DESCRIPTOR = _BATCHUPDATEBLOBSRESPONSE_RESPONSE,
-    __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+  'Response' : _reflection.GeneratedProtocolMessageType('Response', (_message.Message,), {
+    'DESCRIPTOR' : _BATCHUPDATEBLOBSRESPONSE_RESPONSE,
+    '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
     # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.BatchUpdateBlobsResponse.Response)
-    ))
+    })
   ,
-  DESCRIPTOR = _BATCHUPDATEBLOBSRESPONSE,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+  'DESCRIPTOR' : _BATCHUPDATEBLOBSRESPONSE,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.BatchUpdateBlobsResponse)
-  ))
+  })
 _sym_db.RegisterMessage(BatchUpdateBlobsResponse)
 _sym_db.RegisterMessage(BatchUpdateBlobsResponse.Response)
 
-BatchReadBlobsRequest = _reflection.GeneratedProtocolMessageType('BatchReadBlobsRequest', (_message.Message,), dict(
-  DESCRIPTOR = _BATCHREADBLOBSREQUEST,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+BatchReadBlobsRequest = _reflection.GeneratedProtocolMessageType('BatchReadBlobsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _BATCHREADBLOBSREQUEST,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.BatchReadBlobsRequest)
-  ))
+  })
 _sym_db.RegisterMessage(BatchReadBlobsRequest)
 
-BatchReadBlobsResponse = _reflection.GeneratedProtocolMessageType('BatchReadBlobsResponse', (_message.Message,), dict(
+BatchReadBlobsResponse = _reflection.GeneratedProtocolMessageType('BatchReadBlobsResponse', (_message.Message,), {
 
-  Response = _reflection.GeneratedProtocolMessageType('Response', (_message.Message,), dict(
-    DESCRIPTOR = _BATCHREADBLOBSRESPONSE_RESPONSE,
-    __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+  'Response' : _reflection.GeneratedProtocolMessageType('Response', (_message.Message,), {
+    'DESCRIPTOR' : _BATCHREADBLOBSRESPONSE_RESPONSE,
+    '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
     # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.BatchReadBlobsResponse.Response)
-    ))
+    })
   ,
-  DESCRIPTOR = _BATCHREADBLOBSRESPONSE,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+  'DESCRIPTOR' : _BATCHREADBLOBSRESPONSE,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.BatchReadBlobsResponse)
-  ))
+  })
 _sym_db.RegisterMessage(BatchReadBlobsResponse)
 _sym_db.RegisterMessage(BatchReadBlobsResponse.Response)
 
-GetTreeRequest = _reflection.GeneratedProtocolMessageType('GetTreeRequest', (_message.Message,), dict(
-  DESCRIPTOR = _GETTREEREQUEST,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+GetTreeRequest = _reflection.GeneratedProtocolMessageType('GetTreeRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETTREEREQUEST,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.GetTreeRequest)
-  ))
+  })
 _sym_db.RegisterMessage(GetTreeRequest)
 
-GetTreeResponse = _reflection.GeneratedProtocolMessageType('GetTreeResponse', (_message.Message,), dict(
-  DESCRIPTOR = _GETTREERESPONSE,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+GetTreeResponse = _reflection.GeneratedProtocolMessageType('GetTreeResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETTREERESPONSE,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.GetTreeResponse)
-  ))
+  })
 _sym_db.RegisterMessage(GetTreeResponse)
 
-GetCapabilitiesRequest = _reflection.GeneratedProtocolMessageType('GetCapabilitiesRequest', (_message.Message,), dict(
-  DESCRIPTOR = _GETCAPABILITIESREQUEST,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+GetCapabilitiesRequest = _reflection.GeneratedProtocolMessageType('GetCapabilitiesRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETCAPABILITIESREQUEST,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.GetCapabilitiesRequest)
-  ))
+  })
 _sym_db.RegisterMessage(GetCapabilitiesRequest)
 
-ServerCapabilities = _reflection.GeneratedProtocolMessageType('ServerCapabilities', (_message.Message,), dict(
-  DESCRIPTOR = _SERVERCAPABILITIES,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+ServerCapabilities = _reflection.GeneratedProtocolMessageType('ServerCapabilities', (_message.Message,), {
+  'DESCRIPTOR' : _SERVERCAPABILITIES,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.ServerCapabilities)
-  ))
+  })
 _sym_db.RegisterMessage(ServerCapabilities)
 
-ActionCacheUpdateCapabilities = _reflection.GeneratedProtocolMessageType('ActionCacheUpdateCapabilities', (_message.Message,), dict(
-  DESCRIPTOR = _ACTIONCACHEUPDATECAPABILITIES,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+ActionCacheUpdateCapabilities = _reflection.GeneratedProtocolMessageType('ActionCacheUpdateCapabilities', (_message.Message,), {
+  'DESCRIPTOR' : _ACTIONCACHEUPDATECAPABILITIES,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.ActionCacheUpdateCapabilities)
-  ))
+  })
 _sym_db.RegisterMessage(ActionCacheUpdateCapabilities)
 
-PriorityCapabilities = _reflection.GeneratedProtocolMessageType('PriorityCapabilities', (_message.Message,), dict(
+PriorityCapabilities = _reflection.GeneratedProtocolMessageType('PriorityCapabilities', (_message.Message,), {
 
-  PriorityRange = _reflection.GeneratedProtocolMessageType('PriorityRange', (_message.Message,), dict(
-    DESCRIPTOR = _PRIORITYCAPABILITIES_PRIORITYRANGE,
-    __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+  'PriorityRange' : _reflection.GeneratedProtocolMessageType('PriorityRange', (_message.Message,), {
+    'DESCRIPTOR' : _PRIORITYCAPABILITIES_PRIORITYRANGE,
+    '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
     # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.PriorityCapabilities.PriorityRange)
-    ))
+    })
   ,
-  DESCRIPTOR = _PRIORITYCAPABILITIES,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+  'DESCRIPTOR' : _PRIORITYCAPABILITIES,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.PriorityCapabilities)
-  ))
+  })
 _sym_db.RegisterMessage(PriorityCapabilities)
 _sym_db.RegisterMessage(PriorityCapabilities.PriorityRange)
 
-CacheCapabilities = _reflection.GeneratedProtocolMessageType('CacheCapabilities', (_message.Message,), dict(
-  DESCRIPTOR = _CACHECAPABILITIES,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+CacheCapabilities = _reflection.GeneratedProtocolMessageType('CacheCapabilities', (_message.Message,), {
+  'DESCRIPTOR' : _CACHECAPABILITIES,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.CacheCapabilities)
-  ))
+  })
 _sym_db.RegisterMessage(CacheCapabilities)
 
-ExecutionCapabilities = _reflection.GeneratedProtocolMessageType('ExecutionCapabilities', (_message.Message,), dict(
-  DESCRIPTOR = _EXECUTIONCAPABILITIES,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+ExecutionCapabilities = _reflection.GeneratedProtocolMessageType('ExecutionCapabilities', (_message.Message,), {
+  'DESCRIPTOR' : _EXECUTIONCAPABILITIES,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.ExecutionCapabilities)
-  ))
+  })
 _sym_db.RegisterMessage(ExecutionCapabilities)
 
-ToolDetails = _reflection.GeneratedProtocolMessageType('ToolDetails', (_message.Message,), dict(
-  DESCRIPTOR = _TOOLDETAILS,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+ToolDetails = _reflection.GeneratedProtocolMessageType('ToolDetails', (_message.Message,), {
+  'DESCRIPTOR' : _TOOLDETAILS,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.ToolDetails)
-  ))
+  })
 _sym_db.RegisterMessage(ToolDetails)
 
-RequestMetadata = _reflection.GeneratedProtocolMessageType('RequestMetadata', (_message.Message,), dict(
-  DESCRIPTOR = _REQUESTMETADATA,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+RequestMetadata = _reflection.GeneratedProtocolMessageType('RequestMetadata', (_message.Message,), {
+  'DESCRIPTOR' : _REQUESTMETADATA,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.RequestMetadata)
-  ))
+  })
 _sym_db.RegisterMessage(RequestMetadata)
 
+_EXECUTION = DESCRIPTOR.services_by_name['Execution']
+_ACTIONCACHE = DESCRIPTOR.services_by_name['ActionCache']
+_CONTENTADDRESSABLESTORAGE = DESCRIPTOR.services_by_name['ContentAddressableStorage']
+_CAPABILITIES = DESCRIPTOR.services_by_name['Capabilities']
+if _descriptor._USE_C_DESCRIPTORS == False:
 
-DESCRIPTOR.has_options = True
-DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\037build.bazel.remote.execution.v2B\024RemoteExecutionProtoP\001Z\017remoteexecution\242\002\003REX\252\002\037Build.Bazel.Remote.Execution.V2'))
-_EXECUTERESPONSE_SERVERLOGSENTRY.has_options = True
-_EXECUTERESPONSE_SERVERLOGSENTRY._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001'))
-
-_EXECUTION = _descriptor.ServiceDescriptor(
-  name='Execution',
-  full_name='build.bazel.remote.execution.v2.Execution',
-  file=DESCRIPTOR,
-  index=0,
-  options=None,
-  serialized_start=7276,
-  serialized_end=7589,
-  methods=[
-  _descriptor.MethodDescriptor(
-    name='Execute',
-    full_name='build.bazel.remote.execution.v2.Execution.Execute',
-    index=0,
-    containing_service=None,
-    input_type=_EXECUTEREQUEST,
-    output_type=google_dot_longrunning_dot_operations__pb2._OPERATION,
-    options=_descriptor._ParseOptions(descriptor_pb2.MethodOptions(), _b('\202\323\344\223\002+\"&/v2/{instance_name=**}/actions:execute:\001*')),
-  ),
-  _descriptor.MethodDescriptor(
-    name='WaitExecution',
-    full_name='build.bazel.remote.execution.v2.Execution.WaitExecution',
-    index=1,
-    containing_service=None,
-    input_type=_WAITEXECUTIONREQUEST,
-    output_type=google_dot_longrunning_dot_operations__pb2._OPERATION,
-    options=_descriptor._ParseOptions(descriptor_pb2.MethodOptions(), _b('\202\323\344\223\002+\"&/v2/{name=operations/**}:waitExecution:\001*')),
-  ),
-])
-_sym_db.RegisterServiceDescriptor(_EXECUTION)
-
-DESCRIPTOR.services_by_name['Execution'] = _EXECUTION
-
-
-_ACTIONCACHE = _descriptor.ServiceDescriptor(
-  name='ActionCache',
-  full_name='build.bazel.remote.execution.v2.ActionCache',
-  file=DESCRIPTOR,
-  index=1,
-  options=None,
-  serialized_start=7592,
-  serialized_end=8062,
-  methods=[
-  _descriptor.MethodDescriptor(
-    name='GetActionResult',
-    full_name='build.bazel.remote.execution.v2.ActionCache.GetActionResult',
-    index=0,
-    containing_service=None,
-    input_type=_GETACTIONRESULTREQUEST,
-    output_type=_ACTIONRESULT,
-    options=_descriptor._ParseOptions(descriptor_pb2.MethodOptions(), _b('\202\323\344\223\002V\022T/v2/{instance_name=**}/actionResults/{action_digest.hash}/{action_digest.size_bytes}')),
-  ),
-  _descriptor.MethodDescriptor(
-    name='UpdateActionResult',
-    full_name='build.bazel.remote.execution.v2.ActionCache.UpdateActionResult',
-    index=1,
-    containing_service=None,
-    input_type=_UPDATEACTIONRESULTREQUEST,
-    output_type=_ACTIONRESULT,
-    options=_descriptor._ParseOptions(descriptor_pb2.MethodOptions(), _b('\202\323\344\223\002e\032T/v2/{instance_name=**}/actionResults/{action_digest.hash}/{action_digest.size_bytes}:\raction_result')),
-  ),
-])
-_sym_db.RegisterServiceDescriptor(_ACTIONCACHE)
-
-DESCRIPTOR.services_by_name['ActionCache'] = _ACTIONCACHE
-
-
-_CONTENTADDRESSABLESTORAGE = _descriptor.ServiceDescriptor(
-  name='ContentAddressableStorage',
-  full_name='build.bazel.remote.execution.v2.ContentAddressableStorage',
-  file=DESCRIPTOR,
-  index=2,
-  options=None,
-  serialized_start=8065,
-  serialized_end=8860,
-  methods=[
-  _descriptor.MethodDescriptor(
-    name='FindMissingBlobs',
-    full_name='build.bazel.remote.execution.v2.ContentAddressableStorage.FindMissingBlobs',
-    index=0,
-    containing_service=None,
-    input_type=_FINDMISSINGBLOBSREQUEST,
-    output_type=_FINDMISSINGBLOBSRESPONSE,
-    options=_descriptor._ParseOptions(descriptor_pb2.MethodOptions(), _b('\202\323\344\223\002-\"(/v2/{instance_name=**}/blobs:findMissing:\001*')),
-  ),
-  _descriptor.MethodDescriptor(
-    name='BatchUpdateBlobs',
-    full_name='build.bazel.remote.execution.v2.ContentAddressableStorage.BatchUpdateBlobs',
-    index=1,
-    containing_service=None,
-    input_type=_BATCHUPDATEBLOBSREQUEST,
-    output_type=_BATCHUPDATEBLOBSRESPONSE,
-    options=_descriptor._ParseOptions(descriptor_pb2.MethodOptions(), _b('\202\323\344\223\002-\"(/v2/{instance_name=**}/blobs:batchUpdate:\001*')),
-  ),
-  _descriptor.MethodDescriptor(
-    name='BatchReadBlobs',
-    full_name='build.bazel.remote.execution.v2.ContentAddressableStorage.BatchReadBlobs',
-    index=2,
-    containing_service=None,
-    input_type=_BATCHREADBLOBSREQUEST,
-    output_type=_BATCHREADBLOBSRESPONSE,
-    options=_descriptor._ParseOptions(descriptor_pb2.MethodOptions(), _b('\202\323\344\223\002+\"&/v2/{instance_name=**}/blobs:batchRead:\001*')),
-  ),
-  _descriptor.MethodDescriptor(
-    name='GetTree',
-    full_name='build.bazel.remote.execution.v2.ContentAddressableStorage.GetTree',
-    index=3,
-    containing_service=None,
-    input_type=_GETTREEREQUEST,
-    output_type=_GETTREERESPONSE,
-    options=_descriptor._ParseOptions(descriptor_pb2.MethodOptions(), _b('\202\323\344\223\002R\022P/v2/{instance_name=**}/blobs/{root_digest.hash}/{root_digest.size_bytes}:getTree')),
-  ),
-])
-_sym_db.RegisterServiceDescriptor(_CONTENTADDRESSABLESTORAGE)
-
-DESCRIPTOR.services_by_name['ContentAddressableStorage'] = _CONTENTADDRESSABLESTORAGE
-
-
-_CAPABILITIES = _descriptor.ServiceDescriptor(
-  name='Capabilities',
-  full_name='build.bazel.remote.execution.v2.Capabilities',
-  file=DESCRIPTOR,
-  index=3,
-  options=None,
-  serialized_start=8863,
-  serialized_end=9052,
-  methods=[
-  _descriptor.MethodDescriptor(
-    name='GetCapabilities',
-    full_name='build.bazel.remote.execution.v2.Capabilities.GetCapabilities',
-    index=0,
-    containing_service=None,
-    input_type=_GETCAPABILITIESREQUEST,
-    output_type=_SERVERCAPABILITIES,
-    options=_descriptor._ParseOptions(descriptor_pb2.MethodOptions(), _b('\202\323\344\223\002%\022#/v2/{instance_name=**}/capabilities')),
-  ),
-])
-_sym_db.RegisterServiceDescriptor(_CAPABILITIES)
-
-DESCRIPTOR.services_by_name['Capabilities'] = _CAPABILITIES
-
+  DESCRIPTOR._options = None
+  DESCRIPTOR._serialized_options = b'\n\037build.bazel.remote.execution.v2B\024RemoteExecutionProtoP\001Z\017remoteexecution\242\002\003REX\252\002\037Build.Bazel.Remote.Execution.V2'
+  _EXECUTERESPONSE_SERVERLOGSENTRY._options = None
+  _EXECUTERESPONSE_SERVERLOGSENTRY._serialized_options = b'8\001'
+  _EXECUTION.methods_by_name['Execute']._options = None
+  _EXECUTION.methods_by_name['Execute']._serialized_options = b'\202\323\344\223\002+\"&/v2/{instance_name=**}/actions:execute:\001*'
+  _EXECUTION.methods_by_name['WaitExecution']._options = None
+  _EXECUTION.methods_by_name['WaitExecution']._serialized_options = b'\202\323\344\223\002+\"&/v2/{name=operations/**}:waitExecution:\001*'
+  _ACTIONCACHE.methods_by_name['GetActionResult']._options = None
+  _ACTIONCACHE.methods_by_name['GetActionResult']._serialized_options = b'\202\323\344\223\002V\022T/v2/{instance_name=**}/actionResults/{action_digest.hash}/{action_digest.size_bytes}'
+  _ACTIONCACHE.methods_by_name['UpdateActionResult']._options = None
+  _ACTIONCACHE.methods_by_name['UpdateActionResult']._serialized_options = b'\202\323\344\223\002e\032T/v2/{instance_name=**}/actionResults/{action_digest.hash}/{action_digest.size_bytes}:\raction_result'
+  _CONTENTADDRESSABLESTORAGE.methods_by_name['FindMissingBlobs']._options = None
+  _CONTENTADDRESSABLESTORAGE.methods_by_name['FindMissingBlobs']._serialized_options = b'\202\323\344\223\002-\"(/v2/{instance_name=**}/blobs:findMissing:\001*'
+  _CONTENTADDRESSABLESTORAGE.methods_by_name['BatchUpdateBlobs']._options = None
+  _CONTENTADDRESSABLESTORAGE.methods_by_name['BatchUpdateBlobs']._serialized_options = b'\202\323\344\223\002-\"(/v2/{instance_name=**}/blobs:batchUpdate:\001*'
+  _CONTENTADDRESSABLESTORAGE.methods_by_name['BatchReadBlobs']._options = None
+  _CONTENTADDRESSABLESTORAGE.methods_by_name['BatchReadBlobs']._serialized_options = b'\202\323\344\223\002+\"&/v2/{instance_name=**}/blobs:batchRead:\001*'
+  _CONTENTADDRESSABLESTORAGE.methods_by_name['GetTree']._options = None
+  _CONTENTADDRESSABLESTORAGE.methods_by_name['GetTree']._serialized_options = b'\202\323\344\223\002R\022P/v2/{instance_name=**}/blobs/{root_digest.hash}/{root_digest.size_bytes}:getTree'
+  _CAPABILITIES.methods_by_name['GetCapabilities']._options = None
+  _CAPABILITIES.methods_by_name['GetCapabilities']._serialized_options = b'\202\323\344\223\002%\022#/v2/{instance_name=**}/capabilities'
+  _DIGESTFUNCTION._serialized_start=7213
+  _DIGESTFUNCTION._serialized_end=7273
+  _ACTION._serialized_start=282
+  _ACTION._serialized_end=495
+  _COMMAND._serialized_start=498
+  _COMMAND._serialized_end=809
+  _COMMAND_ENVIRONMENTVARIABLE._serialized_start=759
+  _COMMAND_ENVIRONMENTVARIABLE._serialized_end=809
+  _PLATFORM._serialized_start=811
+  _PLATFORM._serialized_end=934
+  _PLATFORM_PROPERTY._serialized_start=895
+  _PLATFORM_PROPERTY._serialized_end=934
+  _DIRECTORY._serialized_start=937
+  _DIRECTORY._serialized_end=1139
+  _FILENODE._serialized_start=1141
+  _FILENODE._serialized_end=1251
+  _DIRECTORYNODE._serialized_start=1253
+  _DIRECTORYNODE._serialized_end=1339
+  _SYMLINKNODE._serialized_start=1341
+  _SYMLINKNODE._serialized_end=1384
+  _DIGEST._serialized_start=1386
+  _DIGEST._serialized_end=1428
+  _EXECUTEDACTIONMETADATA._serialized_start=1431
+  _EXECUTEDACTIONMETADATA._serialized_end=2051
+  _ACTIONRESULT._serialized_start=2054
+  _ACTIONRESULT._serialized_end=2491
+  _OUTPUTFILE._serialized_start=2493
+  _OUTPUTFILE._serialized_end=2605
+  _TREE._serialized_start=2607
+  _TREE._serialized_end=2733
+  _OUTPUTDIRECTORY._serialized_start=2735
+  _OUTPUTDIRECTORY._serialized_end=2834
+  _EXECUTIONPOLICY._serialized_start=2836
+  _EXECUTIONPOLICY._serialized_end=2871
+  _RESULTSCACHEPOLICY._serialized_start=2873
+  _RESULTSCACHEPOLICY._serialized_end=2911
+  _EXECUTEREQUEST._serialized_start=2914
+  _EXECUTEREQUEST._serialized_end=3221
+  _LOGFILE._serialized_start=3223
+  _LOGFILE._serialized_end=3313
+  _EXECUTERESPONSE._serialized_start=3316
+  _EXECUTERESPONSE._serialized_end=3635
+  _EXECUTERESPONSE_SERVERLOGSENTRY._serialized_start=3544
+  _EXECUTERESPONSE_SERVERLOGSENTRY._serialized_end=3635
+  _EXECUTEOPERATIONMETADATA._serialized_start=3638
+  _EXECUTEOPERATIONMETADATA._serialized_end=3945
+  _EXECUTEOPERATIONMETADATA_STAGE._serialized_start=3866
+  _EXECUTEOPERATIONMETADATA_STAGE._serialized_end=3945
+  _WAITEXECUTIONREQUEST._serialized_start=3947
+  _WAITEXECUTIONREQUEST._serialized_end=3983
+  _GETACTIONRESULTREQUEST._serialized_start=3985
+  _GETACTIONRESULTREQUEST._serialized_end=4096
+  _UPDATEACTIONRESULTREQUEST._serialized_start=4099
+  _UPDATEACTIONRESULTREQUEST._serialized_end=4366
+  _FINDMISSINGBLOBSREQUEST._serialized_start=4368
+  _FINDMISSINGBLOBSREQUEST._serialized_end=4479
+  _FINDMISSINGBLOBSRESPONSE._serialized_start=4481
+  _FINDMISSINGBLOBSRESPONSE._serialized_end=4578
+  _BATCHUPDATEBLOBSREQUEST._serialized_start=4581
+  _BATCHUPDATEBLOBSREQUEST._serialized_end=4795
+  _BATCHUPDATEBLOBSREQUEST_REQUEST._serialized_start=4715
+  _BATCHUPDATEBLOBSREQUEST_REQUEST._serialized_end=4795
+  _BATCHUPDATEBLOBSRESPONSE._serialized_start=4798
+  _BATCHUPDATEBLOBSRESPONSE._serialized_end=5016
+  _BATCHUPDATEBLOBSRESPONSE_RESPONSE._serialized_start=4913
+  _BATCHUPDATEBLOBSRESPONSE_RESPONSE._serialized_end=5016
+  _BATCHREADBLOBSREQUEST._serialized_start=5018
+  _BATCHREADBLOBSREQUEST._serialized_end=5122
+  _BATCHREADBLOBSRESPONSE._serialized_start=5125
+  _BATCHREADBLOBSRESPONSE._serialized_end=5353
+  _BATCHREADBLOBSRESPONSE_RESPONSE._serialized_start=5236
+  _BATCHREADBLOBSRESPONSE_RESPONSE._serialized_end=5353
+  _GETTREEREQUEST._serialized_start=5356
+  _GETTREEREQUEST._serialized_end=5496
+  _GETTREERESPONSE._serialized_start=5498
+  _GETTREERESPONSE._serialized_end=5605
+  _GETCAPABILITIESREQUEST._serialized_start=5607
+  _GETCAPABILITIESREQUEST._serialized_end=5654
+  _SERVERCAPABILITIES._serialized_start=5657
+  _SERVERCAPABILITIES._serialized_end=6012
+  _ACTIONCACHEUPDATECAPABILITIES._serialized_start=6014
+  _ACTIONCACHEUPDATECAPABILITIES._serialized_end=6069
+  _PRIORITYCAPABILITIES._serialized_start=6072
+  _PRIORITYCAPABILITIES._serialized_end=6244
+  _PRIORITYCAPABILITIES_PRIORITYRANGE._serialized_start=6185
+  _PRIORITYCAPABILITIES_PRIORITYRANGE._serialized_end=6244
+  _CACHECAPABILITIES._serialized_start=6247
+  _CACHECAPABILITIES._serialized_end=6767
+  _CACHECAPABILITIES_SYMLINKABSOLUTEPATHSTRATEGY._serialized_start=6696
+  _CACHECAPABILITIES_SYMLINKABSOLUTEPATHSTRATEGY._serialized_end=6767
+  _EXECUTIONCAPABILITIES._serialized_start=6770
+  _EXECUTIONCAPABILITIES._serialized_end=6985
+  _TOOLDETAILS._serialized_start=6987
+  _TOOLDETAILS._serialized_end=7041
+  _REQUESTMETADATA._serialized_start=7044
+  _REQUESTMETADATA._serialized_end=7211
+  _EXECUTION._serialized_start=7276
+  _EXECUTION._serialized_end=7589
+  _ACTIONCACHE._serialized_start=7592
+  _ACTIONCACHE._serialized_end=8062
+  _CONTENTADDRESSABLESTORAGE._serialized_start=8065
+  _CONTENTADDRESSABLESTORAGE._serialized_end=8860
+  _CAPABILITIES._serialized_start=8863
+  _CAPABILITIES._serialized_end=9052
 # @@protoc_insertion_point(module_scope)
diff --git a/buildstream/_protos/build/bazel/remote/execution/v2/remote_execution_pb2_grpc.py b/buildstream/_protos/build/bazel/remote/execution/v2/remote_execution_pb2_grpc.py
index 3769a68..d6ac20d 100644
--- a/buildstream/_protos/build/bazel/remote/execution/v2/remote_execution_pb2_grpc.py
+++ b/buildstream/_protos/build/bazel/remote/execution/v2/remote_execution_pb2_grpc.py
@@ -1,4 +1,5 @@
 # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
 import grpc
 
 from buildstream._protos.build.bazel.remote.execution.v2 import remote_execution_pb2 as build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2
@@ -6,588 +7,859 @@
 
 
 class ExecutionStub(object):
-  """The Remote Execution API is used to execute an
-  [Action][build.bazel.remote.execution.v2.Action] on the remote
-  workers.
+    """The Remote Execution API is used to execute an
+    [Action][build.bazel.remote.execution.v2.Action] on the remote
+    workers.
 
-  As with other services in the Remote Execution API, any call may return an
-  error with a [RetryInfo][google.rpc.RetryInfo] error detail providing
-  information about when the client should retry the request; clients SHOULD
-  respect the information provided.
-  """
-
-  def __init__(self, channel):
-    """Constructor.
-
-    Args:
-      channel: A grpc.Channel.
+    As with other services in the Remote Execution API, any call may return an
+    error with a [RetryInfo][google.rpc.RetryInfo] error detail providing
+    information about when the client should retry the request; clients SHOULD
+    respect the information provided.
     """
-    self.Execute = channel.unary_stream(
-        '/build.bazel.remote.execution.v2.Execution/Execute',
-        request_serializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.ExecuteRequest.SerializeToString,
-        response_deserializer=google_dot_longrunning_dot_operations__pb2.Operation.FromString,
-        )
-    self.WaitExecution = channel.unary_stream(
-        '/build.bazel.remote.execution.v2.Execution/WaitExecution',
-        request_serializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.WaitExecutionRequest.SerializeToString,
-        response_deserializer=google_dot_longrunning_dot_operations__pb2.Operation.FromString,
-        )
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.Execute = channel.unary_stream(
+                '/build.bazel.remote.execution.v2.Execution/Execute',
+                request_serializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.ExecuteRequest.SerializeToString,
+                response_deserializer=google_dot_longrunning_dot_operations__pb2.Operation.FromString,
+                )
+        self.WaitExecution = channel.unary_stream(
+                '/build.bazel.remote.execution.v2.Execution/WaitExecution',
+                request_serializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.WaitExecutionRequest.SerializeToString,
+                response_deserializer=google_dot_longrunning_dot_operations__pb2.Operation.FromString,
+                )
 
 
 class ExecutionServicer(object):
-  """The Remote Execution API is used to execute an
-  [Action][build.bazel.remote.execution.v2.Action] on the remote
-  workers.
+    """The Remote Execution API is used to execute an
+    [Action][build.bazel.remote.execution.v2.Action] on the remote
+    workers.
 
-  As with other services in the Remote Execution API, any call may return an
-  error with a [RetryInfo][google.rpc.RetryInfo] error detail providing
-  information about when the client should retry the request; clients SHOULD
-  respect the information provided.
-  """
-
-  def Execute(self, request, context):
-    """Execute an action remotely.
-
-    In order to execute an action, the client must first upload all of the
-    inputs, the
-    [Command][build.bazel.remote.execution.v2.Command] to run, and the
-    [Action][build.bazel.remote.execution.v2.Action] into the
-    [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
-    It then calls `Execute` with an `action_digest` referring to them. The
-    server will run the action and eventually return the result.
-
-    The input `Action`'s fields MUST meet the various canonicalization
-    requirements specified in the documentation for their types so that it has
-    the same digest as other logically equivalent `Action`s. The server MAY
-    enforce the requirements and return errors if a non-canonical input is
-    received. It MAY also proceed without verifying some or all of the
-    requirements, such as for performance reasons. If the server does not
-    verify the requirement, then it will treat the `Action` as distinct from
-    another logically equivalent action if they hash differently.
-
-    Returns a stream of
-    [google.longrunning.Operation][google.longrunning.Operation] messages
-    describing the resulting execution, with eventual `response`
-    [ExecuteResponse][build.bazel.remote.execution.v2.ExecuteResponse]. The
-    `metadata` on the operation is of type
-    [ExecuteOperationMetadata][build.bazel.remote.execution.v2.ExecuteOperationMetadata].
-
-    If the client remains connected after the first response is returned after
-    the server, then updates are streamed as if the client had called
-    [WaitExecution][build.bazel.remote.execution.v2.Execution.WaitExecution]
-    until the execution completes or the request reaches an error. The
-    operation can also be queried using [Operations
-    API][google.longrunning.Operations.GetOperation].
-
-    The server NEED NOT implement other methods or functionality of the
-    Operations API.
-
-    Errors discovered during creation of the `Operation` will be reported
-    as gRPC Status errors, while errors that occurred while running the
-    action will be reported in the `status` field of the `ExecuteResponse`. The
-    server MUST NOT set the `error` field of the `Operation` proto.
-    The possible errors include:
-    * `INVALID_ARGUMENT`: One or more arguments are invalid.
-    * `FAILED_PRECONDITION`: One or more errors occurred in setting up the
-    action requested, such as a missing input or command or no worker being
-    available. The client may be able to fix the errors and retry.
-    * `RESOURCE_EXHAUSTED`: There is insufficient quota of some resource to run
-    the action.
-    * `UNAVAILABLE`: Due to a transient condition, such as all workers being
-    occupied (and the server does not support a queue), the action could not
-    be started. The client should retry.
-    * `INTERNAL`: An internal error occurred in the execution engine or the
-    worker.
-    * `DEADLINE_EXCEEDED`: The execution timed out.
-
-    In the case of a missing input or command, the server SHOULD additionally
-    send a [PreconditionFailure][google.rpc.PreconditionFailure] error detail
-    where, for each requested blob not present in the CAS, there is a
-    `Violation` with a `type` of `MISSING` and a `subject` of
-    `"blobs/{hash}/{size}"` indicating the digest of the missing blob.
+    As with other services in the Remote Execution API, any call may return an
+    error with a [RetryInfo][google.rpc.RetryInfo] error detail providing
+    information about when the client should retry the request; clients SHOULD
+    respect the information provided.
     """
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
 
-  def WaitExecution(self, request, context):
-    """Wait for an execution operation to complete. When the client initially
-    makes the request, the server immediately responds with the current status
-    of the execution. The server will leave the request stream open until the
-    operation completes, and then respond with the completed operation. The
-    server MAY choose to stream additional updates as execution progresses,
-    such as to provide an update as to the state of the execution.
-    """
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def Execute(self, request, context):
+        """Execute an action remotely.
+
+        In order to execute an action, the client must first upload all of the
+        inputs, the
+        [Command][build.bazel.remote.execution.v2.Command] to run, and the
+        [Action][build.bazel.remote.execution.v2.Action] into the
+        [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
+        It then calls `Execute` with an `action_digest` referring to them. The
+        server will run the action and eventually return the result.
+
+        The input `Action`'s fields MUST meet the various canonicalization
+        requirements specified in the documentation for their types so that it has
+        the same digest as other logically equivalent `Action`s. The server MAY
+        enforce the requirements and return errors if a non-canonical input is
+        received. It MAY also proceed without verifying some or all of the
+        requirements, such as for performance reasons. If the server does not
+        verify the requirement, then it will treat the `Action` as distinct from
+        another logically equivalent action if they hash differently.
+
+        Returns a stream of
+        [google.longrunning.Operation][google.longrunning.Operation] messages
+        describing the resulting execution, with eventual `response`
+        [ExecuteResponse][build.bazel.remote.execution.v2.ExecuteResponse]. The
+        `metadata` on the operation is of type
+        [ExecuteOperationMetadata][build.bazel.remote.execution.v2.ExecuteOperationMetadata].
+
+        If the client remains connected after the first response is returned after
+        the server, then updates are streamed as if the client had called
+        [WaitExecution][build.bazel.remote.execution.v2.Execution.WaitExecution]
+        until the execution completes or the request reaches an error. The
+        operation can also be queried using [Operations
+        API][google.longrunning.Operations.GetOperation].
+
+        The server NEED NOT implement other methods or functionality of the
+        Operations API.
+
+        Errors discovered during creation of the `Operation` will be reported
+        as gRPC Status errors, while errors that occurred while running the
+        action will be reported in the `status` field of the `ExecuteResponse`. The
+        server MUST NOT set the `error` field of the `Operation` proto.
+        The possible errors include:
+        * `INVALID_ARGUMENT`: One or more arguments are invalid.
+        * `FAILED_PRECONDITION`: One or more errors occurred in setting up the
+        action requested, such as a missing input or command or no worker being
+        available. The client may be able to fix the errors and retry.
+        * `RESOURCE_EXHAUSTED`: There is insufficient quota of some resource to run
+        the action.
+        * `UNAVAILABLE`: Due to a transient condition, such as all workers being
+        occupied (and the server does not support a queue), the action could not
+        be started. The client should retry.
+        * `INTERNAL`: An internal error occurred in the execution engine or the
+        worker.
+        * `DEADLINE_EXCEEDED`: The execution timed out.
+
+        In the case of a missing input or command, the server SHOULD additionally
+        send a [PreconditionFailure][google.rpc.PreconditionFailure] error detail
+        where, for each requested blob not present in the CAS, there is a
+        `Violation` with a `type` of `MISSING` and a `subject` of
+        `"blobs/{hash}/{size}"` indicating the digest of the missing blob.
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def WaitExecution(self, request, context):
+        """Wait for an execution operation to complete. When the client initially
+        makes the request, the server immediately responds with the current status
+        of the execution. The server will leave the request stream open until the
+        operation completes, and then respond with the completed operation. The
+        server MAY choose to stream additional updates as execution progresses,
+        such as to provide an update as to the state of the execution.
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
 
 def add_ExecutionServicer_to_server(servicer, server):
-  rpc_method_handlers = {
-      'Execute': grpc.unary_stream_rpc_method_handler(
-          servicer.Execute,
-          request_deserializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.ExecuteRequest.FromString,
-          response_serializer=google_dot_longrunning_dot_operations__pb2.Operation.SerializeToString,
-      ),
-      'WaitExecution': grpc.unary_stream_rpc_method_handler(
-          servicer.WaitExecution,
-          request_deserializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.WaitExecutionRequest.FromString,
-          response_serializer=google_dot_longrunning_dot_operations__pb2.Operation.SerializeToString,
-      ),
-  }
-  generic_handler = grpc.method_handlers_generic_handler(
-      'build.bazel.remote.execution.v2.Execution', rpc_method_handlers)
-  server.add_generic_rpc_handlers((generic_handler,))
+    rpc_method_handlers = {
+            'Execute': grpc.unary_stream_rpc_method_handler(
+                    servicer.Execute,
+                    request_deserializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.ExecuteRequest.FromString,
+                    response_serializer=google_dot_longrunning_dot_operations__pb2.Operation.SerializeToString,
+            ),
+            'WaitExecution': grpc.unary_stream_rpc_method_handler(
+                    servicer.WaitExecution,
+                    request_deserializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.WaitExecutionRequest.FromString,
+                    response_serializer=google_dot_longrunning_dot_operations__pb2.Operation.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'build.bazel.remote.execution.v2.Execution', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class Execution(object):
+    """The Remote Execution API is used to execute an
+    [Action][build.bazel.remote.execution.v2.Action] on the remote
+    workers.
+
+    As with other services in the Remote Execution API, any call may return an
+    error with a [RetryInfo][google.rpc.RetryInfo] error detail providing
+    information about when the client should retry the request; clients SHOULD
+    respect the information provided.
+    """
+
+    @staticmethod
+    def Execute(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_stream(request, target, '/build.bazel.remote.execution.v2.Execution/Execute',
+            build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.ExecuteRequest.SerializeToString,
+            google_dot_longrunning_dot_operations__pb2.Operation.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def WaitExecution(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_stream(request, target, '/build.bazel.remote.execution.v2.Execution/WaitExecution',
+            build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.WaitExecutionRequest.SerializeToString,
+            google_dot_longrunning_dot_operations__pb2.Operation.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
 
 class ActionCacheStub(object):
-  """The action cache API is used to query whether a given action has already been
-  performed and, if so, retrieve its result. Unlike the
-  [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage],
-  which addresses blobs by their own content, the action cache addresses the
-  [ActionResult][build.bazel.remote.execution.v2.ActionResult] by a
-  digest of the encoded [Action][build.bazel.remote.execution.v2.Action]
-  which produced them.
+    """The action cache API is used to query whether a given action has already been
+    performed and, if so, retrieve its result. Unlike the
+    [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage],
+    which addresses blobs by their own content, the action cache addresses the
+    [ActionResult][build.bazel.remote.execution.v2.ActionResult] by a
+    digest of the encoded [Action][build.bazel.remote.execution.v2.Action]
+    which produced them.
 
-  The lifetime of entries in the action cache is implementation-specific, but
-  the server SHOULD assume that more recently used entries are more likely to
-  be used again. Additionally, action cache implementations SHOULD ensure that
-  any blobs referenced in the
-  [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage]
-  are still valid when returning a result.
+    The lifetime of entries in the action cache is implementation-specific, but
+    the server SHOULD assume that more recently used entries are more likely to
+    be used again. Additionally, action cache implementations SHOULD ensure that
+    any blobs referenced in the
+    [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage]
+    are still valid when returning a result.
 
-  As with other services in the Remote Execution API, any call may return an
-  error with a [RetryInfo][google.rpc.RetryInfo] error detail providing
-  information about when the client should retry the request; clients SHOULD
-  respect the information provided.
-  """
-
-  def __init__(self, channel):
-    """Constructor.
-
-    Args:
-      channel: A grpc.Channel.
+    As with other services in the Remote Execution API, any call may return an
+    error with a [RetryInfo][google.rpc.RetryInfo] error detail providing
+    information about when the client should retry the request; clients SHOULD
+    respect the information provided.
     """
-    self.GetActionResult = channel.unary_unary(
-        '/build.bazel.remote.execution.v2.ActionCache/GetActionResult',
-        request_serializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.GetActionResultRequest.SerializeToString,
-        response_deserializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.ActionResult.FromString,
-        )
-    self.UpdateActionResult = channel.unary_unary(
-        '/build.bazel.remote.execution.v2.ActionCache/UpdateActionResult',
-        request_serializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.UpdateActionResultRequest.SerializeToString,
-        response_deserializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.ActionResult.FromString,
-        )
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.GetActionResult = channel.unary_unary(
+                '/build.bazel.remote.execution.v2.ActionCache/GetActionResult',
+                request_serializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.GetActionResultRequest.SerializeToString,
+                response_deserializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.ActionResult.FromString,
+                )
+        self.UpdateActionResult = channel.unary_unary(
+                '/build.bazel.remote.execution.v2.ActionCache/UpdateActionResult',
+                request_serializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.UpdateActionResultRequest.SerializeToString,
+                response_deserializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.ActionResult.FromString,
+                )
 
 
 class ActionCacheServicer(object):
-  """The action cache API is used to query whether a given action has already been
-  performed and, if so, retrieve its result. Unlike the
-  [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage],
-  which addresses blobs by their own content, the action cache addresses the
-  [ActionResult][build.bazel.remote.execution.v2.ActionResult] by a
-  digest of the encoded [Action][build.bazel.remote.execution.v2.Action]
-  which produced them.
+    """The action cache API is used to query whether a given action has already been
+    performed and, if so, retrieve its result. Unlike the
+    [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage],
+    which addresses blobs by their own content, the action cache addresses the
+    [ActionResult][build.bazel.remote.execution.v2.ActionResult] by a
+    digest of the encoded [Action][build.bazel.remote.execution.v2.Action]
+    which produced them.
 
-  The lifetime of entries in the action cache is implementation-specific, but
-  the server SHOULD assume that more recently used entries are more likely to
-  be used again. Additionally, action cache implementations SHOULD ensure that
-  any blobs referenced in the
-  [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage]
-  are still valid when returning a result.
+    The lifetime of entries in the action cache is implementation-specific, but
+    the server SHOULD assume that more recently used entries are more likely to
+    be used again. Additionally, action cache implementations SHOULD ensure that
+    any blobs referenced in the
+    [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage]
+    are still valid when returning a result.
 
-  As with other services in the Remote Execution API, any call may return an
-  error with a [RetryInfo][google.rpc.RetryInfo] error detail providing
-  information about when the client should retry the request; clients SHOULD
-  respect the information provided.
-  """
-
-  def GetActionResult(self, request, context):
-    """Retrieve a cached execution result.
-
-    Errors:
-    * `NOT_FOUND`: The requested `ActionResult` is not in the cache.
+    As with other services in the Remote Execution API, any call may return an
+    error with a [RetryInfo][google.rpc.RetryInfo] error detail providing
+    information about when the client should retry the request; clients SHOULD
+    respect the information provided.
     """
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
 
-  def UpdateActionResult(self, request, context):
-    """Upload a new execution result.
+    def GetActionResult(self, request, context):
+        """Retrieve a cached execution result.
 
-    This method is intended for servers which implement the distributed cache
-    independently of the
-    [Execution][build.bazel.remote.execution.v2.Execution] API. As a
-    result, it is OPTIONAL for servers to implement.
+        Errors:
+        * `NOT_FOUND`: The requested `ActionResult` is not in the cache.
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-    In order to allow the server to perform access control based on the type of
-    action, and to assist with client debugging, the client MUST first upload
-    the [Action][build.bazel.remote.execution.v2.Execution] that produced the
-    result, along with its
-    [Command][build.bazel.remote.execution.v2.Command], into the
-    `ContentAddressableStorage`.
+    def UpdateActionResult(self, request, context):
+        """Upload a new execution result.
 
-    Errors:
-    * `NOT_IMPLEMENTED`: This method is not supported by the server.
-    * `RESOURCE_EXHAUSTED`: There is insufficient storage space to add the
-    entry to the cache.
-    """
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+        This method is intended for servers which implement the distributed cache
+        independently of the
+        [Execution][build.bazel.remote.execution.v2.Execution] API. As a
+        result, it is OPTIONAL for servers to implement.
+
+        In order to allow the server to perform access control based on the type of
+        action, and to assist with client debugging, the client MUST first upload
+        the [Action][build.bazel.remote.execution.v2.Execution] that produced the
+        result, along with its
+        [Command][build.bazel.remote.execution.v2.Command], into the
+        `ContentAddressableStorage`.
+
+        Errors:
+        * `NOT_IMPLEMENTED`: This method is not supported by the server.
+        * `RESOURCE_EXHAUSTED`: There is insufficient storage space to add the
+        entry to the cache.
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
 
 def add_ActionCacheServicer_to_server(servicer, server):
-  rpc_method_handlers = {
-      'GetActionResult': grpc.unary_unary_rpc_method_handler(
-          servicer.GetActionResult,
-          request_deserializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.GetActionResultRequest.FromString,
-          response_serializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.ActionResult.SerializeToString,
-      ),
-      'UpdateActionResult': grpc.unary_unary_rpc_method_handler(
-          servicer.UpdateActionResult,
-          request_deserializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.UpdateActionResultRequest.FromString,
-          response_serializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.ActionResult.SerializeToString,
-      ),
-  }
-  generic_handler = grpc.method_handlers_generic_handler(
-      'build.bazel.remote.execution.v2.ActionCache', rpc_method_handlers)
-  server.add_generic_rpc_handlers((generic_handler,))
+    rpc_method_handlers = {
+            'GetActionResult': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetActionResult,
+                    request_deserializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.GetActionResultRequest.FromString,
+                    response_serializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.ActionResult.SerializeToString,
+            ),
+            'UpdateActionResult': grpc.unary_unary_rpc_method_handler(
+                    servicer.UpdateActionResult,
+                    request_deserializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.UpdateActionResultRequest.FromString,
+                    response_serializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.ActionResult.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'build.bazel.remote.execution.v2.ActionCache', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class ActionCache(object):
+    """The action cache API is used to query whether a given action has already been
+    performed and, if so, retrieve its result. Unlike the
+    [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage],
+    which addresses blobs by their own content, the action cache addresses the
+    [ActionResult][build.bazel.remote.execution.v2.ActionResult] by a
+    digest of the encoded [Action][build.bazel.remote.execution.v2.Action]
+    which produced them.
+
+    The lifetime of entries in the action cache is implementation-specific, but
+    the server SHOULD assume that more recently used entries are more likely to
+    be used again. Additionally, action cache implementations SHOULD ensure that
+    any blobs referenced in the
+    [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage]
+    are still valid when returning a result.
+
+    As with other services in the Remote Execution API, any call may return an
+    error with a [RetryInfo][google.rpc.RetryInfo] error detail providing
+    information about when the client should retry the request; clients SHOULD
+    respect the information provided.
+    """
+
+    @staticmethod
+    def GetActionResult(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/build.bazel.remote.execution.v2.ActionCache/GetActionResult',
+            build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.GetActionResultRequest.SerializeToString,
+            build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.ActionResult.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def UpdateActionResult(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/build.bazel.remote.execution.v2.ActionCache/UpdateActionResult',
+            build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.UpdateActionResultRequest.SerializeToString,
+            build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.ActionResult.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
 
 class ContentAddressableStorageStub(object):
-  """The CAS (content-addressable storage) is used to store the inputs to and
-  outputs from the execution service. Each piece of content is addressed by the
-  digest of its binary data.
+    """The CAS (content-addressable storage) is used to store the inputs to and
+    outputs from the execution service. Each piece of content is addressed by the
+    digest of its binary data.
 
-  Most of the binary data stored in the CAS is opaque to the execution engine,
-  and is only used as a communication medium. In order to build an
-  [Action][build.bazel.remote.execution.v2.Action],
-  however, the client will need to also upload the
-  [Command][build.bazel.remote.execution.v2.Command] and input root
-  [Directory][build.bazel.remote.execution.v2.Directory] for the Action.
-  The Command and Directory messages must be marshalled to wire format and then
-  uploaded under the hash as with any other piece of content. In practice, the
-  input root directory is likely to refer to other Directories in its
-  hierarchy, which must also each be uploaded on their own.
+    Most of the binary data stored in the CAS is opaque to the execution engine,
+    and is only used as a communication medium. In order to build an
+    [Action][build.bazel.remote.execution.v2.Action],
+    however, the client will need to also upload the
+    [Command][build.bazel.remote.execution.v2.Command] and input root
+    [Directory][build.bazel.remote.execution.v2.Directory] for the Action.
+    The Command and Directory messages must be marshalled to wire format and then
+    uploaded under the hash as with any other piece of content. In practice, the
+    input root directory is likely to refer to other Directories in its
+    hierarchy, which must also each be uploaded on their own.
 
-  For small file uploads the client should group them together and call
-  [BatchUpdateBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchUpdateBlobs]
-  on chunks of no more than 10 MiB. For large uploads, the client must use the
-  [Write method][google.bytestream.ByteStream.Write] of the ByteStream API. The
-  `resource_name` is `{instance_name}/uploads/{uuid}/blobs/{hash}/{size}`,
-  where `instance_name` is as described in the next paragraph, `uuid` is a
-  version 4 UUID generated by the client, and `hash` and `size` are the
-  [Digest][build.bazel.remote.execution.v2.Digest] of the blob. The
-  `uuid` is used only to avoid collisions when multiple clients try to upload
-  the same file (or the same client tries to upload the file multiple times at
-  once on different threads), so the client MAY reuse the `uuid` for uploading
-  different blobs. The `resource_name` may optionally have a trailing filename
-  (or other metadata) for a client to use if it is storing URLs, as in
-  `{instance}/uploads/{uuid}/blobs/{hash}/{size}/foo/bar/baz.cc`. Anything
-  after the `size` is ignored.
+    For small file uploads the client should group them together and call
+    [BatchUpdateBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchUpdateBlobs]
+    on chunks of no more than 10 MiB. For large uploads, the client must use the
+    [Write method][google.bytestream.ByteStream.Write] of the ByteStream API. The
+    `resource_name` is `{instance_name}/uploads/{uuid}/blobs/{hash}/{size}`,
+    where `instance_name` is as described in the next paragraph, `uuid` is a
+    version 4 UUID generated by the client, and `hash` and `size` are the
+    [Digest][build.bazel.remote.execution.v2.Digest] of the blob. The
+    `uuid` is used only to avoid collisions when multiple clients try to upload
+    the same file (or the same client tries to upload the file multiple times at
+    once on different threads), so the client MAY reuse the `uuid` for uploading
+    different blobs. The `resource_name` may optionally have a trailing filename
+    (or other metadata) for a client to use if it is storing URLs, as in
+    `{instance}/uploads/{uuid}/blobs/{hash}/{size}/foo/bar/baz.cc`. Anything
+    after the `size` is ignored.
 
-  A single server MAY support multiple instances of the execution system, each
-  with their own workers, storage, cache, etc. The exact relationship between
-  instances is up to the server. If the server does, then the `instance_name`
-  is an identifier, possibly containing multiple path segments, used to
-  distinguish between the various instances on the server, in a manner defined
-  by the server. For servers which do not support multiple instances, then the
-  `instance_name` is the empty path and the leading slash is omitted, so that
-  the `resource_name` becomes `uploads/{uuid}/blobs/{hash}/{size}`.
+    A single server MAY support multiple instances of the execution system, each
+    with their own workers, storage, cache, etc. The exact relationship between
+    instances is up to the server. If the server does, then the `instance_name`
+    is an identifier, possibly containing multiple path segments, used to
+    distinguish between the various instances on the server, in a manner defined
+    by the server. For servers which do not support multiple instances, then the
+    `instance_name` is the empty path and the leading slash is omitted, so that
+    the `resource_name` becomes `uploads/{uuid}/blobs/{hash}/{size}`.
 
-  When attempting an upload, if another client has already completed the upload
-  (which may occur in the middle of a single upload if another client uploads
-  the same blob concurrently), the request will terminate immediately with
-  a response whose `committed_size` is the full size of the uploaded file
-  (regardless of how much data was transmitted by the client). If the client
-  completes the upload but the
-  [Digest][build.bazel.remote.execution.v2.Digest] does not match, an
-  `INVALID_ARGUMENT` error will be returned. In either case, the client should
-  not attempt to retry the upload.
+    When attempting an upload, if another client has already completed the upload
+    (which may occur in the middle of a single upload if another client uploads
+    the same blob concurrently), the request will terminate immediately with
+    a response whose `committed_size` is the full size of the uploaded file
+    (regardless of how much data was transmitted by the client). If the client
+    completes the upload but the
+    [Digest][build.bazel.remote.execution.v2.Digest] does not match, an
+    `INVALID_ARGUMENT` error will be returned. In either case, the client should
+    not attempt to retry the upload.
 
-  For downloading blobs, the client must use the
-  [Read method][google.bytestream.ByteStream.Read] of the ByteStream API, with
-  a `resource_name` of `"{instance_name}/blobs/{hash}/{size}"`, where
-  `instance_name` is the instance name (see above), and `hash` and `size` are
-  the [Digest][build.bazel.remote.execution.v2.Digest] of the blob.
+    For downloading blobs, the client must use the
+    [Read method][google.bytestream.ByteStream.Read] of the ByteStream API, with
+    a `resource_name` of `"{instance_name}/blobs/{hash}/{size}"`, where
+    `instance_name` is the instance name (see above), and `hash` and `size` are
+    the [Digest][build.bazel.remote.execution.v2.Digest] of the blob.
 
-  The lifetime of entries in the CAS is implementation specific, but it SHOULD
-  be long enough to allow for newly-added and recently looked-up entries to be
-  used in subsequent calls (e.g. to
-  [Execute][build.bazel.remote.execution.v2.Execution.Execute]).
+    The lifetime of entries in the CAS is implementation specific, but it SHOULD
+    be long enough to allow for newly-added and recently looked-up entries to be
+    used in subsequent calls (e.g. to
+    [Execute][build.bazel.remote.execution.v2.Execution.Execute]).
 
-  As with other services in the Remote Execution API, any call may return an
-  error with a [RetryInfo][google.rpc.RetryInfo] error detail providing
-  information about when the client should retry the request; clients SHOULD
-  respect the information provided.
-  """
-
-  def __init__(self, channel):
-    """Constructor.
-
-    Args:
-      channel: A grpc.Channel.
+    As with other services in the Remote Execution API, any call may return an
+    error with a [RetryInfo][google.rpc.RetryInfo] error detail providing
+    information about when the client should retry the request; clients SHOULD
+    respect the information provided.
     """
-    self.FindMissingBlobs = channel.unary_unary(
-        '/build.bazel.remote.execution.v2.ContentAddressableStorage/FindMissingBlobs',
-        request_serializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.FindMissingBlobsRequest.SerializeToString,
-        response_deserializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.FindMissingBlobsResponse.FromString,
-        )
-    self.BatchUpdateBlobs = channel.unary_unary(
-        '/build.bazel.remote.execution.v2.ContentAddressableStorage/BatchUpdateBlobs',
-        request_serializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.BatchUpdateBlobsRequest.SerializeToString,
-        response_deserializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.BatchUpdateBlobsResponse.FromString,
-        )
-    self.BatchReadBlobs = channel.unary_unary(
-        '/build.bazel.remote.execution.v2.ContentAddressableStorage/BatchReadBlobs',
-        request_serializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.BatchReadBlobsRequest.SerializeToString,
-        response_deserializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.BatchReadBlobsResponse.FromString,
-        )
-    self.GetTree = channel.unary_stream(
-        '/build.bazel.remote.execution.v2.ContentAddressableStorage/GetTree',
-        request_serializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.GetTreeRequest.SerializeToString,
-        response_deserializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.GetTreeResponse.FromString,
-        )
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.FindMissingBlobs = channel.unary_unary(
+                '/build.bazel.remote.execution.v2.ContentAddressableStorage/FindMissingBlobs',
+                request_serializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.FindMissingBlobsRequest.SerializeToString,
+                response_deserializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.FindMissingBlobsResponse.FromString,
+                )
+        self.BatchUpdateBlobs = channel.unary_unary(
+                '/build.bazel.remote.execution.v2.ContentAddressableStorage/BatchUpdateBlobs',
+                request_serializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.BatchUpdateBlobsRequest.SerializeToString,
+                response_deserializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.BatchUpdateBlobsResponse.FromString,
+                )
+        self.BatchReadBlobs = channel.unary_unary(
+                '/build.bazel.remote.execution.v2.ContentAddressableStorage/BatchReadBlobs',
+                request_serializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.BatchReadBlobsRequest.SerializeToString,
+                response_deserializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.BatchReadBlobsResponse.FromString,
+                )
+        self.GetTree = channel.unary_stream(
+                '/build.bazel.remote.execution.v2.ContentAddressableStorage/GetTree',
+                request_serializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.GetTreeRequest.SerializeToString,
+                response_deserializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.GetTreeResponse.FromString,
+                )
 
 
 class ContentAddressableStorageServicer(object):
-  """The CAS (content-addressable storage) is used to store the inputs to and
-  outputs from the execution service. Each piece of content is addressed by the
-  digest of its binary data.
+    """The CAS (content-addressable storage) is used to store the inputs to and
+    outputs from the execution service. Each piece of content is addressed by the
+    digest of its binary data.
 
-  Most of the binary data stored in the CAS is opaque to the execution engine,
-  and is only used as a communication medium. In order to build an
-  [Action][build.bazel.remote.execution.v2.Action],
-  however, the client will need to also upload the
-  [Command][build.bazel.remote.execution.v2.Command] and input root
-  [Directory][build.bazel.remote.execution.v2.Directory] for the Action.
-  The Command and Directory messages must be marshalled to wire format and then
-  uploaded under the hash as with any other piece of content. In practice, the
-  input root directory is likely to refer to other Directories in its
-  hierarchy, which must also each be uploaded on their own.
+    Most of the binary data stored in the CAS is opaque to the execution engine,
+    and is only used as a communication medium. In order to build an
+    [Action][build.bazel.remote.execution.v2.Action],
+    however, the client will need to also upload the
+    [Command][build.bazel.remote.execution.v2.Command] and input root
+    [Directory][build.bazel.remote.execution.v2.Directory] for the Action.
+    The Command and Directory messages must be marshalled to wire format and then
+    uploaded under the hash as with any other piece of content. In practice, the
+    input root directory is likely to refer to other Directories in its
+    hierarchy, which must also each be uploaded on their own.
 
-  For small file uploads the client should group them together and call
-  [BatchUpdateBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchUpdateBlobs]
-  on chunks of no more than 10 MiB. For large uploads, the client must use the
-  [Write method][google.bytestream.ByteStream.Write] of the ByteStream API. The
-  `resource_name` is `{instance_name}/uploads/{uuid}/blobs/{hash}/{size}`,
-  where `instance_name` is as described in the next paragraph, `uuid` is a
-  version 4 UUID generated by the client, and `hash` and `size` are the
-  [Digest][build.bazel.remote.execution.v2.Digest] of the blob. The
-  `uuid` is used only to avoid collisions when multiple clients try to upload
-  the same file (or the same client tries to upload the file multiple times at
-  once on different threads), so the client MAY reuse the `uuid` for uploading
-  different blobs. The `resource_name` may optionally have a trailing filename
-  (or other metadata) for a client to use if it is storing URLs, as in
-  `{instance}/uploads/{uuid}/blobs/{hash}/{size}/foo/bar/baz.cc`. Anything
-  after the `size` is ignored.
+    For small file uploads the client should group them together and call
+    [BatchUpdateBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchUpdateBlobs]
+    on chunks of no more than 10 MiB. For large uploads, the client must use the
+    [Write method][google.bytestream.ByteStream.Write] of the ByteStream API. The
+    `resource_name` is `{instance_name}/uploads/{uuid}/blobs/{hash}/{size}`,
+    where `instance_name` is as described in the next paragraph, `uuid` is a
+    version 4 UUID generated by the client, and `hash` and `size` are the
+    [Digest][build.bazel.remote.execution.v2.Digest] of the blob. The
+    `uuid` is used only to avoid collisions when multiple clients try to upload
+    the same file (or the same client tries to upload the file multiple times at
+    once on different threads), so the client MAY reuse the `uuid` for uploading
+    different blobs. The `resource_name` may optionally have a trailing filename
+    (or other metadata) for a client to use if it is storing URLs, as in
+    `{instance}/uploads/{uuid}/blobs/{hash}/{size}/foo/bar/baz.cc`. Anything
+    after the `size` is ignored.
 
-  A single server MAY support multiple instances of the execution system, each
-  with their own workers, storage, cache, etc. The exact relationship between
-  instances is up to the server. If the server does, then the `instance_name`
-  is an identifier, possibly containing multiple path segments, used to
-  distinguish between the various instances on the server, in a manner defined
-  by the server. For servers which do not support multiple instances, then the
-  `instance_name` is the empty path and the leading slash is omitted, so that
-  the `resource_name` becomes `uploads/{uuid}/blobs/{hash}/{size}`.
+    A single server MAY support multiple instances of the execution system, each
+    with their own workers, storage, cache, etc. The exact relationship between
+    instances is up to the server. If the server does, then the `instance_name`
+    is an identifier, possibly containing multiple path segments, used to
+    distinguish between the various instances on the server, in a manner defined
+    by the server. For servers which do not support multiple instances, then the
+    `instance_name` is the empty path and the leading slash is omitted, so that
+    the `resource_name` becomes `uploads/{uuid}/blobs/{hash}/{size}`.
 
-  When attempting an upload, if another client has already completed the upload
-  (which may occur in the middle of a single upload if another client uploads
-  the same blob concurrently), the request will terminate immediately with
-  a response whose `committed_size` is the full size of the uploaded file
-  (regardless of how much data was transmitted by the client). If the client
-  completes the upload but the
-  [Digest][build.bazel.remote.execution.v2.Digest] does not match, an
-  `INVALID_ARGUMENT` error will be returned. In either case, the client should
-  not attempt to retry the upload.
+    When attempting an upload, if another client has already completed the upload
+    (which may occur in the middle of a single upload if another client uploads
+    the same blob concurrently), the request will terminate immediately with
+    a response whose `committed_size` is the full size of the uploaded file
+    (regardless of how much data was transmitted by the client). If the client
+    completes the upload but the
+    [Digest][build.bazel.remote.execution.v2.Digest] does not match, an
+    `INVALID_ARGUMENT` error will be returned. In either case, the client should
+    not attempt to retry the upload.
 
-  For downloading blobs, the client must use the
-  [Read method][google.bytestream.ByteStream.Read] of the ByteStream API, with
-  a `resource_name` of `"{instance_name}/blobs/{hash}/{size}"`, where
-  `instance_name` is the instance name (see above), and `hash` and `size` are
-  the [Digest][build.bazel.remote.execution.v2.Digest] of the blob.
+    For downloading blobs, the client must use the
+    [Read method][google.bytestream.ByteStream.Read] of the ByteStream API, with
+    a `resource_name` of `"{instance_name}/blobs/{hash}/{size}"`, where
+    `instance_name` is the instance name (see above), and `hash` and `size` are
+    the [Digest][build.bazel.remote.execution.v2.Digest] of the blob.
 
-  The lifetime of entries in the CAS is implementation specific, but it SHOULD
-  be long enough to allow for newly-added and recently looked-up entries to be
-  used in subsequent calls (e.g. to
-  [Execute][build.bazel.remote.execution.v2.Execution.Execute]).
+    The lifetime of entries in the CAS is implementation specific, but it SHOULD
+    be long enough to allow for newly-added and recently looked-up entries to be
+    used in subsequent calls (e.g. to
+    [Execute][build.bazel.remote.execution.v2.Execution.Execute]).
 
-  As with other services in the Remote Execution API, any call may return an
-  error with a [RetryInfo][google.rpc.RetryInfo] error detail providing
-  information about when the client should retry the request; clients SHOULD
-  respect the information provided.
-  """
-
-  def FindMissingBlobs(self, request, context):
-    """Determine if blobs are present in the CAS.
-
-    Clients can use this API before uploading blobs to determine which ones are
-    already present in the CAS and do not need to be uploaded again.
-
-    There are no method-specific errors.
+    As with other services in the Remote Execution API, any call may return an
+    error with a [RetryInfo][google.rpc.RetryInfo] error detail providing
+    information about when the client should retry the request; clients SHOULD
+    respect the information provided.
     """
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
 
-  def BatchUpdateBlobs(self, request, context):
-    """Upload many blobs at once.
+    def FindMissingBlobs(self, request, context):
+        """Determine if blobs are present in the CAS.
 
-    The server may enforce a limit of the combined total size of blobs
-    to be uploaded using this API. This limit may be obtained using the
-    [Capabilities][build.bazel.remote.execution.v2.Capabilities] API.
-    Requests exceeding the limit should either be split into smaller
-    chunks or uploaded using the
-    [ByteStream API][google.bytestream.ByteStream], as appropriate.
+        Clients can use this API before uploading blobs to determine which ones are
+        already present in the CAS and do not need to be uploaded again.
 
-    This request is equivalent to calling a Bytestream `Write` request
-    on each individual blob, in parallel. The requests may succeed or fail
-    independently.
+        There are no method-specific errors.
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-    Errors:
-    * `INVALID_ARGUMENT`: The client attempted to upload more than the
-    server supported limit.
+    def BatchUpdateBlobs(self, request, context):
+        """Upload many blobs at once.
 
-    Individual requests may return the following errors, additionally:
-    * `RESOURCE_EXHAUSTED`: There is insufficient disk quota to store the blob.
-    * `INVALID_ARGUMENT`: The
-    [Digest][build.bazel.remote.execution.v2.Digest] does not match the
-    provided data.
-    """
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+        The server may enforce a limit of the combined total size of blobs
+        to be uploaded using this API. This limit may be obtained using the
+        [Capabilities][build.bazel.remote.execution.v2.Capabilities] API.
+        Requests exceeding the limit should either be split into smaller
+        chunks or uploaded using the
+        [ByteStream API][google.bytestream.ByteStream], as appropriate.
 
-  def BatchReadBlobs(self, request, context):
-    """Download many blobs at once.
+        This request is equivalent to calling a Bytestream `Write` request
+        on each individual blob, in parallel. The requests may succeed or fail
+        independently.
 
-    The server may enforce a limit of the combined total size of blobs
-    to be downloaded using this API. This limit may be obtained using the
-    [Capabilities][build.bazel.remote.execution.v2.Capabilities] API.
-    Requests exceeding the limit should either be split into smaller
-    chunks or downloaded using the
-    [ByteStream API][google.bytestream.ByteStream], as appropriate.
+        Errors:
+        * `INVALID_ARGUMENT`: The client attempted to upload more than the
+        server supported limit.
 
-    This request is equivalent to calling a Bytestream `Read` request
-    on each individual blob, in parallel. The requests may succeed or fail
-    independently.
+        Individual requests may return the following errors, additionally:
+        * `RESOURCE_EXHAUSTED`: There is insufficient disk quota to store the blob.
+        * `INVALID_ARGUMENT`: The
+        [Digest][build.bazel.remote.execution.v2.Digest] does not match the
+        provided data.
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-    Errors:
-    * `INVALID_ARGUMENT`: The client attempted to read more than the
-    server supported limit.
+    def BatchReadBlobs(self, request, context):
+        """Download many blobs at once.
 
-    Every error on individual read will be returned in the corresponding digest
-    status.
-    """
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+        The server may enforce a limit of the combined total size of blobs
+        to be downloaded using this API. This limit may be obtained using the
+        [Capabilities][build.bazel.remote.execution.v2.Capabilities] API.
+        Requests exceeding the limit should either be split into smaller
+        chunks or downloaded using the
+        [ByteStream API][google.bytestream.ByteStream], as appropriate.
 
-  def GetTree(self, request, context):
-    """Fetch the entire directory tree rooted at a node.
+        This request is equivalent to calling a Bytestream `Read` request
+        on each individual blob, in parallel. The requests may succeed or fail
+        independently.
 
-    This request must be targeted at a
-    [Directory][build.bazel.remote.execution.v2.Directory] stored in the
-    [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage]
-    (CAS). The server will enumerate the `Directory` tree recursively and
-    return every node descended from the root.
+        Errors:
+        * `INVALID_ARGUMENT`: The client attempted to read more than the
+        server supported limit.
 
-    The GetTreeRequest.page_token parameter can be used to skip ahead in
-    the stream (e.g. when retrying a partially completed and aborted request),
-    by setting it to a value taken from GetTreeResponse.next_page_token of the
-    last successfully processed GetTreeResponse).
+        Every error on individual read will be returned in the corresponding digest
+        status.
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-    The exact traversal order is unspecified and, unless retrieving subsequent
-    pages from an earlier request, is not guaranteed to be stable across
-    multiple invocations of `GetTree`.
+    def GetTree(self, request, context):
+        """Fetch the entire directory tree rooted at a node.
 
-    If part of the tree is missing from the CAS, the server will return the
-    portion present and omit the rest.
+        This request must be targeted at a
+        [Directory][build.bazel.remote.execution.v2.Directory] stored in the
+        [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage]
+        (CAS). The server will enumerate the `Directory` tree recursively and
+        return every node descended from the root.
 
-    * `NOT_FOUND`: The requested tree root is not present in the CAS.
-    """
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+        The GetTreeRequest.page_token parameter can be used to skip ahead in
+        the stream (e.g. when retrying a partially completed and aborted request),
+        by setting it to a value taken from GetTreeResponse.next_page_token of the
+        last successfully processed GetTreeResponse).
+
+        The exact traversal order is unspecified and, unless retrieving subsequent
+        pages from an earlier request, is not guaranteed to be stable across
+        multiple invocations of `GetTree`.
+
+        If part of the tree is missing from the CAS, the server will return the
+        portion present and omit the rest.
+
+        * `NOT_FOUND`: The requested tree root is not present in the CAS.
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
 
 def add_ContentAddressableStorageServicer_to_server(servicer, server):
-  rpc_method_handlers = {
-      'FindMissingBlobs': grpc.unary_unary_rpc_method_handler(
-          servicer.FindMissingBlobs,
-          request_deserializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.FindMissingBlobsRequest.FromString,
-          response_serializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.FindMissingBlobsResponse.SerializeToString,
-      ),
-      'BatchUpdateBlobs': grpc.unary_unary_rpc_method_handler(
-          servicer.BatchUpdateBlobs,
-          request_deserializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.BatchUpdateBlobsRequest.FromString,
-          response_serializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.BatchUpdateBlobsResponse.SerializeToString,
-      ),
-      'BatchReadBlobs': grpc.unary_unary_rpc_method_handler(
-          servicer.BatchReadBlobs,
-          request_deserializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.BatchReadBlobsRequest.FromString,
-          response_serializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.BatchReadBlobsResponse.SerializeToString,
-      ),
-      'GetTree': grpc.unary_stream_rpc_method_handler(
-          servicer.GetTree,
-          request_deserializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.GetTreeRequest.FromString,
-          response_serializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.GetTreeResponse.SerializeToString,
-      ),
-  }
-  generic_handler = grpc.method_handlers_generic_handler(
-      'build.bazel.remote.execution.v2.ContentAddressableStorage', rpc_method_handlers)
-  server.add_generic_rpc_handlers((generic_handler,))
+    rpc_method_handlers = {
+            'FindMissingBlobs': grpc.unary_unary_rpc_method_handler(
+                    servicer.FindMissingBlobs,
+                    request_deserializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.FindMissingBlobsRequest.FromString,
+                    response_serializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.FindMissingBlobsResponse.SerializeToString,
+            ),
+            'BatchUpdateBlobs': grpc.unary_unary_rpc_method_handler(
+                    servicer.BatchUpdateBlobs,
+                    request_deserializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.BatchUpdateBlobsRequest.FromString,
+                    response_serializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.BatchUpdateBlobsResponse.SerializeToString,
+            ),
+            'BatchReadBlobs': grpc.unary_unary_rpc_method_handler(
+                    servicer.BatchReadBlobs,
+                    request_deserializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.BatchReadBlobsRequest.FromString,
+                    response_serializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.BatchReadBlobsResponse.SerializeToString,
+            ),
+            'GetTree': grpc.unary_stream_rpc_method_handler(
+                    servicer.GetTree,
+                    request_deserializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.GetTreeRequest.FromString,
+                    response_serializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.GetTreeResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'build.bazel.remote.execution.v2.ContentAddressableStorage', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class ContentAddressableStorage(object):
+    """The CAS (content-addressable storage) is used to store the inputs to and
+    outputs from the execution service. Each piece of content is addressed by the
+    digest of its binary data.
+
+    Most of the binary data stored in the CAS is opaque to the execution engine,
+    and is only used as a communication medium. In order to build an
+    [Action][build.bazel.remote.execution.v2.Action],
+    however, the client will need to also upload the
+    [Command][build.bazel.remote.execution.v2.Command] and input root
+    [Directory][build.bazel.remote.execution.v2.Directory] for the Action.
+    The Command and Directory messages must be marshalled to wire format and then
+    uploaded under the hash as with any other piece of content. In practice, the
+    input root directory is likely to refer to other Directories in its
+    hierarchy, which must also each be uploaded on their own.
+
+    For small file uploads the client should group them together and call
+    [BatchUpdateBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchUpdateBlobs]
+    on chunks of no more than 10 MiB. For large uploads, the client must use the
+    [Write method][google.bytestream.ByteStream.Write] of the ByteStream API. The
+    `resource_name` is `{instance_name}/uploads/{uuid}/blobs/{hash}/{size}`,
+    where `instance_name` is as described in the next paragraph, `uuid` is a
+    version 4 UUID generated by the client, and `hash` and `size` are the
+    [Digest][build.bazel.remote.execution.v2.Digest] of the blob. The
+    `uuid` is used only to avoid collisions when multiple clients try to upload
+    the same file (or the same client tries to upload the file multiple times at
+    once on different threads), so the client MAY reuse the `uuid` for uploading
+    different blobs. The `resource_name` may optionally have a trailing filename
+    (or other metadata) for a client to use if it is storing URLs, as in
+    `{instance}/uploads/{uuid}/blobs/{hash}/{size}/foo/bar/baz.cc`. Anything
+    after the `size` is ignored.
+
+    A single server MAY support multiple instances of the execution system, each
+    with their own workers, storage, cache, etc. The exact relationship between
+    instances is up to the server. If the server does, then the `instance_name`
+    is an identifier, possibly containing multiple path segments, used to
+    distinguish between the various instances on the server, in a manner defined
+    by the server. For servers which do not support multiple instances, then the
+    `instance_name` is the empty path and the leading slash is omitted, so that
+    the `resource_name` becomes `uploads/{uuid}/blobs/{hash}/{size}`.
+
+    When attempting an upload, if another client has already completed the upload
+    (which may occur in the middle of a single upload if another client uploads
+    the same blob concurrently), the request will terminate immediately with
+    a response whose `committed_size` is the full size of the uploaded file
+    (regardless of how much data was transmitted by the client). If the client
+    completes the upload but the
+    [Digest][build.bazel.remote.execution.v2.Digest] does not match, an
+    `INVALID_ARGUMENT` error will be returned. In either case, the client should
+    not attempt to retry the upload.
+
+    For downloading blobs, the client must use the
+    [Read method][google.bytestream.ByteStream.Read] of the ByteStream API, with
+    a `resource_name` of `"{instance_name}/blobs/{hash}/{size}"`, where
+    `instance_name` is the instance name (see above), and `hash` and `size` are
+    the [Digest][build.bazel.remote.execution.v2.Digest] of the blob.
+
+    The lifetime of entries in the CAS is implementation specific, but it SHOULD
+    be long enough to allow for newly-added and recently looked-up entries to be
+    used in subsequent calls (e.g. to
+    [Execute][build.bazel.remote.execution.v2.Execution.Execute]).
+
+    As with other services in the Remote Execution API, any call may return an
+    error with a [RetryInfo][google.rpc.RetryInfo] error detail providing
+    information about when the client should retry the request; clients SHOULD
+    respect the information provided.
+    """
+
+    @staticmethod
+    def FindMissingBlobs(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/build.bazel.remote.execution.v2.ContentAddressableStorage/FindMissingBlobs',
+            build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.FindMissingBlobsRequest.SerializeToString,
+            build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.FindMissingBlobsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def BatchUpdateBlobs(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/build.bazel.remote.execution.v2.ContentAddressableStorage/BatchUpdateBlobs',
+            build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.BatchUpdateBlobsRequest.SerializeToString,
+            build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.BatchUpdateBlobsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def BatchReadBlobs(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/build.bazel.remote.execution.v2.ContentAddressableStorage/BatchReadBlobs',
+            build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.BatchReadBlobsRequest.SerializeToString,
+            build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.BatchReadBlobsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def GetTree(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_stream(request, target, '/build.bazel.remote.execution.v2.ContentAddressableStorage/GetTree',
+            build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.GetTreeRequest.SerializeToString,
+            build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.GetTreeResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
 
 class CapabilitiesStub(object):
-  """The Capabilities service may be used by remote execution clients to query
-  various server properties, in order to self-configure or return meaningful
-  error messages.
+    """The Capabilities service may be used by remote execution clients to query
+    various server properties, in order to self-configure or return meaningful
+    error messages.
 
-  The query may include a particular `instance_name`, in which case the values
-  returned will pertain to that instance.
-  """
-
-  def __init__(self, channel):
-    """Constructor.
-
-    Args:
-      channel: A grpc.Channel.
+    The query may include a particular `instance_name`, in which case the values
+    returned will pertain to that instance.
     """
-    self.GetCapabilities = channel.unary_unary(
-        '/build.bazel.remote.execution.v2.Capabilities/GetCapabilities',
-        request_serializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.GetCapabilitiesRequest.SerializeToString,
-        response_deserializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.ServerCapabilities.FromString,
-        )
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.GetCapabilities = channel.unary_unary(
+                '/build.bazel.remote.execution.v2.Capabilities/GetCapabilities',
+                request_serializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.GetCapabilitiesRequest.SerializeToString,
+                response_deserializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.ServerCapabilities.FromString,
+                )
 
 
 class CapabilitiesServicer(object):
-  """The Capabilities service may be used by remote execution clients to query
-  various server properties, in order to self-configure or return meaningful
-  error messages.
+    """The Capabilities service may be used by remote execution clients to query
+    various server properties, in order to self-configure or return meaningful
+    error messages.
 
-  The query may include a particular `instance_name`, in which case the values
-  returned will pertain to that instance.
-  """
-
-  def GetCapabilities(self, request, context):
-    """GetCapabilities returns the server capabilities configuration.
+    The query may include a particular `instance_name`, in which case the values
+    returned will pertain to that instance.
     """
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+
+    def GetCapabilities(self, request, context):
+        """GetCapabilities returns the server capabilities configuration.
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
 
 def add_CapabilitiesServicer_to_server(servicer, server):
-  rpc_method_handlers = {
-      'GetCapabilities': grpc.unary_unary_rpc_method_handler(
-          servicer.GetCapabilities,
-          request_deserializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.GetCapabilitiesRequest.FromString,
-          response_serializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.ServerCapabilities.SerializeToString,
-      ),
-  }
-  generic_handler = grpc.method_handlers_generic_handler(
-      'build.bazel.remote.execution.v2.Capabilities', rpc_method_handlers)
-  server.add_generic_rpc_handlers((generic_handler,))
+    rpc_method_handlers = {
+            'GetCapabilities': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetCapabilities,
+                    request_deserializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.GetCapabilitiesRequest.FromString,
+                    response_serializer=build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.ServerCapabilities.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'build.bazel.remote.execution.v2.Capabilities', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class Capabilities(object):
+    """The Capabilities service may be used by remote execution clients to query
+    various server properties, in order to self-configure or return meaningful
+    error messages.
+
+    The query may include a particular `instance_name`, in which case the values
+    returned will pertain to that instance.
+    """
+
+    @staticmethod
+    def GetCapabilities(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/build.bazel.remote.execution.v2.Capabilities/GetCapabilities',
+            build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.GetCapabilitiesRequest.SerializeToString,
+            build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.ServerCapabilities.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/buildstream/_protos/build/bazel/semver/semver_pb2.py b/buildstream/_protos/build/bazel/semver/semver_pb2.py
index a36cf72..c663eaf 100644
--- a/buildstream/_protos/build/bazel/semver/semver_pb2.py
+++ b/buildstream/_protos/build/bazel/semver/semver_pb2.py
@@ -1,13 +1,12 @@
+# -*- coding: utf-8 -*-
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: build/bazel/semver/semver.proto
-
-import sys
-_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+"""Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
-from google.protobuf import descriptor_pb2
 # @@protoc_insertion_point(imports)
 
 _sym_db = _symbol_database.Default()
@@ -15,76 +14,21 @@
 
 
 
-DESCRIPTOR = _descriptor.FileDescriptor(
-  name='build/bazel/semver/semver.proto',
-  package='build.bazel.semver',
-  syntax='proto3',
-  serialized_pb=_b('\n\x1f\x62uild/bazel/semver/semver.proto\x12\x12\x62uild.bazel.semver\"I\n\x06SemVer\x12\r\n\x05major\x18\x01 \x01(\x05\x12\r\n\x05minor\x18\x02 \x01(\x05\x12\r\n\x05patch\x18\x03 \x01(\x05\x12\x12\n\nprerelease\x18\x04 \x01(\tb\x06proto3')
-)
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1f\x62uild/bazel/semver/semver.proto\x12\x12\x62uild.bazel.semver\"I\n\x06SemVer\x12\r\n\x05major\x18\x01 \x01(\x05\x12\r\n\x05minor\x18\x02 \x01(\x05\x12\r\n\x05patch\x18\x03 \x01(\x05\x12\x12\n\nprerelease\x18\x04 \x01(\tb\x06proto3')
 
 
 
-
-_SEMVER = _descriptor.Descriptor(
-  name='SemVer',
-  full_name='build.bazel.semver.SemVer',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='major', full_name='build.bazel.semver.SemVer.major', index=0,
-      number=1, type=5, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='minor', full_name='build.bazel.semver.SemVer.minor', index=1,
-      number=2, type=5, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='patch', full_name='build.bazel.semver.SemVer.patch', index=2,
-      number=3, type=5, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='prerelease', full_name='build.bazel.semver.SemVer.prerelease', index=3,
-      number=4, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=55,
-  serialized_end=128,
-)
-
-DESCRIPTOR.message_types_by_name['SemVer'] = _SEMVER
-_sym_db.RegisterFileDescriptor(DESCRIPTOR)
-
-SemVer = _reflection.GeneratedProtocolMessageType('SemVer', (_message.Message,), dict(
-  DESCRIPTOR = _SEMVER,
-  __module__ = 'build.bazel.semver.semver_pb2'
+_SEMVER = DESCRIPTOR.message_types_by_name['SemVer']
+SemVer = _reflection.GeneratedProtocolMessageType('SemVer', (_message.Message,), {
+  'DESCRIPTOR' : _SEMVER,
+  '__module__' : 'build.bazel.semver.semver_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.semver.SemVer)
-  ))
+  })
 _sym_db.RegisterMessage(SemVer)
 
+if _descriptor._USE_C_DESCRIPTORS == False:
 
+  DESCRIPTOR._options = None
+  _SEMVER._serialized_start=55
+  _SEMVER._serialized_end=128
 # @@protoc_insertion_point(module_scope)
diff --git a/buildstream/_protos/build/bazel/semver/semver_pb2_grpc.py b/buildstream/_protos/build/bazel/semver/semver_pb2_grpc.py
index a894352..2daafff 100644
--- a/buildstream/_protos/build/bazel/semver/semver_pb2_grpc.py
+++ b/buildstream/_protos/build/bazel/semver/semver_pb2_grpc.py
@@ -1,3 +1,4 @@
 # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
 import grpc
 
diff --git a/buildstream/_protos/buildstream/v2/buildstream_pb2.py b/buildstream/_protos/buildstream/v2/buildstream_pb2.py
index 57fdae4..7c47f8b 100644
--- a/buildstream/_protos/buildstream/v2/buildstream_pb2.py
+++ b/buildstream/_protos/buildstream/v2/buildstream_pb2.py
@@ -1,13 +1,12 @@
+# -*- coding: utf-8 -*-
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: buildstream/v2/buildstream.proto
-
-import sys
-_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+"""Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
-from google.protobuf import descriptor_pb2
 # @@protoc_insertion_point(imports)
 
 _sym_db = _symbol_database.Default()
@@ -17,309 +16,80 @@
 from buildstream._protos.google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
 
 
-DESCRIPTOR = _descriptor.FileDescriptor(
-  name='buildstream/v2/buildstream.proto',
-  package='buildstream.v2',
-  syntax='proto3',
-  serialized_pb=_b('\n buildstream/v2/buildstream.proto\x12\x0e\x62uildstream.v2\x1a\x36\x62uild/bazel/remote/execution/v2/remote_execution.proto\x1a\x1cgoogle/api/annotations.proto\"9\n\x13GetReferenceRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12\x0b\n\x03key\x18\x02 \x01(\t\"O\n\x14GetReferenceResponse\x12\x37\n\x06\x64igest\x18\x01 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"v\n\x16UpdateReferenceRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12\x0c\n\x04keys\x18\x02 \x03(\t\x12\x37\n\x06\x64igest\x18\x03 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"\x19\n\x17UpdateReferenceResponse\"&\n\rStatusRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\"\'\n\x0eStatusResponse\x12\x15\n\rallow_updates\x18\x01 \x01(\x08\x32\xca\x03\n\x10ReferenceStorage\x12\x90\x01\n\x0cGetReference\x12#.buildstream.v2.GetReferenceRequest\x1a$.buildstream.v2.GetReferenceResponse\"5\x82\xd3\xe4\x93\x02/\x12-/v2/{instance_name=**}/buildstream/refs/{key}\x12\xa1\x01\n\x0fUpdateReference\x12&.buildstream.v2.UpdateReferenceRequest\x1a\'.buildstream.v2.UpdateReferenceResponse\"=\x82\xd3\xe4\x93\x02\x37\x1a-/v2/{instance_name=**}/buildstream/refs/{key}:\x06\x64igest\x12\x7f\n\x06Status\x12\x1d.buildstream.v2.StatusRequest\x1a\x1e.buildstream.v2.StatusResponse\"6\x82\xd3\xe4\x93\x02\x30\x1a./v2/{instance_name=**}/buildstream/refs:statusb\x06proto3')
-  ,
-  dependencies=[build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.DESCRIPTOR,google_dot_api_dot_annotations__pb2.DESCRIPTOR,])
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n buildstream/v2/buildstream.proto\x12\x0e\x62uildstream.v2\x1a\x36\x62uild/bazel/remote/execution/v2/remote_execution.proto\x1a\x1cgoogle/api/annotations.proto\"9\n\x13GetReferenceRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12\x0b\n\x03key\x18\x02 \x01(\t\"O\n\x14GetReferenceResponse\x12\x37\n\x06\x64igest\x18\x01 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"v\n\x16UpdateReferenceRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12\x0c\n\x04keys\x18\x02 \x03(\t\x12\x37\n\x06\x64igest\x18\x03 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"\x19\n\x17UpdateReferenceResponse\"&\n\rStatusRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\"\'\n\x0eStatusResponse\x12\x15\n\rallow_updates\x18\x01 \x01(\x08\x32\xca\x03\n\x10ReferenceStorage\x12\x90\x01\n\x0cGetReference\x12#.buildstream.v2.GetReferenceRequest\x1a$.buildstream.v2.GetReferenceResponse\"5\x82\xd3\xe4\x93\x02/\x12-/v2/{instance_name=**}/buildstream/refs/{key}\x12\xa1\x01\n\x0fUpdateReference\x12&.buildstream.v2.UpdateReferenceRequest\x1a\'.buildstream.v2.UpdateReferenceResponse\"=\x82\xd3\xe4\x93\x02\x37\x1a-/v2/{instance_name=**}/buildstream/refs/{key}:\x06\x64igest\x12\x7f\n\x06Status\x12\x1d.buildstream.v2.StatusRequest\x1a\x1e.buildstream.v2.StatusResponse\"6\x82\xd3\xe4\x93\x02\x30\x1a./v2/{instance_name=**}/buildstream/refs:statusb\x06proto3')
 
 
 
-
-_GETREFERENCEREQUEST = _descriptor.Descriptor(
-  name='GetReferenceRequest',
-  full_name='buildstream.v2.GetReferenceRequest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='instance_name', full_name='buildstream.v2.GetReferenceRequest.instance_name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='key', full_name='buildstream.v2.GetReferenceRequest.key', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=138,
-  serialized_end=195,
-)
-
-
-_GETREFERENCERESPONSE = _descriptor.Descriptor(
-  name='GetReferenceResponse',
-  full_name='buildstream.v2.GetReferenceResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='digest', full_name='buildstream.v2.GetReferenceResponse.digest', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=197,
-  serialized_end=276,
-)
-
-
-_UPDATEREFERENCEREQUEST = _descriptor.Descriptor(
-  name='UpdateReferenceRequest',
-  full_name='buildstream.v2.UpdateReferenceRequest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='instance_name', full_name='buildstream.v2.UpdateReferenceRequest.instance_name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='keys', full_name='buildstream.v2.UpdateReferenceRequest.keys', index=1,
-      number=2, type=9, cpp_type=9, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='digest', full_name='buildstream.v2.UpdateReferenceRequest.digest', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=278,
-  serialized_end=396,
-)
-
-
-_UPDATEREFERENCERESPONSE = _descriptor.Descriptor(
-  name='UpdateReferenceResponse',
-  full_name='buildstream.v2.UpdateReferenceResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=398,
-  serialized_end=423,
-)
-
-
-_STATUSREQUEST = _descriptor.Descriptor(
-  name='StatusRequest',
-  full_name='buildstream.v2.StatusRequest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='instance_name', full_name='buildstream.v2.StatusRequest.instance_name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=425,
-  serialized_end=463,
-)
-
-
-_STATUSRESPONSE = _descriptor.Descriptor(
-  name='StatusResponse',
-  full_name='buildstream.v2.StatusResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='allow_updates', full_name='buildstream.v2.StatusResponse.allow_updates', index=0,
-      number=1, type=8, cpp_type=7, label=1,
-      has_default_value=False, default_value=False,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=465,
-  serialized_end=504,
-)
-
-_GETREFERENCERESPONSE.fields_by_name['digest'].message_type = build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2._DIGEST
-_UPDATEREFERENCEREQUEST.fields_by_name['digest'].message_type = build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2._DIGEST
-DESCRIPTOR.message_types_by_name['GetReferenceRequest'] = _GETREFERENCEREQUEST
-DESCRIPTOR.message_types_by_name['GetReferenceResponse'] = _GETREFERENCERESPONSE
-DESCRIPTOR.message_types_by_name['UpdateReferenceRequest'] = _UPDATEREFERENCEREQUEST
-DESCRIPTOR.message_types_by_name['UpdateReferenceResponse'] = _UPDATEREFERENCERESPONSE
-DESCRIPTOR.message_types_by_name['StatusRequest'] = _STATUSREQUEST
-DESCRIPTOR.message_types_by_name['StatusResponse'] = _STATUSRESPONSE
-_sym_db.RegisterFileDescriptor(DESCRIPTOR)
-
-GetReferenceRequest = _reflection.GeneratedProtocolMessageType('GetReferenceRequest', (_message.Message,), dict(
-  DESCRIPTOR = _GETREFERENCEREQUEST,
-  __module__ = 'buildstream.v2.buildstream_pb2'
+_GETREFERENCEREQUEST = DESCRIPTOR.message_types_by_name['GetReferenceRequest']
+_GETREFERENCERESPONSE = DESCRIPTOR.message_types_by_name['GetReferenceResponse']
+_UPDATEREFERENCEREQUEST = DESCRIPTOR.message_types_by_name['UpdateReferenceRequest']
+_UPDATEREFERENCERESPONSE = DESCRIPTOR.message_types_by_name['UpdateReferenceResponse']
+_STATUSREQUEST = DESCRIPTOR.message_types_by_name['StatusRequest']
+_STATUSRESPONSE = DESCRIPTOR.message_types_by_name['StatusResponse']
+GetReferenceRequest = _reflection.GeneratedProtocolMessageType('GetReferenceRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETREFERENCEREQUEST,
+  '__module__' : 'buildstream.v2.buildstream_pb2'
   # @@protoc_insertion_point(class_scope:buildstream.v2.GetReferenceRequest)
-  ))
+  })
 _sym_db.RegisterMessage(GetReferenceRequest)
 
-GetReferenceResponse = _reflection.GeneratedProtocolMessageType('GetReferenceResponse', (_message.Message,), dict(
-  DESCRIPTOR = _GETREFERENCERESPONSE,
-  __module__ = 'buildstream.v2.buildstream_pb2'
+GetReferenceResponse = _reflection.GeneratedProtocolMessageType('GetReferenceResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETREFERENCERESPONSE,
+  '__module__' : 'buildstream.v2.buildstream_pb2'
   # @@protoc_insertion_point(class_scope:buildstream.v2.GetReferenceResponse)
-  ))
+  })
 _sym_db.RegisterMessage(GetReferenceResponse)
 
-UpdateReferenceRequest = _reflection.GeneratedProtocolMessageType('UpdateReferenceRequest', (_message.Message,), dict(
-  DESCRIPTOR = _UPDATEREFERENCEREQUEST,
-  __module__ = 'buildstream.v2.buildstream_pb2'
+UpdateReferenceRequest = _reflection.GeneratedProtocolMessageType('UpdateReferenceRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATEREFERENCEREQUEST,
+  '__module__' : 'buildstream.v2.buildstream_pb2'
   # @@protoc_insertion_point(class_scope:buildstream.v2.UpdateReferenceRequest)
-  ))
+  })
 _sym_db.RegisterMessage(UpdateReferenceRequest)
 
-UpdateReferenceResponse = _reflection.GeneratedProtocolMessageType('UpdateReferenceResponse', (_message.Message,), dict(
-  DESCRIPTOR = _UPDATEREFERENCERESPONSE,
-  __module__ = 'buildstream.v2.buildstream_pb2'
+UpdateReferenceResponse = _reflection.GeneratedProtocolMessageType('UpdateReferenceResponse', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATEREFERENCERESPONSE,
+  '__module__' : 'buildstream.v2.buildstream_pb2'
   # @@protoc_insertion_point(class_scope:buildstream.v2.UpdateReferenceResponse)
-  ))
+  })
 _sym_db.RegisterMessage(UpdateReferenceResponse)
 
-StatusRequest = _reflection.GeneratedProtocolMessageType('StatusRequest', (_message.Message,), dict(
-  DESCRIPTOR = _STATUSREQUEST,
-  __module__ = 'buildstream.v2.buildstream_pb2'
+StatusRequest = _reflection.GeneratedProtocolMessageType('StatusRequest', (_message.Message,), {
+  'DESCRIPTOR' : _STATUSREQUEST,
+  '__module__' : 'buildstream.v2.buildstream_pb2'
   # @@protoc_insertion_point(class_scope:buildstream.v2.StatusRequest)
-  ))
+  })
 _sym_db.RegisterMessage(StatusRequest)
 
-StatusResponse = _reflection.GeneratedProtocolMessageType('StatusResponse', (_message.Message,), dict(
-  DESCRIPTOR = _STATUSRESPONSE,
-  __module__ = 'buildstream.v2.buildstream_pb2'
+StatusResponse = _reflection.GeneratedProtocolMessageType('StatusResponse', (_message.Message,), {
+  'DESCRIPTOR' : _STATUSRESPONSE,
+  '__module__' : 'buildstream.v2.buildstream_pb2'
   # @@protoc_insertion_point(class_scope:buildstream.v2.StatusResponse)
-  ))
+  })
 _sym_db.RegisterMessage(StatusResponse)
 
+_REFERENCESTORAGE = DESCRIPTOR.services_by_name['ReferenceStorage']
+if _descriptor._USE_C_DESCRIPTORS == False:
 
-
-_REFERENCESTORAGE = _descriptor.ServiceDescriptor(
-  name='ReferenceStorage',
-  full_name='buildstream.v2.ReferenceStorage',
-  file=DESCRIPTOR,
-  index=0,
-  options=None,
-  serialized_start=507,
-  serialized_end=965,
-  methods=[
-  _descriptor.MethodDescriptor(
-    name='GetReference',
-    full_name='buildstream.v2.ReferenceStorage.GetReference',
-    index=0,
-    containing_service=None,
-    input_type=_GETREFERENCEREQUEST,
-    output_type=_GETREFERENCERESPONSE,
-    options=_descriptor._ParseOptions(descriptor_pb2.MethodOptions(), _b('\202\323\344\223\002/\022-/v2/{instance_name=**}/buildstream/refs/{key}')),
-  ),
-  _descriptor.MethodDescriptor(
-    name='UpdateReference',
-    full_name='buildstream.v2.ReferenceStorage.UpdateReference',
-    index=1,
-    containing_service=None,
-    input_type=_UPDATEREFERENCEREQUEST,
-    output_type=_UPDATEREFERENCERESPONSE,
-    options=_descriptor._ParseOptions(descriptor_pb2.MethodOptions(), _b('\202\323\344\223\0027\032-/v2/{instance_name=**}/buildstream/refs/{key}:\006digest')),
-  ),
-  _descriptor.MethodDescriptor(
-    name='Status',
-    full_name='buildstream.v2.ReferenceStorage.Status',
-    index=2,
-    containing_service=None,
-    input_type=_STATUSREQUEST,
-    output_type=_STATUSRESPONSE,
-    options=_descriptor._ParseOptions(descriptor_pb2.MethodOptions(), _b('\202\323\344\223\0020\032./v2/{instance_name=**}/buildstream/refs:status')),
-  ),
-])
-_sym_db.RegisterServiceDescriptor(_REFERENCESTORAGE)
-
-DESCRIPTOR.services_by_name['ReferenceStorage'] = _REFERENCESTORAGE
-
+  DESCRIPTOR._options = None
+  _REFERENCESTORAGE.methods_by_name['GetReference']._options = None
+  _REFERENCESTORAGE.methods_by_name['GetReference']._serialized_options = b'\202\323\344\223\002/\022-/v2/{instance_name=**}/buildstream/refs/{key}'
+  _REFERENCESTORAGE.methods_by_name['UpdateReference']._options = None
+  _REFERENCESTORAGE.methods_by_name['UpdateReference']._serialized_options = b'\202\323\344\223\0027\032-/v2/{instance_name=**}/buildstream/refs/{key}:\006digest'
+  _REFERENCESTORAGE.methods_by_name['Status']._options = None
+  _REFERENCESTORAGE.methods_by_name['Status']._serialized_options = b'\202\323\344\223\0020\032./v2/{instance_name=**}/buildstream/refs:status'
+  _GETREFERENCEREQUEST._serialized_start=138
+  _GETREFERENCEREQUEST._serialized_end=195
+  _GETREFERENCERESPONSE._serialized_start=197
+  _GETREFERENCERESPONSE._serialized_end=276
+  _UPDATEREFERENCEREQUEST._serialized_start=278
+  _UPDATEREFERENCEREQUEST._serialized_end=396
+  _UPDATEREFERENCERESPONSE._serialized_start=398
+  _UPDATEREFERENCERESPONSE._serialized_end=423
+  _STATUSREQUEST._serialized_start=425
+  _STATUSREQUEST._serialized_end=463
+  _STATUSRESPONSE._serialized_start=465
+  _STATUSRESPONSE._serialized_end=504
+  _REFERENCESTORAGE._serialized_start=507
+  _REFERENCESTORAGE._serialized_end=965
 # @@protoc_insertion_point(module_scope)
diff --git a/buildstream/_protos/buildstream/v2/buildstream_pb2_grpc.py b/buildstream/_protos/buildstream/v2/buildstream_pb2_grpc.py
index b3e6534..eb3d73e 100644
--- a/buildstream/_protos/buildstream/v2/buildstream_pb2_grpc.py
+++ b/buildstream/_protos/buildstream/v2/buildstream_pb2_grpc.py
@@ -1,89 +1,143 @@
 # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
 import grpc
 
 from buildstream._protos.buildstream.v2 import buildstream_pb2 as buildstream_dot_v2_dot_buildstream__pb2
 
 
 class ReferenceStorageStub(object):
-  # missing associated documentation comment in .proto file
-  pass
+    """Missing associated documentation comment in .proto file."""
 
-  def __init__(self, channel):
-    """Constructor.
+    def __init__(self, channel):
+        """Constructor.
 
-    Args:
-      channel: A grpc.Channel.
-    """
-    self.GetReference = channel.unary_unary(
-        '/buildstream.v2.ReferenceStorage/GetReference',
-        request_serializer=buildstream_dot_v2_dot_buildstream__pb2.GetReferenceRequest.SerializeToString,
-        response_deserializer=buildstream_dot_v2_dot_buildstream__pb2.GetReferenceResponse.FromString,
-        )
-    self.UpdateReference = channel.unary_unary(
-        '/buildstream.v2.ReferenceStorage/UpdateReference',
-        request_serializer=buildstream_dot_v2_dot_buildstream__pb2.UpdateReferenceRequest.SerializeToString,
-        response_deserializer=buildstream_dot_v2_dot_buildstream__pb2.UpdateReferenceResponse.FromString,
-        )
-    self.Status = channel.unary_unary(
-        '/buildstream.v2.ReferenceStorage/Status',
-        request_serializer=buildstream_dot_v2_dot_buildstream__pb2.StatusRequest.SerializeToString,
-        response_deserializer=buildstream_dot_v2_dot_buildstream__pb2.StatusResponse.FromString,
-        )
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.GetReference = channel.unary_unary(
+                '/buildstream.v2.ReferenceStorage/GetReference',
+                request_serializer=buildstream_dot_v2_dot_buildstream__pb2.GetReferenceRequest.SerializeToString,
+                response_deserializer=buildstream_dot_v2_dot_buildstream__pb2.GetReferenceResponse.FromString,
+                )
+        self.UpdateReference = channel.unary_unary(
+                '/buildstream.v2.ReferenceStorage/UpdateReference',
+                request_serializer=buildstream_dot_v2_dot_buildstream__pb2.UpdateReferenceRequest.SerializeToString,
+                response_deserializer=buildstream_dot_v2_dot_buildstream__pb2.UpdateReferenceResponse.FromString,
+                )
+        self.Status = channel.unary_unary(
+                '/buildstream.v2.ReferenceStorage/Status',
+                request_serializer=buildstream_dot_v2_dot_buildstream__pb2.StatusRequest.SerializeToString,
+                response_deserializer=buildstream_dot_v2_dot_buildstream__pb2.StatusResponse.FromString,
+                )
 
 
 class ReferenceStorageServicer(object):
-  # missing associated documentation comment in .proto file
-  pass
+    """Missing associated documentation comment in .proto file."""
 
-  def GetReference(self, request, context):
-    """Retrieve a CAS [Directory][build.bazel.remote.execution.v2.Directory]
-    digest by name.
+    def GetReference(self, request, context):
+        """Retrieve a CAS [Directory][build.bazel.remote.execution.v2.Directory]
+        digest by name.
 
-    Errors:
-    * `NOT_FOUND`: The requested reference is not in the cache.
-    """
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+        Errors:
+        * `NOT_FOUND`: The requested reference is not in the cache.
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def UpdateReference(self, request, context):
-    """Associate a name with a CAS [Directory][build.bazel.remote.execution.v2.Directory]
-    digest.
+    def UpdateReference(self, request, context):
+        """Associate a name with a CAS [Directory][build.bazel.remote.execution.v2.Directory]
+        digest.
 
-    Errors:
-    * `RESOURCE_EXHAUSTED`: There is insufficient storage space to add the
-    entry to the cache.
-    """
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+        Errors:
+        * `RESOURCE_EXHAUSTED`: There is insufficient storage space to add the
+        entry to the cache.
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def Status(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def Status(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
 
 def add_ReferenceStorageServicer_to_server(servicer, server):
-  rpc_method_handlers = {
-      'GetReference': grpc.unary_unary_rpc_method_handler(
-          servicer.GetReference,
-          request_deserializer=buildstream_dot_v2_dot_buildstream__pb2.GetReferenceRequest.FromString,
-          response_serializer=buildstream_dot_v2_dot_buildstream__pb2.GetReferenceResponse.SerializeToString,
-      ),
-      'UpdateReference': grpc.unary_unary_rpc_method_handler(
-          servicer.UpdateReference,
-          request_deserializer=buildstream_dot_v2_dot_buildstream__pb2.UpdateReferenceRequest.FromString,
-          response_serializer=buildstream_dot_v2_dot_buildstream__pb2.UpdateReferenceResponse.SerializeToString,
-      ),
-      'Status': grpc.unary_unary_rpc_method_handler(
-          servicer.Status,
-          request_deserializer=buildstream_dot_v2_dot_buildstream__pb2.StatusRequest.FromString,
-          response_serializer=buildstream_dot_v2_dot_buildstream__pb2.StatusResponse.SerializeToString,
-      ),
-  }
-  generic_handler = grpc.method_handlers_generic_handler(
-      'buildstream.v2.ReferenceStorage', rpc_method_handlers)
-  server.add_generic_rpc_handlers((generic_handler,))
+    rpc_method_handlers = {
+            'GetReference': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetReference,
+                    request_deserializer=buildstream_dot_v2_dot_buildstream__pb2.GetReferenceRequest.FromString,
+                    response_serializer=buildstream_dot_v2_dot_buildstream__pb2.GetReferenceResponse.SerializeToString,
+            ),
+            'UpdateReference': grpc.unary_unary_rpc_method_handler(
+                    servicer.UpdateReference,
+                    request_deserializer=buildstream_dot_v2_dot_buildstream__pb2.UpdateReferenceRequest.FromString,
+                    response_serializer=buildstream_dot_v2_dot_buildstream__pb2.UpdateReferenceResponse.SerializeToString,
+            ),
+            'Status': grpc.unary_unary_rpc_method_handler(
+                    servicer.Status,
+                    request_deserializer=buildstream_dot_v2_dot_buildstream__pb2.StatusRequest.FromString,
+                    response_serializer=buildstream_dot_v2_dot_buildstream__pb2.StatusResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'buildstream.v2.ReferenceStorage', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class ReferenceStorage(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def GetReference(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/buildstream.v2.ReferenceStorage/GetReference',
+            buildstream_dot_v2_dot_buildstream__pb2.GetReferenceRequest.SerializeToString,
+            buildstream_dot_v2_dot_buildstream__pb2.GetReferenceResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def UpdateReference(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/buildstream.v2.ReferenceStorage/UpdateReference',
+            buildstream_dot_v2_dot_buildstream__pb2.UpdateReferenceRequest.SerializeToString,
+            buildstream_dot_v2_dot_buildstream__pb2.UpdateReferenceResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Status(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/buildstream.v2.ReferenceStorage/Status',
+            buildstream_dot_v2_dot_buildstream__pb2.StatusRequest.SerializeToString,
+            buildstream_dot_v2_dot_buildstream__pb2.StatusResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/buildstream/_protos/google/api/annotations_pb2.py b/buildstream/_protos/google/api/annotations_pb2.py
index 092c46d..ed5de66 100644
--- a/buildstream/_protos/google/api/annotations_pb2.py
+++ b/buildstream/_protos/google/api/annotations_pb2.py
@@ -1,13 +1,12 @@
+# -*- coding: utf-8 -*-
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: google/api/annotations.proto
-
-import sys
-_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+"""Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
-from google.protobuf import descriptor_pb2
 # @@protoc_insertion_point(imports)
 
 _sym_db = _symbol_database.Default()
@@ -17,30 +16,15 @@
 from google.protobuf import descriptor_pb2 as google_dot_protobuf_dot_descriptor__pb2
 
 
-DESCRIPTOR = _descriptor.FileDescriptor(
-  name='google/api/annotations.proto',
-  package='google.api',
-  syntax='proto3',
-  serialized_pb=_b('\n\x1cgoogle/api/annotations.proto\x12\ngoogle.api\x1a\x15google/api/http.proto\x1a google/protobuf/descriptor.proto:E\n\x04http\x12\x1e.google.protobuf.MethodOptions\x18\xb0\xca\xbc\" \x01(\x0b\x32\x14.google.api.HttpRuleBn\n\x0e\x63om.google.apiB\x10\x41nnotationsProtoP\x01ZAgoogle.golang.org/genproto/googleapis/api/annotations;annotations\xa2\x02\x04GAPIb\x06proto3')
-  ,
-  dependencies=[google_dot_api_dot_http__pb2.DESCRIPTOR,google_dot_protobuf_dot_descriptor__pb2.DESCRIPTOR,])
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1cgoogle/api/annotations.proto\x12\ngoogle.api\x1a\x15google/api/http.proto\x1a google/protobuf/descriptor.proto:E\n\x04http\x12\x1e.google.protobuf.MethodOptions\x18\xb0\xca\xbc\" \x01(\x0b\x32\x14.google.api.HttpRuleBn\n\x0e\x63om.google.apiB\x10\x41nnotationsProtoP\x01ZAgoogle.golang.org/genproto/googleapis/api/annotations;annotations\xa2\x02\x04GAPIb\x06proto3')
 
 
 HTTP_FIELD_NUMBER = 72295728
-http = _descriptor.FieldDescriptor(
-  name='http', full_name='google.api.http', index=0,
-  number=72295728, type=11, cpp_type=10, label=1,
-  has_default_value=False, default_value=None,
-  message_type=None, enum_type=None, containing_type=None,
-  is_extension=True, extension_scope=None,
-  options=None, file=DESCRIPTOR)
+http = DESCRIPTOR.extensions_by_name['http']
 
-DESCRIPTOR.extensions_by_name['http'] = http
-_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+if _descriptor._USE_C_DESCRIPTORS == False:
+  google_dot_protobuf_dot_descriptor__pb2.MethodOptions.RegisterExtension(http)
 
-http.message_type = google_dot_api_dot_http__pb2._HTTPRULE
-google_dot_protobuf_dot_descriptor__pb2.MethodOptions.RegisterExtension(http)
-
-DESCRIPTOR.has_options = True
-DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\016com.google.apiB\020AnnotationsProtoP\001ZAgoogle.golang.org/genproto/googleapis/api/annotations;annotations\242\002\004GAPI'))
+  DESCRIPTOR._options = None
+  DESCRIPTOR._serialized_options = b'\n\016com.google.apiB\020AnnotationsProtoP\001ZAgoogle.golang.org/genproto/googleapis/api/annotations;annotations\242\002\004GAPI'
 # @@protoc_insertion_point(module_scope)
diff --git a/buildstream/_protos/google/api/annotations_pb2_grpc.py b/buildstream/_protos/google/api/annotations_pb2_grpc.py
index a894352..2daafff 100644
--- a/buildstream/_protos/google/api/annotations_pb2_grpc.py
+++ b/buildstream/_protos/google/api/annotations_pb2_grpc.py
@@ -1,3 +1,4 @@
 # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
 import grpc
 
diff --git a/buildstream/_protos/google/api/http_pb2.py b/buildstream/_protos/google/api/http_pb2.py
index aad9ddb..22190ed 100644
--- a/buildstream/_protos/google/api/http_pb2.py
+++ b/buildstream/_protos/google/api/http_pb2.py
@@ -1,13 +1,12 @@
+# -*- coding: utf-8 -*-
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: google/api/http.proto
-
-import sys
-_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+"""Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
-from google.protobuf import descriptor_pb2
 # @@protoc_insertion_point(imports)
 
 _sym_db = _symbol_database.Default()
@@ -15,229 +14,42 @@
 
 
 
-DESCRIPTOR = _descriptor.FileDescriptor(
-  name='google/api/http.proto',
-  package='google.api',
-  syntax='proto3',
-  serialized_pb=_b('\n\x15google/api/http.proto\x12\ngoogle.api\"T\n\x04Http\x12#\n\x05rules\x18\x01 \x03(\x0b\x32\x14.google.api.HttpRule\x12\'\n\x1f\x66ully_decode_reserved_expansion\x18\x02 \x01(\x08\"\xea\x01\n\x08HttpRule\x12\x10\n\x08selector\x18\x01 \x01(\t\x12\r\n\x03get\x18\x02 \x01(\tH\x00\x12\r\n\x03put\x18\x03 \x01(\tH\x00\x12\x0e\n\x04post\x18\x04 \x01(\tH\x00\x12\x10\n\x06\x64\x65lete\x18\x05 \x01(\tH\x00\x12\x0f\n\x05patch\x18\x06 \x01(\tH\x00\x12/\n\x06\x63ustom\x18\x08 \x01(\x0b\x32\x1d.google.api.CustomHttpPatternH\x00\x12\x0c\n\x04\x62ody\x18\x07 \x01(\t\x12\x31\n\x13\x61\x64\x64itional_bindings\x18\x0b \x03(\x0b\x32\x14.google.api.HttpRuleB\t\n\x07pattern\"/\n\x11\x43ustomHttpPattern\x12\x0c\n\x04kind\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\tBj\n\x0e\x63om.google.apiB\tHttpProtoP\x01ZAgoogle.golang.org/genproto/googleapis/api/annotations;annotations\xf8\x01\x01\xa2\x02\x04GAPIb\x06proto3')
-)
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15google/api/http.proto\x12\ngoogle.api\"T\n\x04Http\x12#\n\x05rules\x18\x01 \x03(\x0b\x32\x14.google.api.HttpRule\x12\'\n\x1f\x66ully_decode_reserved_expansion\x18\x02 \x01(\x08\"\xea\x01\n\x08HttpRule\x12\x10\n\x08selector\x18\x01 \x01(\t\x12\r\n\x03get\x18\x02 \x01(\tH\x00\x12\r\n\x03put\x18\x03 \x01(\tH\x00\x12\x0e\n\x04post\x18\x04 \x01(\tH\x00\x12\x10\n\x06\x64\x65lete\x18\x05 \x01(\tH\x00\x12\x0f\n\x05patch\x18\x06 \x01(\tH\x00\x12/\n\x06\x63ustom\x18\x08 \x01(\x0b\x32\x1d.google.api.CustomHttpPatternH\x00\x12\x0c\n\x04\x62ody\x18\x07 \x01(\t\x12\x31\n\x13\x61\x64\x64itional_bindings\x18\x0b \x03(\x0b\x32\x14.google.api.HttpRuleB\t\n\x07pattern\"/\n\x11\x43ustomHttpPattern\x12\x0c\n\x04kind\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\tBj\n\x0e\x63om.google.apiB\tHttpProtoP\x01ZAgoogle.golang.org/genproto/googleapis/api/annotations;annotations\xf8\x01\x01\xa2\x02\x04GAPIb\x06proto3')
 
 
 
-
-_HTTP = _descriptor.Descriptor(
-  name='Http',
-  full_name='google.api.Http',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='rules', full_name='google.api.Http.rules', index=0,
-      number=1, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='fully_decode_reserved_expansion', full_name='google.api.Http.fully_decode_reserved_expansion', index=1,
-      number=2, type=8, cpp_type=7, label=1,
-      has_default_value=False, default_value=False,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=37,
-  serialized_end=121,
-)
-
-
-_HTTPRULE = _descriptor.Descriptor(
-  name='HttpRule',
-  full_name='google.api.HttpRule',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='selector', full_name='google.api.HttpRule.selector', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='get', full_name='google.api.HttpRule.get', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='put', full_name='google.api.HttpRule.put', index=2,
-      number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='post', full_name='google.api.HttpRule.post', index=3,
-      number=4, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='delete', full_name='google.api.HttpRule.delete', index=4,
-      number=5, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='patch', full_name='google.api.HttpRule.patch', index=5,
-      number=6, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='custom', full_name='google.api.HttpRule.custom', index=6,
-      number=8, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='body', full_name='google.api.HttpRule.body', index=7,
-      number=7, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='additional_bindings', full_name='google.api.HttpRule.additional_bindings', index=8,
-      number=11, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-    _descriptor.OneofDescriptor(
-      name='pattern', full_name='google.api.HttpRule.pattern',
-      index=0, containing_type=None, fields=[]),
-  ],
-  serialized_start=124,
-  serialized_end=358,
-)
-
-
-_CUSTOMHTTPPATTERN = _descriptor.Descriptor(
-  name='CustomHttpPattern',
-  full_name='google.api.CustomHttpPattern',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='kind', full_name='google.api.CustomHttpPattern.kind', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='path', full_name='google.api.CustomHttpPattern.path', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=360,
-  serialized_end=407,
-)
-
-_HTTP.fields_by_name['rules'].message_type = _HTTPRULE
-_HTTPRULE.fields_by_name['custom'].message_type = _CUSTOMHTTPPATTERN
-_HTTPRULE.fields_by_name['additional_bindings'].message_type = _HTTPRULE
-_HTTPRULE.oneofs_by_name['pattern'].fields.append(
-  _HTTPRULE.fields_by_name['get'])
-_HTTPRULE.fields_by_name['get'].containing_oneof = _HTTPRULE.oneofs_by_name['pattern']
-_HTTPRULE.oneofs_by_name['pattern'].fields.append(
-  _HTTPRULE.fields_by_name['put'])
-_HTTPRULE.fields_by_name['put'].containing_oneof = _HTTPRULE.oneofs_by_name['pattern']
-_HTTPRULE.oneofs_by_name['pattern'].fields.append(
-  _HTTPRULE.fields_by_name['post'])
-_HTTPRULE.fields_by_name['post'].containing_oneof = _HTTPRULE.oneofs_by_name['pattern']
-_HTTPRULE.oneofs_by_name['pattern'].fields.append(
-  _HTTPRULE.fields_by_name['delete'])
-_HTTPRULE.fields_by_name['delete'].containing_oneof = _HTTPRULE.oneofs_by_name['pattern']
-_HTTPRULE.oneofs_by_name['pattern'].fields.append(
-  _HTTPRULE.fields_by_name['patch'])
-_HTTPRULE.fields_by_name['patch'].containing_oneof = _HTTPRULE.oneofs_by_name['pattern']
-_HTTPRULE.oneofs_by_name['pattern'].fields.append(
-  _HTTPRULE.fields_by_name['custom'])
-_HTTPRULE.fields_by_name['custom'].containing_oneof = _HTTPRULE.oneofs_by_name['pattern']
-DESCRIPTOR.message_types_by_name['Http'] = _HTTP
-DESCRIPTOR.message_types_by_name['HttpRule'] = _HTTPRULE
-DESCRIPTOR.message_types_by_name['CustomHttpPattern'] = _CUSTOMHTTPPATTERN
-_sym_db.RegisterFileDescriptor(DESCRIPTOR)
-
-Http = _reflection.GeneratedProtocolMessageType('Http', (_message.Message,), dict(
-  DESCRIPTOR = _HTTP,
-  __module__ = 'google.api.http_pb2'
+_HTTP = DESCRIPTOR.message_types_by_name['Http']
+_HTTPRULE = DESCRIPTOR.message_types_by_name['HttpRule']
+_CUSTOMHTTPPATTERN = DESCRIPTOR.message_types_by_name['CustomHttpPattern']
+Http = _reflection.GeneratedProtocolMessageType('Http', (_message.Message,), {
+  'DESCRIPTOR' : _HTTP,
+  '__module__' : 'google.api.http_pb2'
   # @@protoc_insertion_point(class_scope:google.api.Http)
-  ))
+  })
 _sym_db.RegisterMessage(Http)
 
-HttpRule = _reflection.GeneratedProtocolMessageType('HttpRule', (_message.Message,), dict(
-  DESCRIPTOR = _HTTPRULE,
-  __module__ = 'google.api.http_pb2'
+HttpRule = _reflection.GeneratedProtocolMessageType('HttpRule', (_message.Message,), {
+  'DESCRIPTOR' : _HTTPRULE,
+  '__module__' : 'google.api.http_pb2'
   # @@protoc_insertion_point(class_scope:google.api.HttpRule)
-  ))
+  })
 _sym_db.RegisterMessage(HttpRule)
 
-CustomHttpPattern = _reflection.GeneratedProtocolMessageType('CustomHttpPattern', (_message.Message,), dict(
-  DESCRIPTOR = _CUSTOMHTTPPATTERN,
-  __module__ = 'google.api.http_pb2'
+CustomHttpPattern = _reflection.GeneratedProtocolMessageType('CustomHttpPattern', (_message.Message,), {
+  'DESCRIPTOR' : _CUSTOMHTTPPATTERN,
+  '__module__' : 'google.api.http_pb2'
   # @@protoc_insertion_point(class_scope:google.api.CustomHttpPattern)
-  ))
+  })
 _sym_db.RegisterMessage(CustomHttpPattern)
 
+if _descriptor._USE_C_DESCRIPTORS == False:
 
-DESCRIPTOR.has_options = True
-DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\016com.google.apiB\tHttpProtoP\001ZAgoogle.golang.org/genproto/googleapis/api/annotations;annotations\370\001\001\242\002\004GAPI'))
+  DESCRIPTOR._options = None
+  DESCRIPTOR._serialized_options = b'\n\016com.google.apiB\tHttpProtoP\001ZAgoogle.golang.org/genproto/googleapis/api/annotations;annotations\370\001\001\242\002\004GAPI'
+  _HTTP._serialized_start=37
+  _HTTP._serialized_end=121
+  _HTTPRULE._serialized_start=124
+  _HTTPRULE._serialized_end=358
+  _CUSTOMHTTPPATTERN._serialized_start=360
+  _CUSTOMHTTPPATTERN._serialized_end=407
 # @@protoc_insertion_point(module_scope)
diff --git a/buildstream/_protos/google/api/http_pb2_grpc.py b/buildstream/_protos/google/api/http_pb2_grpc.py
index a894352..2daafff 100644
--- a/buildstream/_protos/google/api/http_pb2_grpc.py
+++ b/buildstream/_protos/google/api/http_pb2_grpc.py
@@ -1,3 +1,4 @@
 # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
 import grpc
 
diff --git a/buildstream/_protos/google/bytestream/bytestream_pb2.py b/buildstream/_protos/google/bytestream/bytestream_pb2.py
index c8487d6..5ee114b 100644
--- a/buildstream/_protos/google/bytestream/bytestream_pb2.py
+++ b/buildstream/_protos/google/bytestream/bytestream_pb2.py
@@ -1,13 +1,12 @@
+# -*- coding: utf-8 -*-
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: google/bytestream/bytestream.proto
-
-import sys
-_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+"""Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
-from google.protobuf import descriptor_pb2
 # @@protoc_insertion_point(imports)
 
 _sym_db = _symbol_database.Default()
@@ -17,337 +16,75 @@
 from google.protobuf import wrappers_pb2 as google_dot_protobuf_dot_wrappers__pb2
 
 
-DESCRIPTOR = _descriptor.FileDescriptor(
-  name='google/bytestream/bytestream.proto',
-  package='google.bytestream',
-  syntax='proto3',
-  serialized_pb=_b('\n\"google/bytestream/bytestream.proto\x12\x11google.bytestream\x1a\x1cgoogle/api/annotations.proto\x1a\x1egoogle/protobuf/wrappers.proto\"M\n\x0bReadRequest\x12\x15\n\rresource_name\x18\x01 \x01(\t\x12\x13\n\x0bread_offset\x18\x02 \x01(\x03\x12\x12\n\nread_limit\x18\x03 \x01(\x03\"\x1c\n\x0cReadResponse\x12\x0c\n\x04\x64\x61ta\x18\n \x01(\x0c\"_\n\x0cWriteRequest\x12\x15\n\rresource_name\x18\x01 \x01(\t\x12\x14\n\x0cwrite_offset\x18\x02 \x01(\x03\x12\x14\n\x0c\x66inish_write\x18\x03 \x01(\x08\x12\x0c\n\x04\x64\x61ta\x18\n \x01(\x0c\"\'\n\rWriteResponse\x12\x16\n\x0e\x63ommitted_size\x18\x01 \x01(\x03\"0\n\x17QueryWriteStatusRequest\x12\x15\n\rresource_name\x18\x01 \x01(\t\"D\n\x18QueryWriteStatusResponse\x12\x16\n\x0e\x63ommitted_size\x18\x01 \x01(\x03\x12\x10\n\x08\x63omplete\x18\x02 \x01(\x08\x32\x92\x02\n\nByteStream\x12I\n\x04Read\x12\x1e.google.bytestream.ReadRequest\x1a\x1f.google.bytestream.ReadResponse0\x01\x12L\n\x05Write\x12\x1f.google.bytestream.WriteRequest\x1a .google.bytestream.WriteResponse(\x01\x12k\n\x10QueryWriteStatus\x12*.google.bytestream.QueryWriteStatusRequest\x1a+.google.bytestream.QueryWriteStatusResponseBe\n\x15\x63om.google.bytestreamB\x0f\x42yteStreamProtoZ;google.golang.org/genproto/googleapis/bytestream;bytestreamb\x06proto3')
-  ,
-  dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR,google_dot_protobuf_dot_wrappers__pb2.DESCRIPTOR,])
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\"google/bytestream/bytestream.proto\x12\x11google.bytestream\x1a\x1cgoogle/api/annotations.proto\x1a\x1egoogle/protobuf/wrappers.proto\"M\n\x0bReadRequest\x12\x15\n\rresource_name\x18\x01 \x01(\t\x12\x13\n\x0bread_offset\x18\x02 \x01(\x03\x12\x12\n\nread_limit\x18\x03 \x01(\x03\"\x1c\n\x0cReadResponse\x12\x0c\n\x04\x64\x61ta\x18\n \x01(\x0c\"_\n\x0cWriteRequest\x12\x15\n\rresource_name\x18\x01 \x01(\t\x12\x14\n\x0cwrite_offset\x18\x02 \x01(\x03\x12\x14\n\x0c\x66inish_write\x18\x03 \x01(\x08\x12\x0c\n\x04\x64\x61ta\x18\n \x01(\x0c\"\'\n\rWriteResponse\x12\x16\n\x0e\x63ommitted_size\x18\x01 \x01(\x03\"0\n\x17QueryWriteStatusRequest\x12\x15\n\rresource_name\x18\x01 \x01(\t\"D\n\x18QueryWriteStatusResponse\x12\x16\n\x0e\x63ommitted_size\x18\x01 \x01(\x03\x12\x10\n\x08\x63omplete\x18\x02 \x01(\x08\x32\x92\x02\n\nByteStream\x12I\n\x04Read\x12\x1e.google.bytestream.ReadRequest\x1a\x1f.google.bytestream.ReadResponse0\x01\x12L\n\x05Write\x12\x1f.google.bytestream.WriteRequest\x1a .google.bytestream.WriteResponse(\x01\x12k\n\x10QueryWriteStatus\x12*.google.bytestream.QueryWriteStatusRequest\x1a+.google.bytestream.QueryWriteStatusResponseBe\n\x15\x63om.google.bytestreamB\x0f\x42yteStreamProtoZ;google.golang.org/genproto/googleapis/bytestream;bytestreamb\x06proto3')
 
 
 
-
-_READREQUEST = _descriptor.Descriptor(
-  name='ReadRequest',
-  full_name='google.bytestream.ReadRequest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='resource_name', full_name='google.bytestream.ReadRequest.resource_name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='read_offset', full_name='google.bytestream.ReadRequest.read_offset', index=1,
-      number=2, type=3, cpp_type=2, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='read_limit', full_name='google.bytestream.ReadRequest.read_limit', index=2,
-      number=3, type=3, cpp_type=2, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=119,
-  serialized_end=196,
-)
-
-
-_READRESPONSE = _descriptor.Descriptor(
-  name='ReadResponse',
-  full_name='google.bytestream.ReadResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='data', full_name='google.bytestream.ReadResponse.data', index=0,
-      number=10, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b(""),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=198,
-  serialized_end=226,
-)
-
-
-_WRITEREQUEST = _descriptor.Descriptor(
-  name='WriteRequest',
-  full_name='google.bytestream.WriteRequest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='resource_name', full_name='google.bytestream.WriteRequest.resource_name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='write_offset', full_name='google.bytestream.WriteRequest.write_offset', index=1,
-      number=2, type=3, cpp_type=2, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='finish_write', full_name='google.bytestream.WriteRequest.finish_write', index=2,
-      number=3, type=8, cpp_type=7, label=1,
-      has_default_value=False, default_value=False,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='data', full_name='google.bytestream.WriteRequest.data', index=3,
-      number=10, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b(""),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=228,
-  serialized_end=323,
-)
-
-
-_WRITERESPONSE = _descriptor.Descriptor(
-  name='WriteResponse',
-  full_name='google.bytestream.WriteResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='committed_size', full_name='google.bytestream.WriteResponse.committed_size', index=0,
-      number=1, type=3, cpp_type=2, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=325,
-  serialized_end=364,
-)
-
-
-_QUERYWRITESTATUSREQUEST = _descriptor.Descriptor(
-  name='QueryWriteStatusRequest',
-  full_name='google.bytestream.QueryWriteStatusRequest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='resource_name', full_name='google.bytestream.QueryWriteStatusRequest.resource_name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=366,
-  serialized_end=414,
-)
-
-
-_QUERYWRITESTATUSRESPONSE = _descriptor.Descriptor(
-  name='QueryWriteStatusResponse',
-  full_name='google.bytestream.QueryWriteStatusResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='committed_size', full_name='google.bytestream.QueryWriteStatusResponse.committed_size', index=0,
-      number=1, type=3, cpp_type=2, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='complete', full_name='google.bytestream.QueryWriteStatusResponse.complete', index=1,
-      number=2, type=8, cpp_type=7, label=1,
-      has_default_value=False, default_value=False,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=416,
-  serialized_end=484,
-)
-
-DESCRIPTOR.message_types_by_name['ReadRequest'] = _READREQUEST
-DESCRIPTOR.message_types_by_name['ReadResponse'] = _READRESPONSE
-DESCRIPTOR.message_types_by_name['WriteRequest'] = _WRITEREQUEST
-DESCRIPTOR.message_types_by_name['WriteResponse'] = _WRITERESPONSE
-DESCRIPTOR.message_types_by_name['QueryWriteStatusRequest'] = _QUERYWRITESTATUSREQUEST
-DESCRIPTOR.message_types_by_name['QueryWriteStatusResponse'] = _QUERYWRITESTATUSRESPONSE
-_sym_db.RegisterFileDescriptor(DESCRIPTOR)
-
-ReadRequest = _reflection.GeneratedProtocolMessageType('ReadRequest', (_message.Message,), dict(
-  DESCRIPTOR = _READREQUEST,
-  __module__ = 'google.bytestream.bytestream_pb2'
+_READREQUEST = DESCRIPTOR.message_types_by_name['ReadRequest']
+_READRESPONSE = DESCRIPTOR.message_types_by_name['ReadResponse']
+_WRITEREQUEST = DESCRIPTOR.message_types_by_name['WriteRequest']
+_WRITERESPONSE = DESCRIPTOR.message_types_by_name['WriteResponse']
+_QUERYWRITESTATUSREQUEST = DESCRIPTOR.message_types_by_name['QueryWriteStatusRequest']
+_QUERYWRITESTATUSRESPONSE = DESCRIPTOR.message_types_by_name['QueryWriteStatusResponse']
+ReadRequest = _reflection.GeneratedProtocolMessageType('ReadRequest', (_message.Message,), {
+  'DESCRIPTOR' : _READREQUEST,
+  '__module__' : 'google.bytestream.bytestream_pb2'
   # @@protoc_insertion_point(class_scope:google.bytestream.ReadRequest)
-  ))
+  })
 _sym_db.RegisterMessage(ReadRequest)
 
-ReadResponse = _reflection.GeneratedProtocolMessageType('ReadResponse', (_message.Message,), dict(
-  DESCRIPTOR = _READRESPONSE,
-  __module__ = 'google.bytestream.bytestream_pb2'
+ReadResponse = _reflection.GeneratedProtocolMessageType('ReadResponse', (_message.Message,), {
+  'DESCRIPTOR' : _READRESPONSE,
+  '__module__' : 'google.bytestream.bytestream_pb2'
   # @@protoc_insertion_point(class_scope:google.bytestream.ReadResponse)
-  ))
+  })
 _sym_db.RegisterMessage(ReadResponse)
 
-WriteRequest = _reflection.GeneratedProtocolMessageType('WriteRequest', (_message.Message,), dict(
-  DESCRIPTOR = _WRITEREQUEST,
-  __module__ = 'google.bytestream.bytestream_pb2'
+WriteRequest = _reflection.GeneratedProtocolMessageType('WriteRequest', (_message.Message,), {
+  'DESCRIPTOR' : _WRITEREQUEST,
+  '__module__' : 'google.bytestream.bytestream_pb2'
   # @@protoc_insertion_point(class_scope:google.bytestream.WriteRequest)
-  ))
+  })
 _sym_db.RegisterMessage(WriteRequest)
 
-WriteResponse = _reflection.GeneratedProtocolMessageType('WriteResponse', (_message.Message,), dict(
-  DESCRIPTOR = _WRITERESPONSE,
-  __module__ = 'google.bytestream.bytestream_pb2'
+WriteResponse = _reflection.GeneratedProtocolMessageType('WriteResponse', (_message.Message,), {
+  'DESCRIPTOR' : _WRITERESPONSE,
+  '__module__' : 'google.bytestream.bytestream_pb2'
   # @@protoc_insertion_point(class_scope:google.bytestream.WriteResponse)
-  ))
+  })
 _sym_db.RegisterMessage(WriteResponse)
 
-QueryWriteStatusRequest = _reflection.GeneratedProtocolMessageType('QueryWriteStatusRequest', (_message.Message,), dict(
-  DESCRIPTOR = _QUERYWRITESTATUSREQUEST,
-  __module__ = 'google.bytestream.bytestream_pb2'
+QueryWriteStatusRequest = _reflection.GeneratedProtocolMessageType('QueryWriteStatusRequest', (_message.Message,), {
+  'DESCRIPTOR' : _QUERYWRITESTATUSREQUEST,
+  '__module__' : 'google.bytestream.bytestream_pb2'
   # @@protoc_insertion_point(class_scope:google.bytestream.QueryWriteStatusRequest)
-  ))
+  })
 _sym_db.RegisterMessage(QueryWriteStatusRequest)
 
-QueryWriteStatusResponse = _reflection.GeneratedProtocolMessageType('QueryWriteStatusResponse', (_message.Message,), dict(
-  DESCRIPTOR = _QUERYWRITESTATUSRESPONSE,
-  __module__ = 'google.bytestream.bytestream_pb2'
+QueryWriteStatusResponse = _reflection.GeneratedProtocolMessageType('QueryWriteStatusResponse', (_message.Message,), {
+  'DESCRIPTOR' : _QUERYWRITESTATUSRESPONSE,
+  '__module__' : 'google.bytestream.bytestream_pb2'
   # @@protoc_insertion_point(class_scope:google.bytestream.QueryWriteStatusResponse)
-  ))
+  })
 _sym_db.RegisterMessage(QueryWriteStatusResponse)
 
+_BYTESTREAM = DESCRIPTOR.services_by_name['ByteStream']
+if _descriptor._USE_C_DESCRIPTORS == False:
 
-DESCRIPTOR.has_options = True
-DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\025com.google.bytestreamB\017ByteStreamProtoZ;google.golang.org/genproto/googleapis/bytestream;bytestream'))
-
-_BYTESTREAM = _descriptor.ServiceDescriptor(
-  name='ByteStream',
-  full_name='google.bytestream.ByteStream',
-  file=DESCRIPTOR,
-  index=0,
-  options=None,
-  serialized_start=487,
-  serialized_end=761,
-  methods=[
-  _descriptor.MethodDescriptor(
-    name='Read',
-    full_name='google.bytestream.ByteStream.Read',
-    index=0,
-    containing_service=None,
-    input_type=_READREQUEST,
-    output_type=_READRESPONSE,
-    options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='Write',
-    full_name='google.bytestream.ByteStream.Write',
-    index=1,
-    containing_service=None,
-    input_type=_WRITEREQUEST,
-    output_type=_WRITERESPONSE,
-    options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='QueryWriteStatus',
-    full_name='google.bytestream.ByteStream.QueryWriteStatus',
-    index=2,
-    containing_service=None,
-    input_type=_QUERYWRITESTATUSREQUEST,
-    output_type=_QUERYWRITESTATUSRESPONSE,
-    options=None,
-  ),
-])
-_sym_db.RegisterServiceDescriptor(_BYTESTREAM)
-
-DESCRIPTOR.services_by_name['ByteStream'] = _BYTESTREAM
-
+  DESCRIPTOR._options = None
+  DESCRIPTOR._serialized_options = b'\n\025com.google.bytestreamB\017ByteStreamProtoZ;google.golang.org/genproto/googleapis/bytestream;bytestream'
+  _READREQUEST._serialized_start=119
+  _READREQUEST._serialized_end=196
+  _READRESPONSE._serialized_start=198
+  _READRESPONSE._serialized_end=226
+  _WRITEREQUEST._serialized_start=228
+  _WRITEREQUEST._serialized_end=323
+  _WRITERESPONSE._serialized_start=325
+  _WRITERESPONSE._serialized_end=364
+  _QUERYWRITESTATUSREQUEST._serialized_start=366
+  _QUERYWRITESTATUSREQUEST._serialized_end=414
+  _QUERYWRITESTATUSRESPONSE._serialized_start=416
+  _QUERYWRITESTATUSRESPONSE._serialized_end=484
+  _BYTESTREAM._serialized_start=487
+  _BYTESTREAM._serialized_end=761
 # @@protoc_insertion_point(module_scope)
diff --git a/buildstream/_protos/google/bytestream/bytestream_pb2_grpc.py b/buildstream/_protos/google/bytestream/bytestream_pb2_grpc.py
index ef993e0..36dd1eb 100644
--- a/buildstream/_protos/google/bytestream/bytestream_pb2_grpc.py
+++ b/buildstream/_protos/google/bytestream/bytestream_pb2_grpc.py
@@ -1,160 +1,240 @@
 # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
 import grpc
 
 from buildstream._protos.google.bytestream import bytestream_pb2 as google_dot_bytestream_dot_bytestream__pb2
 
 
 class ByteStreamStub(object):
-  """#### Introduction
+    """#### Introduction
 
-  The Byte Stream API enables a client to read and write a stream of bytes to
-  and from a resource. Resources have names, and these names are supplied in
-  the API calls below to identify the resource that is being read from or
-  written to.
+    The Byte Stream API enables a client to read and write a stream of bytes to
+    and from a resource. Resources have names, and these names are supplied in
+    the API calls below to identify the resource that is being read from or
+    written to.
 
-  All implementations of the Byte Stream API export the interface defined here:
+    All implementations of the Byte Stream API export the interface defined here:
 
-  * `Read()`: Reads the contents of a resource.
+    * `Read()`: Reads the contents of a resource.
 
-  * `Write()`: Writes the contents of a resource. The client can call `Write()`
-  multiple times with the same resource and can check the status of the write
-  by calling `QueryWriteStatus()`.
+    * `Write()`: Writes the contents of a resource. The client can call `Write()`
+    multiple times with the same resource and can check the status of the write
+    by calling `QueryWriteStatus()`.
 
-  #### Service parameters and metadata
+    #### Service parameters and metadata
 
-  The ByteStream API provides no direct way to access/modify any metadata
-  associated with the resource.
+    The ByteStream API provides no direct way to access/modify any metadata
+    associated with the resource.
 
-  #### Errors
+    #### Errors
 
-  The errors returned by the service are in the Google canonical error space.
-  """
-
-  def __init__(self, channel):
-    """Constructor.
-
-    Args:
-      channel: A grpc.Channel.
+    The errors returned by the service are in the Google canonical error space.
     """
-    self.Read = channel.unary_stream(
-        '/google.bytestream.ByteStream/Read',
-        request_serializer=google_dot_bytestream_dot_bytestream__pb2.ReadRequest.SerializeToString,
-        response_deserializer=google_dot_bytestream_dot_bytestream__pb2.ReadResponse.FromString,
-        )
-    self.Write = channel.stream_unary(
-        '/google.bytestream.ByteStream/Write',
-        request_serializer=google_dot_bytestream_dot_bytestream__pb2.WriteRequest.SerializeToString,
-        response_deserializer=google_dot_bytestream_dot_bytestream__pb2.WriteResponse.FromString,
-        )
-    self.QueryWriteStatus = channel.unary_unary(
-        '/google.bytestream.ByteStream/QueryWriteStatus',
-        request_serializer=google_dot_bytestream_dot_bytestream__pb2.QueryWriteStatusRequest.SerializeToString,
-        response_deserializer=google_dot_bytestream_dot_bytestream__pb2.QueryWriteStatusResponse.FromString,
-        )
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.Read = channel.unary_stream(
+                '/google.bytestream.ByteStream/Read',
+                request_serializer=google_dot_bytestream_dot_bytestream__pb2.ReadRequest.SerializeToString,
+                response_deserializer=google_dot_bytestream_dot_bytestream__pb2.ReadResponse.FromString,
+                )
+        self.Write = channel.stream_unary(
+                '/google.bytestream.ByteStream/Write',
+                request_serializer=google_dot_bytestream_dot_bytestream__pb2.WriteRequest.SerializeToString,
+                response_deserializer=google_dot_bytestream_dot_bytestream__pb2.WriteResponse.FromString,
+                )
+        self.QueryWriteStatus = channel.unary_unary(
+                '/google.bytestream.ByteStream/QueryWriteStatus',
+                request_serializer=google_dot_bytestream_dot_bytestream__pb2.QueryWriteStatusRequest.SerializeToString,
+                response_deserializer=google_dot_bytestream_dot_bytestream__pb2.QueryWriteStatusResponse.FromString,
+                )
 
 
 class ByteStreamServicer(object):
-  """#### Introduction
+    """#### Introduction
 
-  The Byte Stream API enables a client to read and write a stream of bytes to
-  and from a resource. Resources have names, and these names are supplied in
-  the API calls below to identify the resource that is being read from or
-  written to.
+    The Byte Stream API enables a client to read and write a stream of bytes to
+    and from a resource. Resources have names, and these names are supplied in
+    the API calls below to identify the resource that is being read from or
+    written to.
 
-  All implementations of the Byte Stream API export the interface defined here:
+    All implementations of the Byte Stream API export the interface defined here:
 
-  * `Read()`: Reads the contents of a resource.
+    * `Read()`: Reads the contents of a resource.
 
-  * `Write()`: Writes the contents of a resource. The client can call `Write()`
-  multiple times with the same resource and can check the status of the write
-  by calling `QueryWriteStatus()`.
+    * `Write()`: Writes the contents of a resource. The client can call `Write()`
+    multiple times with the same resource and can check the status of the write
+    by calling `QueryWriteStatus()`.
 
-  #### Service parameters and metadata
+    #### Service parameters and metadata
 
-  The ByteStream API provides no direct way to access/modify any metadata
-  associated with the resource.
+    The ByteStream API provides no direct way to access/modify any metadata
+    associated with the resource.
 
-  #### Errors
+    #### Errors
 
-  The errors returned by the service are in the Google canonical error space.
-  """
-
-  def Read(self, request, context):
-    """`Read()` is used to retrieve the contents of a resource as a sequence
-    of bytes. The bytes are returned in a sequence of responses, and the
-    responses are delivered as the results of a server-side streaming RPC.
+    The errors returned by the service are in the Google canonical error space.
     """
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
 
-  def Write(self, request_iterator, context):
-    """`Write()` is used to send the contents of a resource as a sequence of
-    bytes. The bytes are sent in a sequence of request protos of a client-side
-    streaming RPC.
+    def Read(self, request, context):
+        """`Read()` is used to retrieve the contents of a resource as a sequence
+        of bytes. The bytes are returned in a sequence of responses, and the
+        responses are delivered as the results of a server-side streaming RPC.
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-    A `Write()` action is resumable. If there is an error or the connection is
-    broken during the `Write()`, the client should check the status of the
-    `Write()` by calling `QueryWriteStatus()` and continue writing from the
-    returned `committed_size`. This may be less than the amount of data the
-    client previously sent.
+    def Write(self, request_iterator, context):
+        """`Write()` is used to send the contents of a resource as a sequence of
+        bytes. The bytes are sent in a sequence of request protos of a client-side
+        streaming RPC.
 
-    Calling `Write()` on a resource name that was previously written and
-    finalized could cause an error, depending on whether the underlying service
-    allows over-writing of previously written resources.
+        A `Write()` action is resumable. If there is an error or the connection is
+        broken during the `Write()`, the client should check the status of the
+        `Write()` by calling `QueryWriteStatus()` and continue writing from the
+        returned `committed_size`. This may be less than the amount of data the
+        client previously sent.
 
-    When the client closes the request channel, the service will respond with
-    a `WriteResponse`. The service will not view the resource as `complete`
-    until the client has sent a `WriteRequest` with `finish_write` set to
-    `true`. Sending any requests on a stream after sending a request with
-    `finish_write` set to `true` will cause an error. The client **should**
-    check the `WriteResponse` it receives to determine how much data the
-    service was able to commit and whether the service views the resource as
-    `complete` or not.
-    """
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+        Calling `Write()` on a resource name that was previously written and
+        finalized could cause an error, depending on whether the underlying service
+        allows over-writing of previously written resources.
 
-  def QueryWriteStatus(self, request, context):
-    """`QueryWriteStatus()` is used to find the `committed_size` for a resource
-    that is being written, which can then be used as the `write_offset` for
-    the next `Write()` call.
+        When the client closes the request channel, the service will respond with
+        a `WriteResponse`. The service will not view the resource as `complete`
+        until the client has sent a `WriteRequest` with `finish_write` set to
+        `true`. Sending any requests on a stream after sending a request with
+        `finish_write` set to `true` will cause an error. The client **should**
+        check the `WriteResponse` it receives to determine how much data the
+        service was able to commit and whether the service views the resource as
+        `complete` or not.
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-    If the resource does not exist (i.e., the resource has been deleted, or the
-    first `Write()` has not yet reached the service), this method returns the
-    error `NOT_FOUND`.
+    def QueryWriteStatus(self, request, context):
+        """`QueryWriteStatus()` is used to find the `committed_size` for a resource
+        that is being written, which can then be used as the `write_offset` for
+        the next `Write()` call.
 
-    The client **may** call `QueryWriteStatus()` at any time to determine how
-    much data has been processed for this resource. This is useful if the
-    client is buffering data and needs to know which data can be safely
-    evicted. For any sequence of `QueryWriteStatus()` calls for a given
-    resource name, the sequence of returned `committed_size` values will be
-    non-decreasing.
-    """
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+        If the resource does not exist (i.e., the resource has been deleted, or the
+        first `Write()` has not yet reached the service), this method returns the
+        error `NOT_FOUND`.
+
+        The client **may** call `QueryWriteStatus()` at any time to determine how
+        much data has been processed for this resource. This is useful if the
+        client is buffering data and needs to know which data can be safely
+        evicted. For any sequence of `QueryWriteStatus()` calls for a given
+        resource name, the sequence of returned `committed_size` values will be
+        non-decreasing.
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
 
 def add_ByteStreamServicer_to_server(servicer, server):
-  rpc_method_handlers = {
-      'Read': grpc.unary_stream_rpc_method_handler(
-          servicer.Read,
-          request_deserializer=google_dot_bytestream_dot_bytestream__pb2.ReadRequest.FromString,
-          response_serializer=google_dot_bytestream_dot_bytestream__pb2.ReadResponse.SerializeToString,
-      ),
-      'Write': grpc.stream_unary_rpc_method_handler(
-          servicer.Write,
-          request_deserializer=google_dot_bytestream_dot_bytestream__pb2.WriteRequest.FromString,
-          response_serializer=google_dot_bytestream_dot_bytestream__pb2.WriteResponse.SerializeToString,
-      ),
-      'QueryWriteStatus': grpc.unary_unary_rpc_method_handler(
-          servicer.QueryWriteStatus,
-          request_deserializer=google_dot_bytestream_dot_bytestream__pb2.QueryWriteStatusRequest.FromString,
-          response_serializer=google_dot_bytestream_dot_bytestream__pb2.QueryWriteStatusResponse.SerializeToString,
-      ),
-  }
-  generic_handler = grpc.method_handlers_generic_handler(
-      'google.bytestream.ByteStream', rpc_method_handlers)
-  server.add_generic_rpc_handlers((generic_handler,))
+    rpc_method_handlers = {
+            'Read': grpc.unary_stream_rpc_method_handler(
+                    servicer.Read,
+                    request_deserializer=google_dot_bytestream_dot_bytestream__pb2.ReadRequest.FromString,
+                    response_serializer=google_dot_bytestream_dot_bytestream__pb2.ReadResponse.SerializeToString,
+            ),
+            'Write': grpc.stream_unary_rpc_method_handler(
+                    servicer.Write,
+                    request_deserializer=google_dot_bytestream_dot_bytestream__pb2.WriteRequest.FromString,
+                    response_serializer=google_dot_bytestream_dot_bytestream__pb2.WriteResponse.SerializeToString,
+            ),
+            'QueryWriteStatus': grpc.unary_unary_rpc_method_handler(
+                    servicer.QueryWriteStatus,
+                    request_deserializer=google_dot_bytestream_dot_bytestream__pb2.QueryWriteStatusRequest.FromString,
+                    response_serializer=google_dot_bytestream_dot_bytestream__pb2.QueryWriteStatusResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'google.bytestream.ByteStream', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class ByteStream(object):
+    """#### Introduction
+
+    The Byte Stream API enables a client to read and write a stream of bytes to
+    and from a resource. Resources have names, and these names are supplied in
+    the API calls below to identify the resource that is being read from or
+    written to.
+
+    All implementations of the Byte Stream API export the interface defined here:
+
+    * `Read()`: Reads the contents of a resource.
+
+    * `Write()`: Writes the contents of a resource. The client can call `Write()`
+    multiple times with the same resource and can check the status of the write
+    by calling `QueryWriteStatus()`.
+
+    #### Service parameters and metadata
+
+    The ByteStream API provides no direct way to access/modify any metadata
+    associated with the resource.
+
+    #### Errors
+
+    The errors returned by the service are in the Google canonical error space.
+    """
+
+    @staticmethod
+    def Read(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_stream(request, target, '/google.bytestream.ByteStream/Read',
+            google_dot_bytestream_dot_bytestream__pb2.ReadRequest.SerializeToString,
+            google_dot_bytestream_dot_bytestream__pb2.ReadResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Write(request_iterator,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.stream_unary(request_iterator, target, '/google.bytestream.ByteStream/Write',
+            google_dot_bytestream_dot_bytestream__pb2.WriteRequest.SerializeToString,
+            google_dot_bytestream_dot_bytestream__pb2.WriteResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def QueryWriteStatus(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/google.bytestream.ByteStream/QueryWriteStatus',
+            google_dot_bytestream_dot_bytestream__pb2.QueryWriteStatusRequest.SerializeToString,
+            google_dot_bytestream_dot_bytestream__pb2.QueryWriteStatusResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/buildstream/_protos/google/longrunning/operations_pb2.py b/buildstream/_protos/google/longrunning/operations_pb2.py
index 9fd8993..4bbd08a 100644
--- a/buildstream/_protos/google/longrunning/operations_pb2.py
+++ b/buildstream/_protos/google/longrunning/operations_pb2.py
@@ -1,13 +1,12 @@
+# -*- coding: utf-8 -*-
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: google/longrunning/operations.proto
-
-import sys
-_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+"""Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
-from google.protobuf import descriptor_pb2
 # @@protoc_insertion_point(imports)
 
 _sym_db = _symbol_database.Default()
@@ -19,373 +18,83 @@
 from buildstream._protos.google.rpc import status_pb2 as google_dot_rpc_dot_status__pb2
 
 
-DESCRIPTOR = _descriptor.FileDescriptor(
-  name='google/longrunning/operations.proto',
-  package='google.longrunning',
-  syntax='proto3',
-  serialized_pb=_b('\n#google/longrunning/operations.proto\x12\x12google.longrunning\x1a\x1cgoogle/api/annotations.proto\x1a\x19google/protobuf/any.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x17google/rpc/status.proto\"\xa8\x01\n\tOperation\x12\x0c\n\x04name\x18\x01 \x01(\t\x12&\n\x08metadata\x18\x02 \x01(\x0b\x32\x14.google.protobuf.Any\x12\x0c\n\x04\x64one\x18\x03 \x01(\x08\x12#\n\x05\x65rror\x18\x04 \x01(\x0b\x32\x12.google.rpc.StatusH\x00\x12(\n\x08response\x18\x05 \x01(\x0b\x32\x14.google.protobuf.AnyH\x00\x42\x08\n\x06result\"#\n\x13GetOperationRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"\\\n\x15ListOperationsRequest\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\x0e\n\x06\x66ilter\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x12\n\npage_token\x18\x03 \x01(\t\"d\n\x16ListOperationsResponse\x12\x31\n\noperations\x18\x01 \x03(\x0b\x32\x1d.google.longrunning.Operation\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\t\"&\n\x16\x43\x61ncelOperationRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"&\n\x16\x44\x65leteOperationRequest\x12\x0c\n\x04name\x18\x01 \x01(\t2\x8c\x04\n\nOperations\x12\x86\x01\n\x0eListOperations\x12).google.longrunning.ListOperationsRequest\x1a*.google.longrunning.ListOperationsResponse\"\x1d\x82\xd3\xe4\x93\x02\x17\x12\x15/v1/{name=operations}\x12x\n\x0cGetOperation\x12\'.google.longrunning.GetOperationRequest\x1a\x1d.google.longrunning.Operation\" \x82\xd3\xe4\x93\x02\x1a\x12\x18/v1/{name=operations/**}\x12w\n\x0f\x44\x65leteOperation\x12*.google.longrunning.DeleteOperationRequest\x1a\x16.google.protobuf.Empty\" \x82\xd3\xe4\x93\x02\x1a*\x18/v1/{name=operations/**}\x12\x81\x01\n\x0f\x43\x61ncelOperation\x12*.google.longrunning.CancelOperationRequest\x1a\x16.google.protobuf.Empty\"*\x82\xd3\xe4\x93\x02$\"\x1f/v1/{name=operations/**}:cancel:\x01*B\x94\x01\n\x16\x63om.google.longrunningB\x0fOperationsProtoP\x01Z=google.golang.org/genproto/googleapis/longrunning;longrunning\xaa\x02\x12Google.LongRunning\xca\x02\x12Google\\LongRunningb\x06proto3')
-  ,
-  dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR,google_dot_protobuf_dot_any__pb2.DESCRIPTOR,google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,google_dot_rpc_dot_status__pb2.DESCRIPTOR,])
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#google/longrunning/operations.proto\x12\x12google.longrunning\x1a\x1cgoogle/api/annotations.proto\x1a\x19google/protobuf/any.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x17google/rpc/status.proto\"\xa8\x01\n\tOperation\x12\x0c\n\x04name\x18\x01 \x01(\t\x12&\n\x08metadata\x18\x02 \x01(\x0b\x32\x14.google.protobuf.Any\x12\x0c\n\x04\x64one\x18\x03 \x01(\x08\x12#\n\x05\x65rror\x18\x04 \x01(\x0b\x32\x12.google.rpc.StatusH\x00\x12(\n\x08response\x18\x05 \x01(\x0b\x32\x14.google.protobuf.AnyH\x00\x42\x08\n\x06result\"#\n\x13GetOperationRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"\\\n\x15ListOperationsRequest\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\x0e\n\x06\x66ilter\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x12\n\npage_token\x18\x03 \x01(\t\"d\n\x16ListOperationsResponse\x12\x31\n\noperations\x18\x01 \x03(\x0b\x32\x1d.google.longrunning.Operation\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\t\"&\n\x16\x43\x61ncelOperationRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"&\n\x16\x44\x65leteOperationRequest\x12\x0c\n\x04name\x18\x01 \x01(\t2\x8c\x04\n\nOperations\x12\x86\x01\n\x0eListOperations\x12).google.longrunning.ListOperationsRequest\x1a*.google.longrunning.ListOperationsResponse\"\x1d\x82\xd3\xe4\x93\x02\x17\x12\x15/v1/{name=operations}\x12x\n\x0cGetOperation\x12\'.google.longrunning.GetOperationRequest\x1a\x1d.google.longrunning.Operation\" \x82\xd3\xe4\x93\x02\x1a\x12\x18/v1/{name=operations/**}\x12w\n\x0f\x44\x65leteOperation\x12*.google.longrunning.DeleteOperationRequest\x1a\x16.google.protobuf.Empty\" \x82\xd3\xe4\x93\x02\x1a*\x18/v1/{name=operations/**}\x12\x81\x01\n\x0f\x43\x61ncelOperation\x12*.google.longrunning.CancelOperationRequest\x1a\x16.google.protobuf.Empty\"*\x82\xd3\xe4\x93\x02$\"\x1f/v1/{name=operations/**}:cancel:\x01*B\x94\x01\n\x16\x63om.google.longrunningB\x0fOperationsProtoP\x01Z=google.golang.org/genproto/googleapis/longrunning;longrunning\xaa\x02\x12Google.LongRunning\xca\x02\x12Google\\LongRunningb\x06proto3')
 
 
 
-
-_OPERATION = _descriptor.Descriptor(
-  name='Operation',
-  full_name='google.longrunning.Operation',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='name', full_name='google.longrunning.Operation.name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='metadata', full_name='google.longrunning.Operation.metadata', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='done', full_name='google.longrunning.Operation.done', index=2,
-      number=3, type=8, cpp_type=7, label=1,
-      has_default_value=False, default_value=False,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='error', full_name='google.longrunning.Operation.error', index=3,
-      number=4, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='response', full_name='google.longrunning.Operation.response', index=4,
-      number=5, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-    _descriptor.OneofDescriptor(
-      name='result', full_name='google.longrunning.Operation.result',
-      index=0, containing_type=None, fields=[]),
-  ],
-  serialized_start=171,
-  serialized_end=339,
-)
-
-
-_GETOPERATIONREQUEST = _descriptor.Descriptor(
-  name='GetOperationRequest',
-  full_name='google.longrunning.GetOperationRequest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='name', full_name='google.longrunning.GetOperationRequest.name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=341,
-  serialized_end=376,
-)
-
-
-_LISTOPERATIONSREQUEST = _descriptor.Descriptor(
-  name='ListOperationsRequest',
-  full_name='google.longrunning.ListOperationsRequest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='name', full_name='google.longrunning.ListOperationsRequest.name', index=0,
-      number=4, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='filter', full_name='google.longrunning.ListOperationsRequest.filter', index=1,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='page_size', full_name='google.longrunning.ListOperationsRequest.page_size', index=2,
-      number=2, type=5, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='page_token', full_name='google.longrunning.ListOperationsRequest.page_token', index=3,
-      number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=378,
-  serialized_end=470,
-)
-
-
-_LISTOPERATIONSRESPONSE = _descriptor.Descriptor(
-  name='ListOperationsResponse',
-  full_name='google.longrunning.ListOperationsResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='operations', full_name='google.longrunning.ListOperationsResponse.operations', index=0,
-      number=1, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='next_page_token', full_name='google.longrunning.ListOperationsResponse.next_page_token', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=472,
-  serialized_end=572,
-)
-
-
-_CANCELOPERATIONREQUEST = _descriptor.Descriptor(
-  name='CancelOperationRequest',
-  full_name='google.longrunning.CancelOperationRequest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='name', full_name='google.longrunning.CancelOperationRequest.name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=574,
-  serialized_end=612,
-)
-
-
-_DELETEOPERATIONREQUEST = _descriptor.Descriptor(
-  name='DeleteOperationRequest',
-  full_name='google.longrunning.DeleteOperationRequest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='name', full_name='google.longrunning.DeleteOperationRequest.name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=614,
-  serialized_end=652,
-)
-
-_OPERATION.fields_by_name['metadata'].message_type = google_dot_protobuf_dot_any__pb2._ANY
-_OPERATION.fields_by_name['error'].message_type = google_dot_rpc_dot_status__pb2._STATUS
-_OPERATION.fields_by_name['response'].message_type = google_dot_protobuf_dot_any__pb2._ANY
-_OPERATION.oneofs_by_name['result'].fields.append(
-  _OPERATION.fields_by_name['error'])
-_OPERATION.fields_by_name['error'].containing_oneof = _OPERATION.oneofs_by_name['result']
-_OPERATION.oneofs_by_name['result'].fields.append(
-  _OPERATION.fields_by_name['response'])
-_OPERATION.fields_by_name['response'].containing_oneof = _OPERATION.oneofs_by_name['result']
-_LISTOPERATIONSRESPONSE.fields_by_name['operations'].message_type = _OPERATION
-DESCRIPTOR.message_types_by_name['Operation'] = _OPERATION
-DESCRIPTOR.message_types_by_name['GetOperationRequest'] = _GETOPERATIONREQUEST
-DESCRIPTOR.message_types_by_name['ListOperationsRequest'] = _LISTOPERATIONSREQUEST
-DESCRIPTOR.message_types_by_name['ListOperationsResponse'] = _LISTOPERATIONSRESPONSE
-DESCRIPTOR.message_types_by_name['CancelOperationRequest'] = _CANCELOPERATIONREQUEST
-DESCRIPTOR.message_types_by_name['DeleteOperationRequest'] = _DELETEOPERATIONREQUEST
-_sym_db.RegisterFileDescriptor(DESCRIPTOR)
-
-Operation = _reflection.GeneratedProtocolMessageType('Operation', (_message.Message,), dict(
-  DESCRIPTOR = _OPERATION,
-  __module__ = 'google.longrunning.operations_pb2'
+_OPERATION = DESCRIPTOR.message_types_by_name['Operation']
+_GETOPERATIONREQUEST = DESCRIPTOR.message_types_by_name['GetOperationRequest']
+_LISTOPERATIONSREQUEST = DESCRIPTOR.message_types_by_name['ListOperationsRequest']
+_LISTOPERATIONSRESPONSE = DESCRIPTOR.message_types_by_name['ListOperationsResponse']
+_CANCELOPERATIONREQUEST = DESCRIPTOR.message_types_by_name['CancelOperationRequest']
+_DELETEOPERATIONREQUEST = DESCRIPTOR.message_types_by_name['DeleteOperationRequest']
+Operation = _reflection.GeneratedProtocolMessageType('Operation', (_message.Message,), {
+  'DESCRIPTOR' : _OPERATION,
+  '__module__' : 'google.longrunning.operations_pb2'
   # @@protoc_insertion_point(class_scope:google.longrunning.Operation)
-  ))
+  })
 _sym_db.RegisterMessage(Operation)
 
-GetOperationRequest = _reflection.GeneratedProtocolMessageType('GetOperationRequest', (_message.Message,), dict(
-  DESCRIPTOR = _GETOPERATIONREQUEST,
-  __module__ = 'google.longrunning.operations_pb2'
+GetOperationRequest = _reflection.GeneratedProtocolMessageType('GetOperationRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETOPERATIONREQUEST,
+  '__module__' : 'google.longrunning.operations_pb2'
   # @@protoc_insertion_point(class_scope:google.longrunning.GetOperationRequest)
-  ))
+  })
 _sym_db.RegisterMessage(GetOperationRequest)
 
-ListOperationsRequest = _reflection.GeneratedProtocolMessageType('ListOperationsRequest', (_message.Message,), dict(
-  DESCRIPTOR = _LISTOPERATIONSREQUEST,
-  __module__ = 'google.longrunning.operations_pb2'
+ListOperationsRequest = _reflection.GeneratedProtocolMessageType('ListOperationsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _LISTOPERATIONSREQUEST,
+  '__module__' : 'google.longrunning.operations_pb2'
   # @@protoc_insertion_point(class_scope:google.longrunning.ListOperationsRequest)
-  ))
+  })
 _sym_db.RegisterMessage(ListOperationsRequest)
 
-ListOperationsResponse = _reflection.GeneratedProtocolMessageType('ListOperationsResponse', (_message.Message,), dict(
-  DESCRIPTOR = _LISTOPERATIONSRESPONSE,
-  __module__ = 'google.longrunning.operations_pb2'
+ListOperationsResponse = _reflection.GeneratedProtocolMessageType('ListOperationsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _LISTOPERATIONSRESPONSE,
+  '__module__' : 'google.longrunning.operations_pb2'
   # @@protoc_insertion_point(class_scope:google.longrunning.ListOperationsResponse)
-  ))
+  })
 _sym_db.RegisterMessage(ListOperationsResponse)
 
-CancelOperationRequest = _reflection.GeneratedProtocolMessageType('CancelOperationRequest', (_message.Message,), dict(
-  DESCRIPTOR = _CANCELOPERATIONREQUEST,
-  __module__ = 'google.longrunning.operations_pb2'
+CancelOperationRequest = _reflection.GeneratedProtocolMessageType('CancelOperationRequest', (_message.Message,), {
+  'DESCRIPTOR' : _CANCELOPERATIONREQUEST,
+  '__module__' : 'google.longrunning.operations_pb2'
   # @@protoc_insertion_point(class_scope:google.longrunning.CancelOperationRequest)
-  ))
+  })
 _sym_db.RegisterMessage(CancelOperationRequest)
 
-DeleteOperationRequest = _reflection.GeneratedProtocolMessageType('DeleteOperationRequest', (_message.Message,), dict(
-  DESCRIPTOR = _DELETEOPERATIONREQUEST,
-  __module__ = 'google.longrunning.operations_pb2'
+DeleteOperationRequest = _reflection.GeneratedProtocolMessageType('DeleteOperationRequest', (_message.Message,), {
+  'DESCRIPTOR' : _DELETEOPERATIONREQUEST,
+  '__module__' : 'google.longrunning.operations_pb2'
   # @@protoc_insertion_point(class_scope:google.longrunning.DeleteOperationRequest)
-  ))
+  })
 _sym_db.RegisterMessage(DeleteOperationRequest)
 
+_OPERATIONS = DESCRIPTOR.services_by_name['Operations']
+if _descriptor._USE_C_DESCRIPTORS == False:
 
-DESCRIPTOR.has_options = True
-DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\026com.google.longrunningB\017OperationsProtoP\001Z=google.golang.org/genproto/googleapis/longrunning;longrunning\252\002\022Google.LongRunning\312\002\022Google\\LongRunning'))
-
-_OPERATIONS = _descriptor.ServiceDescriptor(
-  name='Operations',
-  full_name='google.longrunning.Operations',
-  file=DESCRIPTOR,
-  index=0,
-  options=None,
-  serialized_start=655,
-  serialized_end=1179,
-  methods=[
-  _descriptor.MethodDescriptor(
-    name='ListOperations',
-    full_name='google.longrunning.Operations.ListOperations',
-    index=0,
-    containing_service=None,
-    input_type=_LISTOPERATIONSREQUEST,
-    output_type=_LISTOPERATIONSRESPONSE,
-    options=_descriptor._ParseOptions(descriptor_pb2.MethodOptions(), _b('\202\323\344\223\002\027\022\025/v1/{name=operations}')),
-  ),
-  _descriptor.MethodDescriptor(
-    name='GetOperation',
-    full_name='google.longrunning.Operations.GetOperation',
-    index=1,
-    containing_service=None,
-    input_type=_GETOPERATIONREQUEST,
-    output_type=_OPERATION,
-    options=_descriptor._ParseOptions(descriptor_pb2.MethodOptions(), _b('\202\323\344\223\002\032\022\030/v1/{name=operations/**}')),
-  ),
-  _descriptor.MethodDescriptor(
-    name='DeleteOperation',
-    full_name='google.longrunning.Operations.DeleteOperation',
-    index=2,
-    containing_service=None,
-    input_type=_DELETEOPERATIONREQUEST,
-    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
-    options=_descriptor._ParseOptions(descriptor_pb2.MethodOptions(), _b('\202\323\344\223\002\032*\030/v1/{name=operations/**}')),
-  ),
-  _descriptor.MethodDescriptor(
-    name='CancelOperation',
-    full_name='google.longrunning.Operations.CancelOperation',
-    index=3,
-    containing_service=None,
-    input_type=_CANCELOPERATIONREQUEST,
-    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
-    options=_descriptor._ParseOptions(descriptor_pb2.MethodOptions(), _b('\202\323\344\223\002$\"\037/v1/{name=operations/**}:cancel:\001*')),
-  ),
-])
-_sym_db.RegisterServiceDescriptor(_OPERATIONS)
-
-DESCRIPTOR.services_by_name['Operations'] = _OPERATIONS
-
+  DESCRIPTOR._options = None
+  DESCRIPTOR._serialized_options = b'\n\026com.google.longrunningB\017OperationsProtoP\001Z=google.golang.org/genproto/googleapis/longrunning;longrunning\252\002\022Google.LongRunning\312\002\022Google\\LongRunning'
+  _OPERATIONS.methods_by_name['ListOperations']._options = None
+  _OPERATIONS.methods_by_name['ListOperations']._serialized_options = b'\202\323\344\223\002\027\022\025/v1/{name=operations}'
+  _OPERATIONS.methods_by_name['GetOperation']._options = None
+  _OPERATIONS.methods_by_name['GetOperation']._serialized_options = b'\202\323\344\223\002\032\022\030/v1/{name=operations/**}'
+  _OPERATIONS.methods_by_name['DeleteOperation']._options = None
+  _OPERATIONS.methods_by_name['DeleteOperation']._serialized_options = b'\202\323\344\223\002\032*\030/v1/{name=operations/**}'
+  _OPERATIONS.methods_by_name['CancelOperation']._options = None
+  _OPERATIONS.methods_by_name['CancelOperation']._serialized_options = b'\202\323\344\223\002$\"\037/v1/{name=operations/**}:cancel:\001*'
+  _OPERATION._serialized_start=171
+  _OPERATION._serialized_end=339
+  _GETOPERATIONREQUEST._serialized_start=341
+  _GETOPERATIONREQUEST._serialized_end=376
+  _LISTOPERATIONSREQUEST._serialized_start=378
+  _LISTOPERATIONSREQUEST._serialized_end=470
+  _LISTOPERATIONSRESPONSE._serialized_start=472
+  _LISTOPERATIONSRESPONSE._serialized_end=572
+  _CANCELOPERATIONREQUEST._serialized_start=574
+  _CANCELOPERATIONREQUEST._serialized_end=612
+  _DELETEOPERATIONREQUEST._serialized_start=614
+  _DELETEOPERATIONREQUEST._serialized_end=652
+  _OPERATIONS._serialized_start=655
+  _OPERATIONS._serialized_end=1179
 # @@protoc_insertion_point(module_scope)
diff --git a/buildstream/_protos/google/longrunning/operations_pb2_grpc.py b/buildstream/_protos/google/longrunning/operations_pb2_grpc.py
index 8f89862..2ab919c 100644
--- a/buildstream/_protos/google/longrunning/operations_pb2_grpc.py
+++ b/buildstream/_protos/google/longrunning/operations_pb2_grpc.py
@@ -1,4 +1,5 @@
 # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
 import grpc
 
 from buildstream._protos.google.longrunning import operations_pb2 as google_dot_longrunning_dot_operations__pb2
@@ -6,127 +7,209 @@
 
 
 class OperationsStub(object):
-  """Manages long-running operations with an API service.
+    """Manages long-running operations with an API service.
 
-  When an API method normally takes long time to complete, it can be designed
-  to return [Operation][google.longrunning.Operation] to the client, and the client can use this
-  interface to receive the real response asynchronously by polling the
-  operation resource, or pass the operation resource to another API (such as
-  Google Cloud Pub/Sub API) to receive the response.  Any API service that
-  returns long-running operations should implement the `Operations` interface
-  so developers can have a consistent client experience.
-  """
-
-  def __init__(self, channel):
-    """Constructor.
-
-    Args:
-      channel: A grpc.Channel.
+    When an API method normally takes long time to complete, it can be designed
+    to return [Operation][google.longrunning.Operation] to the client, and the client can use this
+    interface to receive the real response asynchronously by polling the
+    operation resource, or pass the operation resource to another API (such as
+    Google Cloud Pub/Sub API) to receive the response.  Any API service that
+    returns long-running operations should implement the `Operations` interface
+    so developers can have a consistent client experience.
     """
-    self.ListOperations = channel.unary_unary(
-        '/google.longrunning.Operations/ListOperations',
-        request_serializer=google_dot_longrunning_dot_operations__pb2.ListOperationsRequest.SerializeToString,
-        response_deserializer=google_dot_longrunning_dot_operations__pb2.ListOperationsResponse.FromString,
-        )
-    self.GetOperation = channel.unary_unary(
-        '/google.longrunning.Operations/GetOperation',
-        request_serializer=google_dot_longrunning_dot_operations__pb2.GetOperationRequest.SerializeToString,
-        response_deserializer=google_dot_longrunning_dot_operations__pb2.Operation.FromString,
-        )
-    self.DeleteOperation = channel.unary_unary(
-        '/google.longrunning.Operations/DeleteOperation',
-        request_serializer=google_dot_longrunning_dot_operations__pb2.DeleteOperationRequest.SerializeToString,
-        response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
-        )
-    self.CancelOperation = channel.unary_unary(
-        '/google.longrunning.Operations/CancelOperation',
-        request_serializer=google_dot_longrunning_dot_operations__pb2.CancelOperationRequest.SerializeToString,
-        response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
-        )
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.ListOperations = channel.unary_unary(
+                '/google.longrunning.Operations/ListOperations',
+                request_serializer=google_dot_longrunning_dot_operations__pb2.ListOperationsRequest.SerializeToString,
+                response_deserializer=google_dot_longrunning_dot_operations__pb2.ListOperationsResponse.FromString,
+                )
+        self.GetOperation = channel.unary_unary(
+                '/google.longrunning.Operations/GetOperation',
+                request_serializer=google_dot_longrunning_dot_operations__pb2.GetOperationRequest.SerializeToString,
+                response_deserializer=google_dot_longrunning_dot_operations__pb2.Operation.FromString,
+                )
+        self.DeleteOperation = channel.unary_unary(
+                '/google.longrunning.Operations/DeleteOperation',
+                request_serializer=google_dot_longrunning_dot_operations__pb2.DeleteOperationRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.CancelOperation = channel.unary_unary(
+                '/google.longrunning.Operations/CancelOperation',
+                request_serializer=google_dot_longrunning_dot_operations__pb2.CancelOperationRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
 
 
 class OperationsServicer(object):
-  """Manages long-running operations with an API service.
+    """Manages long-running operations with an API service.
 
-  When an API method normally takes long time to complete, it can be designed
-  to return [Operation][google.longrunning.Operation] to the client, and the client can use this
-  interface to receive the real response asynchronously by polling the
-  operation resource, or pass the operation resource to another API (such as
-  Google Cloud Pub/Sub API) to receive the response.  Any API service that
-  returns long-running operations should implement the `Operations` interface
-  so developers can have a consistent client experience.
-  """
-
-  def ListOperations(self, request, context):
-    """Lists operations that match the specified filter in the request. If the
-    server doesn't support this method, it returns `UNIMPLEMENTED`.
-
-    NOTE: the `name` binding below allows API services to override the binding
-    to use different resource name schemes, such as `users/*/operations`.
+    When an API method normally takes long time to complete, it can be designed
+    to return [Operation][google.longrunning.Operation] to the client, and the client can use this
+    interface to receive the real response asynchronously by polling the
+    operation resource, or pass the operation resource to another API (such as
+    Google Cloud Pub/Sub API) to receive the response.  Any API service that
+    returns long-running operations should implement the `Operations` interface
+    so developers can have a consistent client experience.
     """
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
 
-  def GetOperation(self, request, context):
-    """Gets the latest state of a long-running operation.  Clients can use this
-    method to poll the operation result at intervals as recommended by the API
-    service.
-    """
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def ListOperations(self, request, context):
+        """Lists operations that match the specified filter in the request. If the
+        server doesn't support this method, it returns `UNIMPLEMENTED`.
 
-  def DeleteOperation(self, request, context):
-    """Deletes a long-running operation. This method indicates that the client is
-    no longer interested in the operation result. It does not cancel the
-    operation. If the server doesn't support this method, it returns
-    `google.rpc.Code.UNIMPLEMENTED`.
-    """
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+        NOTE: the `name` binding below allows API services to override the binding
+        to use different resource name schemes, such as `users/*/operations`.
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def CancelOperation(self, request, context):
-    """Starts asynchronous cancellation on a long-running operation.  The server
-    makes a best effort to cancel the operation, but success is not
-    guaranteed.  If the server doesn't support this method, it returns
-    `google.rpc.Code.UNIMPLEMENTED`.  Clients can use
-    [Operations.GetOperation][google.longrunning.Operations.GetOperation] or
-    other methods to check whether the cancellation succeeded or whether the
-    operation completed despite cancellation. On successful cancellation,
-    the operation is not deleted; instead, it becomes an operation with
-    an [Operation.error][google.longrunning.Operation.error] value with a [google.rpc.Status.code][google.rpc.Status.code] of 1,
-    corresponding to `Code.CANCELLED`.
-    """
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def GetOperation(self, request, context):
+        """Gets the latest state of a long-running operation.  Clients can use this
+        method to poll the operation result at intervals as recommended by the API
+        service.
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def DeleteOperation(self, request, context):
+        """Deletes a long-running operation. This method indicates that the client is
+        no longer interested in the operation result. It does not cancel the
+        operation. If the server doesn't support this method, it returns
+        `google.rpc.Code.UNIMPLEMENTED`.
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def CancelOperation(self, request, context):
+        """Starts asynchronous cancellation on a long-running operation.  The server
+        makes a best effort to cancel the operation, but success is not
+        guaranteed.  If the server doesn't support this method, it returns
+        `google.rpc.Code.UNIMPLEMENTED`.  Clients can use
+        [Operations.GetOperation][google.longrunning.Operations.GetOperation] or
+        other methods to check whether the cancellation succeeded or whether the
+        operation completed despite cancellation. On successful cancellation,
+        the operation is not deleted; instead, it becomes an operation with
+        an [Operation.error][google.longrunning.Operation.error] value with a [google.rpc.Status.code][google.rpc.Status.code] of 1,
+        corresponding to `Code.CANCELLED`.
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
 
 def add_OperationsServicer_to_server(servicer, server):
-  rpc_method_handlers = {
-      'ListOperations': grpc.unary_unary_rpc_method_handler(
-          servicer.ListOperations,
-          request_deserializer=google_dot_longrunning_dot_operations__pb2.ListOperationsRequest.FromString,
-          response_serializer=google_dot_longrunning_dot_operations__pb2.ListOperationsResponse.SerializeToString,
-      ),
-      'GetOperation': grpc.unary_unary_rpc_method_handler(
-          servicer.GetOperation,
-          request_deserializer=google_dot_longrunning_dot_operations__pb2.GetOperationRequest.FromString,
-          response_serializer=google_dot_longrunning_dot_operations__pb2.Operation.SerializeToString,
-      ),
-      'DeleteOperation': grpc.unary_unary_rpc_method_handler(
-          servicer.DeleteOperation,
-          request_deserializer=google_dot_longrunning_dot_operations__pb2.DeleteOperationRequest.FromString,
-          response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
-      ),
-      'CancelOperation': grpc.unary_unary_rpc_method_handler(
-          servicer.CancelOperation,
-          request_deserializer=google_dot_longrunning_dot_operations__pb2.CancelOperationRequest.FromString,
-          response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
-      ),
-  }
-  generic_handler = grpc.method_handlers_generic_handler(
-      'google.longrunning.Operations', rpc_method_handlers)
-  server.add_generic_rpc_handlers((generic_handler,))
+    rpc_method_handlers = {
+            'ListOperations': grpc.unary_unary_rpc_method_handler(
+                    servicer.ListOperations,
+                    request_deserializer=google_dot_longrunning_dot_operations__pb2.ListOperationsRequest.FromString,
+                    response_serializer=google_dot_longrunning_dot_operations__pb2.ListOperationsResponse.SerializeToString,
+            ),
+            'GetOperation': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetOperation,
+                    request_deserializer=google_dot_longrunning_dot_operations__pb2.GetOperationRequest.FromString,
+                    response_serializer=google_dot_longrunning_dot_operations__pb2.Operation.SerializeToString,
+            ),
+            'DeleteOperation': grpc.unary_unary_rpc_method_handler(
+                    servicer.DeleteOperation,
+                    request_deserializer=google_dot_longrunning_dot_operations__pb2.DeleteOperationRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'CancelOperation': grpc.unary_unary_rpc_method_handler(
+                    servicer.CancelOperation,
+                    request_deserializer=google_dot_longrunning_dot_operations__pb2.CancelOperationRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'google.longrunning.Operations', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class Operations(object):
+    """Manages long-running operations with an API service.
+
+    When an API method normally takes long time to complete, it can be designed
+    to return [Operation][google.longrunning.Operation] to the client, and the client can use this
+    interface to receive the real response asynchronously by polling the
+    operation resource, or pass the operation resource to another API (such as
+    Google Cloud Pub/Sub API) to receive the response.  Any API service that
+    returns long-running operations should implement the `Operations` interface
+    so developers can have a consistent client experience.
+    """
+
+    @staticmethod
+    def ListOperations(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/google.longrunning.Operations/ListOperations',
+            google_dot_longrunning_dot_operations__pb2.ListOperationsRequest.SerializeToString,
+            google_dot_longrunning_dot_operations__pb2.ListOperationsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def GetOperation(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/google.longrunning.Operations/GetOperation',
+            google_dot_longrunning_dot_operations__pb2.GetOperationRequest.SerializeToString,
+            google_dot_longrunning_dot_operations__pb2.Operation.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def DeleteOperation(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/google.longrunning.Operations/DeleteOperation',
+            google_dot_longrunning_dot_operations__pb2.DeleteOperationRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def CancelOperation(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/google.longrunning.Operations/CancelOperation',
+            google_dot_longrunning_dot_operations__pb2.CancelOperationRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/buildstream/_protos/google/rpc/status_pb2.py b/buildstream/_protos/google/rpc/status_pb2.py
index 6c47723..d3388b0 100644
--- a/buildstream/_protos/google/rpc/status_pb2.py
+++ b/buildstream/_protos/google/rpc/status_pb2.py
@@ -1,13 +1,12 @@
+# -*- coding: utf-8 -*-
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: google/rpc/status.proto
-
-import sys
-_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+"""Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
-from google.protobuf import descriptor_pb2
 # @@protoc_insertion_point(imports)
 
 _sym_db = _symbol_database.Default()
@@ -16,73 +15,22 @@
 from google.protobuf import any_pb2 as google_dot_protobuf_dot_any__pb2
 
 
-DESCRIPTOR = _descriptor.FileDescriptor(
-  name='google/rpc/status.proto',
-  package='google.rpc',
-  syntax='proto3',
-  serialized_pb=_b('\n\x17google/rpc/status.proto\x12\ngoogle.rpc\x1a\x19google/protobuf/any.proto\"N\n\x06Status\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x0f\n\x07message\x18\x02 \x01(\t\x12%\n\x07\x64\x65tails\x18\x03 \x03(\x0b\x32\x14.google.protobuf.AnyB^\n\x0e\x63om.google.rpcB\x0bStatusProtoP\x01Z7google.golang.org/genproto/googleapis/rpc/status;status\xa2\x02\x03RPCb\x06proto3')
-  ,
-  dependencies=[google_dot_protobuf_dot_any__pb2.DESCRIPTOR,])
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x17google/rpc/status.proto\x12\ngoogle.rpc\x1a\x19google/protobuf/any.proto\"N\n\x06Status\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x0f\n\x07message\x18\x02 \x01(\t\x12%\n\x07\x64\x65tails\x18\x03 \x03(\x0b\x32\x14.google.protobuf.AnyB^\n\x0e\x63om.google.rpcB\x0bStatusProtoP\x01Z7google.golang.org/genproto/googleapis/rpc/status;status\xa2\x02\x03RPCb\x06proto3')
 
 
 
-
-_STATUS = _descriptor.Descriptor(
-  name='Status',
-  full_name='google.rpc.Status',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='code', full_name='google.rpc.Status.code', index=0,
-      number=1, type=5, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='message', full_name='google.rpc.Status.message', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='details', full_name='google.rpc.Status.details', index=2,
-      number=3, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=66,
-  serialized_end=144,
-)
-
-_STATUS.fields_by_name['details'].message_type = google_dot_protobuf_dot_any__pb2._ANY
-DESCRIPTOR.message_types_by_name['Status'] = _STATUS
-_sym_db.RegisterFileDescriptor(DESCRIPTOR)
-
-Status = _reflection.GeneratedProtocolMessageType('Status', (_message.Message,), dict(
-  DESCRIPTOR = _STATUS,
-  __module__ = 'google.rpc.status_pb2'
+_STATUS = DESCRIPTOR.message_types_by_name['Status']
+Status = _reflection.GeneratedProtocolMessageType('Status', (_message.Message,), {
+  'DESCRIPTOR' : _STATUS,
+  '__module__' : 'google.rpc.status_pb2'
   # @@protoc_insertion_point(class_scope:google.rpc.Status)
-  ))
+  })
 _sym_db.RegisterMessage(Status)
 
+if _descriptor._USE_C_DESCRIPTORS == False:
 
-DESCRIPTOR.has_options = True
-DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\016com.google.rpcB\013StatusProtoP\001Z7google.golang.org/genproto/googleapis/rpc/status;status\242\002\003RPC'))
+  DESCRIPTOR._options = None
+  DESCRIPTOR._serialized_options = b'\n\016com.google.rpcB\013StatusProtoP\001Z7google.golang.org/genproto/googleapis/rpc/status;status\242\002\003RPC'
+  _STATUS._serialized_start=66
+  _STATUS._serialized_end=144
 # @@protoc_insertion_point(module_scope)
diff --git a/buildstream/_protos/google/rpc/status_pb2_grpc.py b/buildstream/_protos/google/rpc/status_pb2_grpc.py
index a894352..2daafff 100644
--- a/buildstream/_protos/google/rpc/status_pb2_grpc.py
+++ b/buildstream/_protos/google/rpc/status_pb2_grpc.py
@@ -1,3 +1,4 @@
 # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
 import grpc
 
diff --git a/requirements/requirements.in b/requirements/requirements.in
index 17a1cf5..d810ba9 100644
--- a/requirements/requirements.in
+++ b/requirements/requirements.in
@@ -2,7 +2,7 @@
 grpcio >= 1.30
 jinja2 >= 2.10
 pluginbase
-protobuf >= 3.6
+protobuf >= 3.19
 psutil
 ruamel.yaml < 0.17
 setuptools