// Copyright 2023 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Protocol buffer definitions for operations in the binhost lookup service.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.27.1
// 	protoc        v3.17.1
// source: chromiumos/prebuilts_cloud.proto

package chromiumos

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	timestamppb "google.golang.org/protobuf/types/known/timestamppb"
	reflect "reflect"
	sync "sync"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// This is used by the `update_service` to update the `lookup_service` database
// with metadata related to snapshots. The `update_snapshot_data` Pub/Sub topic
// is associated with this schema definition, so messages sent to update
// snapshot data must follow this format.
// All the fields must be sent in each message.
type UpdateSnapshotDataRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Unique sha of the snapshot.
	SnapshotSha string `protobuf:"bytes,1,opt,name=snapshot_sha,json=snapshotSha,proto3" json:"snapshot_sha,omitempty"`
	// Snapshot number.
	SnapshotNum uint32 `protobuf:"varint,2,opt,name=snapshot_num,json=snapshotNum,proto3" json:"snapshot_num,omitempty"`
	// Boolean to denote if the snapshot is external.
	External bool `protobuf:"varint,3,opt,name=external,proto3" json:"external,omitempty"`
	// Id of the annealing build that created the snapshot.
	BuildbucketId uint64 `protobuf:"varint,4,opt,name=buildbucket_id,json=buildbucketId,proto3" json:"buildbucket_id,omitempty"`
}

func (x *UpdateSnapshotDataRequest) Reset() {
	*x = UpdateSnapshotDataRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromiumos_prebuilts_cloud_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *UpdateSnapshotDataRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*UpdateSnapshotDataRequest) ProtoMessage() {}

