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 }