1
0
mirror of https://github.com/lxc/incus.git synced 2026-02-05 09:46:19 +01:00

api: Handle pre initialized targed ConfigMap (default values)

Signed-off-by: Lucas Bremgartner <lucas.bremgartner@futurfusion.io>
This commit is contained in:
Lucas Bremgartner
2025-09-22 07:38:38 +02:00
parent 055396ccdd
commit e78e22fb2a
2 changed files with 181 additions and 17 deletions

View File

@@ -47,11 +47,14 @@ func (m *ConfigMap) UnmarshalYAML(unmarshal func(any) error) error {
func (m *ConfigMap) fromMapStringAny(raw map[string]any) error {
if raw == nil {
*m = nil
return nil
}
result := make(ConfigMap, len(raw))
result := *m
if result == nil {
result = make(ConfigMap, len(raw))
}
for k, v := range raw {
switch val := v.(type) {
case string:

View File

@@ -13,8 +13,9 @@ import (
func TestConfigMap_UnmarshalJSON(t *testing.T) {
tests := []struct {
name string
input map[string]any
name string
input map[string]any
target api.ConfigMap
assertErr require.ErrorAssertionFunc
want api.ConfigMap
@@ -27,11 +28,28 @@ func TestConfigMap_UnmarshalJSON(t *testing.T) {
want: nil,
},
{
name: "empty",
input: map[string]any{},
name: "nil with defaults",
input: nil,
target: api.ConfigMap{
"default_string": "string",
},
assertErr: require.NoError,
want: api.ConfigMap{},
want: api.ConfigMap{
"default_string": "string",
},
},
{
name: "empty",
input: map[string]any{},
target: api.ConfigMap{
"default_string": "string",
},
assertErr: require.NoError,
want: api.ConfigMap{
"default_string": "string",
},
},
{
name: "only string",
@@ -79,6 +97,35 @@ func TestConfigMap_UnmarshalJSON(t *testing.T) {
"null": "",
},
},
{
name: "mixed with defaults",
input: map[string]any{
"string": "string",
"int": 5,
"uint": uint64(math.MaxUint64),
"float64": 5.4,
"float64max": math.MaxFloat64,
"bool": true,
"empty": "",
"null": nil,
},
target: api.ConfigMap{
"default_string": "string",
},
assertErr: require.NoError,
want: api.ConfigMap{
"string": "string",
"int": "5",
"uint": "1.8446744073709552e+19",
"float64": "5.4",
"float64max": "1.7976931348623157e+308",
"bool": "true",
"empty": "",
"null": "",
"default_string": "string",
},
},
// errors
{
@@ -92,6 +139,22 @@ func TestConfigMap_UnmarshalJSON(t *testing.T) {
assertErr: require.Error,
want: nil,
},
{
name: "error - unsupported type object with defaults",
input: map[string]any{
"invalid": map[string]any{ // invalid
"inner": "value",
},
},
target: api.ConfigMap{
"default_string": "string",
},
assertErr: require.Error,
want: api.ConfigMap{
"default_string": "string",
},
},
{
name: "error - unsupported type array",
input: map[string]any{
@@ -103,6 +166,22 @@ func TestConfigMap_UnmarshalJSON(t *testing.T) {
assertErr: require.Error,
want: nil,
},
{
name: "error - unsupported type array with defaults",
input: map[string]any{
"invalid": []string{ // invalid
"inner", "value",
},
},
target: api.ConfigMap{
"default_string": "string",
},
assertErr: require.Error,
want: api.ConfigMap{
"default_string": "string",
},
},
}
for _, tc := range tests {
@@ -110,20 +189,19 @@ func TestConfigMap_UnmarshalJSON(t *testing.T) {
in, err := json.Marshal(tc.input)
require.NoError(t, err)
var got api.ConfigMap
err = json.Unmarshal(in, &got)
err = json.Unmarshal(in, &tc.target)
tc.assertErr(t, err)
require.Equal(t, tc.want, got)
require.Equal(t, tc.want, tc.target)
})
}
}
func TestConfigMap_UnmarshalYAML(t *testing.T) {
tests := []struct {
name string
input map[string]any
name string
input map[string]any
target api.ConfigMap
assertErr require.ErrorAssertionFunc
want api.ConfigMap
@@ -135,6 +213,18 @@ func TestConfigMap_UnmarshalYAML(t *testing.T) {
assertErr: require.NoError,
want: api.ConfigMap{},
},
{
name: "nil with defaults",
input: nil,
target: api.ConfigMap{
"default_string": "string",
},
assertErr: require.NoError,
want: api.ConfigMap{
"default_string": "string",
},
},
{
name: "empty",
input: map[string]any{},
@@ -142,6 +232,18 @@ func TestConfigMap_UnmarshalYAML(t *testing.T) {
assertErr: require.NoError,
want: api.ConfigMap{},
},
{
name: "empty with defaults",
input: map[string]any{},
target: api.ConfigMap{
"default_string": "string",
},
assertErr: require.NoError,
want: api.ConfigMap{
"default_string": "string",
},
},
{
name: "only string",
input: map[string]any{
@@ -188,6 +290,35 @@ func TestConfigMap_UnmarshalYAML(t *testing.T) {
"null": "",
},
},
{
name: "mixed with defaults",
input: map[string]any{
"string": "string",
"int": 5,
"uint": uint64(math.MaxUint64),
"float64": 5.4,
"float64max": math.MaxFloat64,
"bool": true,
"empty": "",
"null": nil,
},
target: api.ConfigMap{
"default_string": "string",
},
assertErr: require.NoError,
want: api.ConfigMap{
"string": "string",
"int": "5",
"uint": "18446744073709551615",
"float64": "5.4",
"float64max": "1.7976931348623157e+308",
"bool": "true",
"empty": "",
"null": "",
"default_string": "string",
},
},
// errors
{
@@ -201,6 +332,22 @@ func TestConfigMap_UnmarshalYAML(t *testing.T) {
assertErr: require.Error,
want: nil,
},
{
name: "error - unsupported type object with defaults",
input: map[string]any{
"invalid": map[string]any{ // invalid
"inner": "value",
},
},
target: api.ConfigMap{
"default_string": "string",
},
assertErr: require.Error,
want: api.ConfigMap{
"default_string": "string",
},
},
{
name: "error - unsupported type array",
input: map[string]any{
@@ -212,6 +359,22 @@ func TestConfigMap_UnmarshalYAML(t *testing.T) {
assertErr: require.Error,
want: nil,
},
{
name: "error - unsupported type array with defaults",
input: map[string]any{
"invalid": []string{ // invalid
"inner", "value",
},
},
target: api.ConfigMap{
"default_string": "string",
},
assertErr: require.Error,
want: api.ConfigMap{
"default_string": "string",
},
},
}
for _, tc := range tests {
@@ -219,12 +382,10 @@ func TestConfigMap_UnmarshalYAML(t *testing.T) {
in, err := yaml.Marshal(tc.input)
require.NoError(t, err)
var got api.ConfigMap
err = yaml.Unmarshal(in, &got)
err = yaml.Unmarshal(in, &tc.target)
tc.assertErr(t, err)
require.Equal(t, tc.want, got)
require.Equal(t, tc.want, tc.target)
})
}
}