diff --git a/pkg/velaql/providers/query/tree.go b/pkg/velaql/providers/query/tree.go index 7dda0fa53..6ccd85c14 100644 --- a/pkg/velaql/providers/query/tree.go +++ b/pkg/velaql/providers/query/tree.go @@ -23,6 +23,7 @@ import ( appsv1 "k8s.io/api/apps/v1" v12 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/meta" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" @@ -677,6 +678,9 @@ func iteratorChildResources(ctx context.Context, cluster string, k8sClient clien clusterCTX := multicluster.ContextWithClusterName(ctx, cluster) items, err := listItemByRule(clusterCTX, k8sClient, resource, *parentObject, specifiedFunc, rules.DefaultGenListOptionFunc) if err != nil { + if meta.IsNoMatchError(err) || runtime.IsNotRegisteredError(err) { + continue + } return nil, err } for _, item := range items { diff --git a/pkg/velaql/providers/query/tree_test.go b/pkg/velaql/providers/query/tree_test.go index d4b2edf8a..b841c6c13 100644 --- a/pkg/velaql/providers/query/tree_test.go +++ b/pkg/velaql/providers/query/tree_test.go @@ -1380,6 +1380,54 @@ var _ = Describe("unit-test to e2e test", func() { Expect(err).Should(BeNil()) Expect(len(res.List)).Should(Equal(2)) }) + + It("Test not exist api don't break whole process", func() { + notExistRuleStr := ` +- parentResourceType: + group: apps + kind: Deployment + childrenResourceType: + - apiVersion: v2 + kind: Pod +` + notExistParentResourceStr := ` +- parentResourceType: + group: badgroup + kind: Deployment + childrenResourceType: + - apiVersion: v2 + kind: Pod +` + Expect(k8sClient.Create(ctx, &v1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "vela-system"}})).Should(SatisfyAny(BeNil(), util.AlreadyExistMatcher{})) + badRuleConfigMap := v1.ConfigMap{TypeMeta: metav1.TypeMeta{APIVersion: "v1", Kind: "ConfigMap"}, + ObjectMeta: metav1.ObjectMeta{Namespace: types3.DefaultKubeVelaNS, Name: "bad-rule", Labels: map[string]string{oam.LabelResourceRules: "true"}}, + Data: map[string]string{relationshipKey: notExistRuleStr}, + } + Expect(k8sClient.Create(ctx, &badRuleConfigMap)).Should(BeNil()) + + notExistParentConfigMap := v1.ConfigMap{TypeMeta: metav1.TypeMeta{APIVersion: "v1", Kind: "ConfigMap"}, + ObjectMeta: metav1.ObjectMeta{Namespace: types3.DefaultKubeVelaNS, Name: "not-exist-parent", Labels: map[string]string{oam.LabelResourceRules: "true"}}, + Data: map[string]string{relationshipKey: notExistParentResourceStr}, + } + Expect(k8sClient.Create(ctx, ¬ExistParentConfigMap)).Should(BeNil()) + + prd := provider{cli: k8sClient} + opt := `app: { + name: "app" + namespace: "test-namespace" + }` + v, err := value.NewValue(opt, nil, "") + + Expect(err).Should(BeNil()) + Expect(prd.GetApplicationResourceTree(nil, v, nil)).Should(BeNil()) + type Res struct { + List []types.AppliedResource `json:"list"` + } + var res Res + err = v.UnmarshalTo(&res) + Expect(err).Should(BeNil()) + Expect(len(res.List)).Should(Equal(2)) + }) }) var _ = Describe("test merge globalRules", func() {