Skip to content

Commit f561f0f

Browse files
handle removing of labels from controller instead of ui
1 parent cd4f009 commit f561f0f

File tree

3 files changed

+163
-5
lines changed

3 files changed

+163
-5
lines changed

internal/controller/gateway_controller.go

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -908,19 +908,43 @@ func (r *GatewayReconciler) cleanupDNSRecordSets(
908908
return result
909909
}
910910

911-
for _, rs := range recordSetList.Items {
911+
deletedCount := 0
912+
for i := range recordSetList.Items {
913+
rs := &recordSetList.Items[i]
914+
hostname := rs.Annotations[annotationDNSHostname]
915+
if rs.Annotations[annotationDNSRetain] == "true" {
916+
logger.Info("retaining DNSRecordSet during gateway finalization, removing managed-by labels",
917+
"name", rs.Name,
918+
"hostname", hostname,
919+
)
920+
if rs.Labels != nil {
921+
labels := maps.Clone(rs.Labels)
922+
delete(labels, labelDNSManaged)
923+
delete(labels, labelManagedBy)
924+
delete(labels, labelDNSSourceKind)
925+
delete(labels, labelDNSSourceName)
926+
delete(labels, labelDNSSourceNS)
927+
rs.Labels = labels
928+
if err := upstreamClient.Update(ctx, rs); err != nil {
929+
result.Err = fmt.Errorf("failed to update DNSRecordSet %q (retain): %w", rs.Name, err)
930+
return result
931+
}
932+
}
933+
continue
934+
}
912935
logger.Info("deleting DNSRecordSet during gateway finalization",
913936
"name", rs.Name,
914-
"hostname", rs.Annotations[annotationDNSHostname],
937+
"hostname", hostname,
915938
)
916-
if err := upstreamClient.Delete(ctx, &rs); err != nil && !apierrors.IsNotFound(err) {
939+
if err := upstreamClient.Delete(ctx, rs); err != nil && !apierrors.IsNotFound(err) {
917940
result.Err = fmt.Errorf("failed to delete DNSRecordSet %q: %w", rs.Name, err)
918941
return result
919942
}
943+
deletedCount++
920944
}
921945

922-
if len(recordSetList.Items) > 0 {
923-
logger.Info("deleted DNSRecordSets during gateway finalization", "count", len(recordSetList.Items))
946+
if deletedCount > 0 {
947+
logger.Info("deleted DNSRecordSets during gateway finalization", "count", deletedCount)
924948
}
925949

926950
return result

internal/controller/gateway_dns_controller.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ const (
4242
labelDNSSourceName = "dns.datumapis.com/source-name"
4343
labelDNSSourceNS = "dns.datumapis.com/source-namespace"
4444
annotationDNSHostname = "dns.datumapis.com/hostname"
45+
annotationDNSRetain = "dns.datumapis.com/retain"
4546
annotationSyncStart = "dns.datumapis.com/sync-started-at"
4647
)
4748

internal/controller/gateway_dns_controller_test.go

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/stretchr/testify/assert"
1313
"github.com/stretchr/testify/require"
1414
corev1 "k8s.io/api/core/v1"
15+
apierrors "k8s.io/apimachinery/pkg/api/errors"
1516
apimeta "k8s.io/apimachinery/pkg/api/meta"
1617
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1718
"k8s.io/apimachinery/pkg/runtime"
@@ -857,6 +858,138 @@ func TestGarbageCollectDNSRecordSets_DoesNotDeleteInUseRecords(t *testing.T) {
857858
require.NoError(t, cl.Get(ctx, client.ObjectKey{Namespace: ns, Name: rsName}, &remaining))
858859
}
859860

861+
// ---------------------------------------------------------------------------
862+
// TestCleanupDNSRecordSets
863+
// ---------------------------------------------------------------------------
864+
865+
func TestCleanupDNSRecordSets_DeletesManagedRecords(t *testing.T) {
866+
const ns = "test-ns"
867+
ctx := log.IntoContext(context.Background(), zap.New())
868+
s := newDNSTestScheme(t)
869+
870+
testConfig := config.NetworkServicesOperator{
871+
Gateway: config.GatewayConfig{
872+
TargetDomain: "gateways.test.local",
873+
EnableDNSIntegration: true,
874+
},
875+
}
876+
877+
gw := newTestGatewayForDNS(ns, "my-gw")
878+
makeRS := func(name, hostname string) *dnsv1alpha1.DNSRecordSet {
879+
return &dnsv1alpha1.DNSRecordSet{
880+
ObjectMeta: metav1.ObjectMeta{
881+
Namespace: ns,
882+
Name: name,
883+
UID: uuid.NewUUID(),
884+
Labels: map[string]string{
885+
labelManagedBy: labelManagedByValue,
886+
labelDNSManaged: "true",
887+
labelDNSSourceKind: KindGateway,
888+
labelDNSSourceName: gw.Name,
889+
labelDNSSourceNS: ns,
890+
},
891+
Annotations: map[string]string{
892+
annotationDNSHostname: hostname,
893+
},
894+
},
895+
Spec: dnsv1alpha1.DNSRecordSetSpec{
896+
DNSZoneRef: corev1.LocalObjectReference{Name: "example-com"},
897+
RecordType: dnsv1alpha1.RRTypeCNAME,
898+
Records: []dnsv1alpha1.RecordEntry{{Name: hostname + "."}},
899+
},
900+
}
901+
}
902+
903+
rs1 := makeRS("my-gw-api", "api.example.com")
904+
rs2 := makeRS("my-gw-other", "other.example.com")
905+
allObjects := []client.Object{gw, rs1, rs2}
906+
for _, obj := range allObjects {
907+
if obj.GetUID() == "" {
908+
obj.SetUID(uuid.NewUUID())
909+
}
910+
obj.SetCreationTimestamp(metav1.Now())
911+
}
912+
913+
cl := buildFakeUpstreamClientForDNS(s, allObjects...)
914+
reconciler := newDNSReconciler(testConfig)
915+
916+
result := reconciler.cleanupDNSRecordSets(ctx, cl, gw)
917+
require.NoError(t, result.Err)
918+
919+
// Both records should be deleted.
920+
var deleted1 dnsv1alpha1.DNSRecordSet
921+
err1 := cl.Get(ctx, client.ObjectKey{Namespace: ns, Name: rs1.Name}, &deleted1)
922+
assert.True(t, apierrors.IsNotFound(err1), "DNSRecordSet %q should have been deleted: %v", rs1.Name, err1)
923+
924+
var deleted2 dnsv1alpha1.DNSRecordSet
925+
err2 := cl.Get(ctx, client.ObjectKey{Namespace: ns, Name: rs2.Name}, &deleted2)
926+
assert.True(t, apierrors.IsNotFound(err2), "DNSRecordSet %q should have been deleted: %v", rs2.Name, err2)
927+
}
928+
929+
func TestCleanupDNSRecordSets_RetainsAndStripsLabelsWhenAnnotationSet(t *testing.T) {
930+
const ns = "test-ns"
931+
ctx := log.IntoContext(context.Background(), zap.New())
932+
s := newDNSTestScheme(t)
933+
934+
testConfig := config.NetworkServicesOperator{
935+
Gateway: config.GatewayConfig{
936+
TargetDomain: "gateways.test.local",
937+
EnableDNSIntegration: true,
938+
},
939+
}
940+
941+
gw := newTestGatewayForDNS(ns, "my-gw")
942+
rsName := dnsRecordSetName(gw.Name, "api.example.com")
943+
rs := &dnsv1alpha1.DNSRecordSet{
944+
ObjectMeta: metav1.ObjectMeta{
945+
Namespace: ns,
946+
Name: rsName,
947+
UID: uuid.NewUUID(),
948+
Labels: map[string]string{
949+
labelManagedBy: labelManagedByValue,
950+
labelDNSManaged: "true",
951+
labelDNSSourceKind: KindGateway,
952+
labelDNSSourceName: gw.Name,
953+
labelDNSSourceNS: ns,
954+
},
955+
Annotations: map[string]string{
956+
annotationDNSHostname: "api.example.com",
957+
annotationDNSRetain: "true",
958+
},
959+
},
960+
Spec: dnsv1alpha1.DNSRecordSetSpec{
961+
DNSZoneRef: corev1.LocalObjectReference{Name: "example-com"},
962+
RecordType: dnsv1alpha1.RRTypeCNAME,
963+
Records: []dnsv1alpha1.RecordEntry{{Name: "api.example.com."}},
964+
},
965+
}
966+
967+
allObjects := []client.Object{gw, rs}
968+
for _, obj := range allObjects {
969+
if obj.GetUID() == "" {
970+
obj.SetUID(uuid.NewUUID())
971+
}
972+
obj.SetCreationTimestamp(metav1.Now())
973+
}
974+
975+
cl := buildFakeUpstreamClientForDNS(s, allObjects...)
976+
reconciler := newDNSReconciler(testConfig)
977+
978+
result := reconciler.cleanupDNSRecordSets(ctx, cl, gw)
979+
require.NoError(t, result.Err)
980+
981+
// Record should still exist.
982+
var updated dnsv1alpha1.DNSRecordSet
983+
require.NoError(t, cl.Get(ctx, client.ObjectKey{Namespace: ns, Name: rsName}, &updated))
984+
985+
// Managed-by labels should have been removed.
986+
assert.Empty(t, updated.Labels[labelDNSManaged], "label %q should be removed", labelDNSManaged)
987+
assert.Empty(t, updated.Labels[labelManagedBy], "label %q should be removed", labelManagedBy)
988+
assert.Empty(t, updated.Labels[labelDNSSourceKind], "label %q should be removed", labelDNSSourceKind)
989+
assert.Empty(t, updated.Labels[labelDNSSourceName], "label %q should be removed", labelDNSSourceName)
990+
assert.Empty(t, updated.Labels[labelDNSSourceNS], "label %q should be removed", labelDNSSourceNS)
991+
}
992+
860993
// ---------------------------------------------------------------------------
861994
// TestReconcileDNSStatus
862995
// ---------------------------------------------------------------------------

0 commit comments

Comments
 (0)