blob: 1c2181128b46e091c358808837e529d045e0fbeb [file] [log] [blame]
package commands
import (
"fmt"
"net/http"
"os"
"cos-extensions/extensions/gpu"
"github.com/spf13/cobra"
)
const (
helpTemplate = `{{if or .Runnable .HasSubCommands}}{{.UsageString}}{{end}}`
usageTemplate = `Usage:
{{.UseLine}}{{with (or .Long .Short)}}
Description:
{{. | trimTrailingWhitespaces}}{{end}}{{if gt (len .Aliases) 0}}
Aliases:
{{.NameAndAliases}}{{end}}{{if .HasExample}}
Examples:
{{.Example}}{{end}}{{if .HasAvailableSubCommands}}{{$cmds := .Commands}}{{if eq (len .Groups) 0}}
{{if eq .Name "cos-extensions"}}Available Commands:{{else}}Available Extensions:{{end}}{{range $cmds}}{{if (or .IsAvailableCommand (eq .Name "help"))}}
{{rpad .Name .NamePadding }} {{.Short}}{{end}}{{end}}{{else}}{{range $group := .Groups}}
{{.Title}}{{range $cmds}}{{if (and (eq .GroupID $group.ID) (or .IsAvailableCommand (eq .Name "help")))}}
{{rpad .Name .NamePadding }} {{.Short}}{{end}}{{end}}{{end}}{{if not .AllChildCommandsHaveGroup}}
Additional Commands:{{range $cmds}}{{if (and (eq .GroupID "") (or .IsAvailableCommand (eq .Name "help")))}}
{{rpad .Name .NamePadding }} {{.Short}}{{end}}{{end}}{{end}}{{end}}{{end}}{{if .HasAvailableLocalFlags}}
Flags:
{{.LocalFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasAvailableInheritedFlags}}
Global Flags:
{{.InheritedFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasHelpSubCommands}}
Additional help topics:{{range .Commands}}{{if .IsAdditionalHelpTopicCommand}}
{{rpad .CommandPath .CommandPathPadding}} {{.Short}}{{end}}{{end}}{{end}}{{if (and .HasAvailableSubCommands (eq .Name "cos-extensions"))}}
Use "{{.CommandPath}} [command] --help" for more information about a command or
use "{{.CommandPath}} [command] <extension> --help" to learn how to use an extension with a command. {{else}} {{if .HasAvailableSubCommands}}
Use "{{.CommandPath}} <extension> --help" to learn how to use an extension with {{.Name}} command{{end}}{{end}}
`
)
var (
rootCmd = &cobra.Command{
Use: "cos-extensions [command] <extension>",
DisableFlagsInUseLine: true,
Long: `cos-extensions Utility to maintain cos extensions.
Available Extensions:
[gpu] Installs gpu drivers and lists the available versions.
Extension usage:
cos-extensions list gpu [--gpu-installer] lists all available gpu driver verions.
When --gpu-installer is set, lists the default
cos-gpu-installer.
cos-extensions install gpu installs gpu drivers.
Additional Description:
cos-extensions install gpu -- [options]
--version
The gpu extension can be invoked with --version. The possible values are 'latest', 'default',
'R<major-version>' eg. 'R470', 'R535'. or precise driver versions retrievable by running
cos-extensions list gpu.
If unspecified, the default driver version is installed.
--force-fallback
This flag indicates whether to use fallback mechanism when specified GPU driver is not compatible
with GPU devices. In case unspecified, the fallback behavior of the installer is not applicable
for --version=R<major-version> eg. 'R470', 'R525' or --version=<precise-version> eg.
'535.129.03', '525.147.05'.
The fallback behavior of the installer is active for --version is unset or --version=default or
--version=latest.
When fallback behavior is active, the installer will find a compatible driver detected GPU on
the VM.
--prepare-build-tools
The gpu extension can be invoked with a --prepare-build-tools optional argument that can be used
to cache the toolchain for the installer.
Caching the toolchain carries the overhead of ~1GB disk space on the stateful partition.
Using this command only populates the cache and does NOT install the GPU drivers thus may save
time on downloading the toolchain during subsequent installations.
--clean-build-tools
Use this optional command to delete the cache for the toolchain present on the stateful
partition.
-test
The gpu extension can be used to install drivers on a dev channel image with this.
-no-verify
Skip kernel module loading, installation verification,
and the enabling of NVIDIA persistence mode.
Useful for preloading drivers without attached GPU.
-debug
The granularity of logging of the gpu extension can be increased by specifying this.
cos-extensions list gpu -- [options]
--target-gpu
This flag specifies the GPU device to display its compatible drivers.
If specified, it must be one of: NVIDIA_TESLA_K80, NVIDIA_TESLA_P4, NVIDIA_TESLA_P100,
NVIDIA_TESLA_V100, NVIDIA_L4, NVIDIA_H100_80GB, NVIDIA_TESLA_A100, NVIDIA_A100_80GB,
NVIDIA_TESLA_T4.
If not specified, the GPU device will be auto-detected by the installer.
--gpu-proto-cache-dir
The GPU proto cache directory that GPU driver versions proto file is stored into.
If unspecified, the GPU driver versions proto file will not be cached.
[kernel-mods] Installs out-of-tree kernel mods from GCS bucket to the COS kernel.
Extension usage:
cos-extensions list kernel-mods [flags] lists all the available compiled kernel modules in a
gcs directory.
cos-extension install kernel-mods installs compiled kernel modules from a GCS bucket
[module files] [flags] -- [module args] directory.
Note that module arguments should be avoided during
multiple module installations as it might lead to
unexpected results.
Additional Description:
cos-extensions install kernel-mods [module files] [flags] -- [module arguments]
--gcs_path
This flag can be used to specify the GCS path which stores the available kernel modules to be
installed. The expected syntax is gs://<bucket name>/<directory path>.
If not specified, the default gcs path is used.
--local_dir
This flag can be used to specify the local directory where the kernel modules would be installed.
If not specified, the default local directory is used.
--download-only, -d
This flag indicates whether to download the module to the local directory without installing.
This flag cannot be used with the local_only flag.
--local_only, -l
This flag indicates whether to install modules directly from local directory without downloading.
This flag cannot be used with the download_only flag.
--recursive, -r
This flag indicates whether to recursively installs modules from a gcs bucket directory and its
subdirectories.
This flag cannot be used with the local_only flag nor module files.
Note that the modules are downloaded with their subdirectory path.
cos-extensions list kernel-mods [flags]
--gcs_path
This flag can be used to specify the GCS path from which the available kernel modules would be
listed. The expected syntax is gs://<bucket name>/<directory path>.
If not specified, the default path is used.
--local_dir
This flag can be used to specify the local directory from which the downloaded or installed
kernel modules would be listed.
If not specified, the default path is used.
--downloaded, -d
This flag indicates whether to list only the downloaded compiled modules in a local directory.
This can be used with local_dir flag, else it uses the default directory. It can be used with
the recursive flag to include downloaded modules in the subdirectories.
--installed, -i
This flag indicates whether to list only the installed kernel modules in a local directory.
This can be used with local_dir flag, else it uses the default directory. It can be used with
the recursive flag to include installed modules in the subdirectories.
--recursive, -r
This flag indicates whether to recursively list all available modules in the gcs subdirectories.
This can be used with gcs_path flag, else it uses default gcs path. It can be used with installed
flag to list all installed kernels in the directory and its subdirectories. It can also be used
with the downloaded flag.`,
}
installCmd = &cobra.Command{
Use: "install <extension>",
DisableFlagsInUseLine: true,
Short: "Installs a COS extension.",
}
listCmd = &cobra.Command{
Use: "list <extension>",
DisableFlagsInUseLine: true,
Short: "Lists all available COS extensions and their versions.",
RunE: func(cmd *cobra.Command, args []string) error {
installers, err := gpu.GetCosInstaller(&http.Client{})
if err != nil {
return fmt.Errorf("Failed to set gpu installer: %v", err)
}
err = gpu.List(installers, false, args)
if err != nil {
return fmt.Errorf("Failed to run list command: %v", err)
}
return nil
},
}
)
func Execute() {
if err := rootCmd.Execute(); err != nil {
// Did not return error as it is handled by the RunE field.
os.Exit(1)
}
}
func init() {
rootCmd.CompletionOptions.DisableDefaultCmd = true
rootCmd.SetUsageTemplate(usageTemplate)
rootCmd.SetHelpTemplate(helpTemplate)
// Registering subcommands for cos-extensions
rootCmd.AddCommand(installCmd)
rootCmd.AddCommand(listCmd)
}