// Copyright 2016 The LUCI Authors. All rights reserved.
// Use of this source code is governed under the Apache License, Version 2.0
// that can be found in the LICENSE file.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.27.1
// 	protoc        v3.17.3
// source: go.chromium.org/luci/dm/api/distributor/swarming/v1/config.proto

package swarmingV1

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

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

	Swarming *Config_Swarming `protobuf:"bytes,1,opt,name=swarming,proto3" json:"swarming,omitempty"`
	Isolate  *Config_Isolate  `protobuf:"bytes,2,opt,name=isolate,proto3" json:"isolate,omitempty"`
}

func (x *Config) Reset() {
	*x = Config{}
	if protoimpl.UnsafeEnabled {
		mi := &file_go_chromium_org_luci_dm_api_distributor_swarming_v1_config_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_swarming_v1_config_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_swarming_v1_config_proto_rawDescGZIP(), []int{0}
}

func (x *Config) GetSwarming() *Config_Swarming {
	if x != nil {
		return x.Swarming
	}
	return nil
}

func (x *Config) GetIsolate() *Config_Isolate {
	if x != nil {
		return x.Isolate
	}
	return nil
}

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

	Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"`
}

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

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

func (*Config_Swarming) ProtoMessage() {}

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

func (x *Config_Swarming) GetUrl() string {
	if x != nil {
		return x.Url
	}
	return ""
}

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

	// The host of the isolate service, e.g. isolateserver.appspot.com.
	Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"`
	// The default assumed expiration period for execution results.
	Expiration *durationpb.Duration `protobuf:"bytes,2,opt,name=expiration,proto3" json:"expiration,omitempty"`
}

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

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

func (*Config_Isolate) ProtoMessage() {}

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

func (x *Config_Isolate) GetUrl() string {
	if x != nil {
		return x.Url
	}
	return ""
}

func (x *Config_Isolate) GetExpiration() *durationpb.Duration {
	if x != nil {
		return x.Expiration
	}
	return nil
}

var File_go_chromium_org_luci_dm_api_distributor_swarming_v1_config_proto protoreflect.FileDescriptor

var file_go_chromium_org_luci_dm_api_distributor_swarming_v1_config_proto_rawDesc = []byte{
	0x0a, 0x40, 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, 0x73, 0x77, 0x61, 0x72, 0x6d, 0x69,
	0x6e, 0x67, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x12, 0x0a, 0x73, 0x77, 0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x56, 0x31, 0x1a, 0x1e,
	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f,
	0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xed,
	0x01, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x37, 0x0a, 0x08, 0x73, 0x77, 0x61,
	0x72, 0x6d, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, 0x77,
	0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x56, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e,
	0x53, 0x77, 0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x73, 0x77, 0x61, 0x72, 0x6d, 0x69,
	0x6e, 0x67, 0x12, 0x34, 0x0a, 0x07, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20,
	0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x73, 0x77, 0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x56, 0x31,
	0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x49, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x52,
	0x07, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x1a, 0x1c, 0x0a, 0x08, 0x53, 0x77, 0x61, 0x72,
	0x6d, 0x69, 0x6e, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x1a, 0x56, 0x0a, 0x07, 0x49, 0x73, 0x6f, 0x6c, 0x61, 0x74,
	0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03,
	0x75, 0x72, 0x6c, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f,
	0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69,
	0x6f, 0x6e, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x40,
	0x5a, 0x3e, 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, 0x73, 0x77, 0x61, 0x72, 0x6d, 0x69,
	0x6e, 0x67, 0x2f, 0x76, 0x31, 0x3b, 0x73, 0x77, 0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x56, 0x31,
	0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_go_chromium_org_luci_dm_api_distributor_swarming_v1_config_proto_rawDescOnce sync.Once
	file_go_chromium_org_luci_dm_api_distributor_swarming_v1_config_proto_rawDescData = file_go_chromium_org_luci_dm_api_distributor_swarming_v1_config_proto_rawDesc
)

func file_go_chromium_org_luci_dm_api_distributor_swarming_v1_config_proto_rawDescGZIP() []byte {
	file_go_chromium_org_luci_dm_api_distributor_swarming_v1_config_proto_rawDescOnce.Do(func() {
		file_go_chromium_org_luci_dm_api_distributor_swarming_v1_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_go_chromium_org_luci_dm_api_distributor_swarming_v1_config_proto_rawDescData)
	})
	return file_go_chromium_org_luci_dm_api_distributor_swarming_v1_config_proto_rawDescData
}

var file_go_chromium_org_luci_dm_api_distributor_swarming_v1_config_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
var file_go_chromium_org_luci_dm_api_distributor_swarming_v1_config_proto_goTypes = []interface{}{
	(*Config)(nil),              // 0: swarmingV1.Config
	(*Config_Swarming)(nil),     // 1: swarmingV1.Config.Swarming
	(*Config_Isolate)(nil),      // 2: swarmingV1.Config.Isolate
	(*durationpb.Duration)(nil), // 3: google.protobuf.Duration
}
var file_go_chromium_org_luci_dm_api_distributor_swarming_v1_config_proto_depIdxs = []int32{
	1, // 0: swarmingV1.Config.swarming:type_name -> swarmingV1.Config.Swarming
	2, // 1: swarmingV1.Config.isolate:type_name -> swarmingV1.Config.Isolate
	3, // 2: swarmingV1.Config.Isolate.expiration:type_name -> google.protobuf.Duration
	3, // [3:3] is the sub-list for method output_type
	3, // [3:3] is the sub-list for method input_type
	3, // [3:3] is the sub-list for extension type_name
	3, // [3:3] is the sub-list for extension extendee
	0, // [0:3] is the sub-list for field type_name
}

func init() { file_go_chromium_org_luci_dm_api_distributor_swarming_v1_config_proto_init() }
func file_go_chromium_org_luci_dm_api_distributor_swarming_v1_config_proto_init() {
	if File_go_chromium_org_luci_dm_api_distributor_swarming_v1_config_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_go_chromium_org_luci_dm_api_distributor_swarming_v1_config_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
			}
		}
		file_go_chromium_org_luci_dm_api_distributor_swarming_v1_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Config_Swarming); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_dm_api_distributor_swarming_v1_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Config_Isolate); 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_swarming_v1_config_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   3,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_go_chromium_org_luci_dm_api_distributor_swarming_v1_config_proto_goTypes,
		DependencyIndexes: file_go_chromium_org_luci_dm_api_distributor_swarming_v1_config_proto_depIdxs,
		MessageInfos:      file_go_chromium_org_luci_dm_api_distributor_swarming_v1_config_proto_msgTypes,
	}.Build()
	File_go_chromium_org_luci_dm_api_distributor_swarming_v1_config_proto = out.File
	file_go_chromium_org_luci_dm_api_distributor_swarming_v1_config_proto_rawDesc = nil
	file_go_chromium_org_luci_dm_api_distributor_swarming_v1_config_proto_goTypes = nil
	file_go_chromium_org_luci_dm_api_distributor_swarming_v1_config_proto_depIdxs = nil
}
