sigs.k8s.io/cluster-api@v1.7.1/internal/controllers/cluster/suite_test.go (about)

     1  /*
     2  Copyright 2022 The Kubernetes Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package cluster
    18  
    19  import (
    20  	"context"
    21  	"fmt"
    22  	"os"
    23  	"testing"
    24  	"time"
    25  
    26  	. "github.com/onsi/gomega"
    27  	apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
    28  	"k8s.io/apimachinery/pkg/runtime"
    29  	clientgoscheme "k8s.io/client-go/kubernetes/scheme"
    30  	ctrl "sigs.k8s.io/controller-runtime"
    31  	"sigs.k8s.io/controller-runtime/pkg/client"
    32  	"sigs.k8s.io/controller-runtime/pkg/controller"
    33  
    34  	clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
    35  	"sigs.k8s.io/cluster-api/api/v1beta1/index"
    36  	"sigs.k8s.io/cluster-api/controllers/remote"
    37  	machinecontroller "sigs.k8s.io/cluster-api/internal/controllers/machine"
    38  	"sigs.k8s.io/cluster-api/internal/test/envtest"
    39  )
    40  
    41  const (
    42  	timeout = time.Second * 30
    43  )
    44  
    45  var (
    46  	env        *envtest.Environment
    47  	ctx        = ctrl.SetupSignalHandler()
    48  	fakeScheme = runtime.NewScheme()
    49  )
    50  
    51  func init() {
    52  	_ = clientgoscheme.AddToScheme(fakeScheme)
    53  	_ = clusterv1.AddToScheme(fakeScheme)
    54  	_ = apiextensionsv1.AddToScheme(fakeScheme)
    55  }
    56  
    57  func TestMain(m *testing.M) {
    58  	setupIndexes := func(ctx context.Context, mgr ctrl.Manager) {
    59  		if err := index.AddDefaultIndexes(ctx, mgr); err != nil {
    60  			panic(fmt.Sprintf("unable to setup index: %v", err))
    61  		}
    62  	}
    63  
    64  	setupReconcilers := func(ctx context.Context, mgr ctrl.Manager) {
    65  		// Set up a ClusterCacheTracker and ClusterCacheReconciler to provide to controllers
    66  		// requiring a connection to a remote cluster
    67  		tracker, err := remote.NewClusterCacheTracker(
    68  			mgr,
    69  			remote.ClusterCacheTrackerOptions{
    70  				Log:     &ctrl.Log,
    71  				Indexes: []remote.Index{remote.NodeProviderIDIndex},
    72  			},
    73  		)
    74  		if err != nil {
    75  			panic(fmt.Sprintf("unable to create cluster cache tracker: %v", err))
    76  		}
    77  		if err := (&remote.ClusterCacheReconciler{
    78  			Client:  mgr.GetClient(),
    79  			Tracker: tracker,
    80  		}).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1}); err != nil {
    81  			panic(fmt.Sprintf("Failed to start ClusterCacheReconciler: %v", err))
    82  		}
    83  
    84  		unstructuredCachingClient, err := client.New(mgr.GetConfig(), client.Options{
    85  			HTTPClient: mgr.GetHTTPClient(),
    86  			Cache: &client.CacheOptions{
    87  				Reader:       mgr.GetCache(),
    88  				Unstructured: true,
    89  			},
    90  		})
    91  		if err != nil {
    92  			panic(fmt.Sprintf("unable to create unstructuredCachineClient: %v", err))
    93  		}
    94  
    95  		if err := (&Reconciler{
    96  			Client:                    mgr.GetClient(),
    97  			UnstructuredCachingClient: unstructuredCachingClient,
    98  			APIReader:                 mgr.GetClient(),
    99  		}).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1}); err != nil {
   100  			panic(fmt.Sprintf("Failed to start ClusterReconciler: %v", err))
   101  		}
   102  		if err := (&machinecontroller.Reconciler{
   103  			Client:                    mgr.GetClient(),
   104  			UnstructuredCachingClient: unstructuredCachingClient,
   105  			APIReader:                 mgr.GetAPIReader(),
   106  			Tracker:                   tracker,
   107  		}).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1}); err != nil {
   108  			panic(fmt.Sprintf("Failed to start MachineReconciler: %v", err))
   109  		}
   110  	}
   111  
   112  	SetDefaultEventuallyPollingInterval(100 * time.Millisecond)
   113  	SetDefaultEventuallyTimeout(timeout)
   114  
   115  	os.Exit(envtest.Run(ctx, envtest.RunInput{
   116  		M:                m,
   117  		SetupEnv:         func(e *envtest.Environment) { env = e },
   118  		SetupIndexes:     setupIndexes,
   119  		SetupReconcilers: setupReconcilers,
   120  	}))
   121  }