From 5f9ee58de071515a4c8b439c9ccd048dfd728c85 Mon Sep 17 00:00:00 2001 From: James Ravn Date: Fri, 1 Apr 2016 16:52:43 +0100 Subject: [PATCH] Fix expired event logic to use 404 instead of 500 It seems this logic was never updated once apiserver started returning 404s for expired (missing) events. This change corrects it to use a 404 so events will get resent correctly if they were expired in etcd. --- pkg/client/record/event.go | 8 +++---- pkg/client/record/event_test.go | 37 +++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/pkg/client/record/event.go b/pkg/client/record/event.go index a2ff6cd0b59..47cbe3eca69 100644 --- a/pkg/client/record/event.go +++ b/pkg/client/record/event.go @@ -31,6 +31,7 @@ import ( "k8s.io/kubernetes/pkg/watch" "github.com/golang/glog" + "net/http" ) const maxTriesPerEvent = 12 @@ -153,12 +154,11 @@ func recordToSink(sink EventSink, event *api.Event, eventCorrelator *EventCorrel func isKeyNotFoundError(err error) bool { statusErr, _ := err.(*errors.StatusError) - // At the moment the server is returning 500 instead of a more specific - // error. When changing this remember that it should be backward compatible - // with old api servers that may be still returning 500. - if statusErr != nil && statusErr.Status().Code == 500 { + + if statusErr != nil && statusErr.Status().Code == http.StatusNotFound { return true } + return false } diff --git a/pkg/client/record/event_test.go b/pkg/client/record/event_test.go index 333a7b4bc5b..822a2d728ed 100644 --- a/pkg/client/record/event_test.go +++ b/pkg/client/record/event_test.go @@ -27,10 +27,12 @@ import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/errors" _ "k8s.io/kubernetes/pkg/api/install" // To register api.Pod used in tests below + "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/client/restclient" k8sruntime "k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/util" "k8s.io/kubernetes/pkg/util/strategicpatch" + "net/http" ) type testEventSink struct { @@ -433,6 +435,41 @@ func TestWriteEventError(t *testing.T) { } } +func TestUpdateExpiredEvent(t *testing.T) { + eventCorrelator := NewEventCorrelator(util.RealClock{}) + randGen := rand.New(rand.NewSource(time.Now().UnixNano())) + + var createdEvent *api.Event + + sink := &testEventSink{ + OnPatch: func(*api.Event, []byte) (*api.Event, error) { + return nil, &errors.StatusError{ + ErrStatus: unversioned.Status{ + Code: http.StatusNotFound, + Reason: unversioned.StatusReasonNotFound, + }} + }, + OnCreate: func(event *api.Event) (*api.Event, error) { + createdEvent = event + return event, nil + }, + } + + ev := &api.Event{} + ev.ResourceVersion = "updated-resource-version" + ev.Count = 2 + recordToSink(sink, ev, eventCorrelator, randGen, 0) + + if createdEvent == nil { + t.Error("Event did not get created after patch failed") + return + } + + if createdEvent.ResourceVersion != "" { + t.Errorf("Event did not have its resource version cleared, was %s", createdEvent.ResourceVersion) + } +} + func TestLotsOfEvents(t *testing.T) { recorderCalled := make(chan struct{}) loggerCalled := make(chan struct{})