Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/pkg/operator/config/config_references.go
4096 views
1
package config
2
3
import (
4
"github.com/grafana/agent/pkg/util/structwalk"
5
prom "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
6
corev1 "k8s.io/api/core/v1"
7
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
8
)
9
10
// AssetReference is a namespaced Secret or ConfigMap selector.
11
type AssetReference struct {
12
Namespace string
13
Reference prom.SecretOrConfigMap
14
}
15
16
// AssetReferences returns all secret or configmap selectors used throughout v.
17
func AssetReferences(v interface{}) []AssetReference {
18
var refs []AssetReference
19
w := assetReferencesWalker{
20
addReference: func(ar AssetReference) {
21
refs = append(refs, ar)
22
},
23
}
24
structwalk.Walk(&w, v)
25
return refs
26
}
27
28
type assetReferencesWalker struct {
29
namespace string
30
addReference func(ar AssetReference)
31
}
32
33
func (arw *assetReferencesWalker) Visit(v interface{}) (w structwalk.Visitor) {
34
if v == nil {
35
return nil
36
}
37
38
// If we've come across a namespaced object, create a new visitor for that
39
// namespace.
40
if o, ok := v.(metav1.Object); ok {
41
return &assetReferencesWalker{
42
namespace: o.GetNamespace(),
43
addReference: arw.addReference,
44
}
45
}
46
47
switch sel := v.(type) {
48
case corev1.SecretKeySelector:
49
if sel.Key != "" && sel.Name != "" {
50
arw.addReference(AssetReference{
51
Namespace: arw.namespace,
52
Reference: prom.SecretOrConfigMap{Secret: &sel},
53
})
54
}
55
case *corev1.SecretKeySelector:
56
arw.addReference(AssetReference{
57
Namespace: arw.namespace,
58
Reference: prom.SecretOrConfigMap{Secret: sel},
59
})
60
case corev1.ConfigMapKeySelector:
61
if sel.Key != "" && sel.Name != "" {
62
arw.addReference(AssetReference{
63
Namespace: arw.namespace,
64
Reference: prom.SecretOrConfigMap{ConfigMap: &sel},
65
})
66
}
67
case *corev1.ConfigMapKeySelector:
68
arw.addReference(AssetReference{
69
Namespace: arw.namespace,
70
Reference: prom.SecretOrConfigMap{ConfigMap: sel},
71
})
72
}
73
74
return arw
75
}
76
77