mirror of https://github.com/portainer/portainer
				
				
				
			feat(edge-config): support edge config for group EE-5962 (#10329)
							parent
							
								
									a66942aa5a
								
							
						
					
					
						commit
						54112b56f2
					
				| 
						 | 
				
			
			@ -49,8 +49,8 @@ func FilterDirForEntryFile(dirEntries []DirEntry, entryFile string) []DirEntry {
 | 
			
		|||
	return filteredDirEntries
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FilterDirForCompatibility returns the content of the entry file if agent version is less than 2.19.0
 | 
			
		||||
func FilterDirForCompatibility(dirEntries []DirEntry, entryFilePath, agentVersion string) (string, error) {
 | 
			
		||||
 | 
			
		||||
	if semver.Compare(fmt.Sprintf("v%s", agentVersion), "v2.19.0") == -1 {
 | 
			
		||||
		for _, dirEntry := range dirEntries {
 | 
			
		||||
			if dirEntry.IsFile {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,6 +9,39 @@ import (
 | 
			
		|||
	"github.com/portainer/portainer/api"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type MultiFilterArgs []struct {
 | 
			
		||||
	FilterKey  string
 | 
			
		||||
	FilterType portainer.PerDevConfigsFilterType
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MultiFilterDirForPerDevConfigs filers the given dirEntries with multiple filter args, returns the merged entries for the given device
 | 
			
		||||
func MultiFilterDirForPerDevConfigs(dirEntries []DirEntry, configPath string, multiFilterArgs MultiFilterArgs) []DirEntry {
 | 
			
		||||
	var filteredDirEntries []DirEntry
 | 
			
		||||
 | 
			
		||||
	for _, multiFilterArg := range multiFilterArgs {
 | 
			
		||||
		tmp := FilterDirForPerDevConfigs(dirEntries, multiFilterArg.FilterKey, configPath, multiFilterArg.FilterType)
 | 
			
		||||
		filteredDirEntries = append(filteredDirEntries, tmp...)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return deduplicate(filteredDirEntries)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func deduplicate(dirEntries []DirEntry) []DirEntry {
 | 
			
		||||
	var deduplicatedDirEntries []DirEntry
 | 
			
		||||
 | 
			
		||||
	marks := make(map[string]struct{})
 | 
			
		||||
 | 
			
		||||
	for _, dirEntry := range dirEntries {
 | 
			
		||||
		_, ok := marks[dirEntry.Name]
 | 
			
		||||
		if !ok {
 | 
			
		||||
			marks[dirEntry.Name] = struct{}{}
 | 
			
		||||
			deduplicatedDirEntries = append(deduplicatedDirEntries, dirEntry)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return deduplicatedDirEntries
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,91 @@
 | 
			
		|||
package filesystem
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	portainer "github.com/portainer/portainer/api"
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
	"testing"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestMultiFilterDirForPerDevConfigs(t *testing.T) {
 | 
			
		||||
	type args struct {
 | 
			
		||||
		dirEntries      []DirEntry
 | 
			
		||||
		configPath      string
 | 
			
		||||
		multiFilterArgs MultiFilterArgs
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	baseDirEntries := []DirEntry{
 | 
			
		||||
		{".env", "", true, 420},
 | 
			
		||||
		{"docker-compose.yaml", "", true, 420},
 | 
			
		||||
		{"configs", "", false, 420},
 | 
			
		||||
		{"configs/file1.conf", "", true, 420},
 | 
			
		||||
		{"configs/file2.conf", "", true, 420},
 | 
			
		||||
		{"configs/folder1", "", false, 420},
 | 
			
		||||
		{"configs/folder1/config1", "", true, 420},
 | 
			
		||||
		{"configs/folder2", "", false, 420},
 | 
			
		||||
		{"configs/folder2/config2", "", true, 420},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	tests := []struct {
 | 
			
		||||
		name string
 | 
			
		||||
		args args
 | 
			
		||||
		want []DirEntry
 | 
			
		||||
	}{
 | 
			
		||||
		{
 | 
			
		||||
			name: "filter file1",
 | 
			
		||||
			args: args{
 | 
			
		||||
				baseDirEntries,
 | 
			
		||||
				"configs",
 | 
			
		||||
				MultiFilterArgs{{"file1", portainer.PerDevConfigsTypeFile}},
 | 
			
		||||
			},
 | 
			
		||||
			want: []DirEntry{baseDirEntries[0], baseDirEntries[1], baseDirEntries[2], baseDirEntries[3]},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "filter folder1",
 | 
			
		||||
			args: args{
 | 
			
		||||
				baseDirEntries,
 | 
			
		||||
				"configs",
 | 
			
		||||
				MultiFilterArgs{{"folder1", portainer.PerDevConfigsTypeDir}},
 | 
			
		||||
			},
 | 
			
		||||
			want: []DirEntry{baseDirEntries[0], baseDirEntries[1], baseDirEntries[2], baseDirEntries[5], baseDirEntries[6]},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "filter file1 and folder1",
 | 
			
		||||
			args: args{
 | 
			
		||||
				baseDirEntries,
 | 
			
		||||
				"configs",
 | 
			
		||||
				MultiFilterArgs{{"folder1", portainer.PerDevConfigsTypeDir}},
 | 
			
		||||
			},
 | 
			
		||||
			want: []DirEntry{baseDirEntries[0], baseDirEntries[1], baseDirEntries[2], baseDirEntries[5], baseDirEntries[6]},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "filter file1 and file2",
 | 
			
		||||
			args: args{
 | 
			
		||||
				baseDirEntries,
 | 
			
		||||
				"configs",
 | 
			
		||||
				MultiFilterArgs{
 | 
			
		||||
					{"file1", portainer.PerDevConfigsTypeFile},
 | 
			
		||||
					{"file2", portainer.PerDevConfigsTypeFile},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			want: []DirEntry{baseDirEntries[0], baseDirEntries[1], baseDirEntries[2], baseDirEntries[3], baseDirEntries[4]},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "filter folder1 and folder2",
 | 
			
		||||
			args: args{
 | 
			
		||||
				baseDirEntries,
 | 
			
		||||
				"configs",
 | 
			
		||||
				MultiFilterArgs{
 | 
			
		||||
					{"folder1", portainer.PerDevConfigsTypeDir},
 | 
			
		||||
					{"folder2", portainer.PerDevConfigsTypeDir},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			want: []DirEntry{baseDirEntries[0], baseDirEntries[1], baseDirEntries[2], baseDirEntries[5], baseDirEntries[6], baseDirEntries[7], baseDirEntries[8]},
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, tt := range tests {
 | 
			
		||||
		t.Run(tt.name, func(t *testing.T) {
 | 
			
		||||
			assert.Equalf(t, tt.want, MultiFilterDirForPerDevConfigs(tt.args.dirEntries, tt.args.configPath, tt.args.multiFilterArgs), "MultiFilterDirForPerDevConfigs(%v, %v, %v)", tt.args.dirEntries, tt.args.configPath, tt.args.multiFilterArgs)
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue