@@ -372,6 +372,159 @@ func TestProvider_NewProvider(t *testing.T) {
372372 })
373373}
374374
375+ func TestProvider_Records_NamespaceLabelSelector_FiltersCorrectly (t * testing.T ) {
376+ ctx := context .Background ()
377+
378+ objects := []runtime.Object {
379+ & corev1.Namespace {
380+ ObjectMeta : metav1.ObjectMeta {
381+ Name : "managed-ns" ,
382+ Labels : map [string ]string {"datum.net/managed-dns" : "true" },
383+ },
384+ },
385+ & corev1.Namespace {
386+ ObjectMeta : metav1.ObjectMeta {Name : "unmanaged-ns" },
387+ },
388+ // Zone in labeled namespace
389+ & dnsv1alpha1.DNSZone {
390+ ObjectMeta : metav1.ObjectMeta {Name : "managed-com" , Namespace : "managed-ns" },
391+ Spec : dnsv1alpha1.DNSZoneSpec {DomainName : "managed.com" },
392+ },
393+ // Zone in unlabeled namespace — should NOT be discovered
394+ & dnsv1alpha1.DNSZone {
395+ ObjectMeta : metav1.ObjectMeta {Name : "unmanaged-com" , Namespace : "unmanaged-ns" },
396+ Spec : dnsv1alpha1.DNSZoneSpec {DomainName : "unmanaged.com" },
397+ },
398+ // Record in labeled namespace (owned by us)
399+ & dnsv1alpha1.DNSRecordSet {
400+ ObjectMeta : metav1.ObjectMeta {
401+ Name : "app-a-managed" , Namespace : "managed-ns" ,
402+ Labels : map [string ]string {LabelOwner : "test-owner" , LabelManagedBy : ManagedByValue },
403+ },
404+ Spec : dnsv1alpha1.DNSRecordSetSpec {
405+ DNSZoneRef : corev1.LocalObjectReference {Name : "managed-com" },
406+ RecordType : dnsv1alpha1 .RRTypeA ,
407+ Records : []dnsv1alpha1.RecordEntry {{Name : "app" , A : & dnsv1alpha1.ARecordSpec {Content : "192.0.2.1" }}},
408+ },
409+ },
410+ // Record in unlabeled namespace (owned by us) — should NOT be returned
411+ & dnsv1alpha1.DNSRecordSet {
412+ ObjectMeta : metav1.ObjectMeta {
413+ Name : "app-a-unmanaged" , Namespace : "unmanaged-ns" ,
414+ Labels : map [string ]string {LabelOwner : "test-owner" , LabelManagedBy : ManagedByValue },
415+ },
416+ Spec : dnsv1alpha1.DNSRecordSetSpec {
417+ DNSZoneRef : corev1.LocalObjectReference {Name : "unmanaged-com" },
418+ RecordType : dnsv1alpha1 .RRTypeA ,
419+ Records : []dnsv1alpha1.RecordEntry {{Name : "app" , A : & dnsv1alpha1.ARecordSpec {Content : "10.0.0.1" }}},
420+ },
421+ },
422+ }
423+
424+ scheme := runtime .NewScheme ()
425+ require .NoError (t , dnsv1alpha1 .AddToScheme (scheme ))
426+ require .NoError (t , corev1 .AddToScheme (scheme ))
427+
428+ fakeClient := fake .NewClientBuilder ().
429+ WithScheme (scheme ).
430+ WithRuntimeObjects (objects ... ).
431+ Build ()
432+
433+ config := & Config {DryRun : false }
434+ logger := logrus .New ()
435+ logger .SetLevel (logrus .ErrorLevel )
436+
437+ src := NewZoneSource ("test" , fakeClient , ZoneSourceConfig {
438+ NamespaceLabelSelector : "datum.net/managed-dns=true" ,
439+ }, config , logger )
440+
441+ p , err := NewProvider (config , "test-owner" , []* ZoneSource {src })
442+ require .NoError (t , err )
443+ require .NoError (t , p .registry .Refresh (ctx ))
444+
445+ // Zone discovery should only find managed.com
446+ zones := p .registry .ListZones ()
447+ assert .Len (t , zones , 1 , "only zones from labeled namespaces should be discovered" )
448+ assert .Equal (t , "managed.com" , zones [0 ].Spec .DomainName )
449+
450+ // Domain filter should only include managed.com
451+ filter := p .GetDomainFilter ()
452+ assert .True (t , filter .Match ("app.managed.com" ))
453+ assert .False (t , filter .Match ("app.unmanaged.com" ))
454+
455+ // Records() must only return records from labeled namespaces
456+ endpoints , err := p .Records (ctx )
457+ require .NoError (t , err )
458+ require .Len (t , endpoints , 1 , "Records() should only return records from labeled namespaces" )
459+ assert .Equal (t , "app.managed.com" , endpoints [0 ].DNSName )
460+ assert .Equal (t , endpoint.Targets {"192.0.2.1" }, endpoints [0 ].Targets )
461+ }
462+
463+ func TestProvider_Records_NamespaceFlag_FiltersCorrectly (t * testing.T ) {
464+ ctx := context .Background ()
465+
466+ objects := []runtime.Object {
467+ & corev1.Namespace {ObjectMeta : metav1.ObjectMeta {Name : "watched-ns" }},
468+ & corev1.Namespace {ObjectMeta : metav1.ObjectMeta {Name : "other-ns" }},
469+ & dnsv1alpha1.DNSZone {
470+ ObjectMeta : metav1.ObjectMeta {Name : "watched-com" , Namespace : "watched-ns" },
471+ Spec : dnsv1alpha1.DNSZoneSpec {DomainName : "watched.com" },
472+ },
473+ & dnsv1alpha1.DNSZone {
474+ ObjectMeta : metav1.ObjectMeta {Name : "other-com" , Namespace : "other-ns" },
475+ Spec : dnsv1alpha1.DNSZoneSpec {DomainName : "other.com" },
476+ },
477+ & dnsv1alpha1.DNSRecordSet {
478+ ObjectMeta : metav1.ObjectMeta {
479+ Name : "app-a-watched" , Namespace : "watched-ns" ,
480+ Labels : map [string ]string {LabelOwner : "test-owner" , LabelManagedBy : ManagedByValue },
481+ },
482+ Spec : dnsv1alpha1.DNSRecordSetSpec {
483+ DNSZoneRef : corev1.LocalObjectReference {Name : "watched-com" },
484+ RecordType : dnsv1alpha1 .RRTypeA ,
485+ Records : []dnsv1alpha1.RecordEntry {{Name : "app" , A : & dnsv1alpha1.ARecordSpec {Content : "192.0.2.1" }}},
486+ },
487+ },
488+ & dnsv1alpha1.DNSRecordSet {
489+ ObjectMeta : metav1.ObjectMeta {
490+ Name : "app-a-other" , Namespace : "other-ns" ,
491+ Labels : map [string ]string {LabelOwner : "test-owner" , LabelManagedBy : ManagedByValue },
492+ },
493+ Spec : dnsv1alpha1.DNSRecordSetSpec {
494+ DNSZoneRef : corev1.LocalObjectReference {Name : "other-com" },
495+ RecordType : dnsv1alpha1 .RRTypeA ,
496+ Records : []dnsv1alpha1.RecordEntry {{Name : "app" , A : & dnsv1alpha1.ARecordSpec {Content : "10.0.0.1" }}},
497+ },
498+ },
499+ }
500+
501+ scheme := runtime .NewScheme ()
502+ require .NoError (t , dnsv1alpha1 .AddToScheme (scheme ))
503+ require .NoError (t , corev1 .AddToScheme (scheme ))
504+
505+ fakeClient := fake .NewClientBuilder ().
506+ WithScheme (scheme ).
507+ WithRuntimeObjects (objects ... ).
508+ Build ()
509+
510+ config := & Config {DryRun : false }
511+ logger := logrus .New ()
512+ logger .SetLevel (logrus .ErrorLevel )
513+
514+ src := NewZoneSource ("test" , fakeClient , ZoneSourceConfig {
515+ Namespace : "watched-ns" ,
516+ }, config , logger )
517+
518+ p , err := NewProvider (config , "test-owner" , []* ZoneSource {src })
519+ require .NoError (t , err )
520+ require .NoError (t , p .registry .Refresh (ctx ))
521+
522+ endpoints , err := p .Records (ctx )
523+ require .NoError (t , err )
524+ require .Len (t , endpoints , 1 , "Records() should only return records from the watched namespace" )
525+ assert .Equal (t , "app.watched.com" , endpoints [0 ].DNSName )
526+ }
527+
375528func TestProvider_OwnershipConflict (t * testing.T ) {
376529 objects := []runtime.Object {
377530 & dnsv1alpha1.DNSZone {
0 commit comments