diff --git a/api/filesystem/serialize_per_dev_configs.go b/api/filesystem/serialize_per_dev_configs.go index c9d02ad0d..55881885a 100644 --- a/api/filesystem/serialize_per_dev_configs.go +++ b/api/filesystem/serialize_per_dev_configs.go @@ -44,11 +44,10 @@ func deduplicate(dirEntries []DirEntry) []DirEntry { // FilterDirForPerDevConfigs filers the given dirEntries, returns entries for the given device // For given configPath A/B/C, return entries: -// 1. all entries outside of dir A -// 2. dir entries A, A/B, A/B/C -// 3. For filterType file: +// 1. all entries outside of dir A/B/C +// 2. For filterType file: // file entries: A/B/C/ and A/B/C/.* -// 4. For filterType dir: +// 3. For filterType dir: // dir entry: A/B/C/ // all entries: A/B/C//* func FilterDirForPerDevConfigs(dirEntries []DirEntry, deviceName, configPath string, filterType portainer.PerDevConfigsFilterType) []DirEntry { @@ -66,12 +65,7 @@ func FilterDirForPerDevConfigs(dirEntries []DirEntry, deviceName, configPath str func shouldIncludeEntry(dirEntry DirEntry, deviceName, configPath string, filterType portainer.PerDevConfigsFilterType) bool { // Include all entries outside of dir A - if !isInConfigRootDir(dirEntry, configPath) { - return true - } - - // Include dir entries A, A/B, A/B/C - if isParentDir(dirEntry, configPath) { + if !isInConfigDir(dirEntry, configPath) { return true } @@ -90,21 +84,9 @@ func shouldIncludeEntry(dirEntry DirEntry, deviceName, configPath string, filter return false } -func isInConfigRootDir(dirEntry DirEntry, configPath string) bool { - // get the first element of the configPath - rootDir := strings.Split(configPath, string(os.PathSeparator))[0] - - // return true if entry name starts with "A/" - return strings.HasPrefix(dirEntry.Name, appendTailSeparator(rootDir)) -} - -func isParentDir(dirEntry DirEntry, configPath string) bool { - if dirEntry.IsFile { - return false - } - - // return true for dir entries A, A/B, A/B/C - return strings.HasPrefix(appendTailSeparator(configPath), appendTailSeparator(dirEntry.Name)) +func isInConfigDir(dirEntry DirEntry, configPath string) bool { + // return true if entry name starts with "A/B" + return strings.HasPrefix(dirEntry.Name, appendTailSeparator(configPath)) } func shouldIncludeFile(dirEntry DirEntry, deviceName, configPath string) bool { diff --git a/api/filesystem/serialize_per_dev_configs_test.go b/api/filesystem/serialize_per_dev_configs_test.go index 6a2a5f33b..55a1a4643 100644 --- a/api/filesystem/serialize_per_dev_configs_test.go +++ b/api/filesystem/serialize_per_dev_configs_test.go @@ -90,3 +90,24 @@ func TestMultiFilterDirForPerDevConfigs(t *testing.T) { }) } } + +func TestIsInConfigDir(t *testing.T) { + f := func(dirEntry DirEntry, configPath string, expect bool) { + t.Helper() + + actual := isInConfigDir(dirEntry, configPath) + assert.Equal(t, expect, actual) + } + + f(DirEntry{Name: "edge-configs"}, "edge-configs", false) + f(DirEntry{Name: "edge-configs_backup"}, "edge-configs", false) + f(DirEntry{Name: "edge-configs/standalone-edge-agent-standard"}, "edge-configs", true) + f(DirEntry{Name: "parent/edge-configs/"}, "edge-configs", false) + f(DirEntry{Name: "edgestacktest"}, "edgestacktest/edge-configs", false) + f(DirEntry{Name: "edgestacktest/edgeconfigs-test.yaml"}, "edgestacktest/edge-configs", false) + f(DirEntry{Name: "edgestacktest/file1.conf"}, "edgestacktest/edge-configs", false) + f(DirEntry{Name: "edgeconfigs-test.yaml"}, "edgestacktest/edge-configs", false) + f(DirEntry{Name: "edgestacktest/edge-configs"}, "edgestacktest/edge-configs", false) + f(DirEntry{Name: "edgestacktest/edge-configs/standalone-edge-agent-async"}, "edgestacktest/edge-configs", true) + f(DirEntry{Name: "edgestacktest/edge-configs/abc.txt"}, "edgestacktest/edge-configs", true) +}