diff --git a/CHANGELOG.md b/CHANGELOG.md index 40eaaaa9..44b74bb0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ * Add support for updating containerd configs to the `nvidia-ctk runtime configure` command. * Create file in `etc/ld.so.conf.d` with permissions `644` to support non-root containers. * Generate CDI specification files with `644` permissions to allow rootless applications (e.g. podman) +* Add `nvidia-ctk cdi list` command to show the known CDI devices. ## v1.13.1 diff --git a/cmd/nvidia-ctk/cdi/cdi.go b/cmd/nvidia-ctk/cdi/cdi.go index e6c75a2d..57ea64dd 100644 --- a/cmd/nvidia-ctk/cdi/cdi.go +++ b/cmd/nvidia-ctk/cdi/cdi.go @@ -18,6 +18,7 @@ package cdi import ( "github.com/NVIDIA/nvidia-container-toolkit/cmd/nvidia-ctk/cdi/generate" + "github.com/NVIDIA/nvidia-container-toolkit/cmd/nvidia-ctk/cdi/list" "github.com/NVIDIA/nvidia-container-toolkit/cmd/nvidia-ctk/cdi/transform" "github.com/sirupsen/logrus" "github.com/urfave/cli/v2" @@ -46,6 +47,7 @@ func (m command) build() *cli.Command { hook.Subcommands = []*cli.Command{ generate.NewCommand(m.logger), transform.NewCommand(m.logger), + list.NewCommand(m.logger), } return &hook diff --git a/cmd/nvidia-ctk/cdi/list/list.go b/cmd/nvidia-ctk/cdi/list/list.go new file mode 100644 index 00000000..b7aab6e0 --- /dev/null +++ b/cmd/nvidia-ctk/cdi/list/list.go @@ -0,0 +1,87 @@ +/** +# 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 list + +import ( + "fmt" + + "github.com/container-orchestrated-devices/container-device-interface/pkg/cdi" + "github.com/sirupsen/logrus" + "github.com/urfave/cli/v2" +) + +type command struct { + logger *logrus.Logger +} + +type config struct{} + +// NewCommand constructs a cdi list 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 { + cfg := config{} + + // Create the command + c := cli.Command{ + Name: "list", + Usage: "List the available CDI devices", + Before: func(c *cli.Context) error { + return m.validateFlags(c, &cfg) + }, + Action: func(c *cli.Context) error { + return m.run(c, &cfg) + }, + } + + c.Flags = []cli.Flag{} + + return &c +} + +func (m command) validateFlags(c *cli.Context, cfg *config) error { + return nil +} + +func (m command) run(c *cli.Context, cfg *config) error { + registry, err := cdi.NewCache( + cdi.WithAutoRefresh(false), + cdi.WithSpecDirs(cdi.DefaultSpecDirs...), + ) + if err != nil { + return fmt.Errorf("failed to create CDI cache: %v", err) + } + + devices := registry.ListDevices() + if len(devices) == 0 { + m.logger.Info("No CDI devices found") + return nil + } + + m.logger.Infof("Found %d CDI devices", len(devices)) + for _, device := range devices { + fmt.Printf("%s\n", device) + } + + return nil +}