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 57959c21589..ba7005abf77 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 { @@ -437,6 +439,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{})