github.com/verrazzano/verrazzano@v1.7.1/cluster-operator/internal/capi/cluster_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  	"testing"
     9  
    10  	"github.com/stretchr/testify/assert"
    11  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    12  	"k8s.io/apimachinery/pkg/runtime"
    13  	"k8s.io/apimachinery/pkg/types"
    14  	"sigs.k8s.io/cluster-api/api/v1beta1"
    15  	"sigs.k8s.io/controller-runtime/pkg/client/fake"
    16  )
    17  
    18  const (
    19  	clusterName      = "test-cluster"
    20  	clusterClassName = "test-cluster-class"
    21  	testNamespace    = "test-namespace"
    22  )
    23  
    24  func TestGetClusterClassFromCluster(t *testing.T) {
    25  	a := assert.New(t)
    26  	ctx := context.TODO()
    27  	scheme := runtime.NewScheme()
    28  	_ = v1beta1.AddToScheme(scheme)
    29  	cluster := newCAPIClusterWithClassReference(clusterName, clusterClassName, testNamespace)
    30  	clusterClass := newCAPIClusterClass(clusterClassName, testNamespace)
    31  	fakeClient := fake.NewClientBuilder().WithScheme(scheme).WithObjects(cluster, clusterClass).Build()
    32  
    33  	retrievedCluster := &v1beta1.Cluster{}
    34  	err := fakeClient.Get(ctx, types.NamespacedName{Name: clusterName, Namespace: testNamespace}, retrievedCluster)
    35  	a.NoError(err)
    36  
    37  	// Get the ClusterClass associated with the Cluster
    38  	retrievedClusterClass, err := GetClusterClassFromCluster(ctx, fakeClient, retrievedCluster)
    39  	a.NoError(err)
    40  	a.Equal(clusterClass, retrievedClusterClass)
    41  
    42  	// Shouldn't work if the CAPI Cluster has no reference to a ClusterClass
    43  	fakeClient = fake.NewClientBuilder().WithScheme(scheme).WithObjects(newCAPICluster(clusterName, testNamespace)).Build()
    44  	err = fakeClient.Get(ctx, types.NamespacedName{Name: clusterName, Namespace: testNamespace}, retrievedCluster)
    45  	a.NoError(err)
    46  	retrievedClusterClass, err = GetClusterClassFromCluster(ctx, fakeClient, retrievedCluster)
    47  	a.Error(err)
    48  	a.Nil(retrievedClusterClass)
    49  }
    50  
    51  func newCAPICluster(name, namespace string) *v1beta1.Cluster {
    52  	cluster := v1beta1.Cluster{
    53  		TypeMeta: metav1.TypeMeta{
    54  			Kind:       "Cluster",
    55  			APIVersion: "cluster.x-k8s.io/v1beta1",
    56  		},
    57  		ObjectMeta: metav1.ObjectMeta{
    58  			Name:      name,
    59  			Namespace: namespace,
    60  		},
    61  	}
    62  	return &cluster
    63  }
    64  
    65  func newCAPIClusterWithClassReference(name, className, namespace string) *v1beta1.Cluster {
    66  	cluster := v1beta1.Cluster{
    67  		TypeMeta: metav1.TypeMeta{
    68  			Kind:       "Cluster",
    69  			APIVersion: "cluster.x-k8s.io/v1beta1",
    70  		},
    71  		ObjectMeta: metav1.ObjectMeta{
    72  			Name:      name,
    73  			Namespace: namespace,
    74  		},
    75  		Spec: v1beta1.ClusterSpec{
    76  			Topology: &v1beta1.Topology{
    77  				Class: className,
    78  			},
    79  		},
    80  	}
    81  	return &cluster
    82  }
    83  
    84  func newCAPIClusterClass(name, namespace string) *v1beta1.ClusterClass {
    85  	clusterClass := v1beta1.ClusterClass{
    86  		TypeMeta: metav1.TypeMeta{
    87  			Kind:       "ClusterClass",
    88  			APIVersion: "cluster.x-k8s.io/v1beta1",
    89  		},
    90  		ObjectMeta: metav1.ObjectMeta{
    91  			Name:      name,
    92  			Namespace: namespace,
    93  		},
    94  	}
    95  	return &clusterClass
    96  }