github.com/verrazzano/verrazzano@v1.7.1/cluster-operator/controllers/capi/capi_cluster_controller_test.go (about) 1 // Copyright (c) 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 capi 5 6 import ( 7 "context" 8 "fmt" 9 "testing" 10 11 "github.com/stretchr/testify/assert" 12 "github.com/verrazzano/verrazzano/cluster-operator/apis/clusters/v1alpha1" 13 internalcapi "github.com/verrazzano/verrazzano/cluster-operator/internal/capi" 14 "github.com/verrazzano/verrazzano/pkg/constants" 15 "go.uber.org/zap" 16 v1 "k8s.io/api/core/v1" 17 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 18 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" 19 "k8s.io/apimachinery/pkg/runtime" 20 "k8s.io/apimachinery/pkg/types" 21 clientgoscheme "k8s.io/client-go/kubernetes/scheme" 22 ctrl "sigs.k8s.io/controller-runtime" 23 "sigs.k8s.io/controller-runtime/pkg/client" 24 "sigs.k8s.io/controller-runtime/pkg/client/fake" 25 ) 26 27 const ( 28 clusterName = "capi1" 29 ) 30 31 // GIVEN a CAPI cluster resource is created 32 // WHEN the reconciler runs 33 // THEN a VMC is created 34 func TestClusterCreation(t *testing.T) { 35 asserts := assert.New(t) 36 37 ep := &v1.Endpoints{ 38 ObjectMeta: metav1.ObjectMeta{ 39 Name: "kubernetes", 40 Namespace: "default", 41 }, 42 Subsets: []v1.EndpointSubset{{Addresses: []v1.EndpointAddress{{IP: "1.2.3.4"}}}}, 43 } 44 45 fakeClient := fake.NewClientBuilder().WithScheme(newScheme()).WithObjects(newCAPICluster(clusterName), ep).Build() 46 reconciler := newCAPIClusterReconciler(fakeClient) 47 request := newRequest(clusterName) 48 49 _, err := reconciler.Reconcile(context.TODO(), request) 50 asserts.NoError(err) 51 52 vmc := &v1alpha1.VerrazzanoManagedCluster{} 53 err = fakeClient.Get(context.TODO(), types.NamespacedName{Name: clusterName, Namespace: constants.VerrazzanoMultiClusterNamespace}, vmc) 54 asserts.NoError(err) 55 cluster := &unstructured.Unstructured{} 56 cluster.SetGroupVersionKind(internalcapi.GVKCAPICluster) 57 err = fakeClient.Get(context.TODO(), types.NamespacedName{Name: clusterName}, cluster) 58 asserts.NoError(err) 59 asserts.Equal(finalizerName, cluster.GetFinalizers()[0]) 60 } 61 62 // GIVEN a CAPI cluster resource is deleted 63 // WHEN the reconciler runs 64 // THEN the VMC is removed 65 func TestClusterDeletion(t *testing.T) { 66 asserts := assert.New(t) 67 68 cluster := newCAPICluster(clusterName) 69 now := metav1.Now() 70 cluster.SetDeletionTimestamp(&now) 71 cluster.SetFinalizers([]string{finalizerName}) 72 73 vmc := &v1alpha1.VerrazzanoManagedCluster{ 74 ObjectMeta: metav1.ObjectMeta{ 75 Name: clusterName, 76 Namespace: constants.VerrazzanoMultiClusterNamespace, 77 }, 78 } 79 vmc.Spec = v1alpha1.VerrazzanoManagedClusterSpec{ 80 Description: fmt.Sprintf("%s VerrazzanoManagedCluster Resource", cluster.GetName()), 81 } 82 83 fakeClient := fake.NewClientBuilder().WithScheme(newScheme()).WithObjects(cluster, vmc).Build() 84 reconciler := newCAPIClusterReconciler(fakeClient) 85 request := newRequest(clusterName) 86 87 _, err := reconciler.Reconcile(context.TODO(), request) 88 asserts.NoError(err) 89 90 remainingVmc := &v1alpha1.VerrazzanoManagedCluster{} 91 err = fakeClient.Get(context.TODO(), types.NamespacedName{Name: clusterName}, remainingVmc) 92 asserts.Error(err) 93 deletedCluster := &unstructured.Unstructured{} 94 deletedCluster.SetGroupVersionKind(internalcapi.GVKCAPICluster) 95 asserts.Error(fakeClient.Get(context.TODO(), types.NamespacedName{Name: clusterName}, deletedCluster)) 96 } 97 98 func newScheme() *runtime.Scheme { 99 scheme := runtime.NewScheme() 100 clientgoscheme.AddToScheme(scheme) 101 v1alpha1.AddToScheme(scheme) 102 103 return scheme 104 } 105 106 func newCAPICluster(name string) *unstructured.Unstructured { 107 cluster := &unstructured.Unstructured{} 108 cluster.SetGroupVersionKind(internalcapi.GVKCAPICluster) 109 cluster.SetName(name) 110 return cluster 111 } 112 113 func newCAPIClusterReconciler(c client.Client) CAPIClusterReconciler { 114 return CAPIClusterReconciler{ 115 Client: c, 116 Scheme: newScheme(), 117 Log: zap.S(), 118 RancherEnabled: true, 119 } 120 } 121 122 func newRequest(name string) ctrl.Request { 123 return ctrl.Request{ 124 NamespacedName: types.NamespacedName{ 125 Name: name, 126 }, 127 } 128 }