github.com/operator-framework/operator-lifecycle-manager@v0.30.0/pkg/controller/operators/suite_test.go (about)

     1  package operators
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"testing"
     7  	"time"
     8  
     9  	. "github.com/onsi/ginkgo/v2"
    10  	. "github.com/onsi/gomega"
    11  	appsv1 "k8s.io/api/apps/v1"
    12  	corev1 "k8s.io/api/core/v1"
    13  	rbacv1 "k8s.io/api/rbac/v1"
    14  	apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
    15  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    16  	"k8s.io/apimachinery/pkg/runtime"
    17  	"k8s.io/apiserver/pkg/storage/names"
    18  	"k8s.io/client-go/rest"
    19  	"k8s.io/client-go/tools/reference"
    20  	apiregistrationv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1"
    21  	ctrl "sigs.k8s.io/controller-runtime"
    22  	"sigs.k8s.io/controller-runtime/pkg/client"
    23  	"sigs.k8s.io/controller-runtime/pkg/envtest"
    24  	logf "sigs.k8s.io/controller-runtime/pkg/log"
    25  	"sigs.k8s.io/controller-runtime/pkg/log/zap"
    26  	metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server"
    27  
    28  	// +kubebuilder:scaffold:imports
    29  
    30  	"github.com/operator-framework/api/crds"
    31  	operatorsv1 "github.com/operator-framework/api/pkg/operators/v1"
    32  	operatorsv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1"
    33  	"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/decorators"
    34  	"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/testobj"
    35  )
    36  
    37  // These tests use Ginkgo (BDD-style Go testing framework). Refer to
    38  // http://onsi.github.io/ginkgo/ to learn more about Ginkgo.
    39  
    40  const (
    41  	timeout  = time.Second * 20
    42  	interval = time.Millisecond * 100
    43  )
    44  
    45  var (
    46  	cfg       *rest.Config
    47  	k8sClient client.Client
    48  	testEnv   *envtest.Environment
    49  	ctx       context.Context
    50  
    51  	scheme            = runtime.NewScheme()
    52  	gracePeriod int64 = 1
    53  	propagation       = metav1.DeletePropagationForeground
    54  	deleteOpts        = &client.DeleteOptions{
    55  		GracePeriodSeconds: &gracePeriod,
    56  		PropagationPolicy:  &propagation,
    57  	}
    58  	genName  = names.SimpleNameGenerator.GenerateName
    59  	fixtures = testobj.NewFixtureFiller(
    60  		testobj.WithFixtureFile(&appsv1.Deployment{}, "testdata/fixtures/deployment.yaml"),
    61  		testobj.WithFixtureFile(&corev1.Service{}, "testdata/fixtures/service.yaml"),
    62  		testobj.WithFixtureFile(&corev1.ServiceAccount{}, "testdata/fixtures/sa.yaml"),
    63  		testobj.WithFixtureFile(&corev1.Secret{}, "testdata/fixtures/secret.yaml"),
    64  		testobj.WithFixtureFile(&corev1.ConfigMap{}, "testdata/fixtures/configmap.yaml"),
    65  		testobj.WithFixtureFile(&rbacv1.Role{}, "testdata/fixtures/role.yaml"),
    66  		testobj.WithFixtureFile(&rbacv1.RoleBinding{}, "testdata/fixtures/rb.yaml"),
    67  		testobj.WithFixtureFile(&rbacv1.ClusterRole{}, "testdata/fixtures/clusterrole.yaml"),
    68  		testobj.WithFixtureFile(&rbacv1.ClusterRoleBinding{}, "testdata/fixtures/crb.yaml"),
    69  		testobj.WithFixtureFile(&apiextensionsv1.CustomResourceDefinition{}, "testdata/fixtures/crd.yaml"),
    70  		testobj.WithFixtureFile(&apiregistrationv1.APIService{}, "testdata/fixtures/apiservice.yaml"),
    71  		testobj.WithFixtureFile(&operatorsv1alpha1.InstallPlan{}, "testdata/fixtures/installplan.yaml"),
    72  	)
    73  )
    74  
    75  func TestAPIs(t *testing.T) {
    76  	RegisterFailHandler(Fail)
    77  
    78  	RunSpecs(t, "Controller Suite")
    79  }
    80  
    81  var _ = BeforeSuite(func() {
    82  	logf.SetLogger(zap.New(zap.WriteTo(GinkgoWriter), zap.UseDevMode(true)))
    83  	By("bootstrapping test environment")
    84  	useExisting := false
    85  	testEnv = &envtest.Environment{
    86  		UseExistingCluster: &useExisting,
    87  		CRDs: []*apiextensionsv1.CustomResourceDefinition{
    88  			crds.CatalogSource(),
    89  			crds.ClusterServiceVersion(),
    90  			crds.InstallPlan(),
    91  			crds.Subscription(),
    92  			crds.OperatorGroup(),
    93  			crds.Operator(),
    94  			crds.OperatorCondition(),
    95  		},
    96  	}
    97  
    98  	var err error
    99  	cfg, err = testEnv.Start()
   100  	Expect(err).ToNot(HaveOccurred())
   101  	Expect(cfg).ToNot(BeNil())
   102  
   103  	By("Setting up a controller manager")
   104  	Expect(metav1.AddMetaToScheme(scheme)).To(Succeed())
   105  	Expect(AddToScheme(scheme)).To(Succeed())
   106  	mgr, err := ctrl.NewManager(cfg, ctrl.Options{
   107  		Metrics: metricsserver.Options{BindAddress: "0"},
   108  		Scheme:  scheme,
   109  	})
   110  	Expect(err).ToNot(HaveOccurred())
   111  
   112  	operatorReconciler, err := NewOperatorReconciler(
   113  		mgr.GetClient(),
   114  		ctrl.Log.WithName("controllers").WithName("Operator"),
   115  		mgr.GetScheme(),
   116  	)
   117  	Expect(err).ToNot(HaveOccurred())
   118  
   119  	adoptionReconciler, err := NewAdoptionReconciler(
   120  		mgr.GetClient(),
   121  		ctrl.Log.WithName("controllers").WithName("Adoption"),
   122  		mgr.GetScheme(),
   123  	)
   124  	Expect(err).ToNot(HaveOccurred())
   125  
   126  	operatorConditionReconciler, err := NewOperatorConditionReconciler(
   127  		mgr.GetClient(),
   128  		ctrl.Log.WithName("controllers").WithName("OperatorCondition"),
   129  		mgr.GetScheme(),
   130  	)
   131  	Expect(err).ToNot(HaveOccurred())
   132  
   133  	operatorConditionGeneratorReconciler, err := NewOperatorConditionGeneratorReconciler(
   134  		mgr.GetClient(),
   135  		ctrl.Log.WithName("controllers").WithName("OperatorCondition"),
   136  		mgr.GetScheme(),
   137  	)
   138  	Expect(err).ToNot(HaveOccurred())
   139  
   140  	By("Adding controllers to the manager")
   141  	Expect(operatorReconciler.SetupWithManager(mgr)).ToNot(HaveOccurred())
   142  	Expect(adoptionReconciler.SetupWithManager(mgr)).ToNot(HaveOccurred())
   143  	Expect(operatorConditionReconciler.SetupWithManager(mgr)).ToNot(HaveOccurred())
   144  	Expect(operatorConditionGeneratorReconciler.SetupWithManager(mgr)).ToNot(HaveOccurred())
   145  
   146  	ctx = ctrl.SetupSignalHandler()
   147  	go func() {
   148  		defer GinkgoRecover()
   149  
   150  		By("Starting managed controllers")
   151  		err := mgr.Start(ctx)
   152  		Expect(err).ToNot(HaveOccurred())
   153  	}()
   154  
   155  	Expect(mgr.GetCache().WaitForCacheSync(ctx)).To(BeTrue(), "Cache sync failed on startup")
   156  
   157  	k8sClient = mgr.GetClient()
   158  	Expect(k8sClient).ToNot(BeNil())
   159  })
   160  
   161  var _ = AfterSuite(func() {
   162  	By("stopping the controller manager")
   163  	ctx.Done()
   164  
   165  	By("tearing down the test environment")
   166  	testEnv.Stop()
   167  })
   168  
   169  func newOperator(name string) *decorators.Operator {
   170  	return &decorators.Operator{
   171  		Operator: &operatorsv1.Operator{
   172  			ObjectMeta: metav1.ObjectMeta{
   173  				Name: name,
   174  			},
   175  		},
   176  	}
   177  }
   178  
   179  func toRefs(scheme *runtime.Scheme, objs ...runtime.Object) (refs []operatorsv1.RichReference) {
   180  	for _, obj := range objs {
   181  		ref, err := reference.GetReference(scheme, obj)
   182  		if err != nil {
   183  			panic(fmt.Errorf("error creating resource reference: %v", err))
   184  		}
   185  
   186  		// Clear unnecessary fields
   187  		ref.UID = ""
   188  		ref.ResourceVersion = ""
   189  
   190  		refs = append(refs, operatorsv1.RichReference{
   191  			ObjectReference: ref,
   192  		})
   193  	}
   194  
   195  	return
   196  }