Add AsQuantity to configmap parser (#1362)

This commit is contained in:
Julian Friedman 2020-05-28 18:23:01 +01:00 committed by GitHub
parent 2d1a04d1ff
commit 6eb9fa1546
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 30 additions and 0 deletions

View File

@ -22,6 +22,7 @@ import (
"strings"
"time"
"k8s.io/apimachinery/pkg/api/resource"
"k8s.io/apimachinery/pkg/util/sets"
)
@ -114,6 +115,21 @@ func AsStringSet(key string, target *sets.String) ParseFunc {
}
}
// AsQuantity parses the value at key as a *resource.Quantity into the target, if it exists
func AsQuantity(key string, target **resource.Quantity) ParseFunc {
return func(data map[string]string) error {
if raw, ok := data[key]; ok {
val, err := resource.ParseQuantity(raw)
if err != nil {
return fmt.Errorf("failed to parse %q: %w", key, err)
}
*target = &val
}
return nil
}
}
// Parse parses the given map using the parser functions passed in.
func Parse(data map[string]string, parsers ...ParseFunc) error {
for _, parse := range parsers {

View File

@ -21,6 +21,7 @@ import (
"time"
"github.com/google/go-cmp/cmp"
"k8s.io/apimachinery/pkg/api/resource"
"k8s.io/apimachinery/pkg/util/sets"
)
@ -32,9 +33,11 @@ type testConfig struct {
f64 float64
dur time.Duration
set sets.String
qua *resource.Quantity
}
func TestParse(t *testing.T) {
fiveHundredM := resource.MustParse("500m")
tests := []struct {
name string
conf testConfig
@ -51,6 +54,7 @@ func TestParse(t *testing.T) {
"test-float64": "1.0",
"test-duration": "1m",
"test-set": "a,b,c",
"test-quantity": "500m",
},
want: testConfig{
str: "foo.bar",
@ -60,6 +64,7 @@ func TestParse(t *testing.T) {
f64: 1.0,
dur: time.Minute,
set: sets.NewString("a", "b", "c"),
qua: &fiveHundredM,
},
}, {
name: "respect defaults",
@ -70,6 +75,7 @@ func TestParse(t *testing.T) {
i64: 2,
f64: 1.0,
dur: time.Minute,
qua: &fiveHundredM,
},
want: testConfig{
str: "foo.bar",
@ -78,6 +84,7 @@ func TestParse(t *testing.T) {
i64: 2,
f64: 1.0,
dur: time.Minute,
qua: &fiveHundredM,
},
}, {
name: "bool defaults to false",
@ -111,6 +118,12 @@ func TestParse(t *testing.T) {
"test-duration": "foo",
},
expectErr: true,
}, {
name: "quantity error",
data: map[string]string{
"test-quantity": "foo",
},
expectErr: true,
}}
for _, test := range tests {
@ -123,6 +136,7 @@ func TestParse(t *testing.T) {
AsFloat64("test-float64", &test.conf.f64),
AsDuration("test-duration", &test.conf.dur),
AsStringSet("test-set", &test.conf.set),
AsQuantity("test-quantity", &test.conf.qua),
); (err == nil) == test.expectErr {
t.Fatal("Failed to parse data:", err)
}