| package gpuconfig | |
| import ( | |
| "context" | |
| "fmt" | |
| "io/ioutil" | |
| "strings" | |
| "cloud.google.com/go/storage" | |
| "cos.googlesource.com/cos/tools.git/src/pkg/gpuconfig/pb" | |
| ) | |
| const ( | |
| kernelGCSPrefix string = "gs://cos-kernel-artifacts/builds" | |
| kernelSrcTarballPathTemplate string = "%s/%[2]s/cos-kernel-src-%[2]s.tgz" | |
| kernelHeadersTarballPathTemplate string = "%s/%[2]s/cos-kernel-headers-%[2]s-x86_64.tgz" | |
| toolchainTarballPathTemplate string = "builds/%s/toolchain_url.x86_64" | |
| toolchainEnvPathTemplate string = "%s/%s/toolchain_env.x86_64" | |
| driverOutputGcsDirTemplate string = "gs://nvidia-drivers-us-public/nvidia-cos-project/%s/" | |
| nvidiaRunfileAddressTemplate string = "https://us.download.nvidia.com/tesla/%[1]s/NVIDIA-Linux-x86_64-%[1]s.run" | |
| ) | |
| func kernelVersionToMilestone(kernelVersion string) string { | |
| milestone := "" | |
| for _, sep := range []string{"m", "r"} { // release branch or main branch check | |
| if split := strings.Split(kernelVersion, sep); len(split) == 2 { | |
| milestone = split[1] | |
| break | |
| } | |
| } | |
| return milestone | |
| } | |
| // Generates and GPU precompilation build configs(and metadata) for a given | |
| // tuple of kernelVersion and driver versions | |
| func GenerateKernelCIConfigs(ctx context.Context, client *storage.Client, kernelVersion string, driverVersions []string) ([]GPUPrecompilationConfig, error) { | |
| configs := []GPUPrecompilationConfig{} | |
| for _, driverVersion := range driverVersions { | |
| config, err := constructKernelCIConfig(ctx, client, kernelVersion, driverVersion) | |
| if err != nil { | |
| return nil, err | |
| } | |
| milestone := kernelVersionToMilestone(kernelVersion) | |
| configs = append(configs, GPUPrecompilationConfig{config, driverVersion, milestone, kernelVersion, "Kernel"}) | |
| } | |
| return configs, nil | |
| } | |
| func constructKernelCIConfig(ctx context.Context, client *storage.Client, kernelVersion, driverVersion string) (*pb.COSGPUBuildRequest, error) { | |
| config := pb.COSGPUBuildRequest{ | |
| KernelSrcTarballGcs: stringPtr(fmt.Sprintf(kernelSrcTarballPathTemplate, kernelGCSPrefix, kernelVersion)), | |
| KernelHeadersTarballGcs: stringPtr(fmt.Sprintf(kernelHeadersTarballPathTemplate, kernelGCSPrefix, kernelVersion)), | |
| NvidiaRunfileAddress: stringPtr(fmt.Sprintf(nvidiaRunfileAddressTemplate, driverVersion)), | |
| ToolchainEnvGcs: stringPtr(fmt.Sprintf(toolchainEnvPathTemplate, kernelGCSPrefix, kernelVersion)), | |
| DriverOutputGcsDir: stringPtr(fmt.Sprintf(driverOutputGcsDirTemplate, kernelVersion)), | |
| } | |
| toolchainTarballPath, err := fetchToolchainTarballPath(ctx, client, kernelVersion) | |
| if err != nil { | |
| return nil, err | |
| } | |
| config.ToolchainTarballGcs = &toolchainTarballPath | |
| return &config, nil | |
| } | |
| func fetchToolchainTarballPath(ctx context.Context, client *storage.Client, kernelVersion string) (string, error) { | |
| toolchainTarballPathURL := fmt.Sprintf(toolchainTarballPathTemplate, kernelVersion) | |
| reader, err := client.Bucket("cos-kernel-artifacts").Object(toolchainTarballPathURL).NewReader(ctx) | |
| if err != nil { | |
| return "", fmt.Errorf("Could not fetch the toolchain tarball path: %w", err) | |
| } | |
| var toolchainTarballPath []byte | |
| if toolchainTarballPath, err = ioutil.ReadAll(reader); err != nil { | |
| return "", fmt.Errorf("Could not read file contents of toolchain tarball path: %w", err) | |
| } | |
| return string(toolchainTarballPath), nil | |
| } | |
| // stringPtr returns a pointer to a string. | |
| func stringPtr(s string) *string { | |
| return &s | |
| } |