// Copyright 2018 The LUCI Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.25.0-devel
// 	protoc        v3.12.1
// source: go.chromium.org/luci/buildbucket/proto/launcher.proto

package buildbucketpb

import (
	proto "github.com/golang/protobuf/proto"
	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)
)

// This is a compile-time assertion that a sufficiently up-to-date version
// of the legacy proto package is being used.
const _ = proto.ProtoPackageIsVersion4

// A collection of build-related secrets we might pass from Buildbucket to Kitchen.
type BuildSecrets struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Token to identify RPCs associated with the same build.
	BuildToken string `protobuf:"bytes,1,opt,name=build_token,json=buildToken,proto3" json:"build_token,omitempty"`
	// Token to allow updating this build's invocation in ResultDB.
	ResultdbInvocationUpdateToken string `protobuf:"bytes,2,opt,name=resultdb_invocation_update_token,json=resultdbInvocationUpdateToken,proto3" json:"resultdb_invocation_update_token,omitempty"`
}

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

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

func (*BuildSecrets) ProtoMessage() {}

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

func (x *BuildSecrets) GetBuildToken() string {
	if x != nil {
		return x.BuildToken
	}
	return ""
}

func (x *BuildSecrets) GetResultdbInvocationUpdateToken() string {
	if x != nil {
		return x.ResultdbInvocationUpdateToken
	}
	return ""
}

// Arguments for bbagent command.
//
// All paths are relateive to bbagent's working directory, and must be delimited
// with slashes ("/"), regardless of the host OS.
type BBAgentArgs struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Path to the user executable.
	//
	// Deprecated. Superceded by payload_path and `build.exe.cmd`.
	ExecutablePath string `protobuf:"bytes,1,opt,name=executable_path,json=executablePath,proto3" json:"executable_path,omitempty"`
	// Path to the base of the user executable package.
	//
	// Required.
	PayloadPath string `protobuf:"bytes,5,opt,name=payload_path,json=payloadPath,proto3" json:"payload_path,omitempty"`
	// Path to a directory where each subdirectory is a cache dir.
	//
	// Required.
	CacheDir string `protobuf:"bytes,2,opt,name=cache_dir,json=cacheDir,proto3" json:"cache_dir,omitempty"`
	// List of Gerrit hosts to force git authentication for.
	//
	// By default public hosts are accessed anonymously, and the anonymous access
	// has very low quota. Context needs to know all such hostnames in advance to
	// be able to force authenticated access to them.
	KnownPublicGerritHosts []string `protobuf:"bytes,3,rep,name=known_public_gerrit_hosts,json=knownPublicGerritHosts,proto3" json:"known_public_gerrit_hosts,omitempty"`
	// Initial state of the build, including immutable state such as id and input
	// properties.
	Build *Build `protobuf:"bytes,4,opt,name=build,proto3" json:"build,omitempty"`
}

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

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

func (*BBAgentArgs) ProtoMessage() {}

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

func (x *BBAgentArgs) GetExecutablePath() string {
	if x != nil {
		return x.ExecutablePath
	}
	return ""
}

func (x *BBAgentArgs) GetPayloadPath() string {
	if x != nil {
		return x.PayloadPath
	}
	return ""
}

func (x *BBAgentArgs) GetCacheDir() string {
	if x != nil {
		return x.CacheDir
	}
	return ""
}

func (x *BBAgentArgs) GetKnownPublicGerritHosts() []string {
	if x != nil {
		return x.KnownPublicGerritHosts
	}
	return nil
}

func (x *BBAgentArgs) GetBuild() *Build {
	if x != nil {
		return x.Build
	}
	return nil
}

var File_go_chromium_org_luci_buildbucket_proto_launcher_proto protoreflect.FileDescriptor

var file_go_chromium_org_luci_buildbucket_proto_launcher_proto_rawDesc = []byte{
	0x0a, 0x35, 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, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x65,
	0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75,
	0x63, 0x6b, 0x65, 0x74, 0x2e, 0x76, 0x32, 0x1a, 0x32, 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, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x78, 0x0a, 0x0c, 0x42,
	0x75, 0x69, 0x6c, 0x64, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x62,
	0x75, 0x69, 0x6c, 0x64, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
	0x52, 0x0a, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x47, 0x0a, 0x20,
	0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x64, 0x62, 0x5f, 0x69, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74,
	0x69, 0x6f, 0x6e, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e,
	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1d, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x64, 0x62,
	0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
	0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xde, 0x01, 0x0a, 0x0b, 0x42, 0x42, 0x41, 0x67, 0x65, 0x6e,
	0x74, 0x41, 0x72, 0x67, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61,
	0x62, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e,
	0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x21,
	0x0a, 0x0c, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x05,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x74,
	0x68, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x02,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x63, 0x68, 0x65, 0x44, 0x69, 0x72, 0x12, 0x39,
	0x0a, 0x19, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x67,
	0x65, 0x72, 0x72, 0x69, 0x74, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28,
	0x09, 0x52, 0x16, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x47, 0x65,
	0x72, 0x72, 0x69, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x2b, 0x0a, 0x05, 0x62, 0x75, 0x69,
	0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64,
	0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52,
	0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 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_launcher_proto_rawDescOnce sync.Once
	file_go_chromium_org_luci_buildbucket_proto_launcher_proto_rawDescData = file_go_chromium_org_luci_buildbucket_proto_launcher_proto_rawDesc
)

func file_go_chromium_org_luci_buildbucket_proto_launcher_proto_rawDescGZIP() []byte {
	file_go_chromium_org_luci_buildbucket_proto_launcher_proto_rawDescOnce.Do(func() {
		file_go_chromium_org_luci_buildbucket_proto_launcher_proto_rawDescData = protoimpl.X.CompressGZIP(file_go_chromium_org_luci_buildbucket_proto_launcher_proto_rawDescData)
	})
	return file_go_chromium_org_luci_buildbucket_proto_launcher_proto_rawDescData
}

var file_go_chromium_org_luci_buildbucket_proto_launcher_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
var file_go_chromium_org_luci_buildbucket_proto_launcher_proto_goTypes = []interface{}{
	(*BuildSecrets)(nil), // 0: buildbucket.v2.BuildSecrets
	(*BBAgentArgs)(nil),  // 1: buildbucket.v2.BBAgentArgs
	(*Build)(nil),        // 2: buildbucket.v2.Build
}
var file_go_chromium_org_luci_buildbucket_proto_launcher_proto_depIdxs = []int32{
	2, // 0: buildbucket.v2.BBAgentArgs.build:type_name -> buildbucket.v2.Build
	1, // [1:1] is the sub-list for method output_type
	1, // [1:1] is the sub-list for method input_type
	1, // [1:1] is the sub-list for extension type_name
	1, // [1:1] is the sub-list for extension extendee
	0, // [0:1] is the sub-list for field type_name
}

func init() { file_go_chromium_org_luci_buildbucket_proto_launcher_proto_init() }
func file_go_chromium_org_luci_buildbucket_proto_launcher_proto_init() {
	if File_go_chromium_org_luci_buildbucket_proto_launcher_proto != nil {
		return
	}
	file_go_chromium_org_luci_buildbucket_proto_build_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_go_chromium_org_luci_buildbucket_proto_launcher_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BuildSecrets); 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_launcher_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BBAgentArgs); 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_launcher_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   2,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_go_chromium_org_luci_buildbucket_proto_launcher_proto_goTypes,
		DependencyIndexes: file_go_chromium_org_luci_buildbucket_proto_launcher_proto_depIdxs,
		MessageInfos:      file_go_chromium_org_luci_buildbucket_proto_launcher_proto_msgTypes,
	}.Build()
	File_go_chromium_org_luci_buildbucket_proto_launcher_proto = out.File
	file_go_chromium_org_luci_buildbucket_proto_launcher_proto_rawDesc = nil
	file_go_chromium_org_luci_buildbucket_proto_launcher_proto_goTypes = nil
	file_go_chromium_org_luci_buildbucket_proto_launcher_proto_depIdxs = nil
}
