diff --git a/go.mod b/go.mod
index c5ba90c..28a21f1 100644
--- a/go.mod
+++ b/go.mod
@@ -22,6 +22,7 @@
 	github.com/smartystreets/goconvey v1.6.4 // indirect
 	github.com/urfave/cli/v2 v2.2.0
 	go.chromium.org/luci v0.0.0-20200722211809-bab0c30be68b
+	golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e
 	golang.org/x/oauth2 v0.0.0-20220722155238-128564f6959c
 	golang.org/x/sys v0.0.0-20220731174439-a90be440212d
 	google.golang.org/api v0.90.0
diff --git a/src/cmd/cos_gpu_installer/test/run_test.sh b/src/cmd/cos_gpu_installer/test/run_test.sh
index aa2d87d..2e581a1 100755
--- a/src/cmd/cos_gpu_installer/test/run_test.sh
+++ b/src/cmd/cos_gpu_installer/test/run_test.sh
@@ -41,12 +41,8 @@
 
 compile_proto() {
     ~/protoc/bin/protoc -I "${SCRIPT_DIR}"/../versions --go_out=paths=source_relative:"${SCRIPT_DIR}"/../versions "${SCRIPT_DIR}"/../versions/versions.proto
-    trap cleanup_proto EXIT
 }
 
-cleanup_proto() {
-    rm "${SCRIPT_DIR}"/../versions/versions.pb.go
-}
 
 run_test() {
     go test -v "${SCRIPT_DIR}"/check_drivers_test.go
diff --git a/src/cmd/cos_gpu_installer/versions/versions.pb.go b/src/cmd/cos_gpu_installer/versions/versions.pb.go
new file mode 100644
index 0000000..413dda5
--- /dev/null
+++ b/src/cmd/cos_gpu_installer/versions/versions.pb.go
@@ -0,0 +1,233 @@
+// 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
+}
