Path: blob/main/pkg/operator/config/config_references.go
4096 views
package config12import (3"github.com/grafana/agent/pkg/util/structwalk"4prom "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"5corev1 "k8s.io/api/core/v1"6metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"7)89// AssetReference is a namespaced Secret or ConfigMap selector.10type AssetReference struct {11Namespace string12Reference prom.SecretOrConfigMap13}1415// AssetReferences returns all secret or configmap selectors used throughout v.16func AssetReferences(v interface{}) []AssetReference {17var refs []AssetReference18w := assetReferencesWalker{19addReference: func(ar AssetReference) {20refs = append(refs, ar)21},22}23structwalk.Walk(&w, v)24return refs25}2627type assetReferencesWalker struct {28namespace string29addReference func(ar AssetReference)30}3132func (arw *assetReferencesWalker) Visit(v interface{}) (w structwalk.Visitor) {33if v == nil {34return nil35}3637// If we've come across a namespaced object, create a new visitor for that38// namespace.39if o, ok := v.(metav1.Object); ok {40return &assetReferencesWalker{41namespace: o.GetNamespace(),42addReference: arw.addReference,43}44}4546switch sel := v.(type) {47case corev1.SecretKeySelector:48if sel.Key != "" && sel.Name != "" {49arw.addReference(AssetReference{50Namespace: arw.namespace,51Reference: prom.SecretOrConfigMap{Secret: &sel},52})53}54case *corev1.SecretKeySelector:55arw.addReference(AssetReference{56Namespace: arw.namespace,57Reference: prom.SecretOrConfigMap{Secret: sel},58})59case corev1.ConfigMapKeySelector:60if sel.Key != "" && sel.Name != "" {61arw.addReference(AssetReference{62Namespace: arw.namespace,63Reference: prom.SecretOrConfigMap{ConfigMap: &sel},64})65}66case *corev1.ConfigMapKeySelector:67arw.addReference(AssetReference{68Namespace: arw.namespace,69Reference: prom.SecretOrConfigMap{ConfigMap: sel},70})71}7273return arw74}757677