diff --git a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/conversion.go b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/conversion.go index 759f08ef58c..646adc4a8d4 100644 --- a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/conversion.go +++ b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/conversion.go @@ -45,6 +45,7 @@ func AddConversionFuncs(scheme *runtime.Scheme) error { Convert_v1_Duration_To_Pointer_v1_Duration, Convert_Slice_string_To_v1_Time, + Convert_Slice_string_To_Pointer_v1_Time, Convert_v1_Time_To_v1_Time, Convert_v1_MicroTime_To_v1_MicroTime, @@ -263,6 +264,22 @@ func Convert_Slice_string_To_v1_Time(in *[]string, out *Time, s conversion.Scope return out.UnmarshalQueryParameter(str) } +func Convert_Slice_string_To_Pointer_v1_Time(in *[]string, out **Time, s conversion.Scope) error { + if in == nil { + return nil + } + str := "" + if len(*in) > 0 { + str = (*in)[0] + } + temp := Time{} + if err := temp.UnmarshalQueryParameter(str); err != nil { + return err + } + *out = &temp + return nil +} + func Convert_string_To_labels_Selector(in *string, out *labels.Selector, s conversion.Scope) error { selector, err := labels.Parse(*in) if err != nil { diff --git a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/conversion_test.go b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/conversion_test.go index 4c73d1d80b4..c48b9d861d5 100644 --- a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/conversion_test.go +++ b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/conversion_test.go @@ -17,10 +17,13 @@ limitations under the License. package v1_test import ( + "net/url" "testing" + "time" apiequality "k8s.io/apimachinery/pkg/api/equality" "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" ) func TestMapToLabelSelectorRoundTrip(t *testing.T) { @@ -82,3 +85,50 @@ func TestConvertSliceStringToDeletionPropagation(t *testing.T) { } } } + +func TestUrlValuesToPointerTime(t *testing.T) { + scheme := runtime.NewScheme() + v1.AddConversionFuncs(scheme) + + type testType struct { + Time *v1.Time `json:"time"` + } + + t1 := v1.Date(1998, time.May, 5, 5, 5, 5, 0, time.UTC) + t1String := t1.Format(time.RFC3339) + t2 := v1.Date(2000, time.June, 6, 6, 6, 6, 0, time.UTC) + t2String := t2.Format(time.RFC3339) + + tcs := []struct { + Input url.Values + Output *v1.Time + }{ + { + Input: url.Values{}, + Output: nil, + }, + { + Input: url.Values{"time": []string{}}, + Output: &v1.Time{}, + }, + { + Input: url.Values{"time": []string{""}}, + Output: &v1.Time{}, + }, + { + Input: url.Values{"time": []string{t1String, t2String}}, + Output: &t1, + }, + } + + for _, tc := range tcs { + result := &testType{} + if err := scheme.Convert(&tc.Input, &result, nil); err != nil { + t.Errorf("Failed to convert []string to *metav1.Time %#v: %v", tc.Input, err) + continue + } + if !apiequality.Semantic.DeepEqual(result.Time, tc.Output) { + t.Errorf("Unexpected output: %v, expected: %v", result.Time, tc.Output) + } + } +}