From 6bca0d8f1e143277edf442d7608c0e95d2dab65d Mon Sep 17 00:00:00 2001 From: Danil Grigorev Date: Mon, 9 Oct 2023 15:01:25 +0200 Subject: [PATCH] Use separate cluster setup for rancher - Add tests for 2 cluster CAPI import setup Signed-off-by: Danil Grigorev --- Makefile | 3 +- .../controllers/cross_cluster_import_test.go | 163 ++++++++++++++++++ internal/controllers/import_controller.go | 13 +- .../controllers/import_controller_test.go | 17 +- internal/controllers/suite_test.go | 1 + internal/rancher/doc.go | 5 +- internal/rancher/setup/cluster.go | 108 ++++++++++++ internal/rancher/setup/doc.go | 18 ++ internal/test/envtest.go | 28 ++- main.go | 59 +------ util/predicates/suite_test.go | 4 +- 11 files changed, 348 insertions(+), 71 deletions(-) create mode 100644 internal/controllers/cross_cluster_import_test.go create mode 100644 internal/rancher/setup/cluster.go create mode 100644 internal/rancher/setup/doc.go diff --git a/Makefile b/Makefile index 30de5173..3e543282 100644 --- a/Makefile +++ b/Makefile @@ -190,7 +190,6 @@ manifests: vendor controller-gen ## Generate WebhookConfiguration, ClusterRole a vendor: go mod tidy go mod vendor - go mod verify .PHONY: vendor-clean vendor-clean: @@ -242,7 +241,7 @@ ARTIFACTS ?= ${ROOT_DIR}/_artifacts KUBEBUILDER_ASSETS ?= $(shell $(SETUP_ENVTEST) use --use-env -p path $(KUBEBUILDER_ENVTEST_KUBERNETES_VERSION)) .PHONY: test -test: $(SETUP_ENVTEST) manifests ## Run tests. +test: $(SETUP_ENVTEST) manifests kubectl ## Run tests. KUBEBUILDER_ASSETS="$(KUBEBUILDER_ASSETS)" go test ./... $(TEST_ARGS) ##@ Build diff --git a/internal/controllers/cross_cluster_import_test.go b/internal/controllers/cross_cluster_import_test.go new file mode 100644 index 00000000..6b4b357a --- /dev/null +++ b/internal/controllers/cross_cluster_import_test.go @@ -0,0 +1,163 @@ +/* +Copyright 2023 SUSE. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package controllers + +import ( + "context" + "fmt" + "os" + "os/exec" + "path/filepath" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + provisioningv1 "github.com/rancher-sandbox/rancher-turtles/internal/rancher/provisioning/v1" + "github.com/rancher-sandbox/rancher-turtles/internal/rancher/setup" + "github.com/rancher-sandbox/rancher-turtles/internal/test" + turtlesnaming "github.com/rancher-sandbox/rancher-turtles/util/naming" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/rest" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + "sigs.k8s.io/cluster-api/util/kubeconfig" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/controller" + "sigs.k8s.io/controller-runtime/pkg/envtest" + + ctrl "sigs.k8s.io/controller-runtime" +) + +var ( + rancherEnv *envtest.Environment + otherEnv *envtest.Environment + rancherCfg *rest.Config + otherCfg *rest.Config + rancherCl client.Client + otherCl client.Client + clusterCtx context.Context + cancel context.CancelFunc + capiCluster *clusterv1.Cluster + rancherCluster *provisioningv1.Cluster + r *CAPIImportReconciler +) + +var _ = Describe("In separate clusters", func() { + + BeforeEach(func() { + By("bootstrapping rancher environment") + var err error + rancherEnv = &envtest.Environment{ + CRDDirectoryPaths: []string{ + filepath.Join("..", "..", "hack", "crd", "bases"), + }, + ErrorIfCRDPathMissing: true, + Scheme: test.RancherScheme, + } + rancherCfg, rancherCl, err = test.StartEnvTest(rancherEnv) + Expect(err).NotTo(HaveOccurred()) + Expect(rancherCfg).NotTo(BeNil()) + Expect(rancherCl).NotTo(BeNil()) + + By("Bootstrapping other cluster environment") + otherEnv = &envtest.Environment{ + CRDDirectoryPaths: []string{ + filepath.Join("..", "..", "hack", "crd", "bases"), + }, + ErrorIfCRDPathMissing: true, + Scheme: test.PartialScheme, + } + otherCfg, otherCl, err = test.StartEnvTest(otherEnv) + Expect(err).NotTo(HaveOccurred()) + Expect(otherCfg).NotTo(BeNil()) + Expect(otherCl).NotTo(BeNil()) + + Expect(otherCl.Create(ctx, &corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{ + Name: testNamespace, + Labels: map[string]string{ + importLabelName: "true", + }, + }, + })).To(Succeed()) + + Expect(rancherCl.Create(ctx, &corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{ + Name: testNamespace, + }, + })).To(Succeed()) + + clusterCtx, cancel = context.WithCancel(ctx) + capiCluster = &clusterv1.Cluster{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-cluster", + Namespace: testNamespace, + }, + } + + rancherCluster = &provisioningv1.Cluster{ + ObjectMeta: metav1.ObjectMeta{ + Name: turtlesnaming.Name(capiCluster.Name).ToRancherName(), + Namespace: testNamespace, + }, + } + }) + + AfterEach(func() { + cancel() + By("tearing down the 2 clsuter environment") + Expect(test.StopEnvTest(rancherEnv)).To(Succeed()) + Expect(test.StopEnvTest(otherEnv)).To(Succeed()) + }) + + It("minimal controller setup should create a Rancher cluster object from a CAPI cluster object located in a different cluster", func() { + mgr, err := ctrl.NewManager(otherCfg, ctrl.Options{ + Scheme: otherEnv.Scheme, + MetricsBindAddress: "0", + HealthProbeBindAddress: "0", + }) + Expect(err).ToNot(HaveOccurred()) + + config := kubeconfig.FromEnvTestConfig(rancherCfg, &clusterv1.Cluster{ + ObjectMeta: metav1.ObjectMeta{Name: "test"}, + }) + kubeconfigFile, err := os.CreateTemp("", "kubeconfig") + Expect(err).ToNot(HaveOccurred()) + defer os.Remove(kubeconfigFile.Name()) + Expect(os.WriteFile(kubeconfigFile.Name(), config, 0600)).To(Succeed()) + + rancher, err := setup.RancherCluster(mgr, kubeconfigFile.Name()) + Expect(err).ToNot(HaveOccurred()) + + reconciler := &CAPIImportReconciler{ + Client: mgr.GetClient(), + RancherCluster: rancher, + } + Expect(reconciler.SetupWithManager(ctx, mgr, controller.Options{})).To(Succeed()) + + go func() { + Expect(mgr.Start(clusterCtx)).To(Succeed()) + }() + + Expect(otherCl.Create(ctx, capiCluster)).To(Succeed()) + capiCluster.Status.ControlPlaneReady = true + Expect(otherCl.Status().Update(ctx, capiCluster)).To(Succeed()) + + args := []string{"get", fmt.Sprintf("clusters.%s", provisioningv1.GroupVersion.Group), rancherCluster.Name, "-n", rancherCluster.Namespace, "--kubeconfig", kubeconfigFile.Name()} + Eventually(exec.Command("kubectl", args...).Run()).Should(Succeed()) + }) + +}) diff --git a/internal/controllers/import_controller.go b/internal/controllers/import_controller.go index fce4c171..b47fb2c0 100644 --- a/internal/controllers/import_controller.go +++ b/internal/controllers/import_controller.go @@ -36,6 +36,7 @@ import ( "k8s.io/client-go/tools/record" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/cluster" "sigs.k8s.io/controller-runtime/pkg/controller" "sigs.k8s.io/controller-runtime/pkg/event" "sigs.k8s.io/controller-runtime/pkg/handler" @@ -68,7 +69,7 @@ const ( // CAPIImportReconciler represents a reconciler for importing CAPI clusters in Rancher. type CAPIImportReconciler struct { Client client.Client - RancherClient client.Client + RancherCluster cluster.Cluster recorder record.EventRecorder WatchFilterValue string Scheme *runtime.Scheme @@ -106,7 +107,7 @@ func (r *CAPIImportReconciler) SetupWithManager(ctx context.Context, mgr ctrl.Ma // Watch Rancher provisioningv2 clusters // NOTE: we will import the types from rancher in the future err = c.Watch( - source.Kind(mgr.GetCache(), &provisioningv1.Cluster{}), + source.Kind(r.RancherCluster.GetCache(), &provisioningv1.Cluster{}), handler.EnqueueRequestsFromMapFunc(r.rancherClusterToCapiCluster(ctx, capiPredicates)), //&handler.EnqueueRequestForOwner{OwnerType: &clusterv1.Cluster{}}, ) @@ -200,7 +201,7 @@ func (r *CAPIImportReconciler) reconcile(ctx context.Context, capiCluster *clust Name: turtlesnaming.Name(capiCluster.Name).ToRancherName(), }} - err := r.RancherClient.Get(ctx, client.ObjectKeyFromObject(rancherCluster), rancherCluster) + err := r.RancherCluster.GetClient().Get(ctx, client.ObjectKeyFromObject(rancherCluster), rancherCluster) if client.IgnoreNotFound(err) != nil { log.Error(err, fmt.Sprintf("Unable to fetch rancher cluster %s", client.ObjectKeyFromObject(rancherCluster))) return ctrl.Result{Requeue: true}, err @@ -218,7 +219,7 @@ func (r *CAPIImportReconciler) reconcileNormal(ctx context.Context, capiCluster ) (ctrl.Result, error) { log := log.FromContext(ctx) - err := r.RancherClient.Get(ctx, client.ObjectKeyFromObject(rancherCluster), rancherCluster) + err := r.RancherCluster.GetClient().Get(ctx, client.ObjectKeyFromObject(rancherCluster), rancherCluster) if apierrors.IsNotFound(err) { shouldImport, err := util.ShouldAutoImport(ctx, log, r.Client, capiCluster, importLabelName) if err != nil { @@ -230,7 +231,7 @@ func (r *CAPIImportReconciler) reconcileNormal(ctx context.Context, capiCluster return ctrl.Result{}, nil } - if err := r.RancherClient.Create(ctx, &provisioningv1.Cluster{ + if err := r.RancherCluster.GetClient().Create(ctx, &provisioningv1.Cluster{ ObjectMeta: metav1.ObjectMeta{ Name: turtlesnaming.Name(capiCluster.Name).ToRancherName(), Namespace: capiCluster.Namespace, @@ -323,7 +324,7 @@ func (r *CAPIImportReconciler) getClusterRegistrationManifest(ctx context.Contex Name: clusterRegistrationTokenName, Namespace: clusterName, }} - err := r.RancherClient.Get(ctx, client.ObjectKeyFromObject(token), token) + err := r.RancherCluster.GetClient().Get(ctx, client.ObjectKeyFromObject(token), token) if client.IgnoreNotFound(err) != nil { return "", fmt.Errorf("error getting registration token for cluster %s: %w", clusterName, err) diff --git a/internal/controllers/import_controller_test.go b/internal/controllers/import_controller_test.go index 3e7bb473..d4df7a64 100644 --- a/internal/controllers/import_controller_test.go +++ b/internal/controllers/import_controller_test.go @@ -18,6 +18,7 @@ package controllers import ( "bufio" + "context" "encoding/json" "errors" "fmt" @@ -43,6 +44,7 @@ import ( "sigs.k8s.io/cluster-api/controllers/remote" "sigs.k8s.io/cluster-api/util/secret" "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/cluster" "sigs.k8s.io/controller-runtime/pkg/reconcile" ) @@ -53,12 +55,24 @@ var _ = Describe("reconcile CAPI Cluster", func() { rancherCluster *provisioningv1.Cluster clusterRegistrationToken *managementv3.ClusterRegistrationToken capiKubeconfigSecret *corev1.Secret + cancel context.CancelFunc + clusterCtx context.Context ) BeforeEach(func() { + // rancher and rancher-turtles deployed in the same cluster + clusterCtx, cancel = context.WithCancel(ctx) + cluster, err := cluster.New(testEnv.Config, func(clusterOptions *cluster.Options) { + clusterOptions.Scheme = testEnv.Scheme + }) + Expect(err).ToNot(HaveOccurred()) + go func() { + Expect(cluster.Start(clusterCtx)).To(Succeed()) + }() + r = &CAPIImportReconciler{ Client: cl, - RancherClient: cl, // rancher and rancher-turtles deployed in the same cluster + RancherCluster: cluster, remoteClientGetter: remote.NewClusterClient, } @@ -95,6 +109,7 @@ var _ = Describe("reconcile CAPI Cluster", func() { }) AfterEach(func() { + defer cancel() objs, err := manifestToObjects(strings.NewReader(testdata.ImportManifest)) clientObjs := []client.Object{ capiCluster, diff --git a/internal/controllers/suite_test.go b/internal/controllers/suite_test.go index fa9d3d14..e75fe8b7 100644 --- a/internal/controllers/suite_test.go +++ b/internal/controllers/suite_test.go @@ -59,6 +59,7 @@ var _ = BeforeSuite(func() { filepath.Join("..", "..", "hack", "crd", "bases"), }, ErrorIfCRDPathMissing: true, + Scheme: test.FullScheme, } cfg, cl, err = test.StartEnvTest(testEnv) Expect(err).NotTo(HaveOccurred()) diff --git a/internal/rancher/doc.go b/internal/rancher/doc.go index 2139ab73..85225d49 100644 --- a/internal/rancher/doc.go +++ b/internal/rancher/doc.go @@ -14,7 +14,8 @@ See the License for the specific language governing permissions and limitations under the License. */ -// Package rancher contains the rancher provisioning.cattle.io/v1 and -// management.cattle.io/v3 API proxy implementations. +// Package rancher contains rancher provisioning.cattle.io/v1 and +// management.cattle.io/v3 API proxy implementations and cluster connectivity +// setup procedures. // +kubebuilder:object:generate=true package rancher diff --git a/internal/rancher/setup/cluster.go b/internal/rancher/setup/cluster.go new file mode 100644 index 00000000..74e78753 --- /dev/null +++ b/internal/rancher/setup/cluster.go @@ -0,0 +1,108 @@ +package setup + +import ( + "fmt" + "os" + + "k8s.io/apimachinery/pkg/runtime" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" + "k8s.io/client-go/rest" + "k8s.io/client-go/tools/clientcmd" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/cache" + "sigs.k8s.io/controller-runtime/pkg/cluster" + + managementv3 "github.com/rancher-sandbox/rancher-turtles/internal/rancher/management/v3" + provisioningv1 "github.com/rancher-sandbox/rancher-turtles/internal/rancher/provisioning/v1" + clientgoscheme "k8s.io/client-go/kubernetes/scheme" +) + +var ( + setupLog = ctrl.Log.WithName("setup") + rancherScheme = runtime.NewScheme() +) + +func init() { + utilruntime.Must(setupScheme(rancherScheme)) +} + +func setupScheme(scheme *runtime.Scheme) error { + if err := clientgoscheme.AddToScheme(scheme); err != nil { + return err + } + if err := provisioningv1.AddToScheme(scheme); err != nil { + return err + } + if err := managementv3.AddToScheme(scheme); err != nil { + return err + } + return nil +} + +// RancherCluster creates a controller runtime cluster instance +// always connected to the rancher manager cluster. +func RancherCluster(mgr ctrl.Manager, rancherKubeconfig string) (cluster.Cluster, error) { + if rancherKubeconfig == "" { + return mgr, setupScheme(mgr.GetScheme()) + } + + config, err := GetConfig(rancherKubeconfig) + if err != nil { + return nil, fmt.Errorf("unable to get rest config: %w", err) + } + + rancherCluster, err := cluster.New( + config, + func(clusterOptions *cluster.Options) { + clusterOptions.Scheme = rancherScheme + clusterOptions.Cache = cache.Options{ + Scheme: rancherScheme, + } + }) + if err != nil { + return nil, fmt.Errorf("unable to setup rancher cluster: %w", err) + } + + // Add rancher cluster as a runnable to the manager instance + // to allow it to be started/stopped with the manager under it's leader election + if err := mgr.Add(rancherCluster); err != nil { + return nil, fmt.Errorf("unable to add rancher cluster as runnable: %w", err) + } + + return rancherCluster, nil +} + +// RancherClusterOrDie creates a controller runtime cluster instance +// always connected to the rancher manager cluster. +func RancherClusterOrDie(mgr ctrl.Manager, rancherKubeconfig string) cluster.Cluster { + cluster, err := RancherCluster(mgr, rancherKubeconfig) + if err != nil { + setupLog.Error(err, "unable to add rancher cluster to manager") + os.Exit(1) + } + + return cluster +} + +// GetConfig loads a REST Config from a path using default kubeconfig context. +func GetConfig(kubeconfigPath string) (*rest.Config, error) { + kubeconfig, err := os.ReadFile(kubeconfigPath) + if err != nil { + return nil, fmt.Errorf("unable to read rancher kubeconfig from file: %w", err) + } + + cfg, err := clientcmd.RESTConfigFromKubeConfig(kubeconfig) + if err != nil { + return nil, fmt.Errorf("unable to initiate rancher client: %w", err) + } + + if cfg.QPS == 0.0 { + cfg.QPS = 20.0 + } + + if cfg.Burst == 0 { + cfg.Burst = 30 + } + + return cfg, nil +} diff --git a/internal/rancher/setup/doc.go b/internal/rancher/setup/doc.go new file mode 100644 index 00000000..8c892425 --- /dev/null +++ b/internal/rancher/setup/doc.go @@ -0,0 +1,18 @@ +/* +Copyright 2023 SUSE. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Package setup contains the rancher cluster setup procedurces +package setup diff --git a/internal/test/envtest.go b/internal/test/envtest.go index d1f3d156..7c527b6c 100644 --- a/internal/test/envtest.go +++ b/internal/test/envtest.go @@ -32,13 +32,29 @@ import ( provisioningv1 "github.com/rancher-sandbox/rancher-turtles/internal/rancher/provisioning/v1" ) -var scheme = runtime.NewScheme() +var ( + // FullScheme is a runtime scheme containing full set of used API GVKs. + FullScheme = runtime.NewScheme() + + // PartialScheme is a runtime scheme containing only set of CAPI and external from API GVKs form Rancher. + PartialScheme = runtime.NewScheme() + + // RancherScheme is a runtime scheme containing only set of used Rancher API GVKs. + RancherScheme = runtime.NewScheme() +) func init() { - utilruntime.Must(clientgoscheme.AddToScheme(scheme)) - utilruntime.Must(clusterv1.AddToScheme(scheme)) - utilruntime.Must(provisioningv1.AddToScheme(scheme)) - utilruntime.Must(managementv3.AddToScheme(scheme)) + utilruntime.Must(clientgoscheme.AddToScheme(FullScheme)) + utilruntime.Must(clusterv1.AddToScheme(FullScheme)) + utilruntime.Must(provisioningv1.AddToScheme(FullScheme)) + utilruntime.Must(managementv3.AddToScheme(FullScheme)) + + utilruntime.Must(clientgoscheme.AddToScheme(PartialScheme)) + utilruntime.Must(clusterv1.AddToScheme(PartialScheme)) + + utilruntime.Must(clientgoscheme.AddToScheme(RancherScheme)) + utilruntime.Must(provisioningv1.AddToScheme(RancherScheme)) + utilruntime.Must(managementv3.AddToScheme(RancherScheme)) } // StartEnvTest starts a new test environment. @@ -52,7 +68,7 @@ func StartEnvTest(testEnv *envtest.Environment) (*rest.Config, client.Client, er return nil, nil, errors.New("envtest.Environment.Start() returned nil config") } - cl, err := client.New(cfg, client.Options{Scheme: scheme}) + cl, err := client.New(cfg, client.Options{Scheme: testEnv.Scheme}) if err != nil { return nil, nil, err } diff --git a/main.go b/main.go index 8a1d690c..f857ccd3 100644 --- a/main.go +++ b/main.go @@ -28,9 +28,6 @@ import ( "k8s.io/apimachinery/pkg/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime" clientgoscheme "k8s.io/client-go/kubernetes/scheme" - "k8s.io/client-go/rest" - "k8s.io/client-go/tools/clientcmd" - clientcmdapi "k8s.io/client-go/tools/clientcmd/api" "k8s.io/client-go/tools/leaderelection/resourcelock" "k8s.io/component-base/version" "k8s.io/klog/v2" @@ -43,8 +40,7 @@ import ( clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" "github.com/rancher-sandbox/rancher-turtles/internal/controllers" - managementv3 "github.com/rancher-sandbox/rancher-turtles/internal/rancher/management/v3" - provisioningv1 "github.com/rancher-sandbox/rancher-turtles/internal/rancher/provisioning/v1" + "github.com/rancher-sandbox/rancher-turtles/internal/rancher/setup" ) var ( @@ -72,8 +68,6 @@ func init() { //+kubebuilder:scaffold:scheme utilruntime.Must(clientgoscheme.AddToScheme(scheme)) utilruntime.Must(clusterv1.AddToScheme(scheme)) - utilruntime.Must(provisioningv1.AddToScheme(scheme)) - utilruntime.Must(managementv3.AddToScheme(scheme)) } // initFlags initializes the flags. @@ -121,7 +115,7 @@ func main() { ctrl.SetLogger(klogr.New()) - mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ + options := ctrl.Options{ Scheme: scheme, MetricsBindAddress: metricsBindAddr, LeaderElection: enableLeaderElection, @@ -136,7 +130,9 @@ func main() { &corev1.Secret{}, }, HealthProbeBindAddress: healthAddr, - }) + } + + mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), options) if err != nil { setupLog.Error(err, "unable to start manager") os.Exit(1) @@ -170,15 +166,9 @@ func setupChecks(mgr ctrl.Manager) { } func setupReconcilers(ctx context.Context, mgr ctrl.Manager) { - rancherClient, err := setupRancherClient(mgr) - if err != nil { - setupLog.Error(err, "failed to create client") - os.Exit(1) - } - if err := (&controllers.CAPIImportReconciler{ Client: mgr.GetClient(), - RancherClient: rancherClient, + RancherCluster: setup.RancherClusterOrDie(mgr, rancherKubeconfig), WatchFilterValue: watchFilterValue, InsecureSkipVerify: insecureSkipVerify, }).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: concurrencyNumber}); err != nil { @@ -186,40 +176,3 @@ func setupReconcilers(ctx context.Context, mgr ctrl.Manager) { os.Exit(1) } } - -// setupRancherClient can either create a client for an in-cluster installation (rancher and rancher-turtles in the same cluster) -// or create a client for an out-of-cluster installation (rancher and rancher-turtles in different clusters) based on the -// existence of Rancher kubeconfig file. -func setupRancherClient(mgr ctrl.Manager) (client.Client, error) { - if len(rancherKubeconfig) > 0 { - setupLog.Info("out-of-cluster installation of rancher-turtles", "using kubeconfig from path", rancherKubeconfig) - - restConfig, err := loadConfigWithContext("", &clientcmd.ClientConfigLoadingRules{ExplicitPath: rancherKubeconfig}, "") - if err != nil { - return nil, fmt.Errorf("unable to load kubeconfig from file: %w", err) - } - - rancherClient, err := client.New(restConfig, client.Options{Scheme: mgr.GetClient().Scheme()}) - if err != nil { - return nil, err - } - - return rancherClient, nil - } - - setupLog.Info("in-cluster installation of rancher-turtles") - - return mgr.GetClient(), nil -} - -// loadConfigWithContext loads a REST Config from a path using a logic similar to the one used in controller-runtime. -func loadConfigWithContext(apiServerURL string, loader clientcmd.ClientConfigLoader, context string) (*rest.Config, error) { - return clientcmd.NewNonInteractiveDeferredLoadingClientConfig( - loader, - &clientcmd.ConfigOverrides{ - ClusterInfo: clientcmdapi.Cluster{ - Server: apiServerURL, - }, - CurrentContext: context, - }).ClientConfig() -} diff --git a/util/predicates/suite_test.go b/util/predicates/suite_test.go index 4a0118f0..da312f72 100644 --- a/util/predicates/suite_test.go +++ b/util/predicates/suite_test.go @@ -32,7 +32,9 @@ var _ = BeforeSuite(func() { By("bootstrapping test environment") var err error - testEnv = &envtest.Environment{} + testEnv = &envtest.Environment{ + Scheme: test.FullScheme, + } cfg, cl, err = test.StartEnvTest(testEnv) Expect(err).NotTo(HaveOccurred()) Expect(cfg).NotTo(BeNil())