From 270b1de6a1fbfd672b2c88f46ed1ffbbdfac864c Mon Sep 17 00:00:00 2001 From: Tiger Kaovilai Date: Mon, 22 Jan 2024 08:50:13 +0700 Subject: [PATCH] Do not attempt restore resource with no available GVK in cluster (#7322) Check for GVK before attempting restore. Signed-off-by: Tiger Kaovilai --- changelogs/unreleased/7322-kaovilai | 1 + pkg/restore/restore.go | 14 ++++++++++++++ pkg/test/resources.go | 1 + 3 files changed, 16 insertions(+) create mode 100644 changelogs/unreleased/7322-kaovilai diff --git a/changelogs/unreleased/7322-kaovilai b/changelogs/unreleased/7322-kaovilai new file mode 100644 index 0000000000..000c28709d --- /dev/null +++ b/changelogs/unreleased/7322-kaovilai @@ -0,0 +1 @@ +Check resource Group Version and Kind is available in cluster before attempting restore to prevent being stuck. \ No newline at end of file diff --git a/pkg/restore/restore.go b/pkg/restore/restore.go index 4d739290e4..318dec279a 100644 --- a/pkg/restore/restore.go +++ b/pkg/restore/restore.go @@ -1059,6 +1059,16 @@ func (ctx *restoreContext) getResourceClient(groupResource schema.GroupResource, } func (ctx *restoreContext) getResourceLister(groupResource schema.GroupResource, obj *unstructured.Unstructured, namespace string) cache.GenericNamespaceLister { + _, _, err := ctx.discoveryHelper.KindFor(schema.GroupVersionKind{ + Group: obj.GroupVersionKind().Group, + Version: obj.GetAPIVersion(), + Kind: obj.GetKind(), + }) + clusterHasKind := err == nil + if !clusterHasKind { + ctx.log.Errorf("Cannot get resource lister %s because GVK doesn't exist in the cluster", groupResource) + return nil + } informer := ctx.dynamicInformerFactory.factory.ForResource(groupResource.WithVersion(obj.GroupVersionKind().Version)) // if the restore contains CRDs or the RIA returns new resources, need to make sure the corresponding informers are synced if !informer.Informer().HasSynced() { @@ -1084,6 +1094,10 @@ func getResourceID(groupResource schema.GroupResource, namespace, name string) s func (ctx *restoreContext) getResource(groupResource schema.GroupResource, obj *unstructured.Unstructured, namespace, name string) (*unstructured.Unstructured, error) { lister := ctx.getResourceLister(groupResource, obj, namespace) + if lister == nil { + // getResourceLister logs the error, this func returns error to the caller to trigger partiallyFailed. + return nil, errors.Errorf("Error getting lister for %s because no informer for GVK found", getResourceID(groupResource, namespace, name)) + } clusterObj, err := lister.Get(name) if err != nil { return nil, errors.Wrapf(err, "error getting resource from lister for %s, %s/%s", groupResource, namespace, name) diff --git a/pkg/test/resources.go b/pkg/test/resources.go index dc1c8e29df..fe2ad6352b 100644 --- a/pkg/test/resources.go +++ b/pkg/test/resources.go @@ -51,6 +51,7 @@ func Pods(items ...metav1.Object) *APIResource { ShortName: "po", Namespaced: true, Items: items, + Kind: "Pod", } }