Refactor Toml config handling

This change refactors the toml config file handlig for runtimes
such as containerd or crio. A toml.Loader is introduced that
encapsulates loading the required file.

This can be extended to allow other mechanisms for loading
loading the current config.

Signed-off-by: Evan Lezar <elezar@nvidia.com>
This commit is contained in:
Evan Lezar
2024-08-08 16:27:07 +02:00
parent 6c5f4eea63
commit bf2bdfd35e
20 changed files with 428 additions and 229 deletions

View File

@@ -20,11 +20,11 @@ import (
"fmt"
"testing"
"github.com/pelletier/go-toml"
testlog "github.com/sirupsen/logrus/hooks/test"
"github.com/stretchr/testify/require"
"github.com/NVIDIA/nvidia-container-toolkit/pkg/config/engine/containerd"
"github.com/NVIDIA/nvidia-container-toolkit/pkg/config/toml"
"github.com/NVIDIA/nvidia-container-toolkit/tools/container"
)
@@ -92,12 +92,12 @@ func TestUpdateV1ConfigDefaultRuntime(t *testing.T) {
useLegacyConfig: tc.legacyConfig,
}
config, err := toml.TreeFromMap(map[string]interface{}{})
cfg, err := toml.Empty.Load()
require.NoError(t, err, "%d: %v", i, tc)
v1 := &containerd.ConfigV1{
Logger: logger,
Tree: config,
Tree: cfg,
UseDefaultRuntimeName: !tc.legacyConfig,
RuntimeType: runtimeType,
}
@@ -240,12 +240,12 @@ func TestUpdateV1Config(t *testing.T) {
},
}
config, err := toml.TreeFromMap(map[string]interface{}{})
cfg, err := toml.Empty.Load()
require.NoError(t, err)
v1 := &containerd.ConfigV1{
Logger: logger,
Tree: config,
Tree: cfg,
UseDefaultRuntimeName: true,
RuntimeType: runtimeType,
ContainerAnnotations: []string{"cdi.k8s.io/*"},
@@ -257,7 +257,7 @@ func TestUpdateV1Config(t *testing.T) {
expected, err := toml.TreeFromMap(tc.expectedConfig)
require.NoError(t, err)
require.Equal(t, expected.String(), config.String())
require.Equal(t, expected.String(), cfg.String())
})
}
}
@@ -401,12 +401,12 @@ func TestUpdateV1ConfigWithRuncPresent(t *testing.T) {
},
}
config, err := toml.TreeFromMap(runcConfigMapV1("/runc-binary"))
cfg, err := toml.TreeFromMap(runcConfigMapV1("/runc-binary"))
require.NoError(t, err)
v1 := &containerd.ConfigV1{
Logger: logger,
Tree: config,
Tree: cfg,
UseDefaultRuntimeName: true,
RuntimeType: runtimeType,
ContainerAnnotations: []string{"cdi.k8s.io/*"},
@@ -418,7 +418,7 @@ func TestUpdateV1ConfigWithRuncPresent(t *testing.T) {
expected, err := toml.TreeFromMap(tc.expectedConfig)
require.NoError(t, err)
require.Equal(t, expected.String(), config.String())
require.Equal(t, expected.String(), cfg.String())
})
}
}
@@ -479,14 +479,14 @@ func TestRevertV1Config(t *testing.T) {
},
}
config, err := toml.TreeFromMap(tc.config)
cfg, err := toml.LoadMap(tc.config)
require.NoError(t, err, "%d: %v", i, tc)
expected, err := toml.TreeFromMap(tc.expected)
require.NoError(t, err, "%d: %v", i, tc)
v1 := &containerd.ConfigV1{
Tree: config,
Tree: cfg,
UseDefaultRuntimeName: true,
RuntimeType: runtimeType,
}
@@ -494,7 +494,7 @@ func TestRevertV1Config(t *testing.T) {
err = o.RevertConfig(v1)
require.NoError(t, err, "%d: %v", i, tc)
configContents, _ := toml.Marshal(config)
configContents, _ := toml.Marshal(cfg)
expectedContents, _ := toml.Marshal(expected)
require.Equal(t, string(expectedContents), string(configContents), "%d: %v", i, tc)

View File

@@ -20,11 +20,11 @@ import (
"fmt"
"testing"
"github.com/pelletier/go-toml"
testlog "github.com/sirupsen/logrus/hooks/test"
"github.com/stretchr/testify/require"
"github.com/NVIDIA/nvidia-container-toolkit/pkg/config/engine/containerd"
"github.com/NVIDIA/nvidia-container-toolkit/pkg/config/toml"
"github.com/NVIDIA/nvidia-container-toolkit/tools/container"
)
@@ -74,19 +74,19 @@ func TestUpdateV2ConfigDefaultRuntime(t *testing.T) {
},
}
config, err := toml.TreeFromMap(map[string]interface{}{})
cfg, err := toml.LoadMap(map[string]interface{}{})
require.NoError(t, err)
v2 := &containerd.Config{
Logger: logger,
Tree: config,
Tree: cfg,
RuntimeType: runtimeType,
}
err = o.UpdateConfig(v2)
require.NoError(t, err)
defaultRuntimeName := config.GetPath([]string{"plugins", "io.containerd.grpc.v1.cri", "containerd", "default_runtime_name"})
defaultRuntimeName := cfg.GetPath([]string{"plugins", "io.containerd.grpc.v1.cri", "containerd", "default_runtime_name"})
require.EqualValues(t, tc.expectedDefaultRuntimeName, defaultRuntimeName)
})
}
@@ -200,12 +200,12 @@ func TestUpdateV2Config(t *testing.T) {
runtimeType: runtimeType,
}
config, err := toml.TreeFromMap(map[string]interface{}{})
cfg, err := toml.LoadMap(map[string]interface{}{})
require.NoError(t, err)
v2 := &containerd.Config{
Logger: logger,
Tree: config,
Tree: cfg,
RuntimeType: o.runtimeType,
ContainerAnnotations: []string{"cdi.k8s.io/*"},
}
@@ -216,7 +216,7 @@ func TestUpdateV2Config(t *testing.T) {
expected, err := toml.TreeFromMap(tc.expectedConfig)
require.NoError(t, err)
require.Equal(t, expected.String(), config.String())
require.Equal(t, expected.String(), cfg.String())
})
}
@@ -355,12 +355,12 @@ func TestUpdateV2ConfigWithRuncPresent(t *testing.T) {
},
}
config, err := toml.TreeFromMap(runcConfigMapV2("/runc-binary"))
cfg, err := toml.LoadMap(runcConfigMapV2("/runc-binary"))
require.NoError(t, err)
v2 := &containerd.Config{
Logger: logger,
Tree: config,
Tree: cfg,
RuntimeType: runtimeType,
ContainerAnnotations: []string{"cdi.k8s.io/*"},
}
@@ -371,7 +371,7 @@ func TestUpdateV2ConfigWithRuncPresent(t *testing.T) {
expected, err := toml.TreeFromMap(tc.expectedConfig)
require.NoError(t, err)
require.Equal(t, expected.String(), config.String())
require.Equal(t, expected.String(), cfg.String())
})
}
}
@@ -427,21 +427,21 @@ func TestRevertV2Config(t *testing.T) {
},
}
config, err := toml.TreeFromMap(tc.config)
cfg, err := toml.LoadMap(tc.config)
require.NoError(t, err)
expected, err := toml.TreeFromMap(tc.expected)
require.NoError(t, err)
v2 := &containerd.Config{
Tree: config,
Tree: cfg,
RuntimeType: runtimeType,
}
err = o.RevertConfig(v2)
require.NoError(t, err)
configContents, _ := toml.Marshal(config)
configContents, _ := toml.Marshal(cfg)
expectedContents, _ := toml.Marshal(expected)
require.Equal(t, string(expectedContents), string(configContents))

View File

@@ -25,6 +25,7 @@ import (
"github.com/NVIDIA/nvidia-container-toolkit/internal/info"
"github.com/NVIDIA/nvidia-container-toolkit/pkg/config/engine/containerd"
"github.com/NVIDIA/nvidia-container-toolkit/pkg/config/toml"
"github.com/NVIDIA/nvidia-container-toolkit/tools/container"
)
@@ -189,6 +190,7 @@ func Setup(c *cli.Context, o *options) error {
cfg, err := containerd.New(
containerd.WithPath(o.Config),
containerd.WithConfigSource(toml.FromFile(o.Config)),
containerd.WithRuntimeType(o.runtimeType),
containerd.WithUseLegacyConfig(o.useLegacyConfig),
containerd.WithContainerAnnotations(o.containerAnnotationsFromCDIPrefixes()...),
@@ -218,6 +220,7 @@ func Cleanup(c *cli.Context, o *options) error {
cfg, err := containerd.New(
containerd.WithPath(o.Config),
containerd.WithConfigSource(toml.FromFile(o.Config)),
containerd.WithRuntimeType(o.runtimeType),
containerd.WithUseLegacyConfig(o.useLegacyConfig),
containerd.WithContainerAnnotations(o.containerAnnotationsFromCDIPrefixes()...),