diff --git a/pkg/controller/garbagecollector/garbagecollector.go b/pkg/controller/garbagecollector/garbagecollector.go index 7df9c02b479..30cf5e43c79 100644 --- a/pkg/controller/garbagecollector/garbagecollector.go +++ b/pkg/controller/garbagecollector/garbagecollector.go @@ -399,7 +399,6 @@ func (gc *GarbageCollector) processDeletingDependentsItem(item *node) error { // dependents are copies of pointers to the owner's dependents, they don't need to be locked. func (gc *GarbageCollector) orphanDependents(owner objectReference, dependents []*node) error { - var failedDependents []objectReference var errorsSlice []error for _, dependent := range dependents { // the dependent.identity.UID is used as precondition @@ -408,10 +407,10 @@ func (gc *GarbageCollector) orphanDependents(owner objectReference, dependents [ // note that if the target ownerReference doesn't exist in the // dependent, strategic merge patch will NOT return an error. if err != nil && !errors.IsNotFound(err) { - errorsSlice = append(errorsSlice, fmt.Errorf("orphaning %s failed with %v", dependent.identity, err)) + errorsSlice = append(errorsSlice, fmt.Errorf("orphaning %s failed, %v", dependent.identity, err)) } } - if len(failedDependents) != 0 { + if len(errorsSlice) != 0 { return fmt.Errorf("failed to orphan dependents of owner %s, got errors: %s", owner, utilerrors.NewAggregate(errorsSlice).Error()) } glog.V(5).Infof("successfully updated all dependents of owner %s", owner) diff --git a/pkg/controller/garbagecollector/garbagecollector_test.go b/pkg/controller/garbagecollector/garbagecollector_test.go index 9f1058f0c85..ec968cdc02c 100644 --- a/pkg/controller/garbagecollector/garbagecollector_test.go +++ b/pkg/controller/garbagecollector/garbagecollector_test.go @@ -586,3 +586,37 @@ func TestUnblockOwnerReference(t *testing.T) { } } } + +func TestOrphanDependentsFailure(t *testing.T) { + testHandler := &fakeActionHandler{ + response: map[string]FakeResponse{ + "PATCH" + "/api/v1/namespaces/ns1/pods/pod": { + 409, + []byte{}, + }, + }, + } + srv, clientConfig := testServerAndClientConfig(testHandler.ServeHTTP) + defer srv.Close() + + gc := setupGC(t, clientConfig) + defer close(gc.stop) + + dependents := []*node{ + { + identity: objectReference{ + OwnerReference: metav1.OwnerReference{ + Kind: "Pod", + APIVersion: "v1", + Name: "pod", + }, + Namespace: "ns1", + }, + }, + } + err := gc.orphanDependents(objectReference{}, dependents) + expected := `the server reported a conflict (patch pods pod)` + if err == nil || !strings.Contains(err.Error(), expected) { + t.Errorf("expected error contains text %s, got %v", expected, err) + } +}