From df5a802bd41c102c470eb9f9d198a8a67f42c4da Mon Sep 17 00:00:00 2001 From: wangyike Date: Wed, 13 Oct 2021 15:53:22 +0800 Subject: [PATCH] Fix: compatibility bug make reivwable --- .../v1alpha2/application/dispatch/dispatch.go | 19 +++++++ .../dispatch/dispatch_suite_test.go | 53 +++++++++++++++++++ 2 files changed, 72 insertions(+) diff --git a/pkg/controller/core.oam.dev/v1alpha2/application/dispatch/dispatch.go b/pkg/controller/core.oam.dev/v1alpha2/application/dispatch/dispatch.go index aeb13bc11..c67c6611c 100644 --- a/pkg/controller/core.oam.dev/v1alpha2/application/dispatch/dispatch.go +++ b/pkg/controller/core.oam.dev/v1alpha2/application/dispatch/dispatch.go @@ -203,6 +203,25 @@ func (a *AppManifestsDispatcher) retrieveLegacyResourceTrackers(ctx context.Cont a.legacyRTs = append(a.legacyRTs, rt.DeepCopy()) } } + + // compatibility code for label typo. more info: https://github.com/oam-dev/kubevela/issues/2464 + // TODO(wangyikewxgm) delete after appRollout deprecated. + oldRtList := &v1beta1.ResourceTrackerList{} + if err := a.c.List(ctx, oldRtList, client.MatchingLabels{ + oam.LabelAppName: ExtractAppName(a.currentRTName, a.namespace), + "app.oam.dev/namesapce": a.namespace, + }); err != nil { + return errors.Wrap(err, "cannot retrieve legacy resource trackers with miss-spell label") + } + if len(oldRtList.Items) != 0 { + for _, rt := range oldRtList.Items { + if rt.Name != a.currentRTName && + (a.previousRT != nil && rt.Name != a.previousRT.Name) && !IsLifeLongResourceTracker(rt) { + a.legacyRTs = append(a.legacyRTs, rt.DeepCopy()) + } + } + } + return nil } diff --git a/pkg/controller/core.oam.dev/v1alpha2/application/dispatch/dispatch_suite_test.go b/pkg/controller/core.oam.dev/v1alpha2/application/dispatch/dispatch_suite_test.go index b9a17f6f0..8eabf6398 100644 --- a/pkg/controller/core.oam.dev/v1alpha2/application/dispatch/dispatch_suite_test.go +++ b/pkg/controller/core.oam.dev/v1alpha2/application/dispatch/dispatch_suite_test.go @@ -465,6 +465,59 @@ var _ = Describe("Test handleSkipGC func", func() { }) }) +var _ = Describe("Test compatibility code", func() { + var namespaceName string + var appName string + ctx := context.Background() + BeforeEach(func() { + namespaceName = fmt.Sprintf("%s-%s", "compatibility-code-test", strconv.FormatInt(rand.Int63(), 16)) + appName = "test-app" + Expect(k8sClient.Create(ctx, &corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: namespaceName}})) + }) + + It("Test GC skip func ", func() { + a := AppManifestsDispatcher{c: k8sClient, currentRTName: appName + "-v4-" + namespaceName, namespace: namespaceName} + resourceTracker_old := v1beta1.ResourceTracker{ + ObjectMeta: metav1.ObjectMeta{ + Name: appName + "-v1-" + namespaceName, + Labels: map[string]string{ + oam.LabelAppNamespace: namespaceName, + oam.LabelAppName: appName, + }, + }, + } + resourceTracker_new := v1beta1.ResourceTracker{ + ObjectMeta: metav1.ObjectMeta{ + Name: appName + "-v2-" + namespaceName, + Labels: map[string]string{ + "app.oam.dev/namesapce": namespaceName, + oam.LabelAppName: appName, + }, + }, + } + resourceTracker_previous := v1beta1.ResourceTracker{ + ObjectMeta: metav1.ObjectMeta{ + Name: appName + "-v3-" + namespaceName, + Labels: map[string]string{ + oam.LabelAppNamespace: namespaceName, + oam.LabelAppName: appName, + }, + }, + } + a.previousRT = &resourceTracker_previous + Expect(a.c.Create(ctx, &resourceTracker_old)).Should(BeNil()) + Expect(a.c.Create(ctx, &resourceTracker_new)).Should(BeNil()) + Expect(a.retrieveLegacyResourceTrackers(ctx)).Should(BeNil()) + Expect(len(a.legacyRTs)).Should(BeEquivalentTo(2)) + res := map[types.UID]bool{} + for _, rt := range a.legacyRTs { + res[rt.UID] = true + } + Expect(res[resourceTracker_old.UID]).Should(BeTrue()) + Expect(res[resourceTracker_new.UID]).Should(BeTrue()) + }) +}) + // in envtest, no gc controller can delete PersistentVolume because of its finalizer // so we just use deletion timestamp to verify its deletion func persistentVolumeIsDeleted(pv *corev1.PersistentVolume) bool {