diff --git a/cmd/nvidia-ctk/cdi/cdi.go b/cmd/nvidia-ctk/cdi/cdi.go new file mode 100644 index 00000000..84b42717 --- /dev/null +++ b/cmd/nvidia-ctk/cdi/cdi.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 cdi + +import ( + "github.com/NVIDIA/nvidia-container-toolkit/cmd/nvidia-ctk/cdi/generate" + "github.com/sirupsen/logrus" + "github.com/urfave/cli/v2" +) + +type command struct { + logger *logrus.Logger +} + +// NewCommand constructs an info 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 'hook' command + hook := cli.Command{ + Name: "cdi", + Usage: "Provide tools for interacting with Container Device Interface specifications", + } + + hook.Subcommands = []*cli.Command{ + generate.NewCommand(m.logger), + } + + return &hook +} diff --git a/cmd/nvidia-ctk/info/generate-cdi/generate-cdi.go b/cmd/nvidia-ctk/cdi/generate/generate.go similarity index 96% rename from cmd/nvidia-ctk/info/generate-cdi/generate-cdi.go rename to cmd/nvidia-ctk/cdi/generate/generate.go index dab14055..c3992d5b 100644 --- a/cmd/nvidia-ctk/info/generate-cdi/generate-cdi.go +++ b/cmd/nvidia-ctk/cdi/generate/generate.go @@ -14,7 +14,7 @@ # limitations under the License. **/ -package cdi +package generate import ( "fmt" @@ -63,7 +63,7 @@ func (m command) build() *cli.Command { // Create the 'generate-cdi' command c := cli.Command{ - Name: "generate-cdi", + Name: "generate", Usage: "Generate CDI specifications for use with CDI-enabled runtimes", Action: func(c *cli.Context) error { return m.run(c, &cfg) @@ -122,7 +122,7 @@ func (m command) run(c *cli.Context, cfg *config) error { } } - _, err = outputTo.Write(data) + err = writeToOutput(cfg.jsonMode, data, outputTo) if err != nil { return fmt.Errorf("failed to write output: %v", err) } @@ -130,6 +130,22 @@ func (m command) run(c *cli.Context, cfg *config) error { return nil } +func writeToOutput(jsonMode bool, data []byte, output io.Writer) error { + if !jsonMode { + _, err := output.Write([]byte("---\n")) + if err != nil { + return fmt.Errorf("failed to write YAML separator: %v", err) + } + + } + _, err := output.Write(data) + if err != nil { + return fmt.Errorf("failed to write data: %v", err) + } + + return nil +} + func (m command) generateSpec() (*specs.Spec, error) { nvmllib := nvml.New() if r := nvmllib.Init(); r != nvml.SUCCESS { diff --git a/cmd/nvidia-ctk/info/generate-cdi/nvml_devices.go b/cmd/nvidia-ctk/cdi/generate/nvml_devices.go similarity index 99% rename from cmd/nvidia-ctk/info/generate-cdi/nvml_devices.go rename to cmd/nvidia-ctk/cdi/generate/nvml_devices.go index 221c4005..7b89203a 100644 --- a/cmd/nvidia-ctk/info/generate-cdi/nvml_devices.go +++ b/cmd/nvidia-ctk/cdi/generate/nvml_devices.go @@ -14,7 +14,7 @@ * limitations under the License. */ -package cdi +package generate import ( "fmt" diff --git a/cmd/nvidia-ctk/info/info.go b/cmd/nvidia-ctk/info/info.go index 5cc888fe..4a5c89f0 100644 --- a/cmd/nvidia-ctk/info/info.go +++ b/cmd/nvidia-ctk/info/info.go @@ -17,7 +17,6 @@ package info import ( - cdi "github.com/NVIDIA/nvidia-container-toolkit/cmd/nvidia-ctk/info/generate-cdi" "github.com/sirupsen/logrus" "github.com/urfave/cli/v2" ) @@ -42,9 +41,7 @@ func (m command) build() *cli.Command { Usage: "Provide information about the system", } - hook.Subcommands = []*cli.Command{ - cdi.NewCommand(m.logger), - } + hook.Subcommands = []*cli.Command{} return &hook } diff --git a/cmd/nvidia-ctk/main.go b/cmd/nvidia-ctk/main.go index fdd32537..a8b04b64 100644 --- a/cmd/nvidia-ctk/main.go +++ b/cmd/nvidia-ctk/main.go @@ -19,6 +19,7 @@ package main import ( "os" + "github.com/NVIDIA/nvidia-container-toolkit/cmd/nvidia-ctk/cdi" "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" @@ -75,6 +76,7 @@ func main() { hook.NewCommand(logger), runtime.NewCommand(logger), infoCLI.NewCommand(logger), + cdi.NewCommand(logger), } // Run the CLI