-
Notifications
You must be signed in to change notification settings - Fork 37
Expand file tree
/
Copy pathsuite_test.go
More file actions
205 lines (174 loc) · 6.03 KB
/
suite_test.go
File metadata and controls
205 lines (174 loc) · 6.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
package agent
import (
"context"
"testing"
"time"
ingressv1alpha1 "github.com/ngrok/ngrok-operator/api/ingress/v1alpha1"
ngrokv1alpha1 "github.com/ngrok/ngrok-operator/api/ngrok/v1alpha1"
"github.com/ngrok/ngrok-operator/internal/controller/labels"
"github.com/ngrok/ngrok-operator/internal/testutils"
"github.com/ngrok/ngrok-operator/pkg/agent"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes/scheme"
"k8s.io/client-go/rest"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/cache"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/envtest"
logf "sigs.k8s.io/controller-runtime/pkg/log"
"sigs.k8s.io/controller-runtime/pkg/log/zap"
"sigs.k8s.io/controller-runtime/pkg/metrics/server"
)
var cfg *rest.Config
var k8sClient client.Client
var testEnv *envtest.Environment
// Env test manager and mock driver for controller runtime tests
var envMgr ctrl.Manager
var envCtx context.Context
var envCancel context.CancelFunc
var envMockDriver *agent.MockAgentDriver
// Namespace filter test manager - tests namespace filtering behavior
var nsMgr ctrl.Manager
var nsMgrCtx context.Context
var nsMgrCancel context.CancelFunc
var nsMockDriver *agent.MockAgentDriver
const (
watchedNamespace = "test-watched"
unwatchedNamespace = "test-unwatched"
controllerNamespace = "test-controller-namespace"
controllerName = "test-agent-controller"
)
func TestControllers(t *testing.T) {
RegisterFailHandler(Fail)
RunSpecs(t, "AgentEndpoint Controller Suite")
}
var _ = BeforeSuite(func() {
logf.SetLogger(zap.New(zap.WriteTo(GinkgoWriter), zap.UseDevMode(true)))
By("bootstrapping test environment")
testEnv = &envtest.Environment{
CRDDirectoryPaths: []string{
testutils.OperatorCRDPath("..", "..", ".."),
},
ErrorIfCRDPathMissing: true,
}
var err error
cfg, err = testEnv.Start()
Expect(err).NotTo(HaveOccurred())
Expect(cfg).NotTo(BeNil())
err = ngrokv1alpha1.AddToScheme(scheme.Scheme)
Expect(err).NotTo(HaveOccurred())
err = ingressv1alpha1.AddToScheme(scheme.Scheme)
Expect(err).NotTo(HaveOccurred())
k8sClient, err = client.New(cfg, client.Options{Scheme: scheme.Scheme})
Expect(err).NotTo(HaveOccurred())
Expect(k8sClient).NotTo(BeNil())
// Set up environment test manager for controller runtime tests
envCtx, envCancel = context.WithCancel(context.Background())
// Initialize mock driver
envMockDriver = agent.NewMockAgentDriver()
// Create dedicated manager for env tests
envMgr, err = ctrl.NewManager(cfg, ctrl.Options{
Scheme: scheme.Scheme,
LeaderElection: false,
Metrics: server.Options{
BindAddress: "0",
},
})
Expect(err).NotTo(HaveOccurred())
// Setup reconciler with mock driver and different controller name
envReconciler := &AgentEndpointReconciler{
Client: envMgr.GetClient(),
Log: logf.Log.WithName("env-agent-endpoint-controller"),
Scheme: envMgr.GetScheme(),
Recorder: envMgr.GetEventRecorderFor("env-agent-endpoint-controller"),
AgentDriver: envMockDriver,
ControllerLabels: labels.NewControllerLabelValues(controllerNamespace, controllerName),
}
// Register controller with manager
Expect(envReconciler.SetupWithManager(envMgr)).To(Succeed())
// Start env test manager
go func() {
defer GinkgoRecover()
err := envMgr.Start(envCtx)
if err != nil && envCtx.Err() == nil {
logf.Log.Error(err, "Env test manager failed to start")
}
}()
// Wait for env manager to be ready
Eventually(func() bool {
testCtx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
defer cancel()
return envMgr.GetCache().WaitForCacheSync(testCtx)
}, 30*time.Second, 100*time.Millisecond).Should(BeTrue())
// Set up namespace filter test manager
By("setting up namespace filter test manager")
// Create namespaces for namespace filtering tests
for _, ns := range []string{watchedNamespace, unwatchedNamespace} {
namespace := &v1.Namespace{
ObjectMeta: metav1.ObjectMeta{
Name: ns,
},
}
err = k8sClient.Create(context.Background(), namespace)
if err != nil {
Expect(client.IgnoreAlreadyExists(err)).To(Succeed())
}
}
// Initialize mock driver for namespace filter tests
nsMockDriver = agent.NewMockAgentDriver()
// Create a manager with namespace filtering
nsMgr, err = ctrl.NewManager(cfg, ctrl.Options{
Scheme: scheme.Scheme,
LeaderElection: false,
Metrics: server.Options{
BindAddress: "0",
},
Cache: cache.Options{
DefaultNamespaces: map[string]cache.Config{
watchedNamespace: {},
},
},
})
Expect(err).NotTo(HaveOccurred())
// Setup reconciler with mock driver for namespace filter tests
nsReconciler := &AgentEndpointReconciler{
Client: nsMgr.GetClient(),
Log: logf.Log.WithName("ns-filter-test-controller"),
Scheme: nsMgr.GetScheme(),
Recorder: nsMgr.GetEventRecorderFor("ns-filter-test-controller"),
AgentDriver: nsMockDriver,
ControllerLabels: labels.NewControllerLabelValues(controllerNamespace, controllerName),
}
Expect(nsReconciler.SetupWithManagerNamed(nsMgr, "ns-filter-agentendpoint")).To(Succeed())
// Start the namespace filter manager
nsMgrCtx, nsMgrCancel = context.WithCancel(context.Background())
go func() {
defer GinkgoRecover()
err := nsMgr.Start(nsMgrCtx)
if err != nil && nsMgrCtx.Err() == nil {
logf.Log.Error(err, "Namespace filter test manager failed to start")
}
}()
// Wait for namespace filter manager to be ready
Eventually(func() bool {
testCtx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
defer cancel()
return nsMgr.GetCache().WaitForCacheSync(testCtx)
}, 30*time.Second, 100*time.Millisecond).Should(BeTrue())
})
var _ = AfterSuite(func() {
By("stopping namespace filter test manager")
if nsMgrCancel != nil {
nsMgrCancel()
}
By("stopping env test manager")
if envCancel != nil {
envCancel()
}
By("tearing down the test environment")
err := testEnv.Stop()
Expect(err).NotTo(HaveOccurred())
})