From 256637249b5e69716f3937187f22efa721acb1e8 Mon Sep 17 00:00:00 2001 From: Angelos Kolaitis Date: Sat, 3 Feb 2024 15:26:59 +0200 Subject: [PATCH] Fix config import relative path glob Previously, resolveImports would apply a glob filter if the path contained any '*', or otherwise convert relative paths to absolute. This meant that it was impossible to specify globs with paths relative to the main config file. This commit first resolves relative to absolute paths, then applies the glob filter (if any). A test case is added to ensure that this now works as expected. Signed-off-by: Angelos Kolaitis --- cmd/containerd/server/config/config.go | 10 +++++----- cmd/containerd/server/config/config_test.go | 11 +++++++++++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/cmd/containerd/server/config/config.go b/cmd/containerd/server/config/config.go index 87eb321a4..7a8d4b6a1 100644 --- a/cmd/containerd/server/config/config.go +++ b/cmd/containerd/server/config/config.go @@ -375,6 +375,11 @@ func resolveImports(parent string, imports []string) ([]string, error) { var out []string for _, path := range imports { + path = filepath.Clean(path) + if !filepath.IsAbs(path) { + path = filepath.Join(filepath.Dir(parent), path) + } + if strings.Contains(path, "*") { matches, err := filepath.Glob(path) if err != nil { @@ -383,11 +388,6 @@ func resolveImports(parent string, imports []string) ([]string, error) { out = append(out, matches...) } else { - path = filepath.Clean(path) - if !filepath.IsAbs(path) { - path = filepath.Join(filepath.Dir(parent), path) - } - out = append(out, path) } } diff --git a/cmd/containerd/server/config/config_test.go b/cmd/containerd/server/config/config_test.go index 817e82028..10fbda098 100644 --- a/cmd/containerd/server/config/config_test.go +++ b/cmd/containerd/server/config/config_test.go @@ -104,6 +104,17 @@ func TestResolveImports(t *testing.T) { filepath.Join(tempDir, "test.toml"), filepath.Join(tempDir, "current.toml"), }) + + t.Run("GlobRelativePath", func(t *testing.T) { + imports, err := resolveImports(filepath.Join(tempDir, "root.toml"), []string{ + "config_*.toml", // Glob files from working dir + }) + assert.NoError(t, err) + assert.Equal(t, imports, []string{ + filepath.Join(tempDir, "config_1.toml"), + filepath.Join(tempDir, "config_2.toml"), + }) + }) } func TestLoadSingleConfig(t *testing.T) {