K8s/Meta: Support setting secure values on a struct type (#109381)

This commit is contained in:
Ryan McKinley
2025-08-12 00:53:56 -05:00
committed by GitHub
parent 238961d3ea
commit 101aea9647
2 changed files with 52 additions and 11 deletions
+38 -11
View File
@@ -836,7 +836,7 @@ func (m *grafanaMetaAccessor) SetSourceProperties(v SourceProperties) {
func (m *grafanaMetaAccessor) GetSecureValues() (vals common.InlineSecureValues, err error) {
defer func() {
if r := recover(); r != nil {
err = fmt.Errorf("error reading spec")
err = fmt.Errorf("error reading secure values")
}
}()
@@ -888,7 +888,7 @@ func (m *grafanaMetaAccessor) GetSecureValues() (vals common.InlineSecureValues,
if f.Kind() == reflect.Struct {
num := f.NumField()
vals = make(common.InlineSecureValues, num)
for i := 0; i < f.NumField(); i++ {
for i := range num {
val := f.Field(i)
if val.IsValid() && val.CanInterface() {
property = val.Interface()
@@ -901,14 +901,7 @@ func (m *grafanaMetaAccessor) GetSecureValues() (vals common.InlineSecureValues,
continue // nothing
}
field := f.Type().Field(i)
fname := field.Tag.Get("json")
if fname == "" {
fname = field.Name
} else {
fname, _ = strings.CutSuffix(fname, ",omitempty")
}
vals[fname] = inline
vals[getJSONFieldName(f, i)] = inline
continue
}
return nil, fmt.Errorf("value not an interface")
@@ -923,12 +916,36 @@ func (m *grafanaMetaAccessor) GetSecureValues() (vals common.InlineSecureValues,
func (m *grafanaMetaAccessor) SetSecureValues(vals common.InlineSecureValues) (err error) {
defer func() {
if r := recover(); r != nil {
err = fmt.Errorf("error setting spec")
fmt.Printf("ERR: %v", r)
err = fmt.Errorf("error writing secure values")
}
}()
f := m.r.FieldByName("Secure")
if f.IsValid() && f.CanSet() {
if f.Kind() == reflect.Struct {
keys := make(map[string]bool, len(vals))
for k := range vals {
keys[k] = true
}
for i := 0; i < f.NumField(); i++ {
val := f.Field(i)
if val.IsValid() && val.CanInterface() && val.CanSet() {
k := getJSONFieldName(f, i)
sv := vals[k]
val.Set(reflect.ValueOf(sv))
delete(keys, k)
} else {
return fmt.Errorf("invalid secure value: %v", val)
}
}
if len(keys) > 0 {
return fmt.Errorf("invalid secure value key: %v", keys)
}
return
}
// It should be a generic map
f.Set(reflect.ValueOf(vals))
return
}
@@ -943,6 +960,16 @@ func (m *grafanaMetaAccessor) SetSecureValues(vals common.InlineSecureValues) (e
return fmt.Errorf("unable to set secure values on (%T)", m.raw)
}
func getJSONFieldName(f reflect.Value, idx int) string {
field := f.Type().Field(idx)
fname := field.Tag.Get("json")
if fname == "" {
return field.Name
}
fname, _ = strings.CutSuffix(fname, ",omitempty")
return fname
}
func ToObjectReference(obj GrafanaMetaAccessor) common.ObjectReference {
gvk := obj.GetGroupVersionKind()
return common.ObjectReference{
+14
View File
@@ -400,6 +400,20 @@ func TestMetaAccessor(t *testing.T) {
secure, err := meta.GetSecureValues()
require.NoError(t, err)
require.JSONEq(t, `{"v1": {"name": "hello"}}`, asJSON(secure, true))
// Check that we can write
err = meta.SetSecureValues(common.InlineSecureValues{
"v2": {Name: "bbb"},
})
require.NoError(t, err)
secure, err = meta.GetSecureValues()
require.NoError(t, err)
require.JSONEq(t, `{"v2": {"name": "bbb"}}`, asJSON(secure, true)) // NOTE: v1 was removed
err = meta.SetSecureValues(common.InlineSecureValues{
"UNKNOWN": {Name: "bbb"}, // not a valid name
})
require.Error(t, err)
})
t.Run("test reading old repo fields (now manager+source)", func(t *testing.T) {