// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// 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/dm/api/distributor/jobsim/jobsim.proto

package jobsim

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)
)

// Config is ONLY for testing purposes in dm/service. However, because of the
// way that the distributor proto works it needs to be included in the main
// distributor.proto file. For consistency, this jobsim proto lives here.
type Config struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Pool specifies the unique 'pool' name for this jobsim configuration. This
	// will be used to namespace jobsim objects in the datastore, and can be used
	// to demonstrate cross-distributor dependencies (by having one pool's jobs
	// depend on another pool's results).
	Pool string `protobuf:"bytes,1,opt,name=pool,proto3" json:"pool,omitempty"`
	// DoPollback controls whether or not this configuration will force DM to
	// poll back when recieving a HandleNotification. If this is true, then
	// HandleNotification will return (nil, nil), and DM will call GetStatus
	// at some later point. If this is false, then HandleNotification will
	// directly return the job's status.
	DoPollback bool `protobuf:"varint,2,opt,name=do_pollback,json=doPollback,proto3" json:"do_pollback,omitempty"`
}

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

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

func (*Config) ProtoMessage() {}

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

func (x *Config) GetPool() string {
	if x != nil {
		return x.Pool
	}
	return ""
}

func (x *Config) GetDoPollback() bool {
	if x != nil {
		return x.DoPollback
	}
	return false
}

var File_go_chromium_org_luci_dm_api_distributor_jobsim_jobsim_proto protoreflect.FileDescriptor

var file_go_chromium_org_luci_dm_api_distributor_jobsim_jobsim_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, 0x64, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x69,
	0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x6f, 0x72, 0x2f, 0x6a, 0x6f, 0x62, 0x73, 0x69, 0x6d,
	0x2f, 0x6a, 0x6f, 0x62, 0x73, 0x69, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x6a,
	0x6f, 0x62, 0x73, 0x69, 0x6d, 0x22, 0x3d, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12,
	0x12, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70,
	0x6f, 0x6f, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x6f, 0x5f, 0x70, 0x6f, 0x6c, 0x6c, 0x62, 0x61,
	0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, 0x6f, 0x50, 0x6f, 0x6c, 0x6c,
	0x62, 0x61, 0x63, 0x6b, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_go_chromium_org_luci_dm_api_distributor_jobsim_jobsim_proto_rawDescOnce sync.Once
	file_go_chromium_org_luci_dm_api_distributor_jobsim_jobsim_proto_rawDescData = file_go_chromium_org_luci_dm_api_distributor_jobsim_jobsim_proto_rawDesc
)

func file_go_chromium_org_luci_dm_api_distributor_jobsim_jobsim_proto_rawDescGZIP() []byte {
	file_go_chromium_org_luci_dm_api_distributor_jobsim_jobsim_proto_rawDescOnce.Do(func() {
		file_go_chromium_org_luci_dm_api_distributor_jobsim_jobsim_proto_rawDescData = protoimpl.X.CompressGZIP(file_go_chromium_org_luci_dm_api_distributor_jobsim_jobsim_proto_rawDescData)
	})
	return file_go_chromium_org_luci_dm_api_distributor_jobsim_jobsim_proto_rawDescData
}

var file_go_chromium_org_luci_dm_api_distributor_jobsim_jobsim_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_go_chromium_org_luci_dm_api_distributor_jobsim_jobsim_proto_goTypes = []interface{}{
	(*Config)(nil), // 0: jobsim.Config
}
var file_go_chromium_org_luci_dm_api_distributor_jobsim_jobsim_proto_depIdxs = []int32{
	0, // [0:0] is the sub-list for method output_type
	0, // [0:0] is the sub-list for method input_type
	0, // [0:0] is the sub-list for extension type_name
	0, // [0:0] is the sub-list for extension extendee
	0, // [0:0] is the sub-list for field type_name
}

func init() { file_go_chromium_org_luci_dm_api_distributor_jobsim_jobsim_proto_init() }
func file_go_chromium_org_luci_dm_api_distributor_jobsim_jobsim_proto_init() {
	if File_go_chromium_org_luci_dm_api_distributor_jobsim_jobsim_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_go_chromium_org_luci_dm_api_distributor_jobsim_jobsim_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Config); 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_dm_api_distributor_jobsim_jobsim_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_go_chromium_org_luci_dm_api_distributor_jobsim_jobsim_proto_goTypes,
		DependencyIndexes: file_go_chromium_org_luci_dm_api_distributor_jobsim_jobsim_proto_depIdxs,
		MessageInfos:      file_go_chromium_org_luci_dm_api_distributor_jobsim_jobsim_proto_msgTypes,
	}.Build()
	File_go_chromium_org_luci_dm_api_distributor_jobsim_jobsim_proto = out.File
	file_go_chromium_org_luci_dm_api_distributor_jobsim_jobsim_proto_rawDesc = nil
	file_go_chromium_org_luci_dm_api_distributor_jobsim_jobsim_proto_goTypes = nil
	file_go_chromium_org_luci_dm_api_distributor_jobsim_jobsim_proto_depIdxs = nil
}
