From 3e7acec0b49a623e2a0d94797d51968080832744 Mon Sep 17 00:00:00 2001 From: Evan Lezar Date: Mon, 13 Mar 2023 14:33:10 +0200 Subject: [PATCH] Add nvidia-ctk config generate-default command This change adds a CLI command to generate a default config. This config checks the host operating system to apply specific modifications that were previously captured in static config files. These include: * select /sbin/ldconfig or /sbin/ldconfig.real depending on which exists on the host * set the user to allow device access on SUSE-based systems Signed-off-by: Evan Lezar --- cmd/nvidia-ctk/config/config.go | 50 +++++++++ .../config/create-default/create-default.go | 102 ++++++++++++++++++ cmd/nvidia-ctk/main.go | 2 + 3 files changed, 154 insertions(+) create mode 100644 cmd/nvidia-ctk/config/config.go create mode 100644 cmd/nvidia-ctk/config/create-default/create-default.go diff --git a/cmd/nvidia-ctk/config/config.go b/cmd/nvidia-ctk/config/config.go new file mode 100644 index 00000000..cc36d11f --- /dev/null +++ b/cmd/nvidia-ctk/config/config.go @@ -0,0 +1,50 @@ +/** +# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved. +# +# 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 config + +import ( + createdefault "github.com/NVIDIA/nvidia-container-toolkit/cmd/nvidia-ctk/config/create-default" + "github.com/sirupsen/logrus" + "github.com/urfave/cli/v2" +) + +type command struct { + logger *logrus.Logger +} + +// NewCommand constructs an config command with the specified logger +func NewCommand(logger *logrus.Logger) *cli.Command { + c := command{ + logger: logger, + } + return c.build() +} + +// build +func (m command) build() *cli.Command { + // Create the 'config' command + c := cli.Command{ + Name: "config", + Usage: "Interact with the NVIDIA Container Toolkit configuration", + } + + c.Subcommands = []*cli.Command{ + createdefault.NewCommand(m.logger), + } + + return &c +} diff --git a/cmd/nvidia-ctk/config/create-default/create-default.go b/cmd/nvidia-ctk/config/create-default/create-default.go new file mode 100644 index 00000000..c0a92cf9 --- /dev/null +++ b/cmd/nvidia-ctk/config/create-default/create-default.go @@ -0,0 +1,102 @@ +/** +# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved. +# +# 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 defaultsubcommand + +import ( + "fmt" + "io" + "os" + + nvctkConfig "github.com/NVIDIA/nvidia-container-toolkit/internal/config" + "github.com/sirupsen/logrus" + "github.com/urfave/cli/v2" +) + +type command struct { + logger *logrus.Logger +} + +// options stores the subcommand options +type options struct { + output string +} + +// NewCommand constructs a default command with the specified logger +func NewCommand(logger *logrus.Logger) *cli.Command { + c := command{ + logger: logger, + } + return c.build() +} + +// build creates the CLI command +func (m command) build() *cli.Command { + opts := options{} + + // Create the 'default' command + c := cli.Command{ + Name: "generate-default", + Aliases: []string{"default"}, + Usage: "Generate the default NVIDIA Container Toolkit configuration file", + Before: func(c *cli.Context) error { + return m.validateFlags(c, &opts) + }, + Action: func(c *cli.Context) error { + return m.run(c, &opts) + }, + } + + c.Flags = []cli.Flag{ + &cli.StringFlag{ + Name: "output", + Usage: "Specify the file to output the generated configuration for to. If this is '' the configuration is ouput to STDOUT.", + Destination: &opts.output, + }, + } + + return &c +} + +func (m command) validateFlags(c *cli.Context, opts *options) error { + return nil +} + +func (m command) run(c *cli.Context, opts *options) error { + defaultConfig, err := nvctkConfig.GetDefaultConfigToml() + if err != nil { + return fmt.Errorf("unable to get default config: %v", err) + } + + var output io.Writer + if opts.output == "" { + output = os.Stdout + } else { + outputFile, err := os.Create(opts.output) + if err != nil { + return fmt.Errorf("unable to create output file: %v", err) + } + defer outputFile.Close() + output = outputFile + } + + _, err = defaultConfig.WriteTo(output) + if err != nil { + return fmt.Errorf("unable to write to output: %v", err) + } + + return nil +} diff --git a/cmd/nvidia-ctk/main.go b/cmd/nvidia-ctk/main.go index acfbd03f..9fd9e603 100644 --- a/cmd/nvidia-ctk/main.go +++ b/cmd/nvidia-ctk/main.go @@ -20,6 +20,7 @@ import ( "os" "github.com/NVIDIA/nvidia-container-toolkit/cmd/nvidia-ctk/cdi" + "github.com/NVIDIA/nvidia-container-toolkit/cmd/nvidia-ctk/config" "github.com/NVIDIA/nvidia-container-toolkit/cmd/nvidia-ctk/hook" infoCLI "github.com/NVIDIA/nvidia-container-toolkit/cmd/nvidia-ctk/info" "github.com/NVIDIA/nvidia-container-toolkit/cmd/nvidia-ctk/runtime" @@ -79,6 +80,7 @@ func main() { infoCLI.NewCommand(logger), cdi.NewCommand(logger), system.NewCommand(logger), + config.NewCommand(logger), } // Run the CLI