@@ -17,6 +17,7 @@ limitations under the License.
17
17
package garbagecollector
18
18
19
19
import (
20
+ "encoding/json"
20
21
"fmt"
21
22
22
23
"k8s.io/apimachinery/pkg/api/errors"
@@ -67,14 +68,6 @@ func (gc *GarbageCollector) getObject(item objectReference) (*unstructured.Unstr
67
68
return gc .dynamicClient .Resource (resource ).Namespace (resourceDefaultNamespace (namespaced , item .Namespace )).Get (item .Name , metav1.GetOptions {})
68
69
}
69
70
70
- func (gc * GarbageCollector ) updateObject (item objectReference , obj * unstructured.Unstructured ) (* unstructured.Unstructured , error ) {
71
- resource , namespaced , err := gc .apiResource (item .APIVersion , item .Kind )
72
- if err != nil {
73
- return nil , err
74
- }
75
- return gc .dynamicClient .Resource (resource ).Namespace (resourceDefaultNamespace (namespaced , item .Namespace )).Update (obj , metav1.UpdateOptions {})
76
- }
77
-
78
71
func (gc * GarbageCollector ) patchObject (item objectReference , patch []byte , pt types.PatchType ) (* unstructured.Unstructured , error ) {
79
72
resource , namespaced , err := gc .apiResource (item .APIVersion , item .Kind )
80
73
if err != nil {
@@ -83,8 +76,6 @@ func (gc *GarbageCollector) patchObject(item objectReference, patch []byte, pt t
83
76
return gc .dynamicClient .Resource (resource ).Namespace (resourceDefaultNamespace (namespaced , item .Namespace )).Patch (item .Name , pt , patch , metav1.PatchOptions {})
84
77
}
85
78
86
- // TODO: Using Patch when strategicmerge supports deleting an entry from a
87
- // slice of a base type.
88
79
func (gc * GarbageCollector ) removeFinalizer (owner * node , targetFinalizer string ) error {
89
80
err := retry .RetryOnConflict (retry .DefaultBackoff , func () error {
90
81
ownerObject , err := gc .getObject (owner .identity )
@@ -112,9 +103,18 @@ func (gc *GarbageCollector) removeFinalizer(owner *node, targetFinalizer string)
112
103
klog .V (5 ).Infof ("the %s finalizer is already removed from object %s" , targetFinalizer , owner .identity )
113
104
return nil
114
105
}
106
+
115
107
// remove the owner from dependent's OwnerReferences
116
- ownerObject .SetFinalizers (newFinalizers )
117
- _ , err = gc .updateObject (owner .identity , ownerObject )
108
+ patch , err := json .Marshal (map [string ]interface {}{
109
+ "metadata" : map [string ]interface {}{
110
+ "resourceVersion" : accessor .GetResourceVersion (),
111
+ "finalizers" : newFinalizers ,
112
+ },
113
+ })
114
+ if err != nil {
115
+ return fmt .Errorf ("unable to finalize %s due to an error serializing patch: %v" , owner .identity , err )
116
+ }
117
+ _ , err = gc .patchObject (owner .identity , patch , types .MergePatchType )
118
118
return err
119
119
})
120
120
if errors .IsConflict (err ) {
0 commit comments