Skip to content

Commit e3d6c05

Browse files
committed
feat(networkinfo): AllowedDNSDomains from VPC DNS zones
Wire NetworkInfo reconciler to DNSRecordService for per-namespace allowed DNS domains derived from VPC DNS zone configuration. Register DNS record service initialization in cmd when VPC networking is enabled.
1 parent 7f460a0 commit e3d6c05

5 files changed

Lines changed: 184 additions & 55 deletions

File tree

cmd/main.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ import (
5858
"github.com/vmware-tanzu/nsx-operator/pkg/metrics"
5959
"github.com/vmware-tanzu/nsx-operator/pkg/nsx"
6060
"github.com/vmware-tanzu/nsx-operator/pkg/nsx/services/common"
61+
"github.com/vmware-tanzu/nsx-operator/pkg/nsx/services/dns"
6162
ipaddressallocationservice "github.com/vmware-tanzu/nsx-operator/pkg/nsx/services/ipaddressallocation"
6263
"github.com/vmware-tanzu/nsx-operator/pkg/nsx/services/vpc"
6364
"github.com/vmware-tanzu/nsx-operator/pkg/nsx/util"
@@ -192,6 +193,11 @@ func startServiceController(mgr manager.Manager, nsxClient *nsx.Client) {
192193
log.Error(err, "Failed to initialize staticroute commonService", "controller", "StaticRoute")
193194
os.Exit(1)
194195
}
196+
dnsRecordService, err := dns.InitializeDNSRecordService(commonService, vpcService)
197+
if err != nil {
198+
log.Error(err, "Failed to initialize DNS record service", "controller", "DNS")
199+
os.Exit(1)
200+
}
195201
ipblocksInfoService := ipblocksinfo.InitializeIPBlocksInfoService(commonService, subnetService)
196202

197203
subnetBindingService, err := subnetbindingservice.InitializeService(commonService)
@@ -230,7 +236,7 @@ func startServiceController(mgr manager.Manager, nsxClient *nsx.Client) {
230236
subnetSetReconcile = subnetset.NewSubnetSetReconciler(mgr, subnetService, subnetPortService, vpcService, subnetBindingService)
231237
reconcilerList = append(
232238
reconcilerList,
233-
networkinfocontroller.NewNetworkInfoReconciler(mgr, vpcService, ipblocksInfoService),
239+
networkinfocontroller.NewNetworkInfoReconciler(mgr, vpcService, ipblocksInfoService, dnsRecordService),
234240
namespacecontroller.NewNamespaceReconciler(mgr, cf, vpcService, subnetService, subnetPortService),
235241
subnet.NewSubnetReconciler(mgr, subnetService, subnetPortService, vpcService, subnetBindingService),
236242
subnetSetReconcile,

pkg/controllers/networkinfo/networkinfo_controller.go

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ package networkinfo
66
import (
77
"context"
88
"fmt"
9+
"maps"
10+
"slices"
911
"time"
1012

1113
stderrors "github.com/vmware/vsphere-automation-sdk-go/lib/vapi/std/errors"
@@ -70,6 +72,7 @@ var (
7072
nsMsgVPCAutoSNATDisabled = newNsUnreadyMessage("SNAT is not enabled in System VPC", NSReasonVPCSnatNotReady)
7173
nsMsgVPCDefaultSNATIPGetError = newNsUnreadyMessage("Default SNAT IP is not allocated in VPC: %v", NSReasonVPCSnatNotReady)
7274
nsMsgVPCIsReady = newNsUnreadyMessage("", "")
75+
nsMsgVPCDNSZonesSyncError = newNsUnreadyMessage("Failed to sync permitted DNS zones from NSX: %v", NSReasonVPCNotReady)
7376
)
7477

7578
type nsUnreadyMessage struct {
@@ -97,12 +100,18 @@ func (m *nsUnreadyMessage) getNSNetworkCondition(options ...interface{}) *corev1
97100
return cond
98101
}
99102

103+
// dnsZoneSyncer is the minimal DNS interface needed by NetworkInfoReconciler for VPC DNS zone lookups.
104+
type dnsZoneSyncer interface {
105+
SyncDNSZonesByVpcNetworkConfig(vpcConfig *v1alpha1.VPCNetworkConfiguration) (map[string]string, error)
106+
}
107+
100108
// NetworkInfoReconciler NetworkInfoReconcile reconciles a NetworkInfo object
101109
// Actually it is more like a shell, which is used to manage nsx VPC
102110
type NetworkInfoReconciler struct {
103111
Client client.Client
104112
Scheme *apimachineryruntime.Scheme
105113
Service *vpc.VPCService
114+
DNSRecordService dnsZoneSyncer
106115
IPBlocksInfoService *ipblocksinfo.IPBlocksInfoService
107116
Recorder record.EventRecorder
108117
queue workqueue.TypedRateLimitingInterface[reconcile.Request]
@@ -430,9 +439,29 @@ func (r *NetworkInfoReconciler) Reconcile(ctx context.Context, req ctrl.Request)
430439
NetworkStack: networkStack,
431440
}
432441

442+
var allowedDNSDomains []string
443+
if r.DNSRecordService != nil && len(nc.Spec.DNSZones) > 0 {
444+
zoneMap, err := r.DNSRecordService.SyncDNSZonesByVpcNetworkConfig(nc)
445+
if err != nil {
446+
r.StatusUpdater.UpdateFail(ctx, networkInfoCR, err, "Failed to sync DNS zones for VPC network configuration", setNetworkInfoVPCStatusWithError, state)
447+
setNSNetworkReadyCondition(ctx, r.Client, req.Namespace, nsMsgVPCDNSZonesSyncError.getNSNetworkCondition(err))
448+
return common.ResultRequeueAfter10sec, err
449+
}
450+
// Use a Set to ensure each domain name in the allowed list is unique.
451+
domainNamesSet := sets.New[string]()
452+
for _, domainName := range slices.Sorted(maps.Values(zoneMap)) {
453+
if domainName == "" {
454+
continue
455+
}
456+
domainNamesSet.Insert(domainName)
457+
}
458+
allowedDNSDomains = domainNamesSet.UnsortedList()
459+
slices.Sort(allowedDNSDomains)
460+
}
461+
433462
// AKO needs to know the AVI subnet path created by NSX
434463
setVPCNetworkConfigurationStatusWithLBS(ctx, r.Client, ncName, state.Name, aviSubnetPath, nsxLBSPath, *createdVpc.Path)
435-
r.StatusUpdater.UpdateSuccess(ctx, networkInfoCR, setNetworkInfoVPCStatus, state)
464+
r.StatusUpdater.UpdateSuccess(ctx, networkInfoCR, setNetworkInfoVPCStatus, state, allowedDNSDomains)
436465

437466
if retryWithSystemVPC {
438467
setNSNetworkReadyCondition(ctx, r.Client, req.Namespace, systemNSCondition)
@@ -805,11 +834,12 @@ func (r *NetworkInfoReconciler) StartController(mgr ctrl.Manager, _ webhook.Serv
805834
return nil
806835
}
807836

808-
func NewNetworkInfoReconciler(mgr ctrl.Manager, vpcService *vpc.VPCService, ipblocksInfoService *ipblocksinfo.IPBlocksInfoService) *NetworkInfoReconciler {
837+
func NewNetworkInfoReconciler(mgr ctrl.Manager, vpcService *vpc.VPCService, ipblocksInfoService *ipblocksinfo.IPBlocksInfoService, dnsRecordService dnsZoneSyncer) *NetworkInfoReconciler {
809838
networkInfoReconciler := &NetworkInfoReconciler{
810-
Client: mgr.GetClient(),
811-
Scheme: mgr.GetScheme(),
812-
Recorder: mgr.GetEventRecorderFor("networkinfo-controller"),
839+
Client: mgr.GetClient(),
840+
Scheme: mgr.GetScheme(),
841+
DNSRecordService: dnsRecordService,
842+
Recorder: mgr.GetEventRecorderFor("networkinfo-controller"),
813843
}
814844
networkInfoReconciler.Service = vpcService
815845
networkInfoReconciler.IPBlocksInfoService = ipblocksInfoService

0 commit comments

Comments
 (0)