Generate all device using merged transform

The nvcid api is extended to allow for merged device options to
be specified. If any options are specified, then a merged device
is generated.

Signed-off-by: Evan Lezar <elezar@nvidia.com>
This commit is contained in:
Evan Lezar
2023-03-17 11:47:31 +02:00
parent ba44c50f4e
commit fe37196788
5 changed files with 46 additions and 23 deletions

View File

@@ -20,6 +20,7 @@ import (
"fmt"
"github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/spec"
"github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/transform"
"github.com/sirupsen/logrus"
"gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvlib/device"
"gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvlib/info"
@@ -31,6 +32,8 @@ type wrapper struct {
vendor string
class string
mergedDeviceOptions []transform.MergedDeviceOption
}
type nvcdilib struct {
@@ -46,6 +49,8 @@ type nvcdilib struct {
class string
infolib info.Interface
mergedDeviceOptions []transform.MergedDeviceOption
}
// New creates a new nvcdi library
@@ -106,9 +111,10 @@ func New(opts ...Option) (Interface, error) {
}
w := wrapper{
Interface: lib,
vendor: l.vendor,
class: l.class,
Interface: lib,
vendor: l.vendor,
class: l.class,
mergedDeviceOptions: l.mergedDeviceOptions,
}
return &w, nil
}
@@ -130,8 +136,8 @@ func (l *wrapper) GetSpec() (spec.Interface, error) {
spec.WithEdits(*edits.ContainerEdits),
spec.WithVendor(l.vendor),
spec.WithClass(l.class),
spec.WithMergedDeviceOptions(l.mergedDeviceOptions...),
)
}
// resolveMode resolves the mode for CDI spec generation based on the current system.

View File

@@ -17,6 +17,7 @@
package nvcdi
import (
"github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/transform"
"github.com/sirupsen/logrus"
"gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvlib/device"
"gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml"
@@ -87,3 +88,11 @@ func WithClass(class string) Option {
o.class = class
}
}
// WithMergedDeviceOptions sets the merged device options for the library
// If these are not set, no merged device will be generated.
func WithMergedDeviceOptions(opts ...transform.MergedDeviceOption) Option {
return func(o *nvcdilib) {
o.mergedDeviceOptions = opts
}
}

View File

@@ -33,8 +33,10 @@ type builder struct {
deviceSpecs []specs.Device
edits specs.ContainerEdits
format string
noSimplify bool
permissions os.FileMode
mergedDeviceOptions []transform.MergedDeviceOption
noSimplify bool
permissions os.FileMode
}
// newBuilder creates a new spec builder with the supplied options
@@ -95,6 +97,16 @@ func (o *builder) Build() (*spec, error) {
}
}
if len(o.mergedDeviceOptions) > 0 {
merge, err := transform.NewMergedDevice(o.mergedDeviceOptions...)
if err != nil {
return nil, fmt.Errorf("failed to create merged device transformer: %v", err)
}
if err := merge.Transform(raw); err != nil {
return nil, fmt.Errorf("failed to merge devices: %v", err)
}
}
s := spec{
Spec: raw,
format: o.format,
@@ -169,3 +181,10 @@ func WithPermissions(permissions os.FileMode) Option {
o.permissions = permissions
}
}
// WithMergedDeviceOptions sets the options for generating a merged device.
func WithMergedDeviceOptions(opts ...transform.MergedDeviceOption) Option {
return func(o *builder) {
o.mergedDeviceOptions = opts
}
}