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  }