From a6476193c81687b0a299908b9e265b819014c0d1 Mon Sep 17 00:00:00 2001 From: Evan Lezar Date: Sat, 26 Oct 2024 21:10:14 +0200 Subject: [PATCH 1/8] [no-relnote] Merge verifyFlags and validateFlags Signed-off-by: Evan Lezar --- tools/container/nvidia-toolkit/run.go | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/tools/container/nvidia-toolkit/run.go b/tools/container/nvidia-toolkit/run.go index 842d7099..abc0a2cd 100644 --- a/tools/container/nvidia-toolkit/run.go +++ b/tools/container/nvidia-toolkit/run.go @@ -130,6 +130,12 @@ func main() { } func validateFlags(_ *cli.Context, o *options) error { + if o.root == "" { + return fmt.Errorf("the install root must be specified") + } + if _, exists := availableRuntimes[o.runtime]; !exists { + return fmt.Errorf("unknown runtime: %v", o.runtime) + } if filepath.Base(o.pidFile) != toolkitPidFilename { return fmt.Errorf("invalid toolkit.pid path %v", o.pidFile) } @@ -144,12 +150,7 @@ func validateFlags(_ *cli.Context, o *options) error { // Run runs the core logic of the CLI func Run(c *cli.Context, o *options) error { - err := verifyFlags(o) - if err != nil { - return fmt.Errorf("unable to verify flags: %v", err) - } - - err = initialize(o.pidFile) + err := initialize(o.pidFile) if err != nil { return fmt.Errorf("unable to initialize: %v", err) } @@ -217,18 +218,6 @@ func ParseArgs(args []string) ([]string, string, error) { return nil, "", fmt.Errorf("unexpected positional argument(s) %v", args[2:lastPositionalArg+1]) } -func verifyFlags(o *options) error { - log.Infof("Verifying Flags") - if o.root == "" { - return fmt.Errorf("the install root must be specified") - } - - if _, exists := availableRuntimes[o.runtime]; !exists { - return fmt.Errorf("unknown runtime: %v", o.runtime) - } - return nil -} - func initialize(pidFile string) error { log.Infof("Initializing") From 76edd1d7ca843b48e8ffe2e9cc1083c1a89e741c Mon Sep 17 00:00:00 2001 From: Evan Lezar Date: Sat, 26 Oct 2024 21:28:17 +0200 Subject: [PATCH 2/8] [no-relnote] Remove unused TryDelete function Signed-off-by: Evan Lezar --- tools/container/toolkit/toolkit.go | 30 ------------------------------ 1 file changed, 30 deletions(-) diff --git a/tools/container/toolkit/toolkit.go b/tools/container/toolkit/toolkit.go index 9b97b419..4aa04fc9 100644 --- a/tools/container/toolkit/toolkit.go +++ b/tools/container/toolkit/toolkit.go @@ -24,7 +24,6 @@ import ( "path/filepath" "strings" - log "github.com/sirupsen/logrus" "github.com/urfave/cli/v2" "tags.cncf.io/container-device-interface/pkg/cdi" "tags.cncf.io/container-device-interface/pkg/parser" @@ -44,8 +43,6 @@ const ( nvidiaContainerToolkitConfigSource = "/etc/nvidia-container-runtime/config.toml" configFilename = "config.toml" - - toolkitPidFilename = "toolkit.pid" ) type Options struct { @@ -257,33 +254,6 @@ func ValidateOptions(opts *Options, toolkitRoot string) error { return nil } -// TryDelete attempts to remove the specified toolkit folder. -// A toolkit.pid file -- if present -- is skipped. -func TryDelete(cli *cli.Context, toolkitRoot string) error { - log.Infof("Attempting to delete NVIDIA container toolkit from '%v'", toolkitRoot) - - contents, err := os.ReadDir(toolkitRoot) - if err != nil && errors.Is(err, os.ErrNotExist) { - return nil - } else if err != nil { - return fmt.Errorf("failed to read the contents of %v: %w", toolkitRoot, err) - } - - for _, content := range contents { - if content.Name() == toolkitPidFilename { - continue - } - name := filepath.Join(toolkitRoot, content.Name()) - if err := os.RemoveAll(name); err != nil { - log.Warningf("could not remove %v: %v", name, err) - } - } - if err := os.RemoveAll(toolkitRoot); err != nil { - log.Warningf("could not remove %v: %v", toolkitRoot, err) - } - return nil -} - // Install installs the components of the NVIDIA container toolkit. // The specified sourceRoot is searched for the components to install. // Any existing installation is removed. From 975309639805decee0b64f5f8226393ba54752e7 Mon Sep 17 00:00:00 2001 From: Evan Lezar Date: Sat, 26 Oct 2024 21:13:27 +0200 Subject: [PATCH 3/8] [no-relnote] Add app struct for nvidia-toolkit Signed-off-by: Evan Lezar --- tools/container/nvidia-toolkit/run.go | 94 ++++++++++++++++++--------- 1 file changed, 62 insertions(+), 32 deletions(-) diff --git a/tools/container/nvidia-toolkit/run.go b/tools/container/nvidia-toolkit/run.go index abc0a2cd..9ce50568 100644 --- a/tools/container/nvidia-toolkit/run.go +++ b/tools/container/nvidia-toolkit/run.go @@ -8,10 +8,10 @@ import ( "strings" "syscall" - log "github.com/sirupsen/logrus" "github.com/urfave/cli/v2" "golang.org/x/sys/unix" + "github.com/NVIDIA/nvidia-container-toolkit/internal/logger" "github.com/NVIDIA/nvidia-container-toolkit/tools/container/runtime" "github.com/NVIDIA/nvidia-container-toolkit/tools/container/toolkit" ) @@ -51,12 +51,44 @@ func (o options) toolkitRoot() string { var Version = "development" func main() { - remainingArgs, root, err := ParseArgs(os.Args) + logger := logger.New() + + remainingArgs, root, err := ParseArgs(logger, os.Args) if err != nil { - log.Errorf("Error: unable to parse arguments: %v", err) + logger.Errorf("Error: unable to parse arguments: %v", err) os.Exit(1) } + c := NewApp(logger, root) + + // Run the CLI + logger.Infof("Starting %v", c.Name) + if err := c.Run(remainingArgs); err != nil { + logger.Errorf("error running nvidia-toolkit: %v", err) + os.Exit(1) + } + + logger.Infof("Completed %v", c.Name) +} + +// An app represents the nvidia-ctk-installer. +type app struct { + logger logger.Interface + // defaultRoot stores the root to use if the --root flag is not specified. + defaultRoot string +} + +// NewApp creates the CLI app fro the specified options. +// defaultRoot is used as the root if not specified via the --root flag. +func NewApp(logger logger.Interface, defaultRoot string) *cli.App { + a := app{ + logger: logger, + defaultRoot: defaultRoot, + } + return a.build() +} + +func (a app) build() *cli.App { options := options{ toolkitOptions: toolkit.Options{}, } @@ -68,10 +100,10 @@ func main() { c.Description = "DESTINATION points to the host path underneath which the nvidia-container-toolkit should be installed.\nIt will be installed at ${DESTINATION}/toolkit" c.Version = Version c.Before = func(ctx *cli.Context) error { - return validateFlags(ctx, &options) + return a.Before(ctx, &options) } c.Action = func(ctx *cli.Context) error { - return Run(ctx, &options) + return a.Run(ctx, &options) } // Setup flags for the CLI @@ -102,7 +134,7 @@ func main() { }, &cli.StringFlag{ Name: "root", - Value: root, + Value: a.defaultRoot, Usage: "the folder where the NVIDIA Container Toolkit is to be installed. It will be installed to `ROOT`/toolkit", Destination: &options.root, EnvVars: []string{"ROOT"}, @@ -119,17 +151,14 @@ func main() { c.Flags = append(c.Flags, toolkit.Flags(&options.toolkitOptions)...) c.Flags = append(c.Flags, runtime.Flags(&options.runtimeOptions)...) - // Run the CLI - log.Infof("Starting %v", c.Name) - if err := c.Run(remainingArgs); err != nil { - log.Errorf("error running nvidia-toolkit: %v", err) - os.Exit(1) - } - - log.Infof("Completed %v", c.Name) + return c } -func validateFlags(_ *cli.Context, o *options) error { +func (a *app) Before(c *cli.Context, o *options) error { + return a.validateFlags(c, o) +} + +func (a *app) validateFlags(_ *cli.Context, o *options) error { if o.root == "" { return fmt.Errorf("the install root must be specified") } @@ -139,6 +168,7 @@ func validateFlags(_ *cli.Context, o *options) error { if filepath.Base(o.pidFile) != toolkitPidFilename { return fmt.Errorf("invalid toolkit.pid path %v", o.pidFile) } + if err := toolkit.ValidateOptions(&o.toolkitOptions, o.toolkitRoot()); err != nil { return err } @@ -149,12 +179,12 @@ func validateFlags(_ *cli.Context, o *options) error { } // Run runs the core logic of the CLI -func Run(c *cli.Context, o *options) error { - err := initialize(o.pidFile) +func (a *app) Run(c *cli.Context, o *options) error { + err := a.initialize(o.pidFile) if err != nil { return fmt.Errorf("unable to initialize: %v", err) } - defer shutdown(o.pidFile) + defer a.shutdown(o.pidFile) if len(o.toolkitOptions.ContainerRuntimeRuntimes.Value()) == 0 { lowlevelRuntimePaths, err := runtime.GetLowlevelRuntimePaths(&o.runtimeOptions, o.runtime) @@ -176,7 +206,7 @@ func Run(c *cli.Context, o *options) error { } if !o.noDaemon { - err = waitForSignal() + err = a.waitForSignal() if err != nil { return fmt.Errorf("unable to wait for signal: %v", err) } @@ -192,8 +222,8 @@ func Run(c *cli.Context, o *options) error { // ParseArgs checks if a single positional argument was defined and extracts this the root. // If no positional arguments are defined, it is assumed that the root is specified as a flag. -func ParseArgs(args []string) ([]string, string, error) { - log.Infof("Parsing arguments") +func ParseArgs(logger logger.Interface, args []string) ([]string, string, error) { + logger.Infof("Parsing arguments") if len(args) < 2 { return args, "", nil @@ -218,8 +248,8 @@ func ParseArgs(args []string) ([]string, string, error) { return nil, "", fmt.Errorf("unexpected positional argument(s) %v", args[2:lastPositionalArg+1]) } -func initialize(pidFile string) error { - log.Infof("Initializing") +func (a *app) initialize(pidFile string) error { + a.logger.Infof("Initializing") if dir := filepath.Dir(pidFile); dir != "" { err := os.MkdirAll(dir, 0755) @@ -235,8 +265,8 @@ func initialize(pidFile string) error { err = unix.Flock(int(f.Fd()), unix.LOCK_EX|unix.LOCK_NB) if err != nil { - log.Warningf("Unable to get exclusive lock on '%v'", pidFile) - log.Warningf("This normally means an instance of the NVIDIA toolkit Container is already running, aborting") + a.logger.Warningf("Unable to get exclusive lock on '%v'", pidFile) + a.logger.Warningf("This normally means an instance of the NVIDIA toolkit Container is already running, aborting") return fmt.Errorf("unable to get flock on pidfile: %v", err) } @@ -253,8 +283,8 @@ func initialize(pidFile string) error { case <-waitingForSignal: signalReceived <- true default: - log.Infof("Signal received, exiting early") - shutdown(pidFile) + a.logger.Infof("Signal received, exiting early") + a.shutdown(pidFile) os.Exit(0) } }() @@ -262,18 +292,18 @@ func initialize(pidFile string) error { return nil } -func waitForSignal() error { - log.Infof("Waiting for signal") +func (a *app) waitForSignal() error { + a.logger.Infof("Waiting for signal") waitingForSignal <- true <-signalReceived return nil } -func shutdown(pidFile string) { - log.Infof("Shutting Down") +func (a *app) shutdown(pidFile string) { + a.logger.Infof("Shutting Down") err := os.Remove(pidFile) if err != nil { - log.Warningf("Unable to remove pidfile: %v", err) + a.logger.Warningf("Unable to remove pidfile: %v", err) } } From 69375d78890a90c1c12d7d0678ff96c2348be409 Mon Sep 17 00:00:00 2001 From: Evan Lezar Date: Sat, 26 Oct 2024 21:49:21 +0200 Subject: [PATCH 4/8] [no-relnote] Use logger in toolkit installation Signed-off-by: Evan Lezar --- tools/container/nvidia-toolkit/run.go | 15 +- tools/container/nvidia-toolkit/run_test.go | 4 +- tools/container/toolkit/executable.go | 11 +- tools/container/toolkit/executable_test.go | 10 ++ tools/container/toolkit/options.go | 40 +++++ tools/container/toolkit/runtime.go | 19 +- tools/container/toolkit/runtime_test.go | 9 +- tools/container/toolkit/toolkit.go | 196 ++++++++++++--------- tools/container/toolkit/toolkit_test.go | 11 +- 9 files changed, 212 insertions(+), 103 deletions(-) create mode 100644 tools/container/toolkit/options.go diff --git a/tools/container/nvidia-toolkit/run.go b/tools/container/nvidia-toolkit/run.go index 9ce50568..c872135d 100644 --- a/tools/container/nvidia-toolkit/run.go +++ b/tools/container/nvidia-toolkit/run.go @@ -76,6 +76,8 @@ type app struct { logger logger.Interface // defaultRoot stores the root to use if the --root flag is not specified. defaultRoot string + + toolkit *toolkit.Installer } // NewApp creates the CLI app fro the specified options. @@ -155,6 +157,10 @@ func (a app) build() *cli.App { } func (a *app) Before(c *cli.Context, o *options) error { + a.toolkit = toolkit.NewInstaller( + toolkit.WithLogger(a.logger), + toolkit.WithToolkitRoot(o.toolkitRoot()), + ) return a.validateFlags(c, o) } @@ -169,7 +175,7 @@ func (a *app) validateFlags(_ *cli.Context, o *options) error { return fmt.Errorf("invalid toolkit.pid path %v", o.pidFile) } - if err := toolkit.ValidateOptions(&o.toolkitOptions, o.toolkitRoot()); err != nil { + if err := a.toolkit.ValidateOptions(&o.toolkitOptions); err != nil { return err } if err := runtime.ValidateOptions(&o.runtimeOptions, o.runtime, o.toolkitRoot()); err != nil { @@ -178,7 +184,9 @@ func (a *app) validateFlags(_ *cli.Context, o *options) error { return nil } -// Run runs the core logic of the CLI +// Run installs the NVIDIA Container Toolkit and updates the requested runtime. +// If the application is run as a daemon, the application waits and unconfigures +// the runtime on termination. func (a *app) Run(c *cli.Context, o *options) error { err := a.initialize(o.pidFile) if err != nil { @@ -195,7 +203,8 @@ func (a *app) Run(c *cli.Context, o *options) error { o.toolkitOptions.ContainerRuntimeRuntimes = *cli.NewStringSlice(lowlevelRuntimePaths...) } - err = toolkit.Install(c, &o.toolkitOptions, "", o.toolkitRoot()) + + err = a.toolkit.Install(c, &o.toolkitOptions) if err != nil { return fmt.Errorf("unable to install toolkit: %v", err) } diff --git a/tools/container/nvidia-toolkit/run_test.go b/tools/container/nvidia-toolkit/run_test.go index 8a0bb50e..f7ba5866 100644 --- a/tools/container/nvidia-toolkit/run_test.go +++ b/tools/container/nvidia-toolkit/run_test.go @@ -20,10 +20,12 @@ import ( "fmt" "testing" + testlog "github.com/sirupsen/logrus/hooks/test" "github.com/stretchr/testify/require" ) func TestParseArgs(t *testing.T) { + logger, _ := testlog.NewNullLogger() testCases := []struct { args []string expectedRemaining []string @@ -70,7 +72,7 @@ func TestParseArgs(t *testing.T) { for i, tc := range testCases { t.Run(fmt.Sprintf("%d", i), func(t *testing.T) { - remaining, root, err := ParseArgs(tc.args) + remaining, root, err := ParseArgs(logger, tc.args) if tc.expectedError != nil { require.EqualError(t, err, tc.expectedError.Error()) } else { diff --git a/tools/container/toolkit/executable.go b/tools/container/toolkit/executable.go index 394ca007..2cf66086 100644 --- a/tools/container/toolkit/executable.go +++ b/tools/container/toolkit/executable.go @@ -23,8 +23,6 @@ import ( "path/filepath" "sort" "strings" - - log "github.com/sirupsen/logrus" ) type executableTarget struct { @@ -33,6 +31,7 @@ type executableTarget struct { } type executable struct { + fileInstaller source string target executableTarget env map[string]string @@ -43,21 +42,21 @@ type executable struct { // install installs an executable component of the NVIDIA container toolkit. The source executable // is copied to a `.real` file and a wapper is created to set up the environment as required. func (e executable) install(destFolder string) (string, error) { - log.Infof("Installing executable '%v' to %v", e.source, destFolder) + e.logger.Infof("Installing executable '%v' to %v", e.source, destFolder) dotfileName := e.dotfileName() - installedDotfileName, err := installFileToFolderWithName(destFolder, dotfileName, e.source) + installedDotfileName, err := e.installFileToFolderWithName(destFolder, dotfileName, e.source) if err != nil { return "", fmt.Errorf("error installing file '%v' as '%v': %v", e.source, dotfileName, err) } - log.Infof("Installed '%v'", installedDotfileName) + e.logger.Infof("Installed '%v'", installedDotfileName) wrapperFilename, err := e.installWrapper(destFolder, installedDotfileName) if err != nil { return "", fmt.Errorf("error wrapping '%v': %v", installedDotfileName, err) } - log.Infof("Installed wrapper '%v'", wrapperFilename) + e.logger.Infof("Installed wrapper '%v'", wrapperFilename) return wrapperFilename, nil } diff --git a/tools/container/toolkit/executable_test.go b/tools/container/toolkit/executable_test.go index 8cb47596..58ba0139 100644 --- a/tools/container/toolkit/executable_test.go +++ b/tools/container/toolkit/executable_test.go @@ -23,10 +23,13 @@ import ( "strings" "testing" + testlog "github.com/sirupsen/logrus/hooks/test" "github.com/stretchr/testify/require" ) func TestWrapper(t *testing.T) { + logger, _ := testlog.NewNullLogger() + const shebang = "#! /bin/sh" const destFolder = "/dest/folder" const dotfileName = "source.real" @@ -98,6 +101,8 @@ func TestWrapper(t *testing.T) { for i, tc := range testCases { buf := &bytes.Buffer{} + tc.e.logger = logger + err := tc.e.writeWrapperTo(buf, destFolder, dotfileName) require.NoError(t, err) @@ -107,6 +112,8 @@ func TestWrapper(t *testing.T) { } func TestInstallExecutable(t *testing.T) { + logger, _ := testlog.NewNullLogger() + inputFolder, err := os.MkdirTemp("", "") require.NoError(t, err) defer os.RemoveAll(inputFolder) @@ -121,6 +128,9 @@ func TestInstallExecutable(t *testing.T) { require.NoError(t, sourceFile.Close()) e := executable{ + fileInstaller: fileInstaller{ + logger: logger, + }, source: source, target: executableTarget{ dotfileName: "input.real", diff --git a/tools/container/toolkit/options.go b/tools/container/toolkit/options.go new file mode 100644 index 00000000..10e49b95 --- /dev/null +++ b/tools/container/toolkit/options.go @@ -0,0 +1,40 @@ +/** +# Copyright 2024 NVIDIA CORPORATION +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +**/ + +package toolkit + +import "github.com/NVIDIA/nvidia-container-toolkit/internal/logger" + +// An Option provides a mechanism to configure an Installer. +type Option func(*Installer) + +func WithLogger(logger logger.Interface) Option { + return func(i *Installer) { + i.logger = logger + } +} + +func WithToolkitRoot(toolkitRoot string) Option { + return func(i *Installer) { + i.toolkitRoot = toolkitRoot + } +} + +func WithSourceRoot(sourceRoot string) Option { + return func(i *Installer) { + i.sourceRoot = sourceRoot + } +} diff --git a/tools/container/toolkit/runtime.go b/tools/container/toolkit/runtime.go index 7bdf7f77..5553d881 100644 --- a/tools/container/toolkit/runtime.go +++ b/tools/container/toolkit/runtime.go @@ -29,10 +29,10 @@ const ( // installContainerRuntimes sets up the NVIDIA container runtimes, copying the executables // and implementing the required wrapper -func installContainerRuntimes(sourceRoot string, toolkitDir string) error { +func (t *Installer) installContainerRuntimes(toolkitDir string) error { runtimes := operator.GetRuntimes() for _, runtime := range runtimes { - r := newNvidiaContainerRuntimeInstaller(filepath.Join(sourceRoot, runtime.Path)) + r := t.newNvidiaContainerRuntimeInstaller(runtime.Path) _, err := r.install(toolkitDir) if err != nil { @@ -46,17 +46,17 @@ func installContainerRuntimes(sourceRoot string, toolkitDir string) error { // This installer will copy the specified source executable to the toolkit directory. // The executable is copied to a file with the same name as the source, but with a ".real" suffix and a wrapper is // created to allow for the configuration of the runtime environment. -func newNvidiaContainerRuntimeInstaller(source string) *executable { +func (t *Installer) newNvidiaContainerRuntimeInstaller(source string) *executable { wrapperName := filepath.Base(source) dotfileName := wrapperName + ".real" target := executableTarget{ dotfileName: dotfileName, wrapperName: wrapperName, } - return newRuntimeInstaller(source, target, nil) + return t.newRuntimeInstaller(source, target, nil) } -func newRuntimeInstaller(source string, target executableTarget, env map[string]string) *executable { +func (t *Installer) newRuntimeInstaller(source string, target executableTarget, env map[string]string) *executable { preLines := []string{ "", "cat /proc/modules | grep -e \"^nvidia \" >/dev/null 2>&1", @@ -74,10 +74,11 @@ func newRuntimeInstaller(source string, target executableTarget, env map[string] } r := executable{ - source: source, - target: target, - env: runtimeEnv, - preLines: preLines, + fileInstaller: t.fileInstaller, + source: source, + target: target, + env: runtimeEnv, + preLines: preLines, } return &r diff --git a/tools/container/toolkit/runtime_test.go b/tools/container/toolkit/runtime_test.go index d2841506..36765409 100644 --- a/tools/container/toolkit/runtime_test.go +++ b/tools/container/toolkit/runtime_test.go @@ -21,11 +21,18 @@ import ( "strings" "testing" + testlog "github.com/sirupsen/logrus/hooks/test" "github.com/stretchr/testify/require" ) func TestNvidiaContainerRuntimeInstallerWrapper(t *testing.T) { - r := newNvidiaContainerRuntimeInstaller(nvidiaContainerRuntimeSource) + logger, _ := testlog.NewNullLogger() + i := Installer{ + fileInstaller: fileInstaller{ + logger: logger, + }, + } + r := i.newNvidiaContainerRuntimeInstaller(nvidiaContainerRuntimeSource) const shebang = "#! /bin/sh" const destFolder = "/dest/folder" diff --git a/tools/container/toolkit/toolkit.go b/tools/container/toolkit/toolkit.go index 4aa04fc9..666708dc 100644 --- a/tools/container/toolkit/toolkit.go +++ b/tools/container/toolkit/toolkit.go @@ -17,7 +17,6 @@ package toolkit import ( - "errors" "fmt" "io" "os" @@ -29,6 +28,7 @@ import ( "tags.cncf.io/container-device-interface/pkg/parser" "github.com/NVIDIA/nvidia-container-toolkit/internal/config" + "github.com/NVIDIA/nvidia-container-toolkit/internal/logger" "github.com/NVIDIA/nvidia-container-toolkit/internal/system/nvdevices" "github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi" transformroot "github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/transform/root" @@ -80,6 +80,28 @@ type Options struct { optInFeatures cli.StringSlice } +type Installer struct { + fileInstaller + toolkitRoot string +} + +type fileInstaller struct { + logger logger.Interface + sourceRoot string +} + +func NewInstaller(opts ...Option) *Installer { + i := &Installer{} + for _, opt := range opts { + opt(i) + } + + if i.logger == nil { + i.logger = logger.New() + } + return i +} + func Flags(opts *Options) []cli.Flag { flags := []cli.Flag{ &cli.StringFlag{ @@ -213,9 +235,12 @@ func Flags(opts *Options) []cli.Flag { } // ValidateOptions checks whether the specified options are valid -func ValidateOptions(opts *Options, toolkitRoot string) error { - if toolkitRoot == "" { - return fmt.Errorf("invalid --toolkit-root option: %v", toolkitRoot) +func (t *Installer) ValidateOptions(opts *Options) error { + if t == nil { + return fmt.Errorf("toolkit installer is not initilized") + } + if t.toolkitRoot == "" { + return fmt.Errorf("invalid --toolkit-root option: %v", t.toolkitRoot) } vendor, class := parser.ParseQualifier(opts.cdiKind) @@ -229,7 +254,7 @@ func ValidateOptions(opts *Options, toolkitRoot string) error { opts.cdiClass = class if opts.cdiEnabled && opts.cdiOutputDir == "" { - log.Warning("Skipping CDI spec generation (no output directory specified)") + t.logger.Warning("Skipping CDI spec generation (no output directory specified)") opts.cdiEnabled = false } @@ -244,7 +269,7 @@ func ValidateOptions(opts *Options, toolkitRoot string) error { } } if !opts.cdiEnabled && !isDisabled { - log.Info("disabling device node creation since --cdi-enabled=false") + t.logger.Info("disabling device node creation since --cdi-enabled=false") isDisabled = true } if isDisabled { @@ -257,88 +282,91 @@ func ValidateOptions(opts *Options, toolkitRoot string) error { // Install installs the components of the NVIDIA container toolkit. // The specified sourceRoot is searched for the components to install. // Any existing installation is removed. -func Install(cli *cli.Context, opts *Options, sourceRoot string, toolkitRoot string) error { - log.Infof("Installing NVIDIA container toolkit to '%v'", toolkitRoot) +func (t *Installer) Install(cli *cli.Context, opts *Options) error { + if t == nil { + return fmt.Errorf("toolkit installer is not initilized") + } + t.logger.Infof("Installing NVIDIA container toolkit to '%v'", t.toolkitRoot) - log.Infof("Removing existing NVIDIA container toolkit installation") - err := os.RemoveAll(toolkitRoot) + t.logger.Infof("Removing existing NVIDIA container toolkit installation") + err := os.RemoveAll(t.toolkitRoot) if err != nil && !opts.ignoreErrors { return fmt.Errorf("error removing toolkit directory: %v", err) } else if err != nil { - log.Errorf("Ignoring error: %v", fmt.Errorf("error removing toolkit directory: %v", err)) + t.logger.Errorf("Ignoring error: %v", fmt.Errorf("error removing toolkit directory: %v", err)) } - toolkitConfigDir := filepath.Join(toolkitRoot, ".config", "nvidia-container-runtime") + toolkitConfigDir := filepath.Join(t.toolkitRoot, ".config", "nvidia-container-runtime") toolkitConfigPath := filepath.Join(toolkitConfigDir, configFilename) - err = createDirectories(toolkitRoot, toolkitConfigDir) + err = t.createDirectories(t.toolkitRoot, toolkitConfigDir) if err != nil && !opts.ignoreErrors { return fmt.Errorf("could not create required directories: %v", err) } else if err != nil { - log.Errorf("Ignoring error: %v", fmt.Errorf("could not create required directories: %v", err)) + t.logger.Errorf("Ignoring error: %v", fmt.Errorf("could not create required directories: %v", err)) } - err = installContainerLibraries(sourceRoot, toolkitRoot) + err = t.installContainerLibraries(t.toolkitRoot) if err != nil && !opts.ignoreErrors { return fmt.Errorf("error installing NVIDIA container library: %v", err) } else if err != nil { - log.Errorf("Ignoring error: %v", fmt.Errorf("error installing NVIDIA container library: %v", err)) + t.logger.Errorf("Ignoring error: %v", fmt.Errorf("error installing NVIDIA container library: %v", err)) } - err = installContainerRuntimes(sourceRoot, toolkitRoot) + err = t.installContainerRuntimes(t.toolkitRoot) if err != nil && !opts.ignoreErrors { return fmt.Errorf("error installing NVIDIA container runtime: %v", err) } else if err != nil { - log.Errorf("Ignoring error: %v", fmt.Errorf("error installing NVIDIA container runtime: %v", err)) + t.logger.Errorf("Ignoring error: %v", fmt.Errorf("error installing NVIDIA container runtime: %v", err)) } - nvidiaContainerCliExecutable, err := installContainerCLI(sourceRoot, toolkitRoot) + nvidiaContainerCliExecutable, err := t.installContainerCLI(t.toolkitRoot) if err != nil && !opts.ignoreErrors { return fmt.Errorf("error installing NVIDIA container CLI: %v", err) } else if err != nil { - log.Errorf("Ignoring error: %v", fmt.Errorf("error installing NVIDIA container CLI: %v", err)) + t.logger.Errorf("Ignoring error: %v", fmt.Errorf("error installing NVIDIA container CLI: %v", err)) } - nvidiaContainerRuntimeHookPath, err := installRuntimeHook(sourceRoot, toolkitRoot, toolkitConfigPath) + nvidiaContainerRuntimeHookPath, err := t.installRuntimeHook(t.toolkitRoot, toolkitConfigPath) if err != nil && !opts.ignoreErrors { return fmt.Errorf("error installing NVIDIA container runtime hook: %v", err) } else if err != nil { - log.Errorf("Ignoring error: %v", fmt.Errorf("error installing NVIDIA container runtime hook: %v", err)) + t.logger.Errorf("Ignoring error: %v", fmt.Errorf("error installing NVIDIA container runtime hook: %v", err)) } - nvidiaCTKPath, err := installContainerToolkitCLI(sourceRoot, toolkitRoot) + nvidiaCTKPath, err := t.installContainerToolkitCLI(t.toolkitRoot) if err != nil && !opts.ignoreErrors { return fmt.Errorf("error installing NVIDIA Container Toolkit CLI: %v", err) } else if err != nil { - log.Errorf("Ignoring error: %v", fmt.Errorf("error installing NVIDIA Container Toolkit CLI: %v", err)) + t.logger.Errorf("Ignoring error: %v", fmt.Errorf("error installing NVIDIA Container Toolkit CLI: %v", err)) } - nvidiaCDIHookPath, err := installContainerCDIHookCLI(sourceRoot, toolkitRoot) + nvidiaCDIHookPath, err := t.installContainerCDIHookCLI(t.toolkitRoot) if err != nil && !opts.ignoreErrors { return fmt.Errorf("error installing NVIDIA Container CDI Hook CLI: %v", err) } else if err != nil { - log.Errorf("Ignoring error: %v", fmt.Errorf("error installing NVIDIA Container CDI Hook CLI: %v", err)) + t.logger.Errorf("Ignoring error: %v", fmt.Errorf("error installing NVIDIA Container CDI Hook CLI: %v", err)) } - err = installToolkitConfig(cli, toolkitConfigPath, nvidiaContainerCliExecutable, nvidiaCTKPath, nvidiaContainerRuntimeHookPath, opts) + err = t.installToolkitConfig(cli, toolkitConfigPath, nvidiaContainerCliExecutable, nvidiaCTKPath, nvidiaContainerRuntimeHookPath, opts) if err != nil && !opts.ignoreErrors { return fmt.Errorf("error installing NVIDIA container toolkit config: %v", err) } else if err != nil { - log.Errorf("Ignoring error: %v", fmt.Errorf("error installing NVIDIA container toolkit config: %v", err)) + t.logger.Errorf("Ignoring error: %v", fmt.Errorf("error installing NVIDIA container toolkit config: %v", err)) } - err = createDeviceNodes(opts) + err = t.createDeviceNodes(opts) if err != nil && !opts.ignoreErrors { return fmt.Errorf("error creating device nodes: %v", err) } else if err != nil { - log.Errorf("Ignoring error: %v", fmt.Errorf("error creating device nodes: %v", err)) + t.logger.Errorf("Ignoring error: %v", fmt.Errorf("error creating device nodes: %v", err)) } - err = generateCDISpec(opts, nvidiaCDIHookPath) + err = t.generateCDISpec(opts, nvidiaCDIHookPath) if err != nil && !opts.ignoreErrors { return fmt.Errorf("error generating CDI specification: %v", err) } else if err != nil { - log.Errorf("Ignoring error: %v", fmt.Errorf("error generating CDI specification: %v", err)) + t.logger.Errorf("Ignoring error: %v", fmt.Errorf("error generating CDI specification: %v", err)) } return nil @@ -349,8 +377,8 @@ func Install(cli *cli.Context, opts *Options, sourceRoot string, toolkitRoot str // A predefined set of library candidates are considered, with the first one // resulting in success being installed to the toolkit folder. The install process // resolves the symlink for the library and copies the versioned library itself. -func installContainerLibraries(sourceRoot string, toolkitRoot string) error { - log.Infof("Installing NVIDIA container library to '%v'", toolkitRoot) +func (t *Installer) installContainerLibraries(toolkitRoot string) error { + t.logger.Infof("Installing NVIDIA container library to '%v'", toolkitRoot) libs := []string{ "libnvidia-container.so.1", @@ -358,7 +386,7 @@ func installContainerLibraries(sourceRoot string, toolkitRoot string) error { } for _, l := range libs { - err := installLibrary(l, sourceRoot, toolkitRoot) + err := t.installLibrary(l, toolkitRoot) if err != nil { return fmt.Errorf("failed to install %s: %v", l, err) } @@ -368,23 +396,23 @@ func installContainerLibraries(sourceRoot string, toolkitRoot string) error { } // installLibrary installs the specified library to the toolkit directory. -func installLibrary(libName string, sourceRoot string, toolkitRoot string) error { - libraryPath, err := findLibrary(sourceRoot, libName) +func (t *Installer) installLibrary(libName string, toolkitRoot string) error { + libraryPath, err := t.findLibrary(libName) if err != nil { return fmt.Errorf("error locating NVIDIA container library: %v", err) } - installedLibPath, err := installFileToFolder(toolkitRoot, libraryPath) + installedLibPath, err := t.installFileToFolder(toolkitRoot, libraryPath) if err != nil { return fmt.Errorf("error installing %v to %v: %v", libraryPath, toolkitRoot, err) } - log.Infof("Installed '%v' to '%v'", libraryPath, installedLibPath) + t.logger.Infof("Installed '%v' to '%v'", libraryPath, installedLibPath) if filepath.Base(installedLibPath) == libName { return nil } - err = installSymlink(toolkitRoot, libName, installedLibPath) + err = t.installSymlink(toolkitRoot, libName, installedLibPath) if err != nil { return fmt.Errorf("error installing symlink for NVIDIA container library: %v", err) } @@ -394,8 +422,8 @@ func installLibrary(libName string, sourceRoot string, toolkitRoot string) error // installToolkitConfig installs the config file for the NVIDIA container toolkit ensuring // that the settings are updated to match the desired install and nvidia driver directories. -func installToolkitConfig(c *cli.Context, toolkitConfigPath string, nvidiaContainerCliExecutablePath string, nvidiaCTKPath string, nvidaContainerRuntimeHookPath string, opts *Options) error { - log.Infof("Installing NVIDIA container toolkit config '%v'", toolkitConfigPath) +func (t *Installer) installToolkitConfig(c *cli.Context, toolkitConfigPath string, nvidiaContainerCliExecutablePath string, nvidiaCTKPath string, nvidaContainerRuntimeHookPath string, opts *Options) error { + t.logger.Infof("Installing NVIDIA container toolkit config '%v'", toolkitConfigPath) cfg, err := config.New( config.WithConfigFile(nvidiaContainerToolkitConfigSource), @@ -457,11 +485,11 @@ func installToolkitConfig(c *cli.Context, toolkitConfigPath string, nvidiaContai for key, value := range optionalConfigValues { if !c.IsSet(key) { - log.Infof("Skipping unset option: %v", key) + t.logger.Infof("Skipping unset option: %v", key) continue } if value == nil { - log.Infof("Skipping option with nil value: %v", key) + t.logger.Infof("Skipping option with nil value: %v", key) continue } @@ -476,7 +504,7 @@ func installToolkitConfig(c *cli.Context, toolkitConfigPath string, nvidiaContai } value = v.Value() default: - log.Warningf("Unexpected type for option %v=%v: %T", key, value, v) + t.logger.Warningf("Unexpected type for option %v=%v: %T", key, value, v) } cfg.Set(key, value) @@ -488,16 +516,17 @@ func installToolkitConfig(c *cli.Context, toolkitConfigPath string, nvidiaContai os.Stdout.WriteString("Using config:\n") if _, err = cfg.WriteTo(os.Stdout); err != nil { - log.Warningf("Failed to output config to STDOUT: %v", err) + t.logger.Warningf("Failed to output config to STDOUT: %v", err) } return nil } // installContainerToolkitCLI installs the nvidia-ctk CLI executable and wrapper. -func installContainerToolkitCLI(sourceRoot string, toolkitDir string) (string, error) { +func (t *Installer) installContainerToolkitCLI(toolkitDir string) (string, error) { e := executable{ - source: filepath.Join(sourceRoot, "/usr/bin/nvidia-ctk"), + fileInstaller: t.fileInstaller, + source: "/usr/bin/nvidia-ctk", target: executableTarget{ dotfileName: "nvidia-ctk.real", wrapperName: "nvidia-ctk", @@ -508,9 +537,10 @@ func installContainerToolkitCLI(sourceRoot string, toolkitDir string) (string, e } // installContainerCDIHookCLI installs the nvidia-cdi-hook CLI executable and wrapper. -func installContainerCDIHookCLI(sourceRoot string, toolkitDir string) (string, error) { +func (t *Installer) installContainerCDIHookCLI(toolkitDir string) (string, error) { e := executable{ - source: filepath.Join(sourceRoot, "/usr/bin/nvidia-cdi-hook"), + fileInstaller: t.fileInstaller, + source: "/usr/bin/nvidia-cdi-hook", target: executableTarget{ dotfileName: "nvidia-cdi-hook.real", wrapperName: "nvidia-cdi-hook", @@ -522,15 +552,16 @@ func installContainerCDIHookCLI(sourceRoot string, toolkitDir string) (string, e // installContainerCLI sets up the NVIDIA container CLI executable, copying the executable // and implementing the required wrapper -func installContainerCLI(sourceRoot string, toolkitRoot string) (string, error) { - log.Infof("Installing NVIDIA container CLI from '%v'", nvidiaContainerCliSource) +func (t *Installer) installContainerCLI(toolkitRoot string) (string, error) { + t.logger.Infof("Installing NVIDIA container CLI from '%v'", nvidiaContainerCliSource) env := map[string]string{ "LD_LIBRARY_PATH": toolkitRoot, } e := executable{ - source: filepath.Join(sourceRoot, nvidiaContainerCliSource), + fileInstaller: t.fileInstaller, + source: nvidiaContainerCliSource, target: executableTarget{ dotfileName: "nvidia-container-cli.real", wrapperName: "nvidia-container-cli", @@ -547,15 +578,16 @@ func installContainerCLI(sourceRoot string, toolkitRoot string) (string, error) // installRuntimeHook sets up the NVIDIA runtime hook, copying the executable // and implementing the required wrapper -func installRuntimeHook(sourceRoot string, toolkitRoot string, configFilePath string) (string, error) { - log.Infof("Installing NVIDIA container runtime hook from '%v'", nvidiaContainerRuntimeHookSource) +func (t *Installer) installRuntimeHook(toolkitRoot string, configFilePath string) (string, error) { + t.logger.Infof("Installing NVIDIA container runtime hook from '%v'", nvidiaContainerRuntimeHookSource) argLines := []string{ fmt.Sprintf("-config \"%s\"", configFilePath), } e := executable{ - source: filepath.Join(sourceRoot, nvidiaContainerRuntimeHookSource), + fileInstaller: t.fileInstaller, + source: nvidiaContainerRuntimeHookSource, target: executableTarget{ dotfileName: "nvidia-container-runtime-hook.real", wrapperName: "nvidia-container-runtime-hook", @@ -568,7 +600,7 @@ func installRuntimeHook(sourceRoot string, toolkitRoot string, configFilePath st return "", fmt.Errorf("error installing NVIDIA container runtime hook: %v", err) } - err = installSymlink(toolkitRoot, "nvidia-container-toolkit", installedPath) + err = t.installSymlink(toolkitRoot, "nvidia-container-toolkit", installedPath) if err != nil { return "", fmt.Errorf("error installing symlink to NVIDIA container runtime hook: %v", err) } @@ -578,10 +610,10 @@ func installRuntimeHook(sourceRoot string, toolkitRoot string, configFilePath st // installSymlink creates a symlink in the toolkitDirectory that points to the specified target. // Note: The target is assumed to be local to the toolkit directory -func installSymlink(toolkitRoot string, link string, target string) error { +func (t *Installer) installSymlink(toolkitRoot string, link string, target string) error { symlinkPath := filepath.Join(toolkitRoot, link) targetPath := filepath.Base(target) - log.Infof("Creating symlink '%v' -> '%v'", symlinkPath, targetPath) + t.logger.Infof("Creating symlink '%v' -> '%v'", symlinkPath, targetPath) err := os.Symlink(targetPath, symlinkPath) if err != nil { @@ -594,15 +626,15 @@ func installSymlink(toolkitRoot string, link string, target string) error { // The path of the input file is ignored. // e.g. installFileToFolder("/some/path/file.txt", "/output/path") // will result in a file "/output/path/file.txt" being generated -func installFileToFolder(destFolder string, src string) (string, error) { +func (t *fileInstaller) installFileToFolder(destFolder string, src string) (string, error) { name := filepath.Base(src) - return installFileToFolderWithName(destFolder, name, src) + return t.installFileToFolderWithName(destFolder, name, src) } // cp src destFolder/name -func installFileToFolderWithName(destFolder string, name, src string) (string, error) { +func (t *fileInstaller) installFileToFolderWithName(destFolder string, name, src string) (string, error) { dest := filepath.Join(destFolder, name) - err := installFile(dest, src) + err := t.installFile(dest, src) if err != nil { return "", fmt.Errorf("error copying '%v' to '%v': %v", src, dest, err) } @@ -611,8 +643,9 @@ func installFileToFolderWithName(destFolder string, name, src string) (string, e // installFile copies a file from src to dest and maintains // file modes -func installFile(dest string, src string) error { - log.Infof("Installing '%v' to '%v'", src, dest) +func (t *fileInstaller) installFile(dest string, src string) error { + src = filepath.Join(t.sourceRoot, src) + t.logger.Infof("Installing '%v' to '%v'", src, dest) source, err := os.Open(src) if err != nil { @@ -654,8 +687,8 @@ func applyModeFromSource(dest string, src string) error { // findLibrary searches a set of candidate libraries in the specified root for // a given library name -func findLibrary(root string, libName string) (string, error) { - log.Infof("Finding library %v (root=%v)", libName, root) +func (t *Installer) findLibrary(libName string) (string, error) { + t.logger.Infof("Finding library %v (root=%v)", libName) candidateDirs := []string{ "/usr/lib64", @@ -664,16 +697,16 @@ func findLibrary(root string, libName string) (string, error) { } for _, d := range candidateDirs { - l := filepath.Join(root, d, libName) - log.Infof("Checking library candidate '%v'", l) + l := filepath.Join(t.sourceRoot, d, libName) + t.logger.Infof("Checking library candidate '%v'", l) - libraryCandidate, err := resolveLink(l) + libraryCandidate, err := t.resolveLink(l) if err != nil { - log.Infof("Skipping library candidate '%v': %v", l, err) + t.logger.Infof("Skipping library candidate '%v': %v", l, err) continue } - return libraryCandidate, nil + return strings.TrimPrefix(libraryCandidate, t.sourceRoot), nil } return "", fmt.Errorf("error locating library '%v'", libName) @@ -682,20 +715,20 @@ func findLibrary(root string, libName string) (string, error) { // resolveLink finds the target of a symlink or the file itself in the // case of a regular file. // This is equivalent to running `readlink -f ${l}` -func resolveLink(l string) (string, error) { +func (t *Installer) resolveLink(l string) (string, error) { resolved, err := filepath.EvalSymlinks(l) if err != nil { return "", fmt.Errorf("error resolving link '%v': %v", l, err) } if l != resolved { - log.Infof("Resolved link: '%v' => '%v'", l, resolved) + t.logger.Infof("Resolved link: '%v' => '%v'", l, resolved) } return resolved, nil } -func createDirectories(dir ...string) error { +func (t *Installer) createDirectories(dir ...string) error { for _, d := range dir { - log.Infof("Creating directory '%v'", d) + t.logger.Infof("Creating directory '%v'", d) err := os.MkdirAll(d, 0755) if err != nil { return fmt.Errorf("error creating directory: %v", err) @@ -704,7 +737,7 @@ func createDirectories(dir ...string) error { return nil } -func createDeviceNodes(opts *Options) error { +func (t *Installer) createDeviceNodes(opts *Options) error { modes := opts.createDeviceNodes.Value() if len(modes) == 0 { return nil @@ -718,9 +751,9 @@ func createDeviceNodes(opts *Options) error { } for _, mode := range modes { - log.Infof("Creating %v device nodes at %v", mode, opts.DevRootCtrPath) + t.logger.Infof("Creating %v device nodes at %v", mode, opts.DevRootCtrPath) if mode != "control" { - log.Warningf("Unrecognised device mode: %v", mode) + t.logger.Warningf("Unrecognised device mode: %v", mode) continue } if err := devices.CreateNVIDIAControlDevices(); err != nil { @@ -731,12 +764,13 @@ func createDeviceNodes(opts *Options) error { } // generateCDISpec generates a CDI spec for use in management containers -func generateCDISpec(opts *Options, nvidiaCDIHookPath string) error { +func (t *Installer) generateCDISpec(opts *Options, nvidiaCDIHookPath string) error { if !opts.cdiEnabled { return nil } - log.Info("Generating CDI spec for management containers") + t.logger.Info("Generating CDI spec for management containers") cdilib, err := nvcdi.New( + nvcdi.WithLogger(t.logger), nvcdi.WithMode(nvcdi.ModeManagement), nvcdi.WithDriverRoot(opts.DriverRootCtrPath), nvcdi.WithDevRoot(opts.DevRootCtrPath), diff --git a/tools/container/toolkit/toolkit_test.go b/tools/container/toolkit/toolkit_test.go index 203b3245..9cfcda2a 100644 --- a/tools/container/toolkit/toolkit_test.go +++ b/tools/container/toolkit/toolkit_test.go @@ -23,6 +23,7 @@ import ( "strings" "testing" + testlog "github.com/sirupsen/logrus/hooks/test" "github.com/stretchr/testify/require" "github.com/urfave/cli/v2" @@ -33,6 +34,7 @@ import ( func TestInstall(t *testing.T) { t.Setenv("__NVCT_TESTING_DEVICES_ARE_FILES", "true") + logger, _ := testlog.NewNullLogger() moduleRoot, err := test.GetModuleRoot() require.NoError(t, err) @@ -127,9 +129,14 @@ kind: example.com/class cdiKind: "example.com/class", } - require.NoError(t, ValidateOptions(&options, toolkitRoot)) + ti := NewInstaller( + WithLogger(logger), + WithToolkitRoot(toolkitRoot), + WithSourceRoot(sourceRoot), + ) + require.NoError(t, ti.ValidateOptions(&options)) - err := Install(&cli.Context{}, &options, sourceRoot, toolkitRoot) + err := ti.Install(&cli.Context{}, &options) if tc.expectedError == nil { require.NoError(t, err) } else { From 5cbf3f82d990bf8fcd1620789b3a6327121b230a Mon Sep 17 00:00:00 2001 From: Evan Lezar Date: Thu, 7 Nov 2024 08:42:06 -0800 Subject: [PATCH 5/8] [no-relnote] Move fileinstaller to separate file Signed-off-by: Evan Lezar --- tools/container/toolkit/file-installer.go | 95 +++++++++++++++++++ tools/container/toolkit/toolkit.go | 107 ++++------------------ 2 files changed, 115 insertions(+), 87 deletions(-) create mode 100644 tools/container/toolkit/file-installer.go diff --git a/tools/container/toolkit/file-installer.go b/tools/container/toolkit/file-installer.go new file mode 100644 index 00000000..ab003c43 --- /dev/null +++ b/tools/container/toolkit/file-installer.go @@ -0,0 +1,95 @@ +/** +# Copyright 2024 NVIDIA CORPORATION +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +**/ + +package toolkit + +import ( + "fmt" + "io" + "os" + "path/filepath" + + "github.com/NVIDIA/nvidia-container-toolkit/internal/logger" +) + +type fileInstaller struct { + logger logger.Interface + // sourceRoot specifies the root that is searched for the components to install. + sourceRoot string +} + +// installFileToFolder copies a source file to a destination folder. +// The path of the input file is ignored. +// e.g. installFileToFolder("/some/path/file.txt", "/output/path") +// will result in a file "/output/path/file.txt" being generated +func (t *fileInstaller) installFileToFolder(destFolder string, src string) (string, error) { + name := filepath.Base(src) + return t.installFileToFolderWithName(destFolder, name, src) +} + +// cp src destFolder/name +func (t *fileInstaller) installFileToFolderWithName(destFolder string, name, src string) (string, error) { + dest := filepath.Join(destFolder, name) + err := t.installFile(dest, src) + if err != nil { + return "", fmt.Errorf("error copying '%v' to '%v': %v", src, dest, err) + } + return dest, nil +} + +// installFile copies a file from src to dest and maintains +// file modes +func (t *fileInstaller) installFile(dest string, src string) error { + src = filepath.Join(t.sourceRoot, src) + t.logger.Infof("Installing '%v' to '%v'", src, dest) + + source, err := os.Open(src) + if err != nil { + return fmt.Errorf("error opening source: %v", err) + } + defer source.Close() + + destination, err := os.Create(dest) + if err != nil { + return fmt.Errorf("error creating destination: %v", err) + } + defer destination.Close() + + _, err = io.Copy(destination, source) + if err != nil { + return fmt.Errorf("error copying file: %v", err) + } + + err = applyModeFromSource(dest, src) + if err != nil { + return fmt.Errorf("error setting destination file mode: %v", err) + } + return nil +} + +// applyModeFromSource sets the file mode for a destination file +// to match that of a specified source file +func applyModeFromSource(dest string, src string) error { + sourceInfo, err := os.Stat(src) + if err != nil { + return fmt.Errorf("error getting file info for '%v': %v", src, err) + } + err = os.Chmod(dest, sourceInfo.Mode()) + if err != nil { + return fmt.Errorf("error setting mode for '%v': %v", dest, err) + } + return nil +} diff --git a/tools/container/toolkit/toolkit.go b/tools/container/toolkit/toolkit.go index 666708dc..a8d4e890 100644 --- a/tools/container/toolkit/toolkit.go +++ b/tools/container/toolkit/toolkit.go @@ -18,7 +18,6 @@ package toolkit import ( "fmt" - "io" "os" "path/filepath" "strings" @@ -80,28 +79,6 @@ type Options struct { optInFeatures cli.StringSlice } -type Installer struct { - fileInstaller - toolkitRoot string -} - -type fileInstaller struct { - logger logger.Interface - sourceRoot string -} - -func NewInstaller(opts ...Option) *Installer { - i := &Installer{} - for _, opt := range opts { - opt(i) - } - - if i.logger == nil { - i.logger = logger.New() - } - return i -} - func Flags(opts *Options) []cli.Flag { flags := []cli.Flag{ &cli.StringFlag{ @@ -234,6 +211,26 @@ func Flags(opts *Options) []cli.Flag { return flags } +// An Installer is used to install the NVIDIA Container Toolkit from the toolkit container. +type Installer struct { + fileInstaller + // toolkitRoot specifies the destination path at which the toolkit is installed. + toolkitRoot string +} + +// NewInstaller creates an installer for the NVIDIA Container Toolkit. +func NewInstaller(opts ...Option) *Installer { + i := &Installer{} + for _, opt := range opts { + opt(i) + } + + if i.logger == nil { + i.logger = logger.New() + } + return i +} + // ValidateOptions checks whether the specified options are valid func (t *Installer) ValidateOptions(opts *Options) error { if t == nil { @@ -280,7 +277,6 @@ func (t *Installer) ValidateOptions(opts *Options) error { } // Install installs the components of the NVIDIA container toolkit. -// The specified sourceRoot is searched for the components to install. // Any existing installation is removed. func (t *Installer) Install(cli *cli.Context, opts *Options) error { if t == nil { @@ -622,69 +618,6 @@ func (t *Installer) installSymlink(toolkitRoot string, link string, target strin return nil } -// installFileToFolder copies a source file to a destination folder. -// The path of the input file is ignored. -// e.g. installFileToFolder("/some/path/file.txt", "/output/path") -// will result in a file "/output/path/file.txt" being generated -func (t *fileInstaller) installFileToFolder(destFolder string, src string) (string, error) { - name := filepath.Base(src) - return t.installFileToFolderWithName(destFolder, name, src) -} - -// cp src destFolder/name -func (t *fileInstaller) installFileToFolderWithName(destFolder string, name, src string) (string, error) { - dest := filepath.Join(destFolder, name) - err := t.installFile(dest, src) - if err != nil { - return "", fmt.Errorf("error copying '%v' to '%v': %v", src, dest, err) - } - return dest, nil -} - -// installFile copies a file from src to dest and maintains -// file modes -func (t *fileInstaller) installFile(dest string, src string) error { - src = filepath.Join(t.sourceRoot, src) - t.logger.Infof("Installing '%v' to '%v'", src, dest) - - source, err := os.Open(src) - if err != nil { - return fmt.Errorf("error opening source: %v", err) - } - defer source.Close() - - destination, err := os.Create(dest) - if err != nil { - return fmt.Errorf("error creating destination: %v", err) - } - defer destination.Close() - - _, err = io.Copy(destination, source) - if err != nil { - return fmt.Errorf("error copying file: %v", err) - } - - err = applyModeFromSource(dest, src) - if err != nil { - return fmt.Errorf("error setting destination file mode: %v", err) - } - return nil -} - -// applyModeFromSource sets the file mode for a destination file -// to match that of a specified source file -func applyModeFromSource(dest string, src string) error { - sourceInfo, err := os.Stat(src) - if err != nil { - return fmt.Errorf("error getting file info for '%v': %v", src, err) - } - err = os.Chmod(dest, sourceInfo.Mode()) - if err != nil { - return fmt.Errorf("error setting mode for '%v': %v", dest, err) - } - return nil -} - // findLibrary searches a set of candidate libraries in the specified root for // a given library name func (t *Installer) findLibrary(libName string) (string, error) { From d953bbb97770ad5360e8f7f32e85af6aa778ae99 Mon Sep 17 00:00:00 2001 From: Evan Lezar Date: Thu, 16 Jan 2025 16:52:43 +0100 Subject: [PATCH 6/8] Move nvidia-toolkit to nvidia-ctk-installer This change moves the containerized installer from nvidia-toolkit to cmd/nvidia-ctk-installer to allow for its use in CI. Signed-off-by: Evan Lezar --- .../nvidia-ctk-installer}/run.go | 0 .../nvidia-ctk-installer}/run_test.go | 0 deployments/container/Dockerfile.ubi8 | 14 +++++++------- deployments/container/Dockerfile.ubuntu | 14 +++++++------- 4 files changed, 14 insertions(+), 14 deletions(-) rename {tools/container/nvidia-toolkit => cmd/nvidia-ctk-installer}/run.go (100%) rename {tools/container/nvidia-toolkit => cmd/nvidia-ctk-installer}/run_test.go (100%) diff --git a/tools/container/nvidia-toolkit/run.go b/cmd/nvidia-ctk-installer/run.go similarity index 100% rename from tools/container/nvidia-toolkit/run.go rename to cmd/nvidia-ctk-installer/run.go diff --git a/tools/container/nvidia-toolkit/run_test.go b/cmd/nvidia-ctk-installer/run_test.go similarity index 100% rename from tools/container/nvidia-toolkit/run_test.go rename to cmd/nvidia-ctk-installer/run_test.go diff --git a/deployments/container/Dockerfile.ubi8 b/deployments/container/Dockerfile.ubi8 index 08e41e28..825d968d 100644 --- a/deployments/container/Dockerfile.ubi8 +++ b/deployments/container/Dockerfile.ubi8 @@ -42,11 +42,10 @@ ENV PATH=$GOPATH/bin:/usr/local/go/bin:$PATH WORKDIR /build COPY . . -# NOTE: Until the config utilities are properly integrated into the -# nvidia-container-toolkit repository, these are built from the `tools` folder -# and not `cmd`. -RUN GOPATH=/artifacts go install -ldflags="-s -w -X 'main.Version=${VERSION}'" ./tools/... - +RUN mkdir /artifacts +ARG VERSION="N/A" +ARG GIT_COMMIT="unknown" +RUN make PREFIX=/artifacts cmd-nvidia-ctk-installer FROM nvidia/cuda:12.6.3-base-ubi8 @@ -72,7 +71,8 @@ RUN PACKAGE_ARCH=${PACKAGE_ARCH/amd64/x86_64} && PACKAGE_ARCH=${PACKAGE_ARCH/arm WORKDIR /work -COPY --from=build /artifacts/bin /work +COPY --from=build /artifacts/nvidia-ctk-installer /work/nvidia-ctk-installer +RUN ln -s nvidia-ctk-installer nvidia-toolkit ENV PATH=/work:$PATH @@ -87,4 +87,4 @@ LABEL description="See summary" RUN mkdir /licenses && mv /NGC-DL-CONTAINER-LICENSE /licenses/NGC-DL-CONTAINER-LICENSE -ENTRYPOINT ["/work/nvidia-toolkit"] +ENTRYPOINT ["/work/nvidia-ctk-installer"] diff --git a/deployments/container/Dockerfile.ubuntu b/deployments/container/Dockerfile.ubuntu index d71e33e9..b1e08136 100644 --- a/deployments/container/Dockerfile.ubuntu +++ b/deployments/container/Dockerfile.ubuntu @@ -41,11 +41,10 @@ ENV PATH=$GOPATH/bin:/usr/local/go/bin:$PATH WORKDIR /build COPY . . -# NOTE: Until the config utilities are properly integrated into the -# nvidia-container-toolkit repository, these are built from the `tools` folder -# and not `cmd`. -RUN GOPATH=/artifacts go install -ldflags="-s -w -X 'main.Version=${VERSION}'" ./tools/... - +RUN mkdir /artifacts +ARG VERSION="N/A" +ARG GIT_COMMIT="unknown" +RUN make PREFIX=/artifacts cmd-nvidia-ctk-installer FROM nvcr.io/nvidia/cuda:12.6.3-base-ubuntu20.04 @@ -80,7 +79,8 @@ RUN dpkg -i \ WORKDIR /work -COPY --from=build /artifacts/bin /work/ +COPY --from=build /artifacts/nvidia-ctk-installer /work/nvidia-ctk-installer +RUN ln -s nvidia-ctk-installer nvidia-toolkit ENV PATH=/work:$PATH @@ -95,4 +95,4 @@ LABEL description="See summary" RUN mkdir /licenses && mv /NGC-DL-CONTAINER-LICENSE /licenses/NGC-DL-CONTAINER-LICENSE -ENTRYPOINT ["/work/nvidia-toolkit"] +ENTRYPOINT ["/work/nvidia-ctk-installer"] From 9429ce039bbda6b71bfdb35c85aed9978a294750 Mon Sep 17 00:00:00 2001 From: Evan Lezar Date: Thu, 16 Jan 2025 16:56:03 +0100 Subject: [PATCH 7/8] [no-relnote] Rename run.go to main.go Signed-off-by: Evan Lezar --- cmd/nvidia-ctk-installer/{run.go => main.go} | 0 cmd/nvidia-ctk-installer/{run_test.go => main_test.go} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename cmd/nvidia-ctk-installer/{run.go => main.go} (100%) rename cmd/nvidia-ctk-installer/{run_test.go => main_test.go} (100%) diff --git a/cmd/nvidia-ctk-installer/run.go b/cmd/nvidia-ctk-installer/main.go similarity index 100% rename from cmd/nvidia-ctk-installer/run.go rename to cmd/nvidia-ctk-installer/main.go diff --git a/cmd/nvidia-ctk-installer/run_test.go b/cmd/nvidia-ctk-installer/main_test.go similarity index 100% rename from cmd/nvidia-ctk-installer/run_test.go rename to cmd/nvidia-ctk-installer/main_test.go From 6bd292eff8c6d7f16a4d94756e0eacd98618b3bd Mon Sep 17 00:00:00 2001 From: Evan Lezar Date: Thu, 16 Jan 2025 16:59:37 +0100 Subject: [PATCH 8/8] [no-relnote] Move tools/container to cmd/nvidia-ctk-installer Signed-off-by: Evan Lezar --- {tools => cmd/nvidia-ctk-installer}/container/README.md | 0 .../nvidia-ctk-installer}/container/container.go | 2 +- .../nvidia-ctk-installer}/container/operator/operator.go | 0 .../container/operator/operator_test.go | 0 .../container/runtime/containerd/config_v1_test.go | 2 +- .../container/runtime/containerd/config_v2_test.go | 2 +- .../container/runtime/containerd/containerd.go | 2 +- .../container/runtime/containerd/containerd_linux.go | 0 .../container/runtime/containerd/containerd_other.go | 0 .../container/runtime/containerd/containerd_test.go | 0 .../nvidia-ctk-installer}/container/runtime/crio/crio.go | 2 +- .../container/runtime/docker/docker.go | 2 +- .../container/runtime/docker/docker_linux.go | 0 .../container/runtime/docker/docker_other.go | 0 .../container/runtime/docker/docker_test.go | 2 +- .../nvidia-ctk-installer}/container/runtime/runtime.go | 8 ++++---- .../nvidia-ctk-installer}/container/toolkit/executable.go | 0 .../container/toolkit/executable_test.go | 0 .../container/toolkit/file-installer.go | 0 .../nvidia-ctk-installer}/container/toolkit/options.go | 0 .../container/toolkit/replacements.go | 0 .../nvidia-ctk-installer}/container/toolkit/runtime.go | 2 +- .../container/toolkit/runtime_test.go | 0 .../nvidia-ctk-installer}/container/toolkit/toolkit.go | 0 .../container/toolkit/toolkit_test.go | 0 cmd/nvidia-ctk-installer/main.go | 4 ++-- 26 files changed, 14 insertions(+), 14 deletions(-) rename {tools => cmd/nvidia-ctk-installer}/container/README.md (100%) rename {tools => cmd/nvidia-ctk-installer}/container/container.go (98%) rename {tools => cmd/nvidia-ctk-installer}/container/operator/operator.go (100%) rename {tools => cmd/nvidia-ctk-installer}/container/operator/operator_test.go (100%) rename {tools => cmd/nvidia-ctk-installer}/container/runtime/containerd/config_v1_test.go (99%) rename {tools => cmd/nvidia-ctk-installer}/container/runtime/containerd/config_v2_test.go (99%) rename {tools => cmd/nvidia-ctk-installer}/container/runtime/containerd/containerd.go (98%) rename {tools => cmd/nvidia-ctk-installer}/container/runtime/containerd/containerd_linux.go (100%) rename {tools => cmd/nvidia-ctk-installer}/container/runtime/containerd/containerd_other.go (100%) rename {tools => cmd/nvidia-ctk-installer}/container/runtime/containerd/containerd_test.go (100%) rename {tools => cmd/nvidia-ctk-installer}/container/runtime/crio/crio.go (98%) rename {tools => cmd/nvidia-ctk-installer}/container/runtime/docker/docker.go (97%) rename {tools => cmd/nvidia-ctk-installer}/container/runtime/docker/docker_linux.go (100%) rename {tools => cmd/nvidia-ctk-installer}/container/runtime/docker/docker_other.go (100%) rename {tools => cmd/nvidia-ctk-installer}/container/runtime/docker/docker_test.go (99%) rename {tools => cmd/nvidia-ctk-installer}/container/runtime/runtime.go (93%) rename {tools => cmd/nvidia-ctk-installer}/container/toolkit/executable.go (100%) rename {tools => cmd/nvidia-ctk-installer}/container/toolkit/executable_test.go (100%) rename {tools => cmd/nvidia-ctk-installer}/container/toolkit/file-installer.go (100%) rename {tools => cmd/nvidia-ctk-installer}/container/toolkit/options.go (100%) rename {tools => cmd/nvidia-ctk-installer}/container/toolkit/replacements.go (100%) rename {tools => cmd/nvidia-ctk-installer}/container/toolkit/runtime.go (96%) rename {tools => cmd/nvidia-ctk-installer}/container/toolkit/runtime_test.go (100%) rename {tools => cmd/nvidia-ctk-installer}/container/toolkit/toolkit.go (100%) rename {tools => cmd/nvidia-ctk-installer}/container/toolkit/toolkit_test.go (100%) diff --git a/tools/container/README.md b/cmd/nvidia-ctk-installer/container/README.md similarity index 100% rename from tools/container/README.md rename to cmd/nvidia-ctk-installer/container/README.md diff --git a/tools/container/container.go b/cmd/nvidia-ctk-installer/container/container.go similarity index 98% rename from tools/container/container.go rename to cmd/nvidia-ctk-installer/container/container.go index c2c50c5b..68e5f1f8 100644 --- a/tools/container/container.go +++ b/cmd/nvidia-ctk-installer/container/container.go @@ -24,8 +24,8 @@ import ( "github.com/sirupsen/logrus" "github.com/urfave/cli/v2" + "github.com/NVIDIA/nvidia-container-toolkit/cmd/nvidia-ctk-installer/container/operator" "github.com/NVIDIA/nvidia-container-toolkit/pkg/config/engine" - "github.com/NVIDIA/nvidia-container-toolkit/tools/container/operator" ) const ( diff --git a/tools/container/operator/operator.go b/cmd/nvidia-ctk-installer/container/operator/operator.go similarity index 100% rename from tools/container/operator/operator.go rename to cmd/nvidia-ctk-installer/container/operator/operator.go diff --git a/tools/container/operator/operator_test.go b/cmd/nvidia-ctk-installer/container/operator/operator_test.go similarity index 100% rename from tools/container/operator/operator_test.go rename to cmd/nvidia-ctk-installer/container/operator/operator_test.go diff --git a/tools/container/runtime/containerd/config_v1_test.go b/cmd/nvidia-ctk-installer/container/runtime/containerd/config_v1_test.go similarity index 99% rename from tools/container/runtime/containerd/config_v1_test.go rename to cmd/nvidia-ctk-installer/container/runtime/containerd/config_v1_test.go index 7042744f..ea06b555 100644 --- a/tools/container/runtime/containerd/config_v1_test.go +++ b/cmd/nvidia-ctk-installer/container/runtime/containerd/config_v1_test.go @@ -23,9 +23,9 @@ import ( testlog "github.com/sirupsen/logrus/hooks/test" "github.com/stretchr/testify/require" + "github.com/NVIDIA/nvidia-container-toolkit/cmd/nvidia-ctk-installer/container" "github.com/NVIDIA/nvidia-container-toolkit/pkg/config/engine/containerd" "github.com/NVIDIA/nvidia-container-toolkit/pkg/config/toml" - "github.com/NVIDIA/nvidia-container-toolkit/tools/container" ) func TestUpdateV1ConfigDefaultRuntime(t *testing.T) { diff --git a/tools/container/runtime/containerd/config_v2_test.go b/cmd/nvidia-ctk-installer/container/runtime/containerd/config_v2_test.go similarity index 99% rename from tools/container/runtime/containerd/config_v2_test.go rename to cmd/nvidia-ctk-installer/container/runtime/containerd/config_v2_test.go index 92eea1fa..e206c59d 100644 --- a/tools/container/runtime/containerd/config_v2_test.go +++ b/cmd/nvidia-ctk-installer/container/runtime/containerd/config_v2_test.go @@ -23,9 +23,9 @@ import ( testlog "github.com/sirupsen/logrus/hooks/test" "github.com/stretchr/testify/require" + "github.com/NVIDIA/nvidia-container-toolkit/cmd/nvidia-ctk-installer/container" "github.com/NVIDIA/nvidia-container-toolkit/pkg/config/engine/containerd" "github.com/NVIDIA/nvidia-container-toolkit/pkg/config/toml" - "github.com/NVIDIA/nvidia-container-toolkit/tools/container" ) const ( diff --git a/tools/container/runtime/containerd/containerd.go b/cmd/nvidia-ctk-installer/container/runtime/containerd/containerd.go similarity index 98% rename from tools/container/runtime/containerd/containerd.go rename to cmd/nvidia-ctk-installer/container/runtime/containerd/containerd.go index 31fd2fea..9ece5306 100644 --- a/tools/container/runtime/containerd/containerd.go +++ b/cmd/nvidia-ctk-installer/container/runtime/containerd/containerd.go @@ -23,10 +23,10 @@ import ( log "github.com/sirupsen/logrus" cli "github.com/urfave/cli/v2" + "github.com/NVIDIA/nvidia-container-toolkit/cmd/nvidia-ctk-installer/container" "github.com/NVIDIA/nvidia-container-toolkit/pkg/config/engine" "github.com/NVIDIA/nvidia-container-toolkit/pkg/config/engine/containerd" "github.com/NVIDIA/nvidia-container-toolkit/pkg/config/toml" - "github.com/NVIDIA/nvidia-container-toolkit/tools/container" ) const ( diff --git a/tools/container/runtime/containerd/containerd_linux.go b/cmd/nvidia-ctk-installer/container/runtime/containerd/containerd_linux.go similarity index 100% rename from tools/container/runtime/containerd/containerd_linux.go rename to cmd/nvidia-ctk-installer/container/runtime/containerd/containerd_linux.go diff --git a/tools/container/runtime/containerd/containerd_other.go b/cmd/nvidia-ctk-installer/container/runtime/containerd/containerd_other.go similarity index 100% rename from tools/container/runtime/containerd/containerd_other.go rename to cmd/nvidia-ctk-installer/container/runtime/containerd/containerd_other.go diff --git a/tools/container/runtime/containerd/containerd_test.go b/cmd/nvidia-ctk-installer/container/runtime/containerd/containerd_test.go similarity index 100% rename from tools/container/runtime/containerd/containerd_test.go rename to cmd/nvidia-ctk-installer/container/runtime/containerd/containerd_test.go diff --git a/tools/container/runtime/crio/crio.go b/cmd/nvidia-ctk-installer/container/runtime/crio/crio.go similarity index 98% rename from tools/container/runtime/crio/crio.go rename to cmd/nvidia-ctk-installer/container/runtime/crio/crio.go index e37fc4ba..0db1f41b 100644 --- a/tools/container/runtime/crio/crio.go +++ b/cmd/nvidia-ctk-installer/container/runtime/crio/crio.go @@ -24,12 +24,12 @@ import ( log "github.com/sirupsen/logrus" cli "github.com/urfave/cli/v2" + "github.com/NVIDIA/nvidia-container-toolkit/cmd/nvidia-ctk-installer/container" "github.com/NVIDIA/nvidia-container-toolkit/internal/config" "github.com/NVIDIA/nvidia-container-toolkit/pkg/config/engine" "github.com/NVIDIA/nvidia-container-toolkit/pkg/config/engine/crio" "github.com/NVIDIA/nvidia-container-toolkit/pkg/config/ocihook" "github.com/NVIDIA/nvidia-container-toolkit/pkg/config/toml" - "github.com/NVIDIA/nvidia-container-toolkit/tools/container" ) const ( diff --git a/tools/container/runtime/docker/docker.go b/cmd/nvidia-ctk-installer/container/runtime/docker/docker.go similarity index 97% rename from tools/container/runtime/docker/docker.go rename to cmd/nvidia-ctk-installer/container/runtime/docker/docker.go index fd5a2750..78d2c42a 100644 --- a/tools/container/runtime/docker/docker.go +++ b/cmd/nvidia-ctk-installer/container/runtime/docker/docker.go @@ -22,9 +22,9 @@ import ( log "github.com/sirupsen/logrus" cli "github.com/urfave/cli/v2" + "github.com/NVIDIA/nvidia-container-toolkit/cmd/nvidia-ctk-installer/container" "github.com/NVIDIA/nvidia-container-toolkit/pkg/config/engine" "github.com/NVIDIA/nvidia-container-toolkit/pkg/config/engine/docker" - "github.com/NVIDIA/nvidia-container-toolkit/tools/container" ) const ( diff --git a/tools/container/runtime/docker/docker_linux.go b/cmd/nvidia-ctk-installer/container/runtime/docker/docker_linux.go similarity index 100% rename from tools/container/runtime/docker/docker_linux.go rename to cmd/nvidia-ctk-installer/container/runtime/docker/docker_linux.go diff --git a/tools/container/runtime/docker/docker_other.go b/cmd/nvidia-ctk-installer/container/runtime/docker/docker_other.go similarity index 100% rename from tools/container/runtime/docker/docker_other.go rename to cmd/nvidia-ctk-installer/container/runtime/docker/docker_other.go diff --git a/tools/container/runtime/docker/docker_test.go b/cmd/nvidia-ctk-installer/container/runtime/docker/docker_test.go similarity index 99% rename from tools/container/runtime/docker/docker_test.go rename to cmd/nvidia-ctk-installer/container/runtime/docker/docker_test.go index 03699b40..129cc143 100644 --- a/tools/container/runtime/docker/docker_test.go +++ b/cmd/nvidia-ctk-installer/container/runtime/docker/docker_test.go @@ -22,8 +22,8 @@ import ( "github.com/stretchr/testify/require" + "github.com/NVIDIA/nvidia-container-toolkit/cmd/nvidia-ctk-installer/container" "github.com/NVIDIA/nvidia-container-toolkit/pkg/config/engine/docker" - "github.com/NVIDIA/nvidia-container-toolkit/tools/container" ) func TestUpdateConfigDefaultRuntime(t *testing.T) { diff --git a/tools/container/runtime/runtime.go b/cmd/nvidia-ctk-installer/container/runtime/runtime.go similarity index 93% rename from tools/container/runtime/runtime.go rename to cmd/nvidia-ctk-installer/container/runtime/runtime.go index 865f92e8..cbe68830 100644 --- a/tools/container/runtime/runtime.go +++ b/cmd/nvidia-ctk-installer/container/runtime/runtime.go @@ -21,10 +21,10 @@ import ( "github.com/urfave/cli/v2" - "github.com/NVIDIA/nvidia-container-toolkit/tools/container" - "github.com/NVIDIA/nvidia-container-toolkit/tools/container/runtime/containerd" - "github.com/NVIDIA/nvidia-container-toolkit/tools/container/runtime/crio" - "github.com/NVIDIA/nvidia-container-toolkit/tools/container/runtime/docker" + "github.com/NVIDIA/nvidia-container-toolkit/cmd/nvidia-ctk-installer/container" + "github.com/NVIDIA/nvidia-container-toolkit/cmd/nvidia-ctk-installer/container/runtime/containerd" + "github.com/NVIDIA/nvidia-container-toolkit/cmd/nvidia-ctk-installer/container/runtime/crio" + "github.com/NVIDIA/nvidia-container-toolkit/cmd/nvidia-ctk-installer/container/runtime/docker" ) const ( diff --git a/tools/container/toolkit/executable.go b/cmd/nvidia-ctk-installer/container/toolkit/executable.go similarity index 100% rename from tools/container/toolkit/executable.go rename to cmd/nvidia-ctk-installer/container/toolkit/executable.go diff --git a/tools/container/toolkit/executable_test.go b/cmd/nvidia-ctk-installer/container/toolkit/executable_test.go similarity index 100% rename from tools/container/toolkit/executable_test.go rename to cmd/nvidia-ctk-installer/container/toolkit/executable_test.go diff --git a/tools/container/toolkit/file-installer.go b/cmd/nvidia-ctk-installer/container/toolkit/file-installer.go similarity index 100% rename from tools/container/toolkit/file-installer.go rename to cmd/nvidia-ctk-installer/container/toolkit/file-installer.go diff --git a/tools/container/toolkit/options.go b/cmd/nvidia-ctk-installer/container/toolkit/options.go similarity index 100% rename from tools/container/toolkit/options.go rename to cmd/nvidia-ctk-installer/container/toolkit/options.go diff --git a/tools/container/toolkit/replacements.go b/cmd/nvidia-ctk-installer/container/toolkit/replacements.go similarity index 100% rename from tools/container/toolkit/replacements.go rename to cmd/nvidia-ctk-installer/container/toolkit/replacements.go diff --git a/tools/container/toolkit/runtime.go b/cmd/nvidia-ctk-installer/container/toolkit/runtime.go similarity index 96% rename from tools/container/toolkit/runtime.go rename to cmd/nvidia-ctk-installer/container/toolkit/runtime.go index 5553d881..5a1a0839 100644 --- a/tools/container/toolkit/runtime.go +++ b/cmd/nvidia-ctk-installer/container/toolkit/runtime.go @@ -20,7 +20,7 @@ import ( "fmt" "path/filepath" - "github.com/NVIDIA/nvidia-container-toolkit/tools/container/operator" + "github.com/NVIDIA/nvidia-container-toolkit/cmd/nvidia-ctk-installer/container/operator" ) const ( diff --git a/tools/container/toolkit/runtime_test.go b/cmd/nvidia-ctk-installer/container/toolkit/runtime_test.go similarity index 100% rename from tools/container/toolkit/runtime_test.go rename to cmd/nvidia-ctk-installer/container/toolkit/runtime_test.go diff --git a/tools/container/toolkit/toolkit.go b/cmd/nvidia-ctk-installer/container/toolkit/toolkit.go similarity index 100% rename from tools/container/toolkit/toolkit.go rename to cmd/nvidia-ctk-installer/container/toolkit/toolkit.go diff --git a/tools/container/toolkit/toolkit_test.go b/cmd/nvidia-ctk-installer/container/toolkit/toolkit_test.go similarity index 100% rename from tools/container/toolkit/toolkit_test.go rename to cmd/nvidia-ctk-installer/container/toolkit/toolkit_test.go diff --git a/cmd/nvidia-ctk-installer/main.go b/cmd/nvidia-ctk-installer/main.go index c872135d..835acbb0 100644 --- a/cmd/nvidia-ctk-installer/main.go +++ b/cmd/nvidia-ctk-installer/main.go @@ -11,9 +11,9 @@ import ( "github.com/urfave/cli/v2" "golang.org/x/sys/unix" + "github.com/NVIDIA/nvidia-container-toolkit/cmd/nvidia-ctk-installer/container/runtime" + "github.com/NVIDIA/nvidia-container-toolkit/cmd/nvidia-ctk-installer/container/toolkit" "github.com/NVIDIA/nvidia-container-toolkit/internal/logger" - "github.com/NVIDIA/nvidia-container-toolkit/tools/container/runtime" - "github.com/NVIDIA/nvidia-container-toolkit/tools/container/toolkit" ) const (