From a2d254807ddf0fbdd19a5d787f5ef38dbe97658e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kevin=20Wiesm=C3=BCller?= Date: Thu, 7 Mar 2019 00:02:52 +0000 Subject: [PATCH] fix handling of nil times in managedFields sorting Kubernetes-commit: 186761efee887cee019bc92a85b3207474b42185 --- .../fieldmanager/internal/managedfields.go | 9 +++-- .../internal/managedfields_test.go | 34 +++++++++++++++++-- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/pkg/endpoints/handlers/fieldmanager/internal/managedfields.go b/pkg/endpoints/handlers/fieldmanager/internal/managedfields.go index 744da85b6..884645c5e 100644 --- a/pkg/endpoints/handlers/fieldmanager/internal/managedfields.go +++ b/pkg/endpoints/handlers/fieldmanager/internal/managedfields.go @@ -20,6 +20,7 @@ import ( "encoding/json" "fmt" "sort" + "time" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -160,8 +161,12 @@ func sortEncodedManagedFields(encodedManagedFields []metav1.ManagedFieldsEntry) return p.Operation < q.Operation } - if p.Time == nil || q.Time == nil { - return false + ntime := &metav1.Time{Time: time.Time{}} + if p.Time == nil { + p.Time = ntime + } + if q.Time == nil { + q.Time = ntime } if !p.Time.Equal(q.Time) { return p.Time.Before(q.Time) diff --git a/pkg/endpoints/handlers/fieldmanager/internal/managedfields_test.go b/pkg/endpoints/handlers/fieldmanager/internal/managedfields_test.go index cedec758c..61aa135d0 100644 --- a/pkg/endpoints/handlers/fieldmanager/internal/managedfields_test.go +++ b/pkg/endpoints/handlers/fieldmanager/internal/managedfields_test.go @@ -228,6 +228,30 @@ func TestSortEncodedManagedFields(t *testing.T) { {Manager: "a", Operation: metav1.ManagedFieldsOperationUpdate, Time: parseTimeOrPanic("2001-01-01T01:00:00Z")}, }, }, + { + name: "manager without time first", + managedFields: []metav1.ManagedFieldsEntry{ + {Manager: "a", Operation: metav1.ManagedFieldsOperationApply, Time: nil}, + {Manager: "a", Operation: metav1.ManagedFieldsOperationApply, Time: parseTimeOrPanic("2001-01-01T01:00:00Z")}, + }, + expected: []metav1.ManagedFieldsEntry{ + {Manager: "a", Operation: metav1.ManagedFieldsOperationApply, Time: nil}, + {Manager: "a", Operation: metav1.ManagedFieldsOperationApply, Time: parseTimeOrPanic("2001-01-01T01:00:00Z")}, + }, + }, + { + name: "manager without time first name last", + managedFields: []metav1.ManagedFieldsEntry{ + {Manager: "a", Operation: metav1.ManagedFieldsOperationApply, Time: parseTimeOrPanic("2001-01-01T01:00:00Z")}, + {Manager: "b", Operation: metav1.ManagedFieldsOperationApply, Time: nil}, + {Manager: "a", Operation: metav1.ManagedFieldsOperationApply, Time: nil}, + }, + expected: []metav1.ManagedFieldsEntry{ + {Manager: "a", Operation: metav1.ManagedFieldsOperationApply, Time: nil}, + {Manager: "b", Operation: metav1.ManagedFieldsOperationApply, Time: nil}, + {Manager: "a", Operation: metav1.ManagedFieldsOperationApply, Time: parseTimeOrPanic("2001-01-01T01:00:00Z")}, + }, + }, { name: "apply first", managedFields: []metav1.ManagedFieldsEntry{ @@ -274,18 +298,24 @@ func TestSortEncodedManagedFields(t *testing.T) { managedFields: []metav1.ManagedFieldsEntry{ {Manager: "c", Operation: metav1.ManagedFieldsOperationUpdate, Time: parseTimeOrPanic("2001-01-01T01:00:00Z")}, {Manager: "a", Operation: metav1.ManagedFieldsOperationApply, Time: nil}, + {Manager: "g", Operation: metav1.ManagedFieldsOperationApply, Time: nil}, {Manager: "f", Operation: metav1.ManagedFieldsOperationUpdate, Time: parseTimeOrPanic("2002-01-01T01:00:00Z")}, + {Manager: "i", Operation: metav1.ManagedFieldsOperationApply, Time: nil}, {Manager: "d", Operation: metav1.ManagedFieldsOperationUpdate, Time: parseTimeOrPanic("2002-01-01T01:00:00Z")}, - {Manager: "e", Operation: metav1.ManagedFieldsOperationUpdate, Time: parseTimeOrPanic("2002-01-01T01:00:00Z")}, + {Manager: "h", Operation: metav1.ManagedFieldsOperationApply, Time: nil}, + {Manager: "e", Operation: metav1.ManagedFieldsOperationUpdate, Time: parseTimeOrPanic("2003-01-01T01:00:00Z")}, {Manager: "b", Operation: metav1.ManagedFieldsOperationApply, Time: nil}, }, expected: []metav1.ManagedFieldsEntry{ {Manager: "a", Operation: metav1.ManagedFieldsOperationApply, Time: nil}, {Manager: "b", Operation: metav1.ManagedFieldsOperationApply, Time: nil}, + {Manager: "g", Operation: metav1.ManagedFieldsOperationApply, Time: nil}, + {Manager: "h", Operation: metav1.ManagedFieldsOperationApply, Time: nil}, + {Manager: "i", Operation: metav1.ManagedFieldsOperationApply, Time: nil}, {Manager: "c", Operation: metav1.ManagedFieldsOperationUpdate, Time: parseTimeOrPanic("2001-01-01T01:00:00Z")}, {Manager: "d", Operation: metav1.ManagedFieldsOperationUpdate, Time: parseTimeOrPanic("2002-01-01T01:00:00Z")}, - {Manager: "e", Operation: metav1.ManagedFieldsOperationUpdate, Time: parseTimeOrPanic("2002-01-01T01:00:00Z")}, {Manager: "f", Operation: metav1.ManagedFieldsOperationUpdate, Time: parseTimeOrPanic("2002-01-01T01:00:00Z")}, + {Manager: "e", Operation: metav1.ManagedFieldsOperationUpdate, Time: parseTimeOrPanic("2003-01-01T01:00:00Z")}, }, }, }