func (x *UpdateSnapshotDataRequest) ProtoReflect() protoreflect.Message {
	mi := &file_chromiumos_prebuilts_cloud_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use UpdateSnapshotDataRequest.ProtoReflect.Descriptor instead.
func (*UpdateSnapshotDataRequest) Descriptor() ([]byte, []int) {
	return file_chromiumos_prebuilts_cloud_proto_rawDescGZIP(), []int{0}
}

func (x *UpdateSnapshotDataRequest) GetSnapshotSha() string {
	if x != nil {
		return x.SnapshotSha
	}
	return ""
}

func (x *UpdateSnapshotDataRequest) GetSnapshotNum() uint32 {
	if x != nil {
		return x.SnapshotNum
	}
	return 0
}

func (x *UpdateSnapshotDataRequest) GetExternal() bool {
	if x != nil {
		return x.External
	}
	return false
}

func (x *UpdateSnapshotDataRequest) GetBuildbucketId() uint64 {
	if x != nil {
		return x.BuildbucketId
	}
	return 0
}

// This is used by the `update_service` to update the `lookup_service` database.
// While this is primarily used to update binhost metadata, the build target
// profiles table is also updated to keep a record of all build targets and
// their associated profiles. The `update_binhost_data` Pub/Sub topic is
// associated with this schema definition, so messages sent to update binhost
// data must follow this format.
// All the fields must be sent in each message.
type UpdateBinhostDataRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The system Chrome OS is being built for, also known as board.
	BuildTarget string `protobuf:"bytes,1,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// Name of the profile to use with the build_target.
	Profile string `protobuf:"bytes,2,opt,name=profile,proto3" json:"profile,omitempty"`
	// Sha of the snapshot associated with the binhost.
	SnapshotSha string `protobuf:"bytes,3,opt,name=snapshot_sha,json=snapshotSha,proto3" json:"snapshot_sha,omitempty"`
	// Location of the binhost object in google storage.
	GsUri string `protobuf:"bytes,4,opt,name=gs_uri,json=gsUri,proto3" json:"gs_uri,omitempty"`
	// Name of the google storage bucket which contains the binhost.
	GsBucketName string `protobuf:"bytes,5,opt,name=gs_bucket_name,json=gsBucketName,proto3" json:"gs_bucket_name,omitempty"`
	// Id of the postsubmit builder that created and uploaded the binhost.
	BuildbucketId uint64 `protobuf:"varint,6,opt,name=buildbucket_id,json=buildbucketId,proto3" json:"buildbucket_id,omitempty"`
	// Bool to indicate if this binhost contains all the binpkgs specified in the
	// packages metadata file.
	Complete bool `protobuf:"varint,7,opt,name=complete,proto3" json:"complete,omitempty"`
	// Bool to indicate if the binhost is private.
	Private bool `protobuf:"varint,8,opt,name=private,proto3" json:"private,omitempty"`
}

func (x *UpdateBinhostDataRequest) Reset() {
	*x = UpdateBinhostDataRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromiumos_prebuilts_cloud_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *UpdateBinhostDataRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*UpdateBinhostDataRequest) ProtoMessage() {}

func (x *UpdateBinhostDataRequest) ProtoReflect() protoreflect.Message {
	mi := &file_chromiumos_prebuilts_cloud_proto_msgTypes[1]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use UpdateBinhostDataRequest.ProtoReflect.Descriptor instead.
func (*UpdateBinhostDataRequest) Descriptor() ([]byte, []int) {
	return file_chromiumos_prebuilts_cloud_proto_rawDescGZIP(), []int{1}
}

func (x *UpdateBinhostDataRequest) GetBuildTarget() string {
	if x != nil {
		return x.BuildTarget
	}
	return ""
}

func (x *UpdateBinhostDataRequest) GetProfile() string {
	if x != nil {
		return x.Profile
	}
	return ""
}

func (x *UpdateBinhostDataRequest) GetSnapshotSha() string {
	if x != nil {
		return x.SnapshotSha
	}
	return ""
}

func (x *UpdateBinhostDataRequest) GetGsUri() string {
	if x != nil {
		return x.GsUri
	}
	return ""
}

func (x *UpdateBinhostDataRequest) GetGsBucketName() string {
	if x != nil {
		return x.GsBucketName
	}
	return ""
}

func (x *UpdateBinhostDataRequest) GetBuildbucketId() uint64 {
	if x != nil {
		return x.BuildbucketId
	}
	return 0
}

func (x *UpdateBinhostDataRequest) GetComplete() bool {
	if x != nil {
		return x.Complete
	}
	return false
}

func (x *UpdateBinhostDataRequest) GetPrivate() bool {
	if x != nil {
		return x.Private
	}
	return false
}

// This is used to query binhosts from the binhost lookup service. The cloud
// function defined in the `chromeos-prebuilts` project accepts incoming HTTP
// GET requests and returns locations of the binhosts, which are filtered based
// on the given filter parameters. The data sent using this protobuf message
// must be a serialized, base64 encoded and sent as query parameter with the
// name `filter`.
type LookupBinhostsRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Name of the google storage bucket (without the "gs://" prefix) which
	// contains the binhosts (e.g. "chromeos-prebuilt").
	GsBucketName string `protobuf:"bytes,1,opt,name=gs_bucket_name,json=gsBucketName,proto3" json:"gs_bucket_name,omitempty"`
	// List of snapshot SHAs to query for binhosts.
	SnapshotShas []string `protobuf:"bytes,2,rep,name=snapshot_shas,json=snapshotShas,proto3" json:"snapshot_shas,omitempty"`
	// The build target (also know as board) of the binhosts.
	BuildTarget string `protobuf:"bytes,3,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// build_target profile of the binhosts.
	Profile string `protobuf:"bytes,4,opt,name=profile,proto3" json:"profile,omitempty"`
	// Bool to indicate if the snapshot SHAs are private (internal).
	Private bool `protobuf:"varint,5,opt,name=private,proto3" json:"private,omitempty"`
	// Bool to indicate if the corresponding binhosts should also be returned.
	// For example, if private=True (internal snapshot SHAs), also return the
	// public binhosts (for the public, external snapshot SHAs).
	GetCorrespondingBinhosts bool `protobuf:"varint,6,opt,name=get_corresponding_binhosts,json=getCorrespondingBinhosts,proto3" json:"get_corresponding_binhosts,omitempty"`
	// The base architecture board for the build target (e.g. amd64-generic).
	GenericBuildTarget string `protobuf:"bytes,7,opt,name=generic_build_target,json=genericBuildTarget,proto3" json:"generic_build_target,omitempty"`
	// The profile of the base architecture board.
	GenericProfile string `protobuf:"bytes,8,opt,name=generic_profile,json=genericProfile,proto3" json:"generic_profile,omitempty"`
}

