add configuration for CDI

Signed-off-by: Ed Bartosh <eduard.bartosh@intel.com>
This commit is contained in:
Ed Bartosh 2022-02-21 21:56:48 +02:00
parent aed0538dac
commit c9b4ccf83e
6 changed files with 26 additions and 5 deletions

View File

@ -328,7 +328,7 @@ func WithoutRefreshedMetadata(i *InfoConfig) {
}
// WithCDI updates OCI spec with CDI content
func WithCDI(s *oci.Spec, annotations map[string]string) NewContainerOpts {
func WithCDI(s *oci.Spec, annotations map[string]string, cdiSpecDirs []string) NewContainerOpts {
return func(ctx context.Context, _ *Client, c *containers.Container) error {
// TODO: Once CRI is extended with native CDI support this will need to be updated...
_, cdiDevices, err := cdi.ParseAnnotations(annotations)
@ -339,7 +339,7 @@ func WithCDI(s *oci.Spec, annotations map[string]string) NewContainerOpts {
return nil
}
registry := cdi.GetRegistry()
registry := cdi.GetRegistry(cdi.WithSpecDirs(cdiSpecDirs...))
if err = registry.Refresh(); err != nil {
// We don't consider registry refresh failure a fatal error.
// For instance, a dynamically generated invalid CDI Spec file for

View File

@ -120,6 +120,14 @@ version = 2
# Note that currently default is set to disabled but target change it in future together with enable_unprivileged_ports
enable_unprivileged_icmp = false
# enable_cdi enables support of the Container Device Interface (CDI)
# For more details about CDI and the syntax of CDI Spec files please refer to
# https://github.com/container-orchestrated-devices/container-device-interface.
enable_cdi = false
# cdi_spec_dirs is the list of directories to scan for CDI spec files
cdi_spec_dirs = ["/etc/cdi", "/var/run/cdi"]
# 'plugins."io.containerd.grpc.v1.cri".containerd' contains config related to containerd
[plugins."io.containerd.grpc.v1.cri".containerd]

View File

@ -302,6 +302,13 @@ type PluginConfig struct {
// and if it is not overwritten by PodSandboxConfig
// Note that currently default is set to disabled but target change it in future together with EnableUnprivilegedPorts
EnableUnprivilegedICMP bool `toml:"enable_unprivileged_icmp" json:"enableUnprivilegedICMP"`
// EnableCDI indicates to enable injection of the Container Device Interface Specifications
// into the OCI config
// For more details about CDI and the syntax of CDI Spec files please refer to
// https://github.com/container-orchestrated-devices/container-device-interface.
EnableCDI bool `toml:"enable_cdi" json:"enableCDI"`
// CDISpecDirs is the list of directories to scan for Container Device Interface Specifications
CDISpecDirs []string `toml:"cdi_spec_dirs" json:"cdiSpecDirs"`
}
// X509KeyPairStreaming contains the x509 configuration for streaming

View File

@ -104,5 +104,7 @@ func DefaultConfig() PluginConfig {
ImageDecryption: ImageDecryption{
KeyModel: KeyModelNode,
},
EnableCDI: false,
CDISpecDirs: []string{"/etc/cdi", "/var/run/cdi"},
}
}

View File

@ -238,8 +238,12 @@ func (c *criService) CreateContainer(ctx context.Context, r *runtime.CreateConta
if err != nil {
return nil, fmt.Errorf("failed to get runtime options: %w", err)
}
if c.config.EnableCDI {
opts = append(opts, containerd.WithCDI(spec, config.Annotations, c.config.CDISpecDirs))
}
opts = append(opts,
containerd.WithCDI(spec, config.Annotations),
containerd.WithSpec(spec, specOpts...),
containerd.WithRuntime(sandboxInfo.Runtime.Name, runtimeOptions),
containerd.WithContainerLabels(containerLabels),

View File

@ -1507,7 +1507,7 @@ func writeFilesToTempDir(tmpDirPattern string, content []string) (string, error)
}
}
return dir, cdi.GetRegistry(cdi.WithSpecDirs(dir)).Refresh()
return dir, nil
}
func TestCDIInjections(t *testing.T) {
@ -1619,7 +1619,7 @@ containerEdits:
}
require.NoError(t, err)
injectFun := containerd.WithCDI(spec, test.annotations)
injectFun := containerd.WithCDI(spec, test.annotations, []string{cdiDir})
err = injectFun(nil, nil, nil)
assert.Equal(t, test.expectError, err != nil)