diff --git a/pkg/config/engine/api.go b/pkg/config/engine/api.go index bc6c4a68..8c7d1b50 100644 --- a/pkg/config/engine/api.go +++ b/pkg/config/engine/api.go @@ -18,12 +18,13 @@ package engine // Interface defines the API for a runtime config updater. type Interface interface { - DefaultRuntime() string AddRuntime(string, string, bool) error - Set(string, interface{}) + DefaultRuntime() string + GetRuntimeConfig(string) (RuntimeConfig, error) RemoveRuntime(string) error Save(string) (int64, error) - GetRuntimeConfig(string) (RuntimeConfig, error) + Set(string, interface{}) + String() string } // RuntimeConfig defines the interface to query container runtime handler configuration diff --git a/pkg/config/engine/containerd/config_v1_test.go b/pkg/config/engine/containerd/config_v1_test.go index 787ab30b..ca82032a 100644 --- a/pkg/config/engine/containerd/config_v1_test.go +++ b/pkg/config/engine/containerd/config_v1_test.go @@ -200,20 +200,21 @@ func TestAddRuntimeV1(t *testing.T) { for _, tc := range testCases { t.Run(tc.description, func(t *testing.T) { - cfg, err := toml.Load(tc.config) - require.NoError(t, err) expectedConfig, err := toml.Load(tc.expectedConfig) require.NoError(t, err) - c := &ConfigV1{ - Logger: logger, - Tree: cfg, - } + c, err := New( + WithLogger(logger), + WithConfigSource(toml.FromString(tc.config)), + WithUseLegacyConfig(true), + WithRuntimeType(""), + ) + require.NoError(t, err) err = c.AddRuntime("test", "/usr/bin/test", tc.setAsDefault) require.NoError(t, err) - require.EqualValues(t, expectedConfig.String(), cfg.String()) + require.EqualValues(t, expectedConfig.String(), c.String()) }) } } diff --git a/pkg/config/engine/containerd/config_v2_test.go b/pkg/config/engine/containerd/config_v2_test.go index a9e0c3be..6304e210 100644 --- a/pkg/config/engine/containerd/config_v2_test.go +++ b/pkg/config/engine/containerd/config_v2_test.go @@ -46,7 +46,7 @@ func TestAddRuntime(t *testing.T) { privileged_without_host_devices = false runtime_engine = "" runtime_root = "" - runtime_type = "" + runtime_type = "io.containerd.runc.v2" [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.test.options] BinaryName = "/usr/bin/test" `, @@ -199,20 +199,19 @@ func TestAddRuntime(t *testing.T) { for _, tc := range testCases { t.Run(tc.description, func(t *testing.T) { - cfg, err := toml.Load(tc.config) - require.NoError(t, err) expectedConfig, err := toml.Load(tc.expectedConfig) require.NoError(t, err) - c := &Config{ - Logger: logger, - Tree: cfg, - } + c, err := New( + WithLogger(logger), + WithConfigSource(toml.FromString(tc.config)), + ) + require.NoError(t, err) err = c.AddRuntime("test", "/usr/bin/test", tc.setAsDefault) require.NoError(t, err) - require.EqualValues(t, expectedConfig.String(), cfg.String()) + require.EqualValues(t, expectedConfig.String(), c.String()) }) } } @@ -299,13 +298,13 @@ func TestGetRuntimeConfig(t *testing.T) { for _, tc := range testCases { t.Run(tc.description, func(t *testing.T) { - cfg, err := toml.Load(config) + + c, err := New( + WithLogger(logger), + WithConfigSource(toml.FromString(config)), + ) require.NoError(t, err) - c := &Config{ - Logger: logger, - Tree: cfg, - } rc, err := c.GetRuntimeConfig(tc.runtime) require.Equal(t, tc.expectedError, err) require.Equal(t, tc.expected, rc.GetBinaryPath()) diff --git a/pkg/config/engine/docker/docker.go b/pkg/config/engine/docker/docker.go index 6ea64f06..eda700d0 100644 --- a/pkg/config/engine/docker/docker.go +++ b/pkg/config/engine/docker/docker.go @@ -166,3 +166,13 @@ func (c *Config) GetRuntimeConfig(name string) (engine.RuntimeConfig, error) { } return &dockerRuntime{}, nil } + +// String returns the string representation of the JSON config. +func (c Config) String() string { + output, err := json.MarshalIndent(c, "", " ") + if err != nil { + return fmt.Sprintf("invalid JSON: %v", err) + } + + return string(output) +} diff --git a/pkg/config/toml/source-string.go b/pkg/config/toml/source-string.go new file mode 100644 index 00000000..72d4cc6d --- /dev/null +++ b/pkg/config/toml/source-string.go @@ -0,0 +1,26 @@ +/** +# Copyright 2024 NVIDIA CORPORATION +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +**/ + +package toml + +type tomlString string + +var _ Loader = (*tomlFile)(nil) + +// Load loads the contents of the specified TOML file as a map. +func (l tomlString) Load() (*Tree, error) { + return Load(string(l)) +} diff --git a/pkg/config/toml/source.go b/pkg/config/toml/source.go index 08907764..90cae913 100644 --- a/pkg/config/toml/source.go +++ b/pkg/config/toml/source.go @@ -45,3 +45,12 @@ func FromCommandLine(cmds ...string) Loader { args: cmds[1:], } } + +// FromString creates a TOML source for the specified contents. +// If an empty string is passed an empty toml config is used. +func FromString(contents string) Loader { + if contents == "" { + return Empty + } + return tomlString(contents) +}