master
go 132 lines 3.83 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package secretstore_test
4
5 import (
6 "os"
7 "path/filepath"
8 "strings"
9 "testing"
10
11 "github.com/netdata/netdata/go/plugins/plugin/agent/secrets/secretstore"
12 "github.com/netdata/netdata/go/plugins/plugin/framework/confgroup"
13 "github.com/stretchr/testify/assert"
14 "github.com/stretchr/testify/require"
15 )
16
17 func TestLoadFileConfigs(t *testing.T) {
18 t.Run("loads user and stock roots with filename defaults", func(t *testing.T) {
19 base := t.TempDir()
20 userRoot := filepath.Join(base, "etc", "netdata", "go.d")
21 stockRoot := filepath.Join(base, "usr", "lib", "netdata", "conf.d", "go.d")
22
23 mustWriteSecretStoreConfigFile(t, filepath.Join(userRoot, "ss", "vault.conf"), `
24 jobs:
25 - name: vault_prod
26 mode: token
27 mode_token:
28 token: vault-token
29 addr: https://vault.example
30 `)
31 mustWriteSecretStoreConfigFile(t, filepath.Join(userRoot, "ss", "azure-kv.yaml"), `
32 jobs:
33 - name: azure_prod
34 mode: managed_identity
35 `)
36 mustWriteSecretStoreConfigFile(t, filepath.Join(stockRoot, "ss", "aws-sm.conf"), `
37 jobs:
38 - name: aws_prod
39 auth_mode: env
40 region: us-east-1
41 `)
42 mustWriteSecretStoreConfigFile(t, filepath.Join(stockRoot, "ss", "gcp-sm.yml"), `
43 jobs:
44 - name: gcp_prod
45 mode: metadata
46 `)
47
48 cfgs, errs := secretstore.LoadFileConfigs([]string{userRoot, stockRoot})
49 require.Empty(t, errs)
50 require.Len(t, cfgs, 4)
51
52 assert.Equal(t, secretstore.KindAzureKV, cfgs[0].Kind())
53 assert.Equal(t, confgroup.TypeUser, cfgs[0].SourceType())
54 assert.Contains(t, cfgs[0].Source(), "file="+filepath.Join(userRoot, "ss", "azure-kv.yaml"))
55
56 assert.Equal(t, secretstore.KindVault, cfgs[1].Kind())
57 assert.Equal(t, confgroup.TypeUser, cfgs[1].SourceType())
58
59 assert.Equal(t, secretstore.KindAWSSM, cfgs[2].Kind())
60 assert.Equal(t, confgroup.TypeStock, cfgs[2].SourceType())
61
62 assert.Equal(t, secretstore.KindGCPSM, cfgs[3].Kind())
63 assert.Equal(t, confgroup.TypeStock, cfgs[3].SourceType())
64 })
65
66 t.Run("keeps explicit kind and allows unknown file stem", func(t *testing.T) {
67 base := t.TempDir()
68 userRoot := filepath.Join(base, "etc", "netdata", "go.d")
69
70 mustWriteSecretStoreConfigFile(t, filepath.Join(userRoot, "ss", "custom.conf"), `
71 jobs:
72 - name: explicit_kind
73 kind: vault
74 mode: token
75 mode_token:
76 token: vault-token
77 addr: https://vault.example
78 - name: inferred_kind
79 mode: token
80 mode_token:
81 token: custom-token
82 addr: https://vault.example
83 `)
84
85 cfgs, errs := secretstore.LoadFileConfigs([]string{userRoot})
86 require.Empty(t, errs)
87 require.Len(t, cfgs, 2)
88 assert.Equal(t, secretstore.KindVault, cfgs[0].Kind())
89 assert.Equal(t, secretstore.StoreKind("custom"), cfgs[1].Kind())
90 })
91
92 t.Run("skips malformed files and non-keyable jobs", func(t *testing.T) {
93 base := t.TempDir()
94 userRoot := filepath.Join(base, "etc", "netdata", "go.d")
95
96 mustWriteSecretStoreConfigFile(t, filepath.Join(userRoot, "ss", "vault.conf"), `
97 jobs:
98 - mode: token
99 mode_token:
100 token: missing-name
101 addr: https://vault.example
102 - name: vault_prod
103 mode: token
104 mode_token:
105 token: vault-token
106 addr: https://vault.example
107 `)
108 mustWriteSecretStoreConfigFile(t, filepath.Join(userRoot, "ss", "gcp-sm.conf"), `
109 jobs:
110 - name: gcp_prod
111 mode: [
112 `)
113
114 cfgs, errs := secretstore.LoadFileConfigs([]string{userRoot})
115 require.Len(t, cfgs, 1)
116 assert.Equal(t, "vault_prod", cfgs[0].Name())
117 assert.Len(t, errs, 2)
118 var messages []string
119 for _, err := range errs {
120 messages = append(messages, err.Error())
121 }
122 joined := strings.Join(messages, "\n")
123 assert.Contains(t, joined, "store name is required")
124 assert.Contains(t, joined, "secretstore file config")
125 })
126 }
127
128 func mustWriteSecretStoreConfigFile(t *testing.T, path, content string) {
129 t.Helper()
130 require.NoError(t, os.MkdirAll(filepath.Dir(path), 0o755))
131 require.NoError(t, os.WriteFile(path, []byte(content), 0o644))
132 }