// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.28.0
// 	protoc        v3.17.3
// source: versions.proto

package versions

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

// This proto defines a list of Nvidia precompiled drivers that are required for COS customers.
type GpuVersionMap struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Entry []*GpuVersionMapEntry `protobuf:"bytes,1,rep,name=entry,proto3" json:"entry,omitempty"`
}

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

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

func (*GpuVersionMap) ProtoMessage() {}

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

func (x *GpuVersionMap) GetEntry() []*GpuVersionMapEntry {
	if x != nil {
		return x.Entry
	}
	return nil
}

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

	// Name of a COS image family.
	// Required.
	CosImageFamily *string `protobuf:"bytes,1,opt,name=cos_image_family,json=cosImageFamily,proto3,oneof" json:"cos_image_family,omitempty"`
	// Version of a GPU driver.
	// Required.
	GpuDriverVersion *string `protobuf:"bytes,2,opt,name=gpu_driver_version,json=gpuDriverVersion,proto3,oneof" json:"gpu_driver_version,omitempty"`
}

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

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

func (*GpuVersionMapEntry) ProtoMessage() {}

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

func (x *GpuVersionMapEntry) GetCosImageFamily() string {
	if x != nil && x.CosImageFamily != nil {
		return *x.CosImageFamily
	}
	return ""
}

func (x *GpuVersionMapEntry) GetGpuDriverVersion() string {
	if x != nil && x.GpuDriverVersion != nil {
		return *x.GpuDriverVersion
	}
	return ""
}

var File_versions_proto protoreflect.FileDescriptor

var file_versions_proto_rawDesc = []byte{
	0x0a, 0x0e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x12, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x43, 0x0a, 0x0d, 0x47, 0x70,
	0x75, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x70, 0x12, 0x32, 0x0a, 0x05, 0x65,
	0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x72,
	0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x70, 0x75, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
	0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22,
	0xa2, 0x01, 0x0a, 0x12, 0x47, 0x70, 0x75, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4d, 0x61,
	0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x2d, 0x0a, 0x10, 0x63, 0x6f, 0x73, 0x5f, 0x69, 0x6d,
	0x61, 0x67, 0x65, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
	0x48, 0x00, 0x52, 0x0e, 0x63, 0x6f, 0x73, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x46, 0x61, 0x6d, 0x69,
	0x6c, 0x79, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x67, 0x70, 0x75, 0x5f, 0x64, 0x72, 0x69,
	0x76, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28,
	0x09, 0x48, 0x01, 0x52, 0x10, 0x67, 0x70, 0x75, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x56, 0x65,
	0x72, 0x73, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x63, 0x6f, 0x73,
	0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x42, 0x15, 0x0a,
	0x13, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x72,
	0x73, 0x69, 0x6f, 0x6e, 0x42, 0x47, 0x5a, 0x45, 0x63, 0x6f, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
	0x6c, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73,
	0x2f, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2e, 0x67, 0x69, 0x74, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x63,
	0x6d, 0x64, 0x2f, 0x63, 0x6f, 0x73, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61,
	0x6c, 0x6c, 0x65, 0x72, 0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x62, 0x06, 0x70,
	0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_versions_proto_rawDescOnce sync.Once
	file_versions_proto_rawDescData = file_versions_proto_rawDesc
)

func file_versions_proto_rawDescGZIP() []byte {
	file_versions_proto_rawDescOnce.Do(func() {
		file_versions_proto_rawDescData = protoimpl.X.CompressGZIP(file_versions_proto_rawDescData)
	})
	return file_versions_proto_rawDescData
}

var file_versions_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
var file_versions_proto_goTypes = []interface{}{
	(*GpuVersionMap)(nil),      // 0: versions.GpuVersionMap
	(*GpuVersionMapEntry)(nil), // 1: versions.GpuVersionMapEntry
}
var file_versions_proto_depIdxs = []int32{
	1, // 0: versions.GpuVersionMap.entry:type_name -> versions.GpuVersionMapEntry
	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_versions_proto_init() }
func file_versions_proto_init() {
	if File_versions_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_versions_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GpuVersionMap); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_versions_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GpuVersionMapEntry); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	file_versions_proto_msgTypes[1].OneofWrappers = []interface{}{}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_versions_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   2,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_versions_proto_goTypes,
		DependencyIndexes: file_versions_proto_depIdxs,
		MessageInfos:      file_versions_proto_msgTypes,
	}.Build()
	File_versions_proto = out.File
	file_versions_proto_rawDesc = nil
	file_versions_proto_goTypes = nil
	file_versions_proto_depIdxs = nil
}