func (x *LookupBinhostsRequest) Reset() {
	*x = LookupBinhostsRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromiumos_prebuilts_cloud_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *LookupBinhostsRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*LookupBinhostsRequest) ProtoMessage() {}

func (x *LookupBinhostsRequest) ProtoReflect() protoreflect.Message {
	mi := &file_chromiumos_prebuilts_cloud_proto_msgTypes[2]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use LookupBinhostsRequest.ProtoReflect.Descriptor instead.
func (*LookupBinhostsRequest) Descriptor() ([]byte, []int) {
	return file_chromiumos_prebuilts_cloud_proto_rawDescGZIP(), []int{2}
}

func (x *LookupBinhostsRequest) GetGsBucketName() string {
	if x != nil {
		return x.GsBucketName
	}
	return ""
}

func (x *LookupBinhostsRequest) GetSnapshotShas() []string {
	if x != nil {
		return x.SnapshotShas
	}
	return nil
}

func (x *LookupBinhostsRequest) GetBuildTarget() string {
	if x != nil {
		return x.BuildTarget
	}
	return ""
}

func (x *LookupBinhostsRequest) GetProfile() string {
	if x != nil {
		return x.Profile
	}
	return ""
}

func (x *LookupBinhostsRequest) GetPrivate() bool {
	if x != nil {
		return x.Private
	}
	return false
}

func (x *LookupBinhostsRequest) GetGetCorrespondingBinhosts() bool {
	if x != nil {
		return x.GetCorrespondingBinhosts
	}
	return false
}

func (x *LookupBinhostsRequest) GetGenericBuildTarget() string {
	if x != nil {
		return x.GenericBuildTarget
	}
	return ""
}

func (x *LookupBinhostsRequest) GetGenericProfile() string {
	if x != nil {
		return x.GenericProfile
	}
	return ""
}

// Response sent by the cloud function defined in the `chromeos-prebuilts`
// project to lookup binhosts. This contains locations of the binhosts, which
// are filtered based on the filter parameters.
type LookupBinhostsResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// List of `Binhost` objects.
	Binhosts []*LookupBinhostsResponse_Binhost `protobuf:"bytes,1,rep,name=binhosts,proto3" json:"binhosts,omitempty"`
}

func (x *LookupBinhostsResponse) Reset() {
	*x = LookupBinhostsResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromiumos_prebuilts_cloud_proto_msgTypes[3]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *LookupBinhostsResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*LookupBinhostsResponse) ProtoMessage() {}

func (x *LookupBinhostsResponse) ProtoReflect() protoreflect.Message {
	mi := &file_chromiumos_prebuilts_cloud_proto_msgTypes[3]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use LookupBinhostsResponse.ProtoReflect.Descriptor instead.
func (*LookupBinhostsResponse) Descriptor() ([]byte, []int) {
	return file_chromiumos_prebuilts_cloud_proto_rawDescGZIP(), []int{3}
}

func (x *LookupBinhostsResponse) GetBinhosts() []*LookupBinhostsResponse_Binhost {
	if x != nil {
		return x.Binhosts
	}
	return nil
}

// Data required to fetch binhosts from the binhost lookup service.
type BinhostLookupServiceData struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Snapshot SHAs of the target binhosts.
	SnapshotShas []string `protobuf:"bytes,1,rep,name=snapshot_shas,json=snapshotShas,proto3" json:"snapshot_shas,omitempty"`
	// Bool to indicate if the snapshot SHAs are private (internal).
	Private bool `protobuf:"varint,2,opt,name=private,proto3" json:"private,omitempty"`
	// Denote whether it is the staging environment.
	IsStaging bool `protobuf:"varint,3,opt,name=is_staging,json=isStaging,proto3" json:"is_staging,omitempty"`
}

func (x *BinhostLookupServiceData) Reset() {
	*x = BinhostLookupServiceData{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromiumos_prebuilts_cloud_proto_msgTypes[4]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *BinhostLookupServiceData) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*BinhostLookupServiceData) ProtoMessage() {}

func (x *BinhostLookupServiceData) ProtoReflect() protoreflect.Message {
	mi := &file_chromiumos_prebuilts_cloud_proto_msgTypes[4]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use BinhostLookupServiceData.ProtoReflect.Descriptor instead.
func (*BinhostLookupServiceData) Descriptor() ([]byte, []int) {
	return file_chromiumos_prebuilts_cloud_proto_rawDescGZIP(), []int{4}
}

func (x *BinhostLookupServiceData) GetSnapshotShas() []string {
	if x != nil {
		return x.SnapshotShas
	}
	return nil
}

func (x *BinhostLookupServiceData) GetPrivate() bool {
	if x != nil {
		return x.Private
	}
	return false
}

func (x *BinhostLookupServiceData) GetIsStaging() bool {
	if x != nil {
		return x.IsStaging
	}
	return false
}

// Metadata related to a binhost.
type LookupBinhostsResponse_Binhost struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// ID of the binhost record in the `lookup_service` DB.
	BinhostId uint64 `protobuf:"varint,1,opt,name=binhost_id,json=binhostId,proto3" json:"binhost_id,omitempty"`
	// Full path to the google storage location of the binhost.
	GsUri string `protobuf:"bytes,2,opt,name=gs_uri,json=gsUri,proto3" json:"gs_uri,omitempty"`
	// Time when the binhost record was inserted into the database.
	CreatedAt *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"`
}

func (x *LookupBinhostsResponse_Binhost) Reset() {
	*x = LookupBinhostsResponse_Binhost{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromiumos_prebuilts_cloud_proto_msgTypes[5]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *LookupBinhostsResponse_Binhost) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*LookupBinhostsResponse_Binhost) ProtoMessage() {}

func (x *LookupBinhostsResponse_Binhost) ProtoReflect() protoreflect.Message {
	mi := &file_chromiumos_prebuilts_cloud_proto_msgTypes[5]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use LookupBinhostsResponse_Binhost.ProtoReflect.Descriptor instead.
func (*LookupBinhostsResponse_Binhost) Descriptor() ([]byte, []int) {
	return file_chromiumos_prebuilts_cloud_proto_rawDescGZIP(), []int{3, 0}
}

func (x *LookupBinhostsResponse_Binhost) GetBinhostId() uint64 {
	if x != nil {
		return x.BinhostId
	}
	return 0
}

func (x *LookupBinhostsResponse_Binhost) GetGsUri() string {
	if x != nil {
		return x.GsUri
	}
	return ""
}

func (x *LookupBinhostsResponse_Binhost) GetCreatedAt() *timestamppb.Timestamp {
	if x != nil {
		return x.CreatedAt
	}
	return nil
}

var File_chromiumos_prebuilts_cloud_proto protoreflect.FileDescriptor

var file_chromiumos_prebuilts_cloud_proto_rawDesc = []byte{
	0x0a, 0x20, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x70, 0x72, 0x65,
	0x62, 0x75, 0x69, 0x6c, 0x74, 0x73, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x12, 0x0a, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x1a, 0x1f,
	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f,
	0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22,
	0xa4, 0x01, 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68,
	0x6f, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a,
	0x0c, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x53, 0x68, 0x61,
	0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x6e, 0x75, 0x6d,
	0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74,
	0x4e, 0x75, 0x6d, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18,
	0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x12,
	0x25, 0x0a, 0x0e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69,
	0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75,
	0x63, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x22, 0x94, 0x02, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74,
	0x65, 0x42, 0x69, 0x6e, 0x68, 0x6f, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75,
	0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x74, 0x61, 0x72,
	0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64,
	0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c,
	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65,
	0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x73, 0x68, 0x61,
	0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74,
	0x53, 0x68, 0x61, 0x12, 0x15, 0x0a, 0x06, 0x67, 0x73, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x04, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x73, 0x55, 0x72, 0x69, 0x12, 0x24, 0x0a, 0x0e, 0x67, 0x73,
	0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01,
	0x28, 0x09, 0x52, 0x0c, 0x67, 0x73, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65,
	0x12, 0x25, 0x0a, 0x0e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f,
	0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62,
	0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x70, 0x6c,
	0x65, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x70, 0x6c,
	0x65, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x08,
	0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x22, 0xd2, 0x02,
	0x0a, 0x15, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x42, 0x69, 0x6e, 0x68, 0x6f, 0x73, 0x74, 0x73,
	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x67, 0x73, 0x5f, 0x62, 0x75,
	0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
	0x0c, 0x67, 0x73, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a,
	0x0d, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x73, 0x18, 0x02,
	0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x53, 0x68,
	0x61, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x74, 0x61, 0x72, 0x67,
	0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x54,
	0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65,
	0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12,
	0x18, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08,
	0x52, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x3c, 0x0a, 0x1a, 0x67, 0x65, 0x74,
	0x5f, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x62,
	0x69, 0x6e, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x67,
	0x65, 0x74, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x42,
	0x69, 0x6e, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x67, 0x65, 0x6e, 0x65, 0x72,
	0x69, 0x63, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18,
	0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x42, 0x75,
	0x69, 0x6c, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x67, 0x65, 0x6e,
	0x65, 0x72, 0x69, 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x08, 0x20, 0x01,
	0x28, 0x09, 0x52, 0x0e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x50, 0x72, 0x6f, 0x66, 0x69,
	0x6c, 0x65, 0x22, 0xdc, 0x01, 0x0a, 0x16, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x42, 0x69, 0x6e,
	0x68, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a,
	0x08, 0x62, 0x69, 0x6e, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,
	0x2a, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x4c, 0x6f, 0x6f,
	0x6b, 0x75, 0x70, 0x42, 0x69, 0x6e, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f,
	0x6e, 0x73, 0x65, 0x2e, 0x42, 0x69, 0x6e, 0x68, 0x6f, 0x73, 0x74, 0x52, 0x08, 0x62, 0x69, 0x6e,
	0x68, 0x6f, 0x73, 0x74, 0x73, 0x1a, 0x7a, 0x0a, 0x07, 0x42, 0x69, 0x6e, 0x68, 0x6f, 0x73, 0x74,
	0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x69, 0x6e, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01,
	0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x62, 0x69, 0x6e, 0x68, 0x6f, 0x73, 0x74, 0x49, 0x64, 0x12,
	0x15, 0x0a, 0x06, 0x67, 0x73, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
	0x05, 0x67, 0x73, 0x55, 0x72, 0x69, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65,
	0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d,
	0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41,
	0x74, 0x22, 0x78, 0x0a, 0x18, 0x42, 0x69, 0x6e, 0x68, 0x6f, 0x73, 0x74, 0x4c, 0x6f, 0x6f, 0x6b,
	0x75, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a,
	0x0d, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x73, 0x18, 0x01,
	0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x53, 0x68,
	0x61, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20,
	0x01, 0x28, 0x08, 0x52, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x0a, 0x0a,
	0x69, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08,
	0x52, 0x09, 0x69, 0x73, 0x53, 0x74, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x42, 0x59, 0x0a, 0x21, 0x63,
	0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65,
	0x2e, 0x63, 0x72, 0x6f, 0x73, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x5a, 0x34, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72,
	0x67, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x69, 0x6e, 0x66,
	0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_chromiumos_prebuilts_cloud_proto_rawDescOnce sync.Once
	file_chromiumos_prebuilts_cloud_proto_rawDescData = file_chromiumos_prebuilts_cloud_proto_rawDesc
)

func file_chromiumos_prebuilts_cloud_proto_rawDescGZIP() []byte {
	file_chromiumos_prebuilts_cloud_proto_rawDescOnce.Do(func() {
		file_chromiumos_prebuilts_cloud_proto_rawDescData = protoimpl.X.CompressGZIP(file_chromiumos_prebuilts_cloud_proto_rawDescData)
	})
	return file_chromiumos_prebuilts_cloud_proto_rawDescData
}

var file_chromiumos_prebuilts_cloud_proto_msgTypes = make([]protoimpl.MessageInfo, 6)
var file_chromiumos_prebuilts_cloud_proto_goTypes = []interface{}{
	(*UpdateSnapshotDataRequest)(nil),      // 0: chromiumos.UpdateSnapshotDataRequest
	(*UpdateBinhostDataRequest)(nil),       // 1: chromiumos.UpdateBinhostDataRequest
	(*LookupBinhostsRequest)(nil),          // 2: chromiumos.LookupBinhostsRequest
	(*LookupBinhostsResponse)(nil),         // 3: chromiumos.LookupBinhostsResponse
	(*BinhostLookupServiceData)(nil),       // 4: chromiumos.BinhostLookupServiceData
	(*LookupBinhostsResponse_Binhost)(nil), // 5: chromiumos.LookupBinhostsResponse.Binhost
	(*timestamppb.Timestamp)(nil),          // 6: google.protobuf.Timestamp
}
var file_chromiumos_prebuilts_cloud_proto_depIdxs = []int32{
	5, // 0: chromiumos.LookupBinhostsResponse.binhosts:type_name -> chromiumos.LookupBinhostsResponse.Binhost
	6, // 1: chromiumos.LookupBinhostsResponse.Binhost.created_at:type_name -> google.protobuf.Timestamp
	2, // [2:2] is the sub-list for method output_type
	2, // [2:2] is the sub-list for method input_type
	2, // [2:2] is the sub-list for extension type_name
	2, // [2:2] is the sub-list for extension extendee
	0, // [0:2] is the sub-list for field type_name
}

func init() { file_chromiumos_prebuilts_cloud_proto_init() }
func file_chromiumos_prebuilts_cloud_proto_init() {
	if File_chromiumos_prebuilts_cloud_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_chromiumos_prebuilts_cloud_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*UpdateSnapshotDataRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_prebuilts_cloud_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*UpdateBinhostDataRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_prebuilts_cloud_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*LookupBinhostsRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_prebuilts_cloud_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*LookupBinhostsResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_prebuilts_cloud_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BinhostLookupServiceData); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_prebuilts_cloud_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*LookupBinhostsResponse_Binhost); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_chromiumos_prebuilts_cloud_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   6,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_chromiumos_prebuilts_cloud_proto_goTypes,
		DependencyIndexes: file_chromiumos_prebuilts_cloud_proto_depIdxs,
		MessageInfos:      file_chromiumos_prebuilts_cloud_proto_msgTypes,
	}.Build()
	File_chromiumos_prebuilts_cloud_proto = out.File
	file_chromiumos_prebuilts_cloud_proto_rawDesc = nil
	file_chromiumos_prebuilts_cloud_proto_goTypes = nil
	file_chromiumos_prebuilts_cloud_proto_depIdxs = nil
}
