master
go 131 lines 3.46 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package secretsctl
4
5 import (
6 "fmt"
7 "strings"
8
9 "github.com/netdata/netdata/go/plugins/plugin/agent/secrets/secretstore"
10 "github.com/netdata/netdata/go/plugins/plugin/framework/dyncfg"
11 )
12
13 func (c *Controller) Lookup(key string) (Entry, bool) {
14 entry, ok := c.lookup(key)
15 if !ok {
16 return Entry{}, false
17 }
18 return entry, true
19 }
20
21 func (c *Controller) lookup(key string) (Entry, bool) {
22 entry, ok := c.lookupInternal(key)
23 if !ok {
24 return Entry{}, false
25 }
26 return entryFromDyncfg(entry), true
27 }
28
29 func (c *Controller) lookupInternal(key string) (*dyncfg.Entry[secretstore.Config], bool) {
30 if strings.TrimSpace(key) == "" || c.exposed == nil {
31 return nil, false
32 }
33 return c.exposed.LookupByKey(key)
34 }
35
36 func (c *Controller) RememberDiscoveredConfig(cfg secretstore.Config) (Entry, bool, error) {
37 entry, changed, err := c.rememberDiscoveredConfig(cfg)
38 if err != nil || !changed || entry == nil {
39 return Entry{}, changed, err
40 }
41 return entryFromDyncfg(entry), true, nil
42 }
43
44 func (c *Controller) rememberDiscoveredConfig(cfg secretstore.Config) (*dyncfg.Entry[secretstore.Config], bool, error) {
45 if err := c.validateConfig(cfg); err != nil {
46 return nil, false, err
47 }
48
49 c.handler.RememberDiscoveredConfig(cfg)
50
51 entry, ok := c.lookupInternal(cfg.ExposedKey())
52 if !ok {
53 entry = c.handler.AddDiscoveredConfig(cfg, dyncfg.StatusAccepted)
54 c.handler.NotifyJobCreate(cfg, dyncfg.StatusAccepted)
55 return entry, true, nil
56 }
57
58 sp, ep := cfg.SourceTypePriority(), entry.Cfg.SourceTypePriority()
59 if ep > sp || (ep == sp && entry.Status == dyncfg.StatusRunning) {
60 return entry, false, nil
61 }
62
63 if entry.Status == dyncfg.StatusRunning || entry.Status == dyncfg.StatusFailed {
64 c.cb.Stop(entry.Cfg)
65 c.cb.TakeCommandMessage()
66 }
67
68 entry = c.handler.AddDiscoveredConfig(cfg, dyncfg.StatusAccepted)
69 c.handler.NotifyJobCreate(cfg, dyncfg.StatusAccepted)
70 return entry, true, nil
71 }
72
73 func (c *Controller) RemoveDiscoveredConfig(cfg secretstore.Config) (Entry, bool) {
74 entry, ok := c.removeDiscoveredConfig(cfg)
75 if !ok || entry == nil {
76 return Entry{}, false
77 }
78 return entryFromDyncfg(entry), true
79 }
80
81 func (c *Controller) removeDiscoveredConfig(cfg secretstore.Config) (*dyncfg.Entry[secretstore.Config], bool) {
82 entry, ok := c.handler.RemoveDiscoveredConfig(cfg)
83 if !ok {
84 return nil, false
85 }
86
87 c.cb.Stop(entry.Cfg)
88 c.cb.TakeCommandMessage()
89 c.handler.NotifyJobRemove(entry.Cfg)
90 return entry, true
91 }
92
93 func (c *Controller) validateConfig(cfg secretstore.Config) error {
94 if err := cfg.Validate(); err != nil {
95 return err
96 }
97 if c.service == nil {
98 return fmt.Errorf("secretstore service is not available")
99 }
100 return c.service.Validate(secretStoreResolveContext(c.Logger, cfg), cfg)
101 }
102
103 func (c *Controller) validateStored(key string) error {
104 entry, ok := c.lookupInternal(key)
105 if !ok {
106 return secretstore.ErrStoreNotFound
107 }
108 if c.service == nil {
109 return fmt.Errorf("secretstore service is not available")
110 }
111
112 if _, ok := c.service.GetStatus(key); ok {
113 return c.service.ValidateStored(secretStoreResolveContextForKey(c.Logger, key, entry.Cfg.Kind(), entry.Cfg.Name()), key)
114 }
115
116 return c.validateConfig(entry.Cfg)
117 }
118
119 func (c *Controller) affectedJobsFor(storeKey string) []secretstore.JobRef {
120 if c.affectedJobs == nil {
121 return nil
122 }
123 return c.affectedJobs(storeKey)
124 }
125
126 func (c *Controller) restartableAffectedJobsFor(storeKey string) []secretstore.JobRef {
127 if c.restartableAffectedJobs == nil {
128 return nil
129 }
130 return c.restartableAffectedJobs(storeKey)
131 }