Skip to content

Commit 1f53fc7

Browse files
authored
Merge pull request #625 from Iceber/convert_deleted_object
add ConvertDeletedObject method for ResourceStorage
2 parents 10af9ae + 84e99ee commit 1f53fc7

File tree

4 files changed

+44
-10
lines changed

4 files changed

+44
-10
lines changed

pkg/storage/internalstorage/resource_storage.go

+17
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"k8s.io/apimachinery/pkg/types"
2121
"k8s.io/apimachinery/pkg/watch"
2222
genericstorage "k8s.io/apiserver/pkg/storage"
23+
"k8s.io/client-go/tools/cache"
2324

2425
internal "github.com/clusterpedia-io/api/clusterpedia"
2526
"github.com/clusterpedia-io/clusterpedia/pkg/storage"
@@ -125,6 +126,22 @@ func (s *ResourceStorage) Update(ctx context.Context, cluster string, obj runtim
125126
return InterpretResourceDBError(cluster, metaobj.GetName(), result.Error)
126127
}
127128

129+
func (c *ResourceStorage) ConvertDeletedObject(obj interface{}) (runtime.Object, error) {
130+
key, err := cache.DeletionHandlingMetaNamespaceKeyFunc(obj)
131+
if err != nil {
132+
return nil, err
133+
}
134+
135+
namespace, name, err := cache.SplitMetaNamespaceKey(key)
136+
if err != nil {
137+
return nil, err
138+
}
139+
140+
// Since it is not necessary to save the complete deleted object to the queue,
141+
// we convert the object to `PartialObjectMetadata`
142+
return &metav1.PartialObjectMetadata{ObjectMeta: metav1.ObjectMeta{Namespace: namespace, Name: name}}, nil
143+
}
144+
128145
func (s *ResourceStorage) deleteObject(cluster, namespace, name string) *gorm.DB {
129146
return s.db.Model(&Resource{}).Where(map[string]interface{}{
130147
"cluster": cluster,

pkg/storage/memorystorage/memory_resource_storage.go

+20
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@ import (
88
"sync"
99

1010
"k8s.io/apimachinery/pkg/api/meta"
11+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1112
"k8s.io/apimachinery/pkg/conversion"
1213
"k8s.io/apimachinery/pkg/runtime"
1314
"k8s.io/apimachinery/pkg/runtime/schema"
1415
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
1516
"k8s.io/apimachinery/pkg/watch"
17+
kubecache "k8s.io/client-go/tools/cache"
1618

1719
internal "github.com/clusterpedia-io/api/clusterpedia"
1820
"github.com/clusterpedia-io/clusterpedia/pkg/storage"
@@ -82,6 +84,24 @@ func (s *ResourceStorage) Update(ctx context.Context, cluster string, obj runtim
8284
return nil
8385
}
8486

87+
func (s *ResourceStorage) ConvertDeletedObject(obj interface{}) (runobj runtime.Object, _ error) {
88+
if d, ok := obj.(kubecache.DeletedFinalStateUnknown); ok {
89+
if obj, ok := d.Obj.(runtime.Object); ok {
90+
return obj, nil
91+
}
92+
namespace, name, err := kubecache.SplitMetaNamespaceKey(d.Key)
93+
if err != nil {
94+
return nil, err
95+
}
96+
return &metav1.PartialObjectMetadata{ObjectMeta: metav1.ObjectMeta{Namespace: namespace, Name: name}}, nil
97+
}
98+
99+
if obj, ok := obj.(runtime.Object); ok {
100+
return obj, nil
101+
}
102+
return nil, fmt.Errorf("Invalid Type(%T): couldn't convert deleted object", obj)
103+
}
104+
85105
func (s *ResourceStorage) Delete(ctx context.Context, cluster string, obj runtime.Object) error {
86106
resourceVersion, err := s.CrvSynchro.UpdateClusterResourceVersion(obj, cluster)
87107
if err != nil {

pkg/storage/storage.go

+2
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ type ResourceStorage interface {
3636

3737
Create(ctx context.Context, cluster string, obj runtime.Object) error
3838
Update(ctx context.Context, cluster string, obj runtime.Object) error
39+
40+
ConvertDeletedObject(obj interface{}) (runtime.Object, error)
3941
Delete(ctx context.Context, cluster string, obj runtime.Object) error
4042
}
4143

pkg/synchromanager/clustersynchro/resource_synchro.go

+5-10
Original file line numberDiff line numberDiff line change
@@ -346,19 +346,14 @@ func (synchro *ResourceSynchro) OnDelete(obj interface{}) {
346346
if !synchro.isRunnableForStorage.Load() {
347347
return
348348
}
349-
350-
if d, ok := obj.(cache.DeletedFinalStateUnknown); ok {
351-
if obj, ok = d.Obj.(*unstructured.Unstructured); !ok {
352-
namespace, name, err := cache.SplitMetaNamespaceKey(d.Key)
353-
if err != nil {
354-
return
355-
}
356-
obj = &metav1.PartialObjectMetadata{ObjectMeta: metav1.ObjectMeta{Namespace: namespace, Name: name}}
357-
}
358-
}
359349
if o, ok := obj.(*unstructured.Unstructured); ok {
360350
synchro.pruneObject(o)
361351
}
352+
353+
obj, err := synchro.storage.ConvertDeletedObject(obj)
354+
if err != nil {
355+
return
356+
}
362357
_ = synchro.queue.Delete(obj)
363358
}
364359

0 commit comments

Comments
 (0)