From 0f7aba9c3c1346ce10955780cc6f36a17d6d77f2 Mon Sep 17 00:00:00 2001 From: Tariq Ibrahim Date: Tue, 22 Oct 2024 18:20:52 -0700 Subject: [PATCH] [TOML ConfigSource] add support for executing fallback CLI commands Signed-off-by: Tariq Ibrahim Co-authored-by: Evan Lezar --- pkg/config/engine/containerd/containerd.go | 3 +- pkg/config/engine/crio/crio.go | 6 ++-- pkg/config/toml/list.go | 41 ++++++++++++++++++++++ pkg/config/toml/source.go | 8 ++--- 4 files changed, 50 insertions(+), 8 deletions(-) create mode 100644 pkg/config/toml/list.go diff --git a/pkg/config/engine/containerd/containerd.go b/pkg/config/engine/containerd/containerd.go index 43ff44a7..a5b08810 100644 --- a/pkg/config/engine/containerd/containerd.go +++ b/pkg/config/engine/containerd/containerd.go @@ -128,8 +128,7 @@ func (c *Config) GetRuntimeConfig(name string) (engine.RuntimeConfig, error) { // CommandLineSource returns the CLI-based containerd config loader func CommandLineSource(hostRoot string) toml.Loader { - commandLine := chrootIfRequired(hostRoot, "containerd", "config", "dump") - return toml.FromCommandLine(commandLine[0], commandLine[1:]...) + return toml.FromCommandLine(chrootIfRequired(hostRoot, "containerd", "config", "dump")...) } func chrootIfRequired(hostRoot string, commandLine ...string) []string { diff --git a/pkg/config/engine/crio/crio.go b/pkg/config/engine/crio/crio.go index ce9c37ff..3d5629d7 100644 --- a/pkg/config/engine/crio/crio.go +++ b/pkg/config/engine/crio/crio.go @@ -155,8 +155,10 @@ func (c *Config) GetRuntimeConfig(name string) (engine.RuntimeConfig, error) { // CommandLineSource returns the CLI-based crio config loader func CommandLineSource(hostRoot string) toml.Loader { - commandLine := chrootIfRequired(hostRoot, "crio", "status", "config") - return toml.FromCommandLine(commandLine[0], commandLine[1:]...) + return toml.LoadFirst( + toml.FromCommandLine(chrootIfRequired(hostRoot, "crio", "status", "config")...), + toml.FromCommandLine(chrootIfRequired(hostRoot, "crio-status", "config")...), + ) } func chrootIfRequired(hostRoot string, commandLine ...string) []string { diff --git a/pkg/config/toml/list.go b/pkg/config/toml/list.go new file mode 100644 index 00000000..324fd841 --- /dev/null +++ b/pkg/config/toml/list.go @@ -0,0 +1,41 @@ +/** +# 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 + +import "errors" + +type firstOf []Loader + +func LoadFirst(loaders ...Loader) Loader { + return firstOf(loaders) +} + +func (loaders firstOf) Load() (*Tree, error) { + var errs error + for _, loader := range loaders { + if loader == nil { + continue + } + tree, err := loader.Load() + if err != nil { + errs = errors.Join(errs, err) + continue + } + return tree, nil + } + return nil, errs +} diff --git a/pkg/config/toml/source.go b/pkg/config/toml/source.go index 5cb0b7fe..08907764 100644 --- a/pkg/config/toml/source.go +++ b/pkg/config/toml/source.go @@ -36,12 +36,12 @@ func FromFile(path string) Loader { // FromCommandLine creates a TOML source from the output of a shell command and its corresponding args. // If the command is empty, an empty config is returned. -func FromCommandLine(cmd string, args ...string) Loader { - if len(cmd) == 0 { +func FromCommandLine(cmds ...string) Loader { + if len(cmds) == 0 { return Empty } return &tomlCliSource{ - command: cmd, - args: args, + command: cmds[0], + args: cmds[1:], } }