sigs.k8s.io/cluster-api@v1.7.1/internal/controllers/machinehealthcheck/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 machinehealthcheck
    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  	clustercontroller "sigs.k8s.io/cluster-api/internal/controllers/cluster"
    38  	machinecontroller "sigs.k8s.io/cluster-api/internal/controllers/machine"
    39  	machinesetcontroller "sigs.k8s.io/cluster-api/internal/controllers/machineset"
    40  	"sigs.k8s.io/cluster-api/internal/test/envtest"
    41  )
    42  
    43  const (
    44  	timeout         = time.Second * 30
    45  	testClusterName = "test-cluster"
    46  )
    47  
    48  var (
    49  	env        *envtest.Environment
    50  	ctx        = ctrl.SetupSignalHandler()
    51  	fakeScheme = runtime.NewScheme()
    52  )
    53  
    54  func init() {
    55  	_ = clientgoscheme.AddToScheme(fakeScheme)
    56  	_ = clusterv1.AddToScheme(fakeScheme)
    57  	_ = apiextensionsv1.AddToScheme(fakeScheme)
    58  }
    59  
    60  func TestMain(m *testing.M) {
    61  	setupIndexes := func(ctx context.Context, mgr ctrl.Manager) {
    62  		if err := index.AddDefaultIndexes(ctx, mgr); err != nil {
    63  			panic(fmt.Sprintf("unable to setup index: %v", err))
    64  		}
    65  	}
    66  
    67  	setupReconcilers := func(ctx context.Context, mgr ctrl.Manager) {
    68  		// Set up a ClusterCacheTracker and ClusterCacheReconciler to provide to controllers
    69  		// requiring a connection to a remote cluster
    70  		tracker, err := remote.NewClusterCacheTracker(
    71  			mgr,
    72  			remote.ClusterCacheTrackerOptions{
    73  				Log:     &ctrl.Log,
    74  				Indexes: []remote.Index{remote.NodeProviderIDIndex},
    75  			},
    76  		)
    77  		if err != nil {
    78  			panic(fmt.Sprintf("unable to create cluster cache tracker: %v", err))
    79  		}
    80  		if err := (&remote.ClusterCacheReconciler{
    81  			Client:  mgr.GetClient(),
    82  			Tracker: tracker,
    83  		}).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1}); err != nil {
    84  			panic(fmt.Sprintf("Failed to start ClusterCacheReconciler: %v", err))
    85  		}
    86  
    87  		unstructuredCachingClient, err := client.New(mgr.GetConfig(), client.Options{
    88  			HTTPClient: mgr.GetHTTPClient(),
    89  			Cache: &client.CacheOptions{
    90  				Reader:       mgr.GetCache(),
    91  				Unstructured: true,
    92  			},
    93  		})
    94  		if err != nil {
    95  			panic(fmt.Sprintf("unable to create unstructuredCachineClient: %v", err))
    96  		}
    97  
    98  		if err := (&clustercontroller.Reconciler{
    99  			Client:                    mgr.GetClient(),
   100  			UnstructuredCachingClient: unstructuredCachingClient,
   101  			APIReader:                 mgr.GetClient(),
   102  		}).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1}); err != nil {
   103  			panic(fmt.Sprintf("Failed to start ClusterReconciler: %v", err))
   104  		}
   105  		if err := (&Reconciler{
   106  			Client:  mgr.GetClient(),
   107  			Tracker: tracker,
   108  		}).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1}); err != nil {
   109  			panic(fmt.Sprintf("Failed to start Reconciler : %v", err))
   110  		}
   111  		if err := (&machinecontroller.Reconciler{
   112  			Client:                    mgr.GetClient(),
   113  			UnstructuredCachingClient: unstructuredCachingClient,
   114  			APIReader:                 mgr.GetAPIReader(),
   115  			Tracker:                   tracker,
   116  		}).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1}); err != nil {
   117  			panic(fmt.Sprintf("Failed to start MachineReconciler: %v", err))
   118  		}
   119  		if err := (&machinesetcontroller.Reconciler{
   120  			Client:                    mgr.GetClient(),
   121  			UnstructuredCachingClient: unstructuredCachingClient,
   122  			APIReader:                 mgr.GetAPIReader(),
   123  			Tracker:                   tracker,
   124  		}).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1}); err != nil {
   125  			panic(fmt.Sprintf("Failed to start MMachineSetReconciler: %v", err))
   126  		}
   127  	}
   128  
   129  	SetDefaultEventuallyPollingInterval(100 * time.Millisecond)
   130  	SetDefaultEventuallyTimeout(timeout)
   131  
   132  	os.Exit(envtest.Run(ctx, envtest.RunInput{
   133  		M:                m,
   134  		SetupEnv:         func(e *envtest.Environment) { env = e },
   135  		SetupIndexes:     setupIndexes,
   136  		SetupReconcilers: setupReconcilers,
   137  	}))
   138  }