@cryptotaxi247 / netdata-1 / commits / 6e7fa53a2

fix(go.d/secretsctl): handle userconfig for job IDs (#22081)

Ilya Mashchenko committed Mar 30, 2026 at 10:34 UTC 6e7fa53a278e41d51796b5c6c13f556483f3c9d0
3 files changed +24 -17
src/go/plugin/agent/jobmgr/dyncfg_secretstore_test.go
+1 -1
@@ -48,7 +48,7 @@ func TestDyncfgSecretStoreSeqExec(t *testing.T) {
48 assert.Equal(t, dyncfg.StatusRunning, entry.Status)
49 _, ok = mustSecretStoreService(t, mgr).GetStatus(secretstore.StoreKey(secretstore.KindVault, "vault_prod"))
50 assert.True(t, ok)
51 - assert.Contains(t, out.String(), "schema get update test remove")
51 + assert.Contains(t, out.String(), "schema get update test userconfig remove")
52 assert.NotContains(t, out.String(), "enable")
53 assert.NotContains(t, out.String(), "disable")
54
src/go/plugin/agent/jobmgr/secretsctl/controller.go
+1
@@ -92,6 +92,7 @@ func New(opts Options) *Controller {
92 dyncfg.CommandGet,
93 dyncfg.CommandUpdate,
94 dyncfg.CommandTest,
95 + dyncfg.CommandUserconfig,
96 },
97 })
98 return c
src/go/plugin/agent/jobmgr/secretsctl/dyncfg.go
+22 -16
@@ -106,19 +106,10 @@ func (c *Controller) dyncfgCmdAdd(fn dyncfg.Function) {
106 }
107
108 func (c *Controller) dyncfgCmdSchema(fn dyncfg.Function) {
109 - kind, ok := c.dyncfgExtractSecretStoreKindFromTemplateID(fn.ID())
110 - if !ok {
111 - storeKey, ok := c.dyncfgExtractSecretStoreKey(fn.ID())
112 - if !ok {
113 - c.api.SendCodef(fn, 400, "Invalid ID format for secretstore schema: %s.", fn.ID())
114 - return
115 - }
116 - entry, ok := c.lookup(storeKey)
117 - if !ok {
118 - c.api.SendCodef(fn, 404, "The specified secretstore '%s' is not configured.", storeKey)
119 - return
120 - }
121 - kind = entry.Cfg.Kind()
109 + kind, err := c.dyncfgResolveSecretStoreKind(fn.ID())
110 + if err != nil {
111 + c.api.SendCodef(fn, secretStoreErrorCode(err), "%v", err)
112 + return
113 }
114
115 schema, ok := c.service.Schema(kind)
@@ -201,9 +192,9 @@ func (c *Controller) dyncfgCmdTest(fn dyncfg.Function) {
192 }
193
194 func (c *Controller) dyncfgCmdUserconfig(fn dyncfg.Function) {
204 - kind, ok := c.dyncfgExtractSecretStoreKindFromTemplateID(fn.ID())
205 - if !ok {
206 - c.api.SendCodef(fn, 400, "Invalid template ID for secretstore userconfig: %s.", fn.ID())
195 + kind, err := c.dyncfgResolveSecretStoreKind(fn.ID())
196 + if err != nil {
197 + c.api.SendCodef(fn, secretStoreErrorCode(err), "%v", err)
198 return
199 }
200 if err := fn.ValidateHasPayload(); err != nil {
@@ -290,6 +281,21 @@ func (c *Controller) dyncfgNewTypedConfig(kind secretstore.StoreKind) (any, erro
281 return cfg, nil
282 }
283
284 +func (c *Controller) dyncfgResolveSecretStoreKind(id string) (secretstore.StoreKind, error) {
285 + if kind, ok := c.dyncfgExtractSecretStoreKindFromTemplateID(id); ok {
286 + return kind, nil
287 + }
288 + storeKey, ok := c.dyncfgExtractSecretStoreKey(id)
289 + if !ok {
290 + return "", fmt.Errorf("invalid secretstore ID format: %s", id)
291 + }
292 + entry, ok := c.lookup(storeKey)
293 + if !ok {
294 + return "", fmt.Errorf("%w: %s", secretstore.ErrStoreNotFound, storeKey)
295 + }
296 + return entry.Cfg.Kind(), nil
297 +}
298 +
299 func (c *Controller) dyncfgExtractSecretStoreKindFromTemplateID(id string) (secretstore.StoreKind, bool) {
300 return c.cb.deps.extractSecretStoreKindFromTemplateID(id)
301 }