master
go 78 lines 1.94 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package jobmgr
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 (m *Manager) affectedJobs(key string) []secretstore.JobRef {
14 if m == nil || m.secretStoreDeps == nil {
15 return nil
16 }
17
18 exposed, _ := m.secretStoreDeps.Impacted(key)
19 return exposed
20 }
21
22 func (m *Manager) restartableAffectedJobs(key string) []secretstore.JobRef {
23 if m == nil || m.secretStoreDeps == nil {
24 return nil
25 }
26
27 exposed, _ := m.secretStoreDeps.Impacted(key)
28 refs := make([]secretstore.JobRef, 0, len(exposed))
29 for _, job := range exposed {
30 entry, ok := m.lookupExposedByFullName(job.ID)
31 if !ok {
32 continue
33 }
34 switch entry.Status {
35 case dyncfg.StatusRunning, dyncfg.StatusFailed:
36 refs = append(refs, job)
37 }
38 }
39 return refs
40 }
41
42 type secretStoreRestartFailure struct {
43 ref secretstore.JobRef
44 err error
45 }
46
47 func (m *Manager) restartDependentJobs(key string) string {
48 failures := m.restartDependentJobsBestEffort(key)
49 if len(failures) == 0 {
50 return ""
51 }
52
53 parts := make([]string, 0, len(failures))
54 for _, failure := range failures {
55 name := failure.ref.Display
56 if name == "" {
57 name = failure.ref.ID
58 }
59 parts = append(parts, fmt.Sprintf("%s (%v)", name, failure.err))
60 }
61
62 return fmt.Sprintf("Secretstore change applied, but dependent collector restarts failed: %s.", strings.Join(parts, "; "))
63 }
64
65 func (m *Manager) restartDependentJobsBestEffort(key string) []secretStoreRestartFailure {
66 if m == nil {
67 return nil
68 }
69
70 var failures []secretStoreRestartFailure
71 for _, job := range m.restartableAffectedJobs(key) {
72 if err := m.restartDependentCollectorJob(job.ID); err != nil {
73 m.Warningf("dyncfg: secretstore: failed to restart dependent job '%s' after store '%s' change: %v", job.ID, key, err)
74 failures = append(failures, secretStoreRestartFailure{ref: job, err: err})
75 }
76 }
77 return failures
78 }