mirror of
https://github.com/NVIDIA/nvidia-container-toolkit
synced 2025-06-16 11:30:20 +00:00
Add device IDs to nvcdi.GetSpec API
This change allows device IDs to the specified in the GetSpec API. This simplifies cases where CDI specs are being generated for specific devices by ID. Signed-off-by: Evan Lezar <elezar@nvidia.com>
This commit is contained in:
parent
dba15acdcc
commit
0134ba4250
@ -195,26 +195,11 @@ func generateAutomaticCDISpec(logger logger.Interface, cfg *config.Config, devic
|
|||||||
return nil, fmt.Errorf("failed to construct CDI library: %w", err)
|
return nil, fmt.Errorf("failed to construct CDI library: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
identifiers := []string{}
|
var identifiers []string
|
||||||
for _, device := range devices {
|
for _, device := range devices {
|
||||||
_, _, id := parser.ParseDevice(device)
|
_, _, id := parser.ParseDevice(device)
|
||||||
identifiers = append(identifiers, id)
|
identifiers = append(identifiers, id)
|
||||||
}
|
}
|
||||||
|
|
||||||
deviceSpecs, err := cdilib.GetDeviceSpecsByID(identifiers...)
|
return cdilib.GetSpec(identifiers...)
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("failed to get CDI device specs: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
commonEdits, err := cdilib.GetCommonEdits()
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("failed to get common CDI spec edits: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return spec.New(
|
|
||||||
spec.WithDeviceSpecs(deviceSpecs),
|
|
||||||
spec.WithEdits(*commonEdits.ContainerEdits),
|
|
||||||
spec.WithVendor("runtime.nvidia.com"),
|
|
||||||
spec.WithClass("gpu"),
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,7 @@ import (
|
|||||||
|
|
||||||
// Interface defines the API for the nvcdi package
|
// Interface defines the API for the nvcdi package
|
||||||
type Interface interface {
|
type Interface interface {
|
||||||
GetSpec() (spec.Interface, error)
|
GetSpec(...string) (spec.Interface, error)
|
||||||
GetCommonEdits() (*cdi.ContainerEdits, error)
|
GetCommonEdits() (*cdi.ContainerEdits, error)
|
||||||
GetAllDeviceSpecs() ([]specs.Device, error)
|
GetAllDeviceSpecs() ([]specs.Device, error)
|
||||||
GetGPUDeviceEdits(device.Device) (*cdi.ContainerEdits, error)
|
GetGPUDeviceEdits(device.Device) (*cdi.ContainerEdits, error)
|
||||||
|
@ -58,7 +58,7 @@ func (l *gdslib) GetCommonEdits() (*cdi.ContainerEdits, error) {
|
|||||||
|
|
||||||
// GetSpec is unsppported for the gdslib specs.
|
// GetSpec is unsppported for the gdslib specs.
|
||||||
// gdslib is typically wrapped by a spec that implements GetSpec.
|
// gdslib is typically wrapped by a spec that implements GetSpec.
|
||||||
func (l *gdslib) GetSpec() (spec.Interface, error) {
|
func (l *gdslib) GetSpec(...string) (spec.Interface, error) {
|
||||||
return nil, fmt.Errorf("GetSpec is not supported")
|
return nil, fmt.Errorf("GetSpec is not supported")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@ type csvlib nvcdilib
|
|||||||
var _ Interface = (*csvlib)(nil)
|
var _ Interface = (*csvlib)(nil)
|
||||||
|
|
||||||
// GetSpec should not be called for wsllib
|
// GetSpec should not be called for wsllib
|
||||||
func (l *csvlib) GetSpec() (spec.Interface, error) {
|
func (l *csvlib) GetSpec(...string) (spec.Interface, error) {
|
||||||
return nil, fmt.Errorf("unexpected call to csvlib.GetSpec()")
|
return nil, fmt.Errorf("unexpected call to csvlib.GetSpec()")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// GetSpec should not be called for imexlib.
|
// GetSpec should not be called for imexlib.
|
||||||
func (l *imexlib) GetSpec() (spec.Interface, error) {
|
func (l *imexlib) GetSpec(...string) (spec.Interface, error) {
|
||||||
return nil, fmt.Errorf("unexpected call to imexlib.GetSpec()")
|
return nil, fmt.Errorf("unexpected call to imexlib.GetSpec()")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@ type nvmllib nvcdilib
|
|||||||
var _ Interface = (*nvmllib)(nil)
|
var _ Interface = (*nvmllib)(nil)
|
||||||
|
|
||||||
// GetSpec should not be called for nvmllib
|
// GetSpec should not be called for nvmllib
|
||||||
func (l *nvmllib) GetSpec() (spec.Interface, error) {
|
func (l *nvmllib) GetSpec(...string) (spec.Interface, error) {
|
||||||
return nil, fmt.Errorf("unexpected call to nvmllib.GetSpec()")
|
return nil, fmt.Errorf("unexpected call to nvmllib.GetSpec()")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ type wsllib nvcdilib
|
|||||||
var _ Interface = (*wsllib)(nil)
|
var _ Interface = (*wsllib)(nil)
|
||||||
|
|
||||||
// GetSpec should not be called for wsllib
|
// GetSpec should not be called for wsllib
|
||||||
func (l *wsllib) GetSpec() (spec.Interface, error) {
|
func (l *wsllib) GetSpec(...string) (spec.Interface, error) {
|
||||||
return nil, fmt.Errorf("unexpected call to wsllib.GetSpec()")
|
return nil, fmt.Errorf("unexpected call to wsllib.GetSpec()")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -180,7 +180,7 @@ func (m managementDiscoverer) nodeIsBlocked(path string) bool {
|
|||||||
|
|
||||||
// GetSpec is unsppported for the managementlib specs.
|
// GetSpec is unsppported for the managementlib specs.
|
||||||
// managementlib is typically wrapped by a spec that implements GetSpec.
|
// managementlib is typically wrapped by a spec that implements GetSpec.
|
||||||
func (m *managementlib) GetSpec() (spec.Interface, error) {
|
func (m *managementlib) GetSpec(...string) (spec.Interface, error) {
|
||||||
return nil, fmt.Errorf("GetSpec is not supported")
|
return nil, fmt.Errorf("GetSpec is not supported")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,7 +58,7 @@ func (l *mofedlib) GetCommonEdits() (*cdi.ContainerEdits, error) {
|
|||||||
|
|
||||||
// GetSpec is unsppported for the mofedlib specs.
|
// GetSpec is unsppported for the mofedlib specs.
|
||||||
// mofedlib is typically wrapped by a spec that implements GetSpec.
|
// mofedlib is typically wrapped by a spec that implements GetSpec.
|
||||||
func (l *mofedlib) GetSpec() (spec.Interface, error) {
|
func (l *mofedlib) GetSpec(...string) (spec.Interface, error) {
|
||||||
return nil, fmt.Errorf("GetSpec is not supported")
|
return nil, fmt.Errorf("GetSpec is not supported")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,8 +35,11 @@ type wrapper struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GetSpec combines the device specs and common edits from the wrapped Interface to a single spec.Interface.
|
// GetSpec combines the device specs and common edits from the wrapped Interface to a single spec.Interface.
|
||||||
func (l *wrapper) GetSpec() (spec.Interface, error) {
|
func (l *wrapper) GetSpec(devices ...string) (spec.Interface, error) {
|
||||||
deviceSpecs, err := l.GetAllDeviceSpecs()
|
if len(devices) == 0 {
|
||||||
|
devices = append(devices, "all")
|
||||||
|
}
|
||||||
|
deviceSpecs, err := l.GetDeviceSpecsByID(devices...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -55,6 +58,16 @@ func (l *wrapper) GetSpec() (spec.Interface, error) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (l *wrapper) GetDeviceSpecsByID(devices ...string) ([]specs.Device, error) {
|
||||||
|
for _, device := range devices {
|
||||||
|
if device != "all" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
return l.GetAllDeviceSpecs()
|
||||||
|
}
|
||||||
|
return l.Interface.GetDeviceSpecsByID(devices...)
|
||||||
|
}
|
||||||
|
|
||||||
// GetAllDeviceSpecs returns the device specs for all available devices.
|
// GetAllDeviceSpecs returns the device specs for all available devices.
|
||||||
func (l *wrapper) GetAllDeviceSpecs() ([]specs.Device, error) {
|
func (l *wrapper) GetAllDeviceSpecs() ([]specs.Device, error) {
|
||||||
return l.Interface.GetAllDeviceSpecs()
|
return l.Interface.GetAllDeviceSpecs()
|
||||||
|
Loading…
Reference in New Issue
Block a user