@@ -47,7 +47,7 @@ func TestReplicaSetEvents(t *testing.T) {
47
47
reporter , err := newPodEventLogger (ctx , podEventLoggerOptions {
48
48
client : client ,
49
49
coderURL : agentURL ,
50
- namespace : namespace ,
50
+ namespaces : [] string { namespace } ,
51
51
logger : slogtest .Make (t , nil ).Leveled (slog .LevelDebug ),
52
52
logDebounce : 5 * time .Second ,
53
53
clock : cMock ,
@@ -144,7 +144,7 @@ func TestPodEvents(t *testing.T) {
144
144
reporter , err := newPodEventLogger (ctx , podEventLoggerOptions {
145
145
client : client ,
146
146
coderURL : agentURL ,
147
- namespace : namespace ,
147
+ namespaces : [] string { namespace } ,
148
148
logger : slogtest .Make (t , nil ).Leveled (slog .LevelDebug ),
149
149
logDebounce : 5 * time .Second ,
150
150
clock : cMock ,
@@ -221,6 +221,153 @@ func TestPodEvents(t *testing.T) {
221
221
require .NoError (t , err )
222
222
}
223
223
224
+ func Test_newPodEventLogger_multipleNamespaces (t * testing.T ) {
225
+ t .Parallel ()
226
+
227
+ api := newFakeAgentAPI (t )
228
+
229
+ ctx := testutil .Context (t , testutil .WaitShort )
230
+ agentURL , err := url .Parse (api .server .URL )
231
+ require .NoError (t , err )
232
+ namespaces := []string {"test-namespace1" , "test-namespace2" }
233
+ client := fake .NewSimpleClientset ()
234
+
235
+ cMock := quartz .NewMock (t )
236
+ reporter , err := newPodEventLogger (ctx , podEventLoggerOptions {
237
+ client : client ,
238
+ coderURL : agentURL ,
239
+ namespaces : namespaces ,
240
+ logger : slogtest .Make (t , nil ).Leveled (slog .LevelDebug ),
241
+ logDebounce : 5 * time .Second ,
242
+ clock : cMock ,
243
+ })
244
+ require .NoError (t , err )
245
+
246
+ // Create a pod in the test-namespace1 namespace
247
+ pod1 := & corev1.Pod {
248
+ ObjectMeta : v1.ObjectMeta {
249
+ Name : "test-pod-1" ,
250
+ Namespace : "test-namespace1" ,
251
+ CreationTimestamp : v1.Time {
252
+ Time : time .Now ().Add (time .Hour ),
253
+ },
254
+ },
255
+ Spec : corev1.PodSpec {
256
+ Containers : []corev1.Container {
257
+ {
258
+ Env : []corev1.EnvVar {
259
+ {
260
+ Name : "CODER_AGENT_TOKEN" ,
261
+ Value : "test-token-1" ,
262
+ },
263
+ },
264
+ },
265
+ },
266
+ },
267
+ }
268
+ _ , err = client .CoreV1 ().Pods ("test-namespace1" ).Create (ctx , pod1 , v1.CreateOptions {})
269
+ require .NoError (t , err )
270
+
271
+ // Create a pod in the test-namespace2 namespace
272
+ pod2 := & corev1.Pod {
273
+ ObjectMeta : v1.ObjectMeta {
274
+ Name : "test-pod-2" ,
275
+ Namespace : "test-namespace2" ,
276
+ CreationTimestamp : v1.Time {
277
+ Time : time .Now ().Add (time .Hour ),
278
+ },
279
+ },
280
+ Spec : corev1.PodSpec {
281
+ Containers : []corev1.Container {
282
+ {
283
+ Env : []corev1.EnvVar {
284
+ {
285
+ Name : "CODER_AGENT_TOKEN" ,
286
+ Value : "test-token-2" ,
287
+ },
288
+ },
289
+ },
290
+ },
291
+ },
292
+ }
293
+ _ , err = client .CoreV1 ().Pods ("test-namespace2" ).Create (ctx , pod2 , v1.CreateOptions {})
294
+ require .NoError (t , err )
295
+
296
+ // Wait for both pods to be registered
297
+ source1 := testutil .RequireRecvCtx (ctx , t , api .logSource )
298
+ require .Equal (t , sourceUUID , source1 .ID )
299
+ require .Equal (t , "Kubernetes" , source1 .DisplayName )
300
+ require .Equal (t , "/icon/k8s.png" , source1 .Icon )
301
+
302
+ source2 := testutil .RequireRecvCtx (ctx , t , api .logSource )
303
+ require .Equal (t , sourceUUID , source2 .ID )
304
+ require .Equal (t , "Kubernetes" , source2 .DisplayName )
305
+ require .Equal (t , "/icon/k8s.png" , source2 .Icon )
306
+
307
+ // Wait for both creation logs
308
+ logs1 := testutil .RequireRecvCtx (ctx , t , api .logs )
309
+ require .Len (t , logs1 , 1 )
310
+ require .Contains (t , logs1 [0 ].Output , "Created pod" )
311
+
312
+ logs2 := testutil .RequireRecvCtx (ctx , t , api .logs )
313
+ require .Len (t , logs2 , 1 )
314
+ require .Contains (t , logs2 [0 ].Output , "Created pod" )
315
+
316
+ // Create an event in the first namespace
317
+ event1 := & corev1.Event {
318
+ ObjectMeta : v1.ObjectMeta {
319
+ Name : "test-event-1" ,
320
+ Namespace : "test-namespace1" ,
321
+ CreationTimestamp : v1.Time {
322
+ Time : time .Now ().Add (time .Hour ),
323
+ },
324
+ },
325
+ InvolvedObject : corev1.ObjectReference {
326
+ Kind : "Pod" ,
327
+ Name : "test-pod-1" ,
328
+ Namespace : "test-namespace1" ,
329
+ },
330
+ Reason : "Test" ,
331
+ Message : "Test event for namespace1" ,
332
+ }
333
+ _ , err = client .CoreV1 ().Events ("test-namespace1" ).Create (ctx , event1 , v1.CreateOptions {})
334
+ require .NoError (t , err )
335
+
336
+ // Wait for the event log
337
+ eventLogs := testutil .RequireRecvCtx (ctx , t , api .logs )
338
+ require .Len (t , eventLogs , 1 )
339
+ require .Contains (t , eventLogs [0 ].Output , "Test event for namespace1" )
340
+
341
+ // Create an event in the first namespace
342
+ event2 := & corev1.Event {
343
+ ObjectMeta : v1.ObjectMeta {
344
+ Name : "test-event-2" ,
345
+ Namespace : "test-namespace2" ,
346
+ CreationTimestamp : v1.Time {
347
+ Time : time .Now ().Add (time .Hour ),
348
+ },
349
+ },
350
+ InvolvedObject : corev1.ObjectReference {
351
+ Kind : "Pod" ,
352
+ Name : "test-pod-2" ,
353
+ Namespace : "test-namespace2" ,
354
+ },
355
+ Reason : "Test" ,
356
+ Message : "Test event for namespace2" ,
357
+ }
358
+ _ , err = client .CoreV1 ().Events ("test-namespace2" ).Create (ctx , event2 , v1.CreateOptions {})
359
+ require .NoError (t , err )
360
+
361
+ // Wait for the event log
362
+ eventLogs2 := testutil .RequireRecvCtx (ctx , t , api .logs )
363
+ require .Len (t , eventLogs2 , 1 )
364
+ require .Contains (t , eventLogs2 [0 ].Output , "Test event for namespace2" )
365
+
366
+ // Clean up
367
+ err = reporter .Close ()
368
+ require .NoError (t , err )
369
+ }
370
+
224
371
func Test_tokenCache (t * testing.T ) {
225
372
t .Parallel ()
226
373
0 commit comments