diff --git a/internal/declarative/v2/reconciler.go b/internal/declarative/v2/reconciler.go index eb08a33845..f9f0eaa3a3 100644 --- a/internal/declarative/v2/reconciler.go +++ b/internal/declarative/v2/reconciler.go @@ -7,7 +7,6 @@ import ( "time" apimetav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/cli-runtime/pkg/resource" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" @@ -52,14 +51,15 @@ func NewFromManager(mgr manager.Manager, requeueIntervals queue.RequeueIntervals reconciler.RequeueIntervals = requeueIntervals reconciler.specResolver = specResolver reconciler.manifestClient = manifestAPIClient - reconciler.managedLabelRemovalService = labelsremoval.NewManagedLabelRemovalService(manifestAPIClient) + reconciler.managedLabelRemovalService = labelsremoval.NewManagedByLabelRemovalService(manifestAPIClient) reconciler.Options = DefaultOptions().Apply(WithManager(mgr)).Apply(options...) return reconciler } -type ManagedLabelRemoval interface { - RemoveManagedLabel(ctx context.Context, - manifest *v1beta2.Manifest, skrClient client.Client, defaultCR *unstructured.Unstructured, +type ManagedByLabelRemoval interface { + RemoveManagedByLabel(ctx context.Context, + manifest *v1beta2.Manifest, + skrClient client.Client, ) error } @@ -77,7 +77,7 @@ type Reconciler struct { MandatoryModuleMetrics *metrics.MandatoryModulesMetrics specResolver SpecResolver manifestClient ManifestAPIClient - managedLabelRemovalService ManagedLabelRemoval + managedLabelRemovalService ManagedByLabelRemoval } //nolint:funlen,cyclop,gocognit // Declarative pkg will be removed soon @@ -123,7 +123,7 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu return r.cleanupManifest(ctx, manifest, manifestStatus, metrics.ManifestUnmanagedUpdate, nil) } - if controllerutil.ContainsFinalizer(manifest, labelsremoval.LabelRemovalFinalizer) { + if controllerutil.ContainsFinalizer(manifest, finalizer.LabelRemovalFinalizer) { return r.handleLabelsRemovalFinalizer(ctx, skrClient, manifest) } @@ -222,16 +222,11 @@ func recordMandatoryModuleState(manifest *v1beta2.Manifest, r *Reconciler) { func (r *Reconciler) handleLabelsRemovalFinalizer(ctx context.Context, skrClient client.Client, manifest *v1beta2.Manifest, ) (ctrl.Result, error) { - defaultCR, err := modulecr.NewClient(skrClient).GetCR(ctx, manifest) + err := r.managedLabelRemovalService.RemoveManagedByLabel(ctx, manifest, skrClient) if err != nil { return ctrl.Result{}, err } - if err := r.managedLabelRemovalService.RemoveManagedLabel(ctx, manifest, skrClient, - defaultCR); err != nil { - return ctrl.Result{}, err - } - r.ManifestMetrics.RecordRequeueReason(metrics.ManifestResourcesLabelRemoval, queue.IntendedRequeue) return ctrl.Result{Requeue: true}, nil } diff --git a/internal/manifest/finalizer/handler.go b/internal/manifest/finalizer/handler.go index b73130e3fd..dae0697fa2 100644 --- a/internal/manifest/finalizer/handler.go +++ b/internal/manifest/finalizer/handler.go @@ -10,7 +10,6 @@ import ( "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" "github.com/kyma-project/lifecycle-manager/api/v1beta2" - "github.com/kyma-project/lifecycle-manager/internal/manifest/labelsremoval" "github.com/kyma-project/lifecycle-manager/pkg/util" ) @@ -19,11 +18,12 @@ var ErrRequeueRequired = errors.New("requeue required") const ( DefaultFinalizer = "declarative.kyma-project.io/finalizer" CustomResourceManagerFinalizer = "resource.kyma-project.io/finalizer" + LabelRemovalFinalizer = "label-removal-finalizer" ) // RemoveRequiredFinalizers removes preconfigured finalizers, but not include CustomResourceManagerFinalizer. func RemoveRequiredFinalizers(manifest *v1beta2.Manifest) bool { - finalizersToRemove := []string{DefaultFinalizer, labelsremoval.LabelRemovalFinalizer} + finalizersToRemove := []string{DefaultFinalizer, LabelRemovalFinalizer} finalizerRemoved := false for _, f := range finalizersToRemove { @@ -46,7 +46,7 @@ func RemoveAllFinalizers(manifest *v1beta2.Manifest) bool { func FinalizersUpdateRequired(manifest *v1beta2.Manifest) bool { defaultFinalizerAdded := controllerutil.AddFinalizer(manifest, DefaultFinalizer) - labelRemovalFinalizerAdded := controllerutil.AddFinalizer(manifest, labelsremoval.LabelRemovalFinalizer) + labelRemovalFinalizerAdded := controllerutil.AddFinalizer(manifest, LabelRemovalFinalizer) return defaultFinalizerAdded || labelRemovalFinalizerAdded } diff --git a/internal/manifest/labelsremoval/labels_removal.go b/internal/manifest/labelsremoval/labels_removal.go index 5e397c1cb9..5493ade7f6 100644 --- a/internal/manifest/labelsremoval/labels_removal.go +++ b/internal/manifest/labelsremoval/labels_removal.go @@ -2,6 +2,7 @@ package labelsremoval import ( "context" + "errors" "fmt" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" @@ -11,37 +12,43 @@ import ( "github.com/kyma-project/lifecycle-manager/api/shared" "github.com/kyma-project/lifecycle-manager/api/v1beta2" + "github.com/kyma-project/lifecycle-manager/internal/manifest/finalizer" + "github.com/kyma-project/lifecycle-manager/internal/manifest/modulecr" ) -const LabelRemovalFinalizer = "label-removal-finalizer" - type ManifestAPIClient interface { UpdateManifest(ctx context.Context, manifest *v1beta2.Manifest) error } -type ManagedLabelRemovalService struct { +type ManagedByLabelRemovalService struct { manifestClient ManifestAPIClient } -func NewManagedLabelRemovalService(manifestClient ManifestAPIClient) *ManagedLabelRemovalService { - return &ManagedLabelRemovalService{ +func NewManagedByLabelRemovalService(manifestClient ManifestAPIClient) *ManagedByLabelRemovalService { + return &ManagedByLabelRemovalService{ manifestClient: manifestClient, } } -func (l *ManagedLabelRemovalService) RemoveManagedLabel(ctx context.Context, - manifest *v1beta2.Manifest, skrClient client.Client, defaultCR *unstructured.Unstructured, +func (l *ManagedByLabelRemovalService) RemoveManagedByLabel(ctx context.Context, + manifest *v1beta2.Manifest, + skrClient client.Client, ) error { - if err := HandleLabelsRemovalFromResources(ctx, manifest, skrClient, defaultCR); err != nil { - return err + resourcesError := removeFromSyncedResources(ctx, manifest, skrClient) + defaultCRError := removeFromDefaultCR(ctx, manifest, skrClient) + + if resourcesError != nil || defaultCRError != nil { + return fmt.Errorf("failed to remove %s label from one or more resources: %w", + shared.ManagedBy, + errors.Join(resourcesError, defaultCRError)) } - controllerutil.RemoveFinalizer(manifest, LabelRemovalFinalizer) + controllerutil.RemoveFinalizer(manifest, finalizer.LabelRemovalFinalizer) return l.manifestClient.UpdateManifest(ctx, manifest) } -func HandleLabelsRemovalFromResources(ctx context.Context, manifestCR *v1beta2.Manifest, - skrClient client.Client, defaultCR *unstructured.Unstructured, +func removeFromSyncedResources(ctx context.Context, manifestCR *v1beta2.Manifest, + skrClient client.Client, ) error { for _, res := range manifestCR.Status.Synced { objectKey := client.ObjectKey{ @@ -54,19 +61,33 @@ func HandleLabelsRemovalFromResources(ctx context.Context, manifestCR *v1beta2.M return fmt.Errorf("failed to get resource, %w", err) } - if IsManagedLabelRemoved(obj) { - if err := skrClient.Update(ctx, obj); err != nil { - return fmt.Errorf("failed to update object: %w", err) - } + if err := removeFromObject(ctx, obj, skrClient); err != nil { + return err } } - if defaultCR == nil { + return nil +} + +func removeFromDefaultCR(ctx context.Context, + manifest *v1beta2.Manifest, + skrClient client.Client, +) error { + if manifest.Spec.Resource == nil { return nil } - if IsManagedLabelRemoved(defaultCR) { - if err := skrClient.Update(ctx, defaultCR); err != nil { + defaultCR, err := modulecr.NewClient(skrClient).GetCR(ctx, manifest) + if err != nil { + return fmt.Errorf("failed to get default CR, %w", err) + } + + return removeFromObject(ctx, defaultCR, skrClient) +} + +func removeFromObject(ctx context.Context, obj *unstructured.Unstructured, skrClient client.Client) error { + if removeManagedLabel(obj) { + if err := skrClient.Update(ctx, obj); err != nil { return fmt.Errorf("failed to update object: %w", err) } } @@ -87,7 +108,7 @@ func constructResource(resource shared.Resource) *unstructured.Unstructured { return obj } -func IsManagedLabelRemoved(resource *unstructured.Unstructured) bool { +func removeManagedLabel(resource *unstructured.Unstructured) bool { labels := resource.GetLabels() _, managedByLabelExists := labels[shared.ManagedBy] if managedByLabelExists { diff --git a/internal/manifest/labelsremoval/labels_removal_test.go b/internal/manifest/labelsremoval/labels_removal_test.go index ec0f458818..ddc21d042e 100644 --- a/internal/manifest/labelsremoval/labels_removal_test.go +++ b/internal/manifest/labelsremoval/labels_removal_test.go @@ -2,8 +2,10 @@ package labelsremoval_test import ( "context" + "errors" "testing" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" apimetav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" @@ -15,34 +17,10 @@ import ( "github.com/kyma-project/lifecycle-manager/api/shared" "github.com/kyma-project/lifecycle-manager/api/v1beta2" "github.com/kyma-project/lifecycle-manager/internal/manifest/labelsremoval" - "github.com/kyma-project/lifecycle-manager/internal/manifest/manifestclient" "github.com/kyma-project/lifecycle-manager/pkg/testutils/builder" ) -func Test_needsUpdateAfterLabelRemoval_WhenLabelsAreEmpty(t *testing.T) { - emptyLabels := map[string]string{} - res := &unstructured.Unstructured{} - res.SetLabels(emptyLabels) - actual := labelsremoval.IsManagedLabelRemoved(res) - - require.False(t, actual) - require.Equal(t, emptyLabels, res.GetLabels()) -} - -func Test_needsUpdateAfterLabelRemoval_WhenManagedByLabel(t *testing.T) { - labels := map[string]string{ - shared.ManagedBy: shared.ManagedByLabelValue, - } - expectedLabels := map[string]string{} - res := &unstructured.Unstructured{} - res.SetLabels(labels) - actual := labelsremoval.IsManagedLabelRemoved(res) - - require.True(t, actual) - require.Equal(t, expectedLabels, res.GetLabels()) -} - -func Test_handleLabelsRemovalFromResources_WhenManifestResourcesHaveLabels(t *testing.T) { +func Test_RemoveManagedByLabel_WhenManifestResourcesHaveLabels(t *testing.T) { gvk := schema.GroupVersionKind{ Group: "test-group", Version: "v1", @@ -105,8 +83,11 @@ func Test_handleLabelsRemovalFromResources_WhenManifestResourcesHaveLabels(t *te err := v1beta2.AddToScheme(scheme) require.NoError(t, err) fakeClient := fake.NewClientBuilder().WithScheme(scheme).WithObjects(objs...).Build() + manifestClient := manifestClientStub{} + + service := labelsremoval.NewManagedByLabelRemovalService(&manifestClient) - err = labelsremoval.HandleLabelsRemovalFromResources(context.TODO(), manifest, fakeClient, nil) + err = service.RemoveManagedByLabel(context.TODO(), manifest, fakeClient) require.NoError(t, err) firstObj, secondObj := &unstructured.Unstructured{}, &unstructured.Unstructured{} @@ -121,29 +102,20 @@ func Test_handleLabelsRemovalFromResources_WhenManifestResourcesHaveLabels(t *te secondObj) require.NoError(t, err) require.Empty(t, secondObj.GetLabels()) -} -func Test_handleLabelsRemovalFromResources_WhenManifestResourcesAreNilAndNoDefaultCR(t *testing.T) { - manifest := builder.NewManifestBuilder().Build() + assert.True(t, manifestClient.called) +} +func Test_RemoveManagedByLabel_WhenManifestResourceCannotBeFetched(t *testing.T) { scheme := machineryruntime.NewScheme() err := v1beta2.AddToScheme(scheme) require.NoError(t, err) - fakeClient := fake.NewClientBuilder().WithScheme(scheme).Build() - - err = labelsremoval.HandleLabelsRemovalFromResources(context.TODO(), manifest, fakeClient, nil) - - require.NoError(t, err) -} - -func Test_handleLabelsRemovalFromResources_WhenManifestResourcesAndDefaultCRHaveLabels(t *testing.T) { gvk := schema.GroupVersionKind{ Group: "test-group", Version: "v1", Kind: "TestKind", } - status := shared.Status{ Synced: []shared.Resource{ { @@ -159,20 +131,22 @@ func Test_handleLabelsRemovalFromResources_WhenManifestResourcesAndDefaultCRHave } manifest := builder.NewManifestBuilder().WithStatus(status).Build() - objs := []client.Object{ - &unstructured.Unstructured{ - Object: map[string]interface{}{ - "apiVersion": gvk.GroupVersion().String(), - "kind": gvk.Kind, - "version": gvk.Version, - }, - }, + fakeClient := fake.NewClientBuilder().WithScheme(scheme).Build() + manifestClient := manifestClientStub{} + + svc := labelsremoval.NewManagedByLabelRemovalService(&manifestClient) + + err = svc.RemoveManagedByLabel(context.TODO(), manifest, fakeClient) + require.ErrorContains(t, err, "failed to get resource") + assert.False(t, manifestClient.called) +} + +func Test_RemoveManagedByLabel_WhenDefaultCRHasLabels(t *testing.T) { + gvk := schema.GroupVersionKind{ + Group: "test-group", + Version: "v1", + Kind: "TestKind", } - objs[0].SetName("test-resource-1") - objs[0].SetNamespace("test-1") - objs[0].SetLabels(map[string]string{ - "operator.kyma-project.io/managed-by": "kyma", - }) defaultCR := &unstructured.Unstructured{} defaultCR.SetName("default-cr") @@ -181,36 +155,61 @@ func Test_handleLabelsRemovalFromResources_WhenManifestResourcesAndDefaultCRHave defaultCR.SetLabels(map[string]string{ "operator.kyma-project.io/managed-by": "kyma", }) - - objs = append(objs, defaultCR) + objs := []client.Object{defaultCR} scheme := machineryruntime.NewScheme() err := v1beta2.AddToScheme(scheme) require.NoError(t, err) fakeClient := fake.NewClientBuilder().WithScheme(scheme).WithObjects(objs...).Build() + manifest := builder.NewManifestBuilder().WithResource(defaultCR).Build() + manifestClient := manifestClientStub{} - err = labelsremoval.HandleLabelsRemovalFromResources(context.TODO(), manifest, fakeClient, - defaultCR) + service := labelsremoval.NewManagedByLabelRemovalService(&manifestClient) - require.NoError(t, err) + err = service.RemoveManagedByLabel(context.TODO(), manifest, fakeClient) - firstObj := &unstructured.Unstructured{} - firstObj.SetGroupVersionKind(gvk) - err = fakeClient.Get(context.TODO(), client.ObjectKey{Name: "test-resource-1", Namespace: "test-1"}, - firstObj) require.NoError(t, err) - require.Empty(t, firstObj.GetLabels()) + err = fakeClient.Get(context.TODO(), + client.ObjectKey{Name: "default-cr", Namespace: "default-ns"}, + defaultCR) require.NoError(t, err) - require.Empty(t, defaultCR.GetLabels()) + assert.Empty(t, defaultCR.GetLabels()) } -func Test_RemoveManagedLabel_WhenErrorIsReturned(t *testing.T) { +func Test_RemoveManagedByLabel_WhenDefaultCRCannotBeFetched(t *testing.T) { + gvk := schema.GroupVersionKind{ + Group: "test-group", + Version: "v1", + Kind: "TestKind", + } + + defaultCR := &unstructured.Unstructured{} + defaultCR.SetName("default-cr") + defaultCR.SetNamespace("default-ns") + defaultCR.SetGroupVersionKind(gvk) + defaultCR.SetLabels(map[string]string{ + "operator.kyma-project.io/managed-by": "kyma", + }) + scheme := machineryruntime.NewScheme() err := v1beta2.AddToScheme(scheme) require.NoError(t, err) + fakeClient := fake.NewClientBuilder().WithScheme(scheme).Build() + manifest := builder.NewManifestBuilder().WithResource(defaultCR).Build() + manifestClient := manifestClientStub{} + + service := labelsremoval.NewManagedByLabelRemovalService(&manifestClient) + + err = service.RemoveManagedByLabel(context.TODO(), manifest, fakeClient) + + require.ErrorContains(t, err, "failed to get default CR") + assert.False(t, manifestClient.called) +} + +func Test_RemoveManagedByLabel_WhenObjCannotBeUpdated(t *testing.T) { gvk := schema.GroupVersionKind{ Group: "test-group", Version: "v1", @@ -229,18 +228,57 @@ func Test_RemoveManagedLabel_WhenErrorIsReturned(t *testing.T) { }, }, } + + objs := []client.Object{ + &unstructured.Unstructured{ + Object: map[string]interface{}{ + "apiVersion": gvk.GroupVersion().String(), + "kind": gvk.Kind, + "version": gvk.Version, + }, + }, + } + objs[0].SetName("test-resource-1") + objs[0].SetNamespace("test-1") + objs[0].SetLabels(map[string]string{ + "operator.kyma-project.io/managed-by": "kyma", + }) + + scheme := machineryruntime.NewScheme() + err := v1beta2.AddToScheme(scheme) + require.NoError(t, err) + fakeClient := fake.NewClientBuilder().WithScheme(scheme).WithObjects(objs...).Build() + manifest := builder.NewManifestBuilder().WithStatus(status).Build() + manifestClient := manifestClientStub{} + + service := labelsremoval.NewManagedByLabelRemovalService(&manifestClient) + + err = service.RemoveManagedByLabel(context.TODO(), manifest, errorClientStub{fakeClient: fakeClient}) + + require.ErrorContains(t, err, "failed to update object") + require.ErrorContains(t, err, "test error") +} + +func Test_RemoveManagedByLabel_WhenManifestResourcesAreNilAndNoDefaultCR(t *testing.T) { + manifest := builder.NewManifestBuilder().Build() + + scheme := machineryruntime.NewScheme() + err := v1beta2.AddToScheme(scheme) + require.NoError(t, err) fakeClient := fake.NewClientBuilder().WithScheme(scheme).Build() + manifestClient := manifestClientStub{} - manifestClnt := manifestclient.NewManifestClient(nil, fakeClient) - svc := labelsremoval.NewManagedLabelRemovalService(manifestClnt) + service := labelsremoval.NewManagedByLabelRemovalService(&manifestClient) - err = svc.RemoveManagedLabel(context.TODO(), manifest, fakeClient, nil) - require.ErrorContains(t, err, "failed to get resource") + err = service.RemoveManagedByLabel(context.TODO(), manifest, fakeClient) + + require.NoError(t, err) + assert.True(t, manifestClient.called) } -func Test_RemoveManagedLabel_WhenFinalizerIsRemoved(t *testing.T) { +func Test_RemoveManagedByLabel_WhenFinalizerIsRemoved(t *testing.T) { scheme := machineryruntime.NewScheme() err := v1beta2.AddToScheme(scheme) require.NoError(t, err) @@ -282,15 +320,37 @@ func Test_RemoveManagedLabel_WhenFinalizerIsRemoved(t *testing.T) { }) fakeClient := fake.NewClientBuilder().WithScheme(scheme).WithObjects(manifest).WithObjects(objs...).Build() + manifestClient := manifestClientStub{} + svc := labelsremoval.NewManagedByLabelRemovalService(&manifestClient) - manifestClnt := manifestclient.NewManifestClient(nil, fakeClient) - svc := labelsremoval.NewManagedLabelRemovalService(manifestClnt) + err = svc.RemoveManagedByLabel(context.TODO(), manifest, fakeClient) - err = svc.RemoveManagedLabel(context.TODO(), manifest, fakeClient, nil) require.NoError(t, err) + assert.Empty(t, manifest.GetFinalizers()) + assert.True(t, manifestClient.called) +} - err = fakeClient.Get(context.TODO(), client.ObjectKey{Name: manifest.GetName(), Namespace: manifest.GetNamespace()}, - manifest) - require.NoError(t, err) - require.Empty(t, manifest.GetFinalizers()) +// stubs + +type manifestClientStub struct { + called bool + err error +} + +func (m *manifestClientStub) UpdateManifest(ctx context.Context, manifest *v1beta2.Manifest) error { + m.called = true + return m.err +} + +type errorClientStub struct { + client.Client + fakeClient client.Client +} + +func (e errorClientStub) Update(_ context.Context, _ client.Object, _ ...client.UpdateOption) error { + return errors.New("test error") +} + +func (e errorClientStub) Get(ctx context.Context, key client.ObjectKey, obj client.Object, opts ...client.GetOption) error { + return e.fakeClient.Get(ctx, key, obj, opts...) } diff --git a/internal/manifest/modulecr/client.go b/internal/manifest/modulecr/client.go index 2d80a8a6a0..928d84f754 100644 --- a/internal/manifest/modulecr/client.go +++ b/internal/manifest/modulecr/client.go @@ -2,6 +2,7 @@ package modulecr import ( "context" + "errors" "fmt" apierrors "k8s.io/apimachinery/pkg/api/errors" @@ -17,6 +18,8 @@ import ( "github.com/kyma-project/lifecycle-manager/pkg/util" ) +var ErrNoResourceDefined = errors.New("no resource defined in the manifest") + type Client struct { client.Client } @@ -30,6 +33,10 @@ func NewClient(client client.Client) *Client { func (c *Client) GetCR(ctx context.Context, manifest *v1beta2.Manifest) (*unstructured.Unstructured, error, ) { + if manifest.Spec.Resource == nil { + return nil, ErrNoResourceDefined + } + resourceCR := &unstructured.Unstructured{} name := manifest.Spec.Resource.GetName() namespace := manifest.Spec.Resource.GetNamespace() diff --git a/pkg/testutils/builder/manifest.go b/pkg/testutils/builder/manifest.go index a7170d88dc..ccd0a11cb0 100644 --- a/pkg/testutils/builder/manifest.go +++ b/pkg/testutils/builder/manifest.go @@ -2,6 +2,7 @@ package builder import ( apimetav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "github.com/kyma-project/lifecycle-manager/api/shared" "github.com/kyma-project/lifecycle-manager/api/v1beta2" @@ -91,6 +92,11 @@ func (mb ManifestBuilder) WithFinalizers(finalizers []string) ManifestBuilder { return mb } +func (mb ManifestBuilder) WithResource(resource *unstructured.Unstructured) ManifestBuilder { + mb.manifest.Spec.Resource = resource + return mb +} + // Build returns the built v1beta2.Manifest. func (mb ManifestBuilder) Build() *v1beta2.Manifest { return mb.manifest diff --git a/tests/e2e/module_unmanage_test.go b/tests/e2e/module_unmanage_test.go index 406b59b010..9f8e0477c1 100644 --- a/tests/e2e/module_unmanage_test.go +++ b/tests/e2e/module_unmanage_test.go @@ -180,7 +180,9 @@ var _ = Describe("Unmanaging Kyma Module", Ordered, func() { Should(Succeed()) }) - It("When Module is enabled again", func() { + It("When Module is enabled again with CustomResourcePolicy:Ignore", func() { + module.CustomResourcePolicy = v1beta2.CustomResourcePolicyIgnore + Eventually(EnableModule). WithContext(ctx). WithArguments(skrClient, defaultRemoteKymaName, RemoteNamespace, module). @@ -203,5 +205,45 @@ var _ = Describe("Unmanaging Kyma Module", Ordered, func() { WithArguments(kyma.GetName(), kyma.GetNamespace(), kcpClient, shared.StateReady). Should(Succeed()) }) + + It("When Module is unmanaged", func() { + Eventually(SetModuleManaged). + WithContext(ctx). + WithArguments(skrClient, defaultRemoteKymaName, RemoteNamespace, module.Name, false). + Should(Succeed()) + + By("And Manifest CR is removed") + Eventually(NoManifestExist). + WithContext(ctx). + WithArguments(kcpClient). + Should(Succeed()) + + By("And Module Operator Deployment is not removed on SKR cluster") + Consistently(CheckIfExists). + WithContext(ctx). + WithArguments(ModuleResourceName, TestModuleResourceNamespace, + "apps", "v1", "Deployment", skrClient). + Should(Succeed()) + + By("And all manifest resources no longer have managed-by labels") + for _, resource := range manifestResources { + objectKey := client.ObjectKey{Name: resource.Name, Namespace: resource.Namespace} + gvk := schema.GroupVersionKind{ + Group: resource.Group, + Version: resource.Version, + Kind: resource.Kind, + } + Eventually(HasExpectedLabel). + WithContext(ctx). + WithArguments(skrClient, objectKey, gvk, + shared.ManagedBy, shared.ManagedByLabelValue).Should(Equal(ErrLabelNotFound)) + } + + By("And KCP Kyma CR is in \"Ready\" State") + Eventually(KymaIsInState). + WithContext(ctx). + WithArguments(kyma.GetName(), kyma.GetNamespace(), kcpClient, shared.StateReady). + Should(Succeed()) + }) }) }) diff --git a/unit-test-coverage.yaml b/unit-test-coverage.yaml index 4bfc67663c..3576252fa6 100644 --- a/unit-test-coverage.yaml +++ b/unit-test-coverage.yaml @@ -10,10 +10,10 @@ packages: internal/manifest/filemutex: 100 internal/manifest/finalizer: 17.5 internal/manifest/skrresources: 20.2 - internal/manifest/labelsremoval: 93 + internal/manifest/labelsremoval: 100 internal/manifest/img: 65.5 internal/manifest/manifestclient: 5.0 - internal/manifest/modulecr: 50.0 + internal/manifest/modulecr: 47.0 internal/maintenancewindows: 87.5 internal/istio: 63.3 internal/pkg/resources: 91.7