Merge branch 'fix-cdi-spec-permissions' into 'main'

Generate CDI specifications with 644 permissions to allow non-root clients to consume them

See merge request nvidia/container-toolkit/container-toolkit!381
This commit is contained in:
Carlos Eduardo Arango Gutierrez 2023-05-02 19:36:40 +00:00
commit 6750df8e01
4 changed files with 25 additions and 3 deletions

View File

@ -4,6 +4,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)
## v1.13.1

View File

@ -251,6 +251,7 @@ func (m command) generateSpec(cfg *config) (spec.Interface, error) {
spec.WithDeviceSpecs(deviceSpecs),
spec.WithEdits(*commonEdits.ContainerEdits),
spec.WithFormat(cfg.format),
spec.WithPermissions(0644),
)
}

View File

@ -18,6 +18,7 @@ package spec
import (
"fmt"
"os"
"github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/transform"
"github.com/container-orchestrated-devices/container-device-interface/pkg/cdi"
@ -33,6 +34,7 @@ type builder struct {
edits specs.ContainerEdits
format string
noSimplify bool
permissions os.FileMode
}
// newBuilder creates a new spec builder with the supplied options
@ -60,7 +62,9 @@ func newBuilder(opts ...Option) *builder {
if s.format == "" {
s.format = FormatYAML
}
if s.permissions == 0 {
s.permissions = 0600
}
return s
}
@ -157,3 +161,10 @@ func WithRawSpec(raw *specs.Spec) Option {
o.raw = raw
}
}
// WithPermissions sets the permissions for the generated spec file
func WithPermissions(permissions os.FileMode) Option {
return func(o *builder) {
o.permissions = permissions
}
}

View File

@ -29,6 +29,7 @@ import (
type spec struct {
*specs.Spec
format string
permissions os.FileMode
}
var _ Interface = (*spec)(nil)
@ -51,7 +52,15 @@ func (s *spec) Save(path string) error {
cdi.WithSpecDirs(specDir),
)
return registry.SpecDB().WriteSpec(s.Raw(), filepath.Base(path))
if err := registry.SpecDB().WriteSpec(s.Raw(), filepath.Base(path)); err != nil {
return fmt.Errorf("failed to write spec: %w", err)
}
if err := os.Chmod(path, s.permissions); err != nil {
return fmt.Errorf("failed to set permissions on spec file: %w", err)
}
return nil
}
// WriteTo writes the spec to the specified writer.