// 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/cipd.proto

package swarmingV1

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

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

	Name    string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	Version string `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"`
}

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

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

func (*CipdPackage) ProtoMessage() {}

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

func (x *CipdPackage) GetName() string {
	if x != nil {
		return x.Name
	}
	return ""
}

func (x *CipdPackage) GetVersion() string {
	if x != nil {
		return x.Version
	}
	return ""
}

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

	// Server to use for cipd packages. Required (though it may be specified
	// by the quest's designated distributor config). This must be
	// scheme://<hostname>, e.g. "https://example.appspot.com". The only
	// supported schemes are http and https.
	Server string `protobuf:"bytes,1,opt,name=server,proto3" json:"server,omitempty"`
	// Specifies the CIPD package to use for the job to obtain the actual CIPD
	// client binary. You usually want to omit this.
	Client *CipdPackage `protobuf:"bytes,2,opt,name=client,proto3" json:"client,omitempty"`
	// A mapping from path-to-install to a list of cipd packages to install at
	// that location. To install packages in the root of the job, use the path
	// ''.
	ByPath map[string]*CipdSpec_CipdPackages `protobuf:"bytes,3,rep,name=by_path,json=byPath,proto3" json:"by_path,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
}

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

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

func (*CipdSpec) ProtoMessage() {}

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

func (x *CipdSpec) GetServer() string {
	if x != nil {
		return x.Server
	}
	return ""
}

func (x *CipdSpec) GetClient() *CipdPackage {
	if x != nil {
		return x.Client
	}
	return nil
}

func (x *CipdSpec) GetByPath() map[string]*CipdSpec_CipdPackages {
	if x != nil {
		return x.ByPath
	}
	return nil
}

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

	Pkg []*CipdPackage `protobuf:"bytes,1,rep,name=pkg,proto3" json:"pkg,omitempty"`
}

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

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

func (*CipdSpec_CipdPackages) ProtoMessage() {}

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

func (x *CipdSpec_CipdPackages) GetPkg() []*CipdPackage {
	if x != nil {
		return x.Pkg
	}
	return nil
}

var File_go_chromium_org_luci_dm_api_distributor_swarming_v1_cipd_proto protoreflect.FileDescriptor

var file_go_chromium_org_luci_dm_api_distributor_swarming_v1_cipd_proto_rawDesc = []byte{
	0x0a, 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, 0x2f, 0x63, 0x69, 0x70, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x12, 0x0a, 0x73, 0x77, 0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x56, 0x31, 0x22, 0x3b, 0x0a, 0x0b,
	0x43, 0x69, 0x70, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e,
	0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,
	0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
	0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa7, 0x02, 0x0a, 0x08, 0x43, 0x69,
	0x70, 0x64, 0x53, 0x70, 0x65, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x2f,
	0x0a, 0x06, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17,
	0x2e, 0x73, 0x77, 0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x56, 0x31, 0x2e, 0x43, 0x69, 0x70, 0x64,
	0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x06, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12,
	0x39, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b,
	0x32, 0x20, 0x2e, 0x73, 0x77, 0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x56, 0x31, 0x2e, 0x43, 0x69,
	0x70, 0x64, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x42, 0x79, 0x50, 0x61, 0x74, 0x68, 0x45, 0x6e, 0x74,
	0x72, 0x79, 0x52, 0x06, 0x62, 0x79, 0x50, 0x61, 0x74, 0x68, 0x1a, 0x39, 0x0a, 0x0c, 0x43, 0x69,
	0x70, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x03, 0x70, 0x6b,
	0x67, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x73, 0x77, 0x61, 0x72, 0x6d, 0x69,
	0x6e, 0x67, 0x56, 0x31, 0x2e, 0x43, 0x69, 0x70, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65,
	0x52, 0x03, 0x70, 0x6b, 0x67, 0x1a, 0x5c, 0x0a, 0x0b, 0x42, 0x79, 0x50, 0x61, 0x74, 0x68, 0x45,
	0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x37, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18,
	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x73, 0x77, 0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67,
	0x56, 0x31, 0x2e, 0x43, 0x69, 0x70, 0x64, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x43, 0x69, 0x70, 0x64,
	0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a,
	0x02, 0x38, 0x01, 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_cipd_proto_rawDescOnce sync.Once
	file_go_chromium_org_luci_dm_api_distributor_swarming_v1_cipd_proto_rawDescData = file_go_chromium_org_luci_dm_api_distributor_swarming_v1_cipd_proto_rawDesc
)

func file_go_chromium_org_luci_dm_api_distributor_swarming_v1_cipd_proto_rawDescGZIP() []byte {
	file_go_chromium_org_luci_dm_api_distributor_swarming_v1_cipd_proto_rawDescOnce.Do(func() {
		file_go_chromium_org_luci_dm_api_distributor_swarming_v1_cipd_proto_rawDescData = protoimpl.X.CompressGZIP(file_go_chromium_org_luci_dm_api_distributor_swarming_v1_cipd_proto_rawDescData)
	})
	return file_go_chromium_org_luci_dm_api_distributor_swarming_v1_cipd_proto_rawDescData
}

var file_go_chromium_org_luci_dm_api_distributor_swarming_v1_cipd_proto_msgTypes = make([]protoimpl.MessageInfo, 4)
var file_go_chromium_org_luci_dm_api_distributor_swarming_v1_cipd_proto_goTypes = []interface{}{
	(*CipdPackage)(nil),           // 0: swarmingV1.CipdPackage
	(*CipdSpec)(nil),              // 1: swarmingV1.CipdSpec
	(*CipdSpec_CipdPackages)(nil), // 2: swarmingV1.CipdSpec.CipdPackages
	nil,                           // 3: swarmingV1.CipdSpec.ByPathEntry
}
var file_go_chromium_org_luci_dm_api_distributor_swarming_v1_cipd_proto_depIdxs = []int32{
	0, // 0: swarmingV1.CipdSpec.client:type_name -> swarmingV1.CipdPackage
	3, // 1: swarmingV1.CipdSpec.by_path:type_name -> swarmingV1.CipdSpec.ByPathEntry
	0, // 2: swarmingV1.CipdSpec.CipdPackages.pkg:type_name -> swarmingV1.CipdPackage
	2, // 3: swarmingV1.CipdSpec.ByPathEntry.value:type_name -> swarmingV1.CipdSpec.CipdPackages
	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_dm_api_distributor_swarming_v1_cipd_proto_init() }
func file_go_chromium_org_luci_dm_api_distributor_swarming_v1_cipd_proto_init() {
	if File_go_chromium_org_luci_dm_api_distributor_swarming_v1_cipd_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_go_chromium_org_luci_dm_api_distributor_swarming_v1_cipd_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*CipdPackage); 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_cipd_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*CipdSpec); 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_cipd_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*CipdSpec_CipdPackages); 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_cipd_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   4,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_go_chromium_org_luci_dm_api_distributor_swarming_v1_cipd_proto_goTypes,
		DependencyIndexes: file_go_chromium_org_luci_dm_api_distributor_swarming_v1_cipd_proto_depIdxs,
		MessageInfos:      file_go_chromium_org_luci_dm_api_distributor_swarming_v1_cipd_proto_msgTypes,
	}.Build()
	File_go_chromium_org_luci_dm_api_distributor_swarming_v1_cipd_proto = out.File
	file_go_chromium_org_luci_dm_api_distributor_swarming_v1_cipd_proto_rawDesc = nil
	file_go_chromium_org_luci_dm_api_distributor_swarming_v1_cipd_proto_goTypes = nil
	file_go_chromium_org_luci_dm_api_distributor_swarming_v1_cipd_proto_depIdxs = nil
}
