@@ -137,6 +137,50 @@ type DNSMXRecords struct {
137137 TTL * int32 `json:"ttl,omitempty"`
138138}
139139
140+ // DNSDKIMRecords holds DKIM (DomainKeys Identified Mail) values with an optional per-record TTL.
141+ // Stored as TXT records under <selector>._domainkey.<domain>.
142+ // Values should be DKIM public key records (e.g. "v=DKIM1; k=rsa; p=...").
143+ type DNSDKIMRecords struct {
144+ // Values is the list of DKIM record values.
145+ // +kubebuilder:validation:MinItems=1
146+ Values []string `json:"values"`
147+
148+ // TTL is the time-to-live for this record type.
149+ // +kubebuilder:validation:Minimum=0
150+ // +kubebuilder:validation:Maximum=3600
151+ // +optional
152+ TTL * int32 `json:"ttl,omitempty"`
153+ }
154+
155+ // DNSSPFRecords holds SPF (Sender Policy Framework) values with an optional per-record TTL.
156+ // Stored as TXT records. Values should follow SPF syntax (e.g. "v=spf1 include:_spf.google.com ~all").
157+ type DNSSPFRecords struct {
158+ // Values is the list of SPF record values.
159+ // +kubebuilder:validation:MinItems=1
160+ Values []string `json:"values"`
161+
162+ // TTL is the time-to-live for this record type.
163+ // +kubebuilder:validation:Minimum=0
164+ // +kubebuilder:validation:Maximum=3600
165+ // +optional
166+ TTL * int32 `json:"ttl,omitempty"`
167+ }
168+
169+ // DNSDMARCRecords holds DMARC (Domain-based Message Authentication, Reporting & Conformance) values
170+ // with an optional per-record TTL. Stored as TXT records under _dmarc.<domain>.
171+ // Values should follow DMARC syntax (e.g. "v=DMARC1; p=reject; rua=mailto:...").
172+ type DNSDMARCRecords struct {
173+ // Values is the list of DMARC record values.
174+ // +kubebuilder:validation:MinItems=1
175+ Values []string `json:"values"`
176+
177+ // TTL is the time-to-live for this record type.
178+ // +kubebuilder:validation:Minimum=0
179+ // +kubebuilder:validation:Maximum=3600
180+ // +optional
181+ TTL * int32 `json:"ttl,omitempty"`
182+ }
183+
140184// DNSCAARecords holds CAA record values with an optional per-record TTL.
141185type DNSCAARecords struct {
142186 // Values is the list of CAA record values.
@@ -176,6 +220,34 @@ type DNSNSRecords struct {
176220 TTL * int32 `json:"ttl,omitempty"`
177221}
178222
223+ // DNSDSRecords holds DS (Delegation Signer) records for DNSSEC chain of trust,
224+ // with an optional per-record TTL. Values should be DS record data (e.g. "12345 8 2 <digest>").
225+ type DNSDSRecords struct {
226+ // Values is the list of DS record values.
227+ // +kubebuilder:validation:MinItems=1
228+ Values []string `json:"values"`
229+
230+ // TTL is the time-to-live for this record type.
231+ // +kubebuilder:validation:Minimum=0
232+ // +kubebuilder:validation:Maximum=3600
233+ // +optional
234+ TTL * int32 `json:"ttl,omitempty"`
235+ }
236+
237+ // DNSDNSKEYRecords holds DNSKEY records for DNSSEC, with an optional per-record TTL.
238+ // Values should be DNSKEY record data (e.g. "257 3 8 <base64-encoded-key>").
239+ type DNSDNSKEYRecords struct {
240+ // Values is the list of DNSKEY record values.
241+ // +kubebuilder:validation:MinItems=1
242+ Values []string `json:"values"`
243+
244+ // TTL is the time-to-live for this record type.
245+ // +kubebuilder:validation:Minimum=0
246+ // +kubebuilder:validation:Maximum=3600
247+ // +optional
248+ TTL * int32 `json:"ttl,omitempty"`
249+ }
250+
179251type DomainTargetDNS struct {
180252 // IPs holds A/AAAA record addresses.
181253 // Cannot be set with FQDN.
@@ -195,6 +267,23 @@ type DomainTargetDNS struct {
195267 // +optional
196268 MX * DNSMXRecords `json:"mx,omitempty"`
197269
270+ // DKIM holds DKIM (DomainKeys Identified Mail) values.
271+ // Stored as TXT records under <selector>._domainkey.<domain>.
272+ // Values should be DKIM public key records (e.g. "v=DKIM1; k=rsa; p=...").
273+ // +optional
274+ DKIM * DNSDKIMRecords `json:"dkim,omitempty"`
275+
276+ // SPF holds SPF (Sender Policy Framework) values.
277+ // Stored as TXT records. Values should follow SPF syntax (e.g. "v=spf1 include:_spf.google.com ~all").
278+ // +optional
279+ SPF * DNSSPFRecords `json:"spf,omitempty"`
280+
281+ // DMARC holds DMARC (Domain-based Message Authentication, Reporting & Conformance) values.
282+ // Stored as TXT records under _dmarc.<domain>.
283+ // Values should follow DMARC syntax (e.g. "v=DMARC1; p=reject; rua=mailto:...").
284+ // +optional
285+ DMARC * DNSDMARCRecords `json:"dmarc,omitempty"`
286+
198287 // CAA holds Certification Authority Authorization record values.
199288 // +optional
200289 CAA * DNSCAARecords `json:"caa,omitempty"`
@@ -207,6 +296,15 @@ type DomainTargetDNS struct {
207296 // +optional
208297 NS * DNSNSRecords `json:"ns,omitempty"`
209298
299+ // DS holds DS (Delegation Signer) records for DNSSEC chain of trust.
300+ // Values should be DS record data (e.g. "12345 8 2 <digest>").
301+ // +optional
302+ DS * DNSDSRecords `json:"ds,omitempty"`
303+
304+ // DNSKEY holds DNSKEY records for DNSSEC.
305+ // Values should be DNSKEY record data (e.g. "257 3 8 <base64-encoded-key>").
306+ // +optional
307+ DNSKEY * DNSDNSKEYRecords `json:"dnskey,omitempty"`
210308}
211309
212310type DomainTLSSpec struct {
@@ -557,6 +655,41 @@ func getDomainRows(domain *Domain) []domainRow {
557655 ttl : resolveTTL (dns .CAA .TTL ),
558656 })
559657 }
658+ if dns .DKIM != nil && len (dns .DKIM .Values ) > 0 {
659+ rows = append (rows , domainRow {
660+ typ : "DNS:DKIM" ,
661+ value : formatMultiValue (dns .DKIM .Values , 30 ),
662+ ttl : resolveTTL (dns .DKIM .TTL ),
663+ })
664+ }
665+ if dns .SPF != nil && len (dns .SPF .Values ) > 0 {
666+ rows = append (rows , domainRow {
667+ typ : "DNS:SPF" ,
668+ value : formatMultiValue (dns .SPF .Values , 30 ),
669+ ttl : resolveTTL (dns .SPF .TTL ),
670+ })
671+ }
672+ if dns .DMARC != nil && len (dns .DMARC .Values ) > 0 {
673+ rows = append (rows , domainRow {
674+ typ : "DNS:DMARC" ,
675+ value : formatMultiValue (dns .DMARC .Values , 30 ),
676+ ttl : resolveTTL (dns .DMARC .TTL ),
677+ })
678+ }
679+ if dns .DS != nil && len (dns .DS .Values ) > 0 {
680+ rows = append (rows , domainRow {
681+ typ : "DNS:DS" ,
682+ value : formatMultiValue (dns .DS .Values , 30 ),
683+ ttl : resolveTTL (dns .DS .TTL ),
684+ })
685+ }
686+ if dns .DNSKEY != nil && len (dns .DNSKEY .Values ) > 0 {
687+ rows = append (rows , domainRow {
688+ typ : "DNS:DNSKEY" ,
689+ value : formatMultiValue (dns .DNSKEY .Values , 30 ),
690+ ttl : resolveTTL (dns .DNSKEY .TTL ),
691+ })
692+ }
560693 }
561694
562695 if len (rows ) == 0 {
0 commit comments