// Copyright 2020 The Swarming Authors. All rights reserved.
// Use of this source code is governed by the Apache v2.0 license that can be
// found in the LICENSE file.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.31.0
// 	protoc        v3.21.7
// source: go.chromium.org/luci/buildbucket/proto/builder_common.proto

package buildbucketpb

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	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)
)

// Identifies a builder.
// Canonical string representation: "{project}/{bucket}/{builder}".
type BuilderID struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Project ID, e.g. "chromium". Unique within a LUCI deployment.
	// Regex: ^[a-z0-9\-_]+$
	Project string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"`
	// Bucket name, e.g. "try". Unique within the project.
	// Regex: ^[a-z0-9\-_.]{1,100}$
	// Together with project, defines an ACL.
	Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"`
	// Builder name, e.g. "linux-rel". Unique within the bucket.
	// Regex: ^[a-zA-Z0-9\-_.\(\) ]{1,128}$
	Builder string `protobuf:"bytes,3,opt,name=builder,proto3" json:"builder,omitempty"`
}

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

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

func (*BuilderID) ProtoMessage() {}

func (x *BuilderID) ProtoReflect() protoreflect.Message {
	mi := &file_go_chromium_org_luci_buildbucket_proto_builder_common_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 BuilderID.ProtoReflect.Descriptor instead.
func (*BuilderID) Descriptor() ([]byte, []int) {
	return file_go_chromium_org_luci_buildbucket_proto_builder_common_proto_rawDescGZIP(), []int{0}
}

func (x *BuilderID) GetProject() string {
	if x != nil {
		return x.Project
	}
	return ""
}

func (x *BuilderID) GetBucket() string {
	if x != nil {
		return x.Bucket
	}
	return ""
}

func (x *BuilderID) GetBuilder() string {
	if x != nil {
		return x.Builder
	}
	return ""
}

type BuilderMetadata struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Team that owns the builder
	Owner string `protobuf:"bytes,1,opt,name=owner,proto3" json:"owner,omitempty"`
	// Builders current health status
	Health *HealthStatus `protobuf:"bytes,2,opt,name=health,proto3" json:"health,omitempty"`
}

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

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

func (*BuilderMetadata) ProtoMessage() {}

func (x *BuilderMetadata) ProtoReflect() protoreflect.Message {
	mi := &file_go_chromium_org_luci_buildbucket_proto_builder_common_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 BuilderMetadata.ProtoReflect.Descriptor instead.
func (*BuilderMetadata) Descriptor() ([]byte, []int) {
	return file_go_chromium_org_luci_buildbucket_proto_builder_common_proto_rawDescGZIP(), []int{1}
}

func (x *BuilderMetadata) GetOwner() string {
	if x != nil {
		return x.Owner
	}
	return ""
}

func (x *BuilderMetadata) GetHealth() *HealthStatus {
	if x != nil {
		return x.Health
	}
	return nil
}

// A configured builder.
//
// It is called BuilderItem and not Builder because
// 1) Builder already exists
// 2) Name "Builder" is incompatible with proto->Java compiler.
type BuilderItem struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Uniquely identifies the builder in a given Buildbucket instance.
	Id *BuilderID `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	// User-supplied configuration after normalization.
	// Does not refer to mixins and has defaults inlined.
	Config *BuilderConfig `protobuf:"bytes,2,opt,name=config,proto3" json:"config,omitempty"`
	// Metadata surrounding the builder.
	Metadata *BuilderMetadata `protobuf:"bytes,3,opt,name=metadata,proto3" json:"metadata,omitempty"`
}

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

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

func (*BuilderItem) ProtoMessage() {}

func (x *BuilderItem) ProtoReflect() protoreflect.Message {
	mi := &file_go_chromium_org_luci_buildbucket_proto_builder_common_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 BuilderItem.ProtoReflect.Descriptor instead.
func (*BuilderItem) Descriptor() ([]byte, []int) {
	return file_go_chromium_org_luci_buildbucket_proto_builder_common_proto_rawDescGZIP(), []int{2}
}

func (x *BuilderItem) GetId() *BuilderID {
	if x != nil {
		return x.Id
	}
	return nil
}

func (x *BuilderItem) GetConfig() *BuilderConfig {
	if x != nil {
		return x.Config
	}
	return nil
}

func (x *BuilderItem) GetMetadata() *BuilderMetadata {
	if x != nil {
		return x.Metadata
	}
	return nil
}

var File_go_chromium_org_luci_buildbucket_proto_builder_common_proto protoreflect.FileDescriptor

var file_go_chromium_org_luci_buildbucket_proto_builder_common_proto_rawDesc = []byte{
	0x0a, 0x3b, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72,
	0x67, 0x2f, 0x6c, 0x75, 0x63, 0x69, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75, 0x63, 0x6b,
	0x65, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72,
	0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x62,
	0x75, 0x69, 0x6c, 0x64, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x76, 0x32, 0x1a, 0x33, 0x67,
	0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x6c,
	0x75, 0x63, 0x69, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2f,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x1a, 0x39, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e,
	0x6f, 0x72, 0x67, 0x2f, 0x6c, 0x75, 0x63, 0x69, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75,
	0x63, 0x6b, 0x65, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64,
	0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x3b, 0x67,
	0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x6c,
	0x75, 0x63, 0x69, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2f,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x6f,
	0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x99, 0x01, 0x0a, 0x09, 0x42,
	0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x49, 0x44, 0x12, 0x2e, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a,
	0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x14, 0x9a, 0xc3, 0x1a, 0x10, 0x53,
	0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52,
	0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2c, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b,
	0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x14, 0x9a, 0xc3, 0x1a, 0x10, 0x53, 0x65,
	0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x06,
	0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x2e, 0x0a, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65,
	0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x14, 0x9a, 0xc3, 0x1a, 0x10, 0x53, 0x65, 0x74,
	0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x07, 0x62,
	0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x22, 0x5d, 0x0a, 0x0f, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65,
	0x72, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x77, 0x6e,
	0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x12,
	0x34, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
	0x1c, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x76, 0x32,
	0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x68,
	0x65, 0x61, 0x6c, 0x74, 0x68, 0x22, 0xa9, 0x01, 0x0a, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65,
	0x72, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x29, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x0b, 0x32, 0x19, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e,
	0x76, 0x32, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x49, 0x44, 0x52, 0x02, 0x69, 0x64,
	0x12, 0x32, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,
	0x32, 0x1a, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x42,
	0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f,
	0x6e, 0x66, 0x69, 0x67, 0x12, 0x3b, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,
	0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75,
	0x63, 0x6b, 0x65, 0x74, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4d,
	0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74,
	0x61, 0x42, 0x36, 0x5a, 0x34, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d,
	0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x6c, 0x75, 0x63, 0x69, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62,
	0x75, 0x63, 0x6b, 0x65, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x3b, 0x62, 0x75, 0x69, 0x6c,
	0x64, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x33,
}

var (
	file_go_chromium_org_luci_buildbucket_proto_builder_common_proto_rawDescOnce sync.Once
	file_go_chromium_org_luci_buildbucket_proto_builder_common_proto_rawDescData = file_go_chromium_org_luci_buildbucket_proto_builder_common_proto_rawDesc
)

func file_go_chromium_org_luci_buildbucket_proto_builder_common_proto_rawDescGZIP() []byte {
	file_go_chromium_org_luci_buildbucket_proto_builder_common_proto_rawDescOnce.Do(func() {
		file_go_chromium_org_luci_buildbucket_proto_builder_common_proto_rawDescData = protoimpl.X.CompressGZIP(file_go_chromium_org_luci_buildbucket_proto_builder_common_proto_rawDescData)
	})
	return file_go_chromium_org_luci_buildbucket_proto_builder_common_proto_rawDescData
}

var file_go_chromium_org_luci_buildbucket_proto_builder_common_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
var file_go_chromium_org_luci_buildbucket_proto_builder_common_proto_goTypes = []interface{}{
	(*BuilderID)(nil),       // 0: buildbucket.v2.BuilderID
	(*BuilderMetadata)(nil), // 1: buildbucket.v2.BuilderMetadata
	(*BuilderItem)(nil),     // 2: buildbucket.v2.BuilderItem
	(*HealthStatus)(nil),    // 3: buildbucket.v2.HealthStatus
	(*BuilderConfig)(nil),   // 4: buildbucket.BuilderConfig
}
var file_go_chromium_org_luci_buildbucket_proto_builder_common_proto_depIdxs = []int32{
	3, // 0: buildbucket.v2.BuilderMetadata.health:type_name -> buildbucket.v2.HealthStatus
	0, // 1: buildbucket.v2.BuilderItem.id:type_name -> buildbucket.v2.BuilderID
	4, // 2: buildbucket.v2.BuilderItem.config:type_name -> buildbucket.BuilderConfig
	1, // 3: buildbucket.v2.BuilderItem.metadata:type_name -> buildbucket.v2.BuilderMetadata
	4, // [4:4] is the sub-list for method output_type
	4, // [4:4] is the sub-list for method input_type
	4, // [4:4] is the sub-list for extension type_name
	4, // [4:4] is the sub-list for extension extendee
	0, // [0:4] is the sub-list for field type_name
}

func init() { file_go_chromium_org_luci_buildbucket_proto_builder_common_proto_init() }
func file_go_chromium_org_luci_buildbucket_proto_builder_common_proto_init() {
	if File_go_chromium_org_luci_buildbucket_proto_builder_common_proto != nil {
		return
	}
	file_go_chromium_org_luci_buildbucket_proto_common_proto_init()
	file_go_chromium_org_luci_buildbucket_proto_field_option_proto_init()
	file_go_chromium_org_luci_buildbucket_proto_project_config_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_go_chromium_org_luci_buildbucket_proto_builder_common_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BuilderID); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_buildbucket_proto_builder_common_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BuilderMetadata); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_buildbucket_proto_builder_common_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BuilderItem); 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_go_chromium_org_luci_buildbucket_proto_builder_common_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   3,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_go_chromium_org_luci_buildbucket_proto_builder_common_proto_goTypes,
		DependencyIndexes: file_go_chromium_org_luci_buildbucket_proto_builder_common_proto_depIdxs,
		MessageInfos:      file_go_chromium_org_luci_buildbucket_proto_builder_common_proto_msgTypes,
	}.Build()
	File_go_chromium_org_luci_buildbucket_proto_builder_common_proto = out.File
	file_go_chromium_org_luci_buildbucket_proto_builder_common_proto_rawDesc = nil
	file_go_chromium_org_luci_buildbucket_proto_builder_common_proto_goTypes = nil
	file_go_chromium_org_luci_buildbucket_proto_builder_common_proto_depIdxs = nil
}
