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  }