...
1
16
17 package controllers
18
19 import (
20 "context"
21 "os"
22 "testing"
23
24 logrtesting "github.com/go-logr/logr/testing"
25 "github.com/stretchr/testify/require"
26 "golang.org/x/sync/errgroup"
27 corev1 "k8s.io/api/core/v1"
28 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
29 "k8s.io/apimachinery/pkg/runtime"
30 "k8s.io/klog/v2"
31 ctrl "sigs.k8s.io/controller-runtime"
32 "sigs.k8s.io/controller-runtime/pkg/client"
33 "sigs.k8s.io/controller-runtime/pkg/envtest"
34 "sigs.k8s.io/controller-runtime/pkg/metrics/server"
35
36 "github.com/cert-manager/issuer-lib/internal/testapi/api"
37 "github.com/cert-manager/issuer-lib/internal/tests/testresource"
38 )
39
40 func createNS(t *testing.T, ctx context.Context, kc client.Client, nsName string) {
41 t.Helper()
42
43 ns := corev1.Namespace{
44 ObjectMeta: metav1.ObjectMeta{
45 Name: nsName,
46 },
47 }
48 require.NoError(t, kc.Create(ctx, &ns))
49 }
50
51 type controllerInterface interface {
52 SetupWithManager(ctx context.Context, mgr ctrl.Manager) error
53 }
54
55 func setupControllersAPIServerAndClient(t *testing.T, parentCtx context.Context, kubeClients *testresource.OwnedKubeClients, controller func(mgr ctrl.Manager) controllerInterface) context.Context {
56 t.Helper()
57
58 eg, gctx := errgroup.WithContext(parentCtx)
59 t.Cleanup(func() {
60 t.Log("Waiting for controller manager to exit")
61 require.NoError(t, eg.Wait())
62 })
63
64 require.NoError(t, corev1.AddToScheme(kubeClients.Scheme))
65
66 logger := logrtesting.NewTestLoggerWithOptions(t, logrtesting.Options{LogTimestamp: true, Verbosity: 10})
67 ctrl.SetLogger(logger)
68 klog.SetLogger(logger)
69
70 t.Log("Installing cert-manager CRDs")
71 _, err := kubeClients.InstallCRDs(envtest.CRDInstallOptions{
72 Scheme: kubeClients.Scheme,
73 Paths: []string{
74 os.Getenv("SIMPLE_CRDS"),
75 os.Getenv("CERT_MANAGER_CRDS"),
76 },
77 ErrorIfPathMissing: true,
78 })
79 require.NoError(t, err)
80
81 scheme := runtime.NewScheme()
82 require.NoError(t, setupCertificateRequestReconcilerScheme(scheme))
83 require.NoError(t, api.AddToScheme(scheme))
84 require.NoError(t, corev1.AddToScheme(scheme))
85
86 t.Log("Creating a controller manager")
87 mgr, err := ctrl.NewManager(kubeClients.Rest, ctrl.Options{
88 Scheme: scheme,
89 Logger: logger,
90 LeaderElection: false,
91 Metrics: server.Options{
92 BindAddress: "0",
93 },
94 })
95 require.NoError(t, err)
96
97 t.Log("Setting up controller")
98 require.NoError(t, controller(mgr).SetupWithManager(gctx, mgr))
99
100 mgrCtx, cancel := context.WithCancel(gctx)
101 t.Cleanup(cancel)
102
103 t.Log("Starting the controller manager")
104 eg.Go(func() error {
105 return mgr.Start(mgrCtx)
106 })
107
108 return gctx
109 }
110
View as plain text