github.com/verrazzano/verrazzano@v1.7.0/application-operator/mcagent/mcagent_deregister_test.go (about) 1 // Copyright (c) 2022, 2023, Oracle and/or its affiliates. 2 // Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. 3 4 package mcagent 5 6 import ( 7 "context" 8 "testing" 9 "time" 10 11 asserts "github.com/stretchr/testify/assert" 12 "github.com/verrazzano/verrazzano/application-operator/constants" 13 clustersv1alpha1 "github.com/verrazzano/verrazzano/cluster-operator/apis/clusters/v1alpha1" 14 "go.uber.org/zap" 15 corev1 "k8s.io/api/core/v1" 16 apierrors "k8s.io/apimachinery/pkg/api/errors" 17 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 18 "k8s.io/apimachinery/pkg/types" 19 k8scheme "k8s.io/client-go/kubernetes/scheme" 20 "sigs.k8s.io/controller-runtime/pkg/client" 21 "sigs.k8s.io/controller-runtime/pkg/client/fake" 22 ) 23 24 // TestSyncDeregistration tests the synchronization method for the following use case. 25 // GIVEN objects on the managed cluster used for managed cluster synchronization 26 // WHEN tthe VMC is deleted 27 // THEN ensure that the managed cluster resources are cleaned up 28 func TestSyncDeregistration(t *testing.T) { 29 a := asserts.New(t) 30 31 vmcDeleted := clustersv1alpha1.VerrazzanoManagedCluster{ 32 ObjectMeta: metav1.ObjectMeta{ 33 Namespace: constants.VerrazzanoMultiClusterNamespace, 34 Name: testClusterName, 35 DeletionTimestamp: &metav1.Time{Time: time.Now()}, 36 }, 37 } 38 vmcNotDeleted := clustersv1alpha1.VerrazzanoManagedCluster{ 39 ObjectMeta: metav1.ObjectMeta{ 40 Namespace: constants.VerrazzanoMultiClusterNamespace, 41 Name: testClusterName, 42 }, 43 } 44 45 mcAgentSec := corev1.Secret{ 46 ObjectMeta: metav1.ObjectMeta{ 47 Name: constants.MCAgentSecret, 48 Namespace: constants.VerrazzanoSystemNamespace, 49 }, 50 } 51 mcRegSec := corev1.Secret{ 52 ObjectMeta: metav1.ObjectMeta{ 53 Name: constants.MCRegistrationSecret, 54 Namespace: constants.VerrazzanoSystemNamespace, 55 }, 56 } 57 58 tests := []struct { 59 name string 60 vmc *clustersv1alpha1.VerrazzanoManagedCluster 61 objects []client.Object 62 }{ 63 { 64 name: "test not deleted", 65 vmc: &vmcNotDeleted, 66 objects: []client.Object{}, 67 }, 68 { 69 name: "test not deleted with secrets", 70 vmc: &vmcNotDeleted, 71 objects: []client.Object{ 72 &mcRegSec, 73 &mcAgentSec, 74 }, 75 }, 76 { 77 name: "test deleted no objects", 78 vmc: &vmcDeleted, 79 objects: []client.Object{}, 80 }, 81 { 82 name: "test deleted registration secret", 83 vmc: &vmcDeleted, 84 objects: []client.Object{&mcRegSec}, 85 }, 86 { 87 name: "test deleted agent secret", 88 vmc: &vmcDeleted, 89 objects: []client.Object{&mcAgentSec}, 90 }, 91 { 92 name: "test deleted both secrets", 93 vmc: &vmcDeleted, 94 objects: []client.Object{ 95 &mcRegSec, 96 &mcAgentSec, 97 }, 98 }, 99 } 100 for _, tt := range tests { 101 t.Run(tt.name, func(t *testing.T) { 102 scheme := k8scheme.Scheme 103 err := clustersv1alpha1.AddToScheme(scheme) 104 a.NoError(err) 105 adminFake := fake.NewClientBuilder().WithScheme(scheme).WithObjects(tt.vmc).Build() 106 managedFake := fake.NewClientBuilder().WithScheme(scheme).WithObjects(tt.objects...).Build() 107 s := &Syncer{ 108 AdminClient: adminFake, 109 LocalClient: managedFake, 110 Log: zap.S(), 111 ManagedClusterName: testClusterName, 112 Context: context.TODO(), 113 } 114 err = s.syncDeregistration() 115 a.NoError(err) 116 117 // Verify that the objects have been deleted 118 if !tt.vmc.DeletionTimestamp.IsZero() { 119 for _, obj := range tt.objects { 120 err := managedFake.Get(context.TODO(), types.NamespacedName{Namespace: obj.GetNamespace(), Name: obj.GetName()}, obj) 121 a.True(apierrors.IsNotFound(err)) 122 } 123 return 124 } 125 // If not deleted, make sure the objects persist 126 for _, obj := range tt.objects { 127 err := managedFake.Get(context.TODO(), types.NamespacedName{Namespace: obj.GetNamespace(), Name: obj.GetName()}, obj) 128 a.NoError(err) 129 } 130 }) 131 } 132 } 133 134 // TestVerifyDeregister tests function to decide if the cluster should be deregistered 135 // GIVEN objects on the managed cluster used for managed cluster synchronization 136 // WHEN deregistration is expected 137 // THEN the function returns true 138 func TestVerifyDeregister(t *testing.T) { 139 assert := asserts.New(t) 140 141 scheme := k8scheme.Scheme 142 err := clustersv1alpha1.AddToScheme(scheme) 143 assert.NoError(err) 144 145 vmcDeleted := clustersv1alpha1.VerrazzanoManagedCluster{ 146 ObjectMeta: metav1.ObjectMeta{ 147 Namespace: constants.VerrazzanoMultiClusterNamespace, 148 Name: testClusterName, 149 DeletionTimestamp: &metav1.Time{Time: time.Now()}, 150 }, 151 } 152 adminDeleted := fake.NewClientBuilder().WithScheme(scheme).WithObjects(&vmcDeleted).Build() 153 154 vmc := clustersv1alpha1.VerrazzanoManagedCluster{ 155 ObjectMeta: metav1.ObjectMeta{ 156 Namespace: constants.VerrazzanoMultiClusterNamespace, 157 Name: testClusterName, 158 }, 159 } 160 admin := fake.NewClientBuilder().WithScheme(scheme).WithObjects(&vmc).Build() 161 162 tests := []struct { 163 name string 164 adminClient client.Client 165 expectFunc func(bool, ...interface{}) bool 166 }{ 167 { 168 name: "test nil Admin client", 169 adminClient: nil, 170 expectFunc: assert.True, 171 }, 172 { 173 name: "test non zero timestamp", 174 adminClient: adminDeleted, 175 expectFunc: assert.True, 176 }, 177 { 178 name: "test zero deletion timestamp", 179 adminClient: admin, 180 expectFunc: assert.False, 181 }, 182 } 183 for _, tt := range tests { 184 t.Run(tt.name, func(t *testing.T) { 185 s := Syncer{ 186 AdminClient: tt.adminClient, 187 Log: zap.S(), 188 ManagedClusterName: testClusterName, 189 Context: context.TODO(), 190 } 191 dereg, err := s.verifyDeregister() 192 assert.NoError(err) 193 tt.expectFunc(dereg) 194 }) 195 } 196 197 }