@@ -19,6 +19,7 @@ import (
19
19
appsv1 "k8s.io/api/apps/v1"
20
20
corev1 "k8s.io/api/core/v1"
21
21
extensionsv1beta1 "k8s.io/api/extensions/v1beta1"
22
+ apierrors "k8s.io/apimachinery/pkg/api/errors"
22
23
"k8s.io/apimachinery/pkg/api/meta"
23
24
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
24
25
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
@@ -245,6 +246,16 @@ func TestStatefulSetOwnershipInferred(t *testing.T) {
245
246
},
246
247
}
247
248
249
+ defaultNs := & corev1.Namespace {
250
+ TypeMeta : metav1.TypeMeta {
251
+ APIVersion : "v1" ,
252
+ Kind : "Namespace" ,
253
+ },
254
+ ObjectMeta : metav1.ObjectMeta {
255
+ Name : "default" ,
256
+ },
257
+ }
258
+
248
259
tests := []struct {
249
260
name string
250
261
cluster * clusterCache
@@ -254,7 +265,7 @@ func TestStatefulSetOwnershipInferred(t *testing.T) {
254
265
}{
255
266
{
256
267
name : "STSTemplateNameNotMatching" ,
257
- cluster : newCluster (t , sts ),
268
+ cluster : newCluster (t , sts , defaultNs ),
258
269
pvc : & corev1.PersistentVolumeClaim {
259
270
TypeMeta : metav1.TypeMeta {Kind : kube .PersistentVolumeClaimKind },
260
271
ObjectMeta : metav1.ObjectMeta {Name : "www1-web-0" , Namespace : "default" },
@@ -263,7 +274,7 @@ func TestStatefulSetOwnershipInferred(t *testing.T) {
263
274
},
264
275
{
265
276
name : "MatchingSTSExists" ,
266
- cluster : newCluster (t , sts ),
277
+ cluster : newCluster (t , sts , defaultNs ),
267
278
pvc : & corev1.PersistentVolumeClaim {
268
279
TypeMeta : metav1.TypeMeta {Kind : kube .PersistentVolumeClaimKind },
269
280
ObjectMeta : metav1.ObjectMeta {Name : "www-web-0" , Namespace : "default" },
@@ -272,7 +283,7 @@ func TestStatefulSetOwnershipInferred(t *testing.T) {
272
283
},
273
284
{
274
285
name : "STSTemplateNameNotMatchingWithBatchProcessing" ,
275
- cluster : newClusterWithOptions (t , opts , sts ),
286
+ cluster : newClusterWithOptions (t , opts , sts , defaultNs ),
276
287
pvc : & corev1.PersistentVolumeClaim {
277
288
TypeMeta : metav1.TypeMeta {Kind : kube .PersistentVolumeClaimKind },
278
289
ObjectMeta : metav1.ObjectMeta {Name : "www1-web-0" , Namespace : "default" },
@@ -281,7 +292,7 @@ func TestStatefulSetOwnershipInferred(t *testing.T) {
281
292
},
282
293
{
283
294
name : "MatchingSTSExistsWithBatchProcessing" ,
284
- cluster : newClusterWithOptions (t , opts , sts ),
295
+ cluster : newClusterWithOptions (t , opts , sts , defaultNs ),
285
296
pvc : & corev1.PersistentVolumeClaim {
286
297
TypeMeta : metav1.TypeMeta {Kind : kube .PersistentVolumeClaimKind },
287
298
ObjectMeta : metav1.ObjectMeta {Name : "www-web-0" , Namespace : "default" },
@@ -334,7 +345,26 @@ func TestEnsureSyncedSingleNamespace(t *testing.T) {
334
345
},
335
346
}
336
347
337
- cluster := newCluster (t , obj1 , obj2 )
348
+ ns1 := & corev1.Namespace {
349
+ TypeMeta : metav1.TypeMeta {
350
+ APIVersion : "v1" ,
351
+ Kind : "Namespace" ,
352
+ },
353
+ ObjectMeta : metav1.ObjectMeta {
354
+ Name : "default1" ,
355
+ },
356
+ }
357
+ ns2 := & corev1.Namespace {
358
+ TypeMeta : metav1.TypeMeta {
359
+ APIVersion : "v1" ,
360
+ Kind : "Namespace" ,
361
+ },
362
+ ObjectMeta : metav1.ObjectMeta {
363
+ Name : "default2" ,
364
+ },
365
+ }
366
+
367
+ cluster := newCluster (t , obj1 , obj2 , ns1 , ns2 )
338
368
cluster .namespaces = []string {"default1" }
339
369
err := cluster .EnsureSynced ()
340
370
require .NoError (t , err )
@@ -420,7 +450,26 @@ metadata:
420
450
}
421
451
422
452
func TestGetManagedLiveObjsNamespacedModeClusterLevelResource (t * testing.T ) {
423
- cluster := newCluster (t , testPod1 (), testRS (), testDeploy ())
453
+ defaultNs := & corev1.Namespace {
454
+ TypeMeta : metav1.TypeMeta {
455
+ APIVersion : "v1" ,
456
+ Kind : "Namespace" ,
457
+ },
458
+ ObjectMeta : metav1.ObjectMeta {
459
+ Name : "default" ,
460
+ },
461
+ }
462
+ productionNs := & corev1.Namespace {
463
+ TypeMeta : metav1.TypeMeta {
464
+ APIVersion : "v1" ,
465
+ Kind : "Namespace" ,
466
+ },
467
+ ObjectMeta : metav1.ObjectMeta {
468
+ Name : "production" ,
469
+ },
470
+ }
471
+
472
+ cluster := newCluster (t , testPod1 (), testRS (), testDeploy (), defaultNs , productionNs )
424
473
cluster .Invalidate (SetPopulateResourceInfoHandler (func (_ * unstructured.Unstructured , _ bool ) (info any , cacheManifest bool ) {
425
474
return nil , true
426
475
}))
@@ -445,7 +494,26 @@ metadata:
445
494
}
446
495
447
496
func TestGetManagedLiveObjsNamespacedModeClusterLevelResource_ClusterResourceEnabled (t * testing.T ) {
448
- cluster := newCluster (t , testPod1 (), testRS (), testDeploy ())
497
+ defaultNs := & corev1.Namespace {
498
+ TypeMeta : metav1.TypeMeta {
499
+ APIVersion : "v1" ,
500
+ Kind : "Namespace" ,
501
+ },
502
+ ObjectMeta : metav1.ObjectMeta {
503
+ Name : "default" ,
504
+ },
505
+ }
506
+ productionNs := & corev1.Namespace {
507
+ TypeMeta : metav1.TypeMeta {
508
+ APIVersion : "v1" ,
509
+ Kind : "Namespace" ,
510
+ },
511
+ ObjectMeta : metav1.ObjectMeta {
512
+ Name : "production" ,
513
+ },
514
+ }
515
+
516
+ cluster := newCluster (t , testPod1 (), testRS (), testDeploy (), defaultNs , productionNs )
449
517
cluster .Invalidate (SetPopulateResourceInfoHandler (func (_ * unstructured.Unstructured , _ bool ) (info any , cacheManifest bool ) {
450
518
return nil , true
451
519
}))
@@ -514,7 +582,26 @@ metadata:
514
582
}
515
583
516
584
func TestGetManagedLiveObjsValidNamespace (t * testing.T ) {
517
- cluster := newCluster (t , testPod1 (), testRS (), testDeploy ())
585
+ defaultNs := & corev1.Namespace {
586
+ TypeMeta : metav1.TypeMeta {
587
+ APIVersion : "v1" ,
588
+ Kind : "Namespace" ,
589
+ },
590
+ ObjectMeta : metav1.ObjectMeta {
591
+ Name : "default" ,
592
+ },
593
+ }
594
+ productionNs := & corev1.Namespace {
595
+ TypeMeta : metav1.TypeMeta {
596
+ APIVersion : "v1" ,
597
+ Kind : "Namespace" ,
598
+ },
599
+ ObjectMeta : metav1.ObjectMeta {
600
+ Name : "production" ,
601
+ },
602
+ }
603
+
604
+ cluster := newCluster (t , testPod1 (), testRS (), testDeploy (), defaultNs , productionNs )
518
605
cluster .Invalidate (SetPopulateResourceInfoHandler (func (_ * unstructured.Unstructured , _ bool ) (info any , cacheManifest bool ) {
519
606
return nil , true
520
607
}))
@@ -542,7 +629,26 @@ metadata:
542
629
}
543
630
544
631
func TestGetManagedLiveObjsInvalidNamespace (t * testing.T ) {
545
- cluster := newCluster (t , testPod1 (), testRS (), testDeploy ())
632
+ defaultNs := & corev1.Namespace {
633
+ TypeMeta : metav1.TypeMeta {
634
+ APIVersion : "v1" ,
635
+ Kind : "Namespace" ,
636
+ },
637
+ ObjectMeta : metav1.ObjectMeta {
638
+ Name : "default" ,
639
+ },
640
+ }
641
+ developNs := & corev1.Namespace {
642
+ TypeMeta : metav1.TypeMeta {
643
+ APIVersion : "v1" ,
644
+ Kind : "Namespace" ,
645
+ },
646
+ ObjectMeta : metav1.ObjectMeta {
647
+ Name : "develop" ,
648
+ },
649
+ }
650
+
651
+ cluster := newCluster (t , testPod1 (), testRS (), testDeploy (), defaultNs , developNs )
546
652
cluster .Invalidate (SetPopulateResourceInfoHandler (func (_ * unstructured.Unstructured , _ bool ) (info any , cacheManifest bool ) {
547
653
return nil , true
548
654
}))
@@ -595,7 +701,18 @@ func TestGetManagedLiveObjsFailedConversion(t *testing.T) {
595
701
t .Run (testCaseCopy .name , func (t * testing.T ) {
596
702
err := apiextensions .AddToScheme (scheme .Scheme )
597
703
require .NoError (t , err )
598
- cluster := newCluster (t , testCRD (), testCronTab ()).
704
+
705
+ defaultNs := & corev1.Namespace {
706
+ TypeMeta : metav1.TypeMeta {
707
+ APIVersion : "v1" ,
708
+ Kind : "Namespace" ,
709
+ },
710
+ ObjectMeta : metav1.ObjectMeta {
711
+ Name : "default" ,
712
+ },
713
+ }
714
+
715
+ cluster := newCluster (t , testCRD (), testCronTab (), defaultNs ).
599
716
WithAPIResources ([]kube.APIResourceInfo {
600
717
{
601
718
GroupKind : schema.GroupKind {Group : cronTabGroup , Kind : "CronTab" },
@@ -1292,3 +1409,40 @@ func BenchmarkIterateHierarchyV2(b *testing.B) {
1292
1409
})
1293
1410
}
1294
1411
}
1412
+
1413
+ func TestSyncWithDeletedNamespace (t * testing.T ) {
1414
+ deletedNamespace := "deleted-namespace"
1415
+ validNamespace := "default"
1416
+ pod := testPod1 ()
1417
+ pod .SetNamespace (validNamespace )
1418
+ validNs := & corev1.Namespace {
1419
+ TypeMeta : metav1.TypeMeta {
1420
+ APIVersion : "v1" ,
1421
+ Kind : "Namespace" ,
1422
+ },
1423
+ ObjectMeta : metav1.ObjectMeta {
1424
+ Name : validNamespace ,
1425
+ },
1426
+ }
1427
+ cluster := newCluster (t , pod , validNs )
1428
+ cluster .namespaces = []string {validNamespace , deletedNamespace }
1429
+ client := cluster .kubectl .(* kubetest.MockKubectlCmd ).DynamicClient .(* fake.FakeDynamicClient )
1430
+
1431
+ // Return "not found" error when getting the deleted namespace during validation
1432
+ client .PrependReactor ("get" , "namespaces" , func (action testcore.Action ) (handled bool , ret runtime.Object , err error ) {
1433
+ getAction := action .(testcore.GetAction )
1434
+ if getAction .GetName () == deletedNamespace {
1435
+ // Simulate namespace not found (deleted)
1436
+ return true , nil , apierrors .NewNotFound (
1437
+ schema.GroupResource {Group : "" , Resource : "namespaces" },
1438
+ deletedNamespace )
1439
+ }
1440
+ return false , nil , nil
1441
+ })
1442
+
1443
+ err := cluster .sync ()
1444
+
1445
+ assert .NoError (t , err )
1446
+ assert .NotContains (t , cluster .namespaces , deletedNamespace )
1447
+ assert .Contains (t , cluster .namespaces , validNamespace )
1448
+ }
0 commit comments