# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: chromiumos/prebuilts_cloud.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 symbol_database as _symbol_database
from google.protobuf.internal import builder as _builder
# @@protoc_insertion_point(imports)

_sym_db = _symbol_database.Default()


from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2


DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n chromiumos/prebuilts_cloud.proto\x12\nchromiumos\x1a\x1fgoogle/protobuf/timestamp.proto\"q\n\x19UpdateSnapshotDataRequest\x12\x14\n\x0csnapshot_sha\x18\x01 \x01(\t\x12\x14\n\x0csnapshot_num\x18\x02 \x01(\r\x12\x10\n\x08\x65xternal\x18\x03 \x01(\x08\x12\x16\n\x0e\x62uildbucket_id\x18\x04 \x01(\x04\"\xba\x01\n\x18UpdateBinhostDataRequest\x12\x14\n\x0c\x62uild_target\x18\x01 \x01(\t\x12\x0f\n\x07profile\x18\x02 \x01(\t\x12\x14\n\x0csnapshot_sha\x18\x03 \x01(\t\x12\x0e\n\x06gs_uri\x18\x04 \x01(\t\x12\x16\n\x0egs_bucket_name\x18\x05 \x01(\t\x12\x16\n\x0e\x62uildbucket_id\x18\x06 \x01(\x04\x12\x10\n\x08\x63omplete\x18\x07 \x01(\x08\x12\x0f\n\x07private\x18\x08 \x01(\x08\"\xd9\x01\n\x15LookupBinhostsRequest\x12\x16\n\x0egs_bucket_name\x18\x01 \x01(\t\x12\x15\n\rsnapshot_shas\x18\x02 \x03(\t\x12\x14\n\x0c\x62uild_target\x18\x03 \x01(\t\x12\x0f\n\x07profile\x18\x04 \x01(\t\x12\x0f\n\x07private\x18\x05 \x01(\x08\x12\"\n\x1aget_corresponding_binhosts\x18\x06 \x01(\x08\x12\x1c\n\x14generic_build_target\x18\x07 \x01(\t\x12\x17\n\x0fgeneric_profile\x18\x08 \x01(\t\"\xb5\x01\n\x16LookupBinhostsResponse\x12<\n\x08\x62inhosts\x18\x01 \x03(\x0b\x32*.chromiumos.LookupBinhostsResponse.Binhost\x1a]\n\x07\x42inhost\x12\x12\n\nbinhost_id\x18\x01 \x01(\x04\x12\x0e\n\x06gs_uri\x18\x02 \x01(\t\x12.\n\ncreated_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"V\n\x18\x42inhostLookupServiceData\x12\x15\n\rsnapshot_shas\x18\x01 \x03(\t\x12\x0f\n\x07private\x18\x02 \x01(\x08\x12\x12\n\nis_staging\x18\x03 \x01(\x08\x42Y\n!com.google.chrome.crosinfra.protoZ4go.chromium.org/chromiumos/infra/proto/go/chromiumosb\x06proto3')

_globals = globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'chromiumos.prebuilts_cloud_pb2', _globals)
if _descriptor._USE_C_DESCRIPTORS == False:

  DESCRIPTOR._options = None
  DESCRIPTOR._serialized_options = b'\n!com.google.chrome.crosinfra.protoZ4go.chromium.org/chromiumos/infra/proto/go/chromiumos'
  _globals['_UPDATESNAPSHOTDATAREQUEST']._serialized_start=81
  _globals['_UPDATESNAPSHOTDATAREQUEST']._serialized_end=194
  _globals['_UPDATEBINHOSTDATAREQUEST']._serialized_start=197
  _globals['_UPDATEBINHOSTDATAREQUEST']._serialized_end=383
  _globals['_LOOKUPBINHOSTSREQUEST']._serialized_start=386
  _globals['_LOOKUPBINHOSTSREQUEST']._serialized_end=603
  _globals['_LOOKUPBINHOSTSRESPONSE']._serialized_start=606
  _globals['_LOOKUPBINHOSTSRESPONSE']._serialized_end=787
  _globals['_LOOKUPBINHOSTSRESPONSE_BINHOST']._serialized_start=694
  _globals['_LOOKUPBINHOSTSRESPONSE_BINHOST']._serialized_end=787
  _globals['_BINHOSTLOOKUPSERVICEDATA']._serialized_start=789
  _globals['_BINHOSTLOOKUPSERVICEDATA']._serialized_end=875
# @@protoc_insertion_point(module_scope)
