@@ -207,14 +207,54 @@ func (t Targets) IsLess(o Targets) bool {
207207 return false
208208}
209209
210- // ProviderSpecificProperty holds the name and value of a configuration which is specific to individual DNS providers
211- type ProviderSpecificProperty struct {
212- Name string `json:"name,omitempty"`
213- Value string `json:"value,omitempty"`
210+ // ProviderSpecific holds configuration which is specific to individual DNS providers
211+ type ProviderSpecific map [string ]string
212+
213+ func (ps ProviderSpecific ) Set (key , value string ) {
214+ ps [key ] = value
214215}
215216
216- // ProviderSpecific holds configuration which is specific to individual DNS providers
217- type ProviderSpecific []ProviderSpecificProperty
217+ func (ps ProviderSpecific ) Get (key string ) (string , bool ) {
218+ value , ok := ps [key ]
219+ return value , ok
220+ }
221+
222+ func (ps ProviderSpecific ) Delete (key string ) {
223+ delete (ps , key )
224+ }
225+
226+ // String returns a stable, backwards-compatible string form.
227+ // For compatibility with older branches where ProviderSpecific was
228+ // []ProviderSpecificProperty, we render:
229+ // - empty or nil as "[]"
230+ // - non-empty as slice-like entries sorted by key, e.g. "[{k1 v1} {k2 v2}]"
231+ // This preserves previous log expectations and keeps output deterministic.
232+ func (ps ProviderSpecific ) String () string {
233+ if len (ps ) == 0 {
234+ return "[]"
235+ }
236+ // Collect and sort keys for stable output.
237+ keys := make ([]string , 0 , len (ps ))
238+ for k := range ps {
239+ keys = append (keys , k )
240+ }
241+ sort .Strings (keys )
242+ // Build entries like "{key value}" preserving stable order.
243+ b := strings.Builder {}
244+ b .WriteByte ('[' )
245+ for i , k := range keys {
246+ if i > 0 {
247+ b .WriteByte (' ' )
248+ }
249+ b .WriteByte ('{' )
250+ b .WriteString (k )
251+ b .WriteByte (' ' )
252+ b .WriteString (ps [k ])
253+ b .WriteByte ('}' )
254+ }
255+ b .WriteByte (']' )
256+ return b .String ()
257+ }
218258
219259// EndpointKey is the type of a map key for separating endpoints or targets.
220260type EndpointKey struct {
@@ -225,7 +265,6 @@ type EndpointKey struct {
225265}
226266
227267// Endpoint is a high-level way of a connection between a service and an IP
228- // +kubebuilder:object:generate=true
229268type Endpoint struct {
230269 // The hostname of the DNS record
231270 DNSName string `json:"dnsName,omitempty"`
@@ -294,37 +333,26 @@ func (e *Endpoint) WithProviderSpecific(key, value string) *Endpoint {
294333
295334// GetProviderSpecificProperty returns the value of a ProviderSpecificProperty if the property exists.
296335func (e * Endpoint ) GetProviderSpecificProperty (key string ) (string , bool ) {
297- for _ , providerSpecific := range e .ProviderSpecific {
298- if providerSpecific .Name == key {
299- return providerSpecific .Value , true
300- }
336+ if e .ProviderSpecific == nil {
337+ return "" , false
301338 }
302- return "" , false
339+ return e . ProviderSpecific . Get ( key )
303340}
304341
305342// SetProviderSpecificProperty sets the value of a ProviderSpecificProperty.
306343func (e * Endpoint ) SetProviderSpecificProperty (key string , value string ) {
307- for i , providerSpecific := range e .ProviderSpecific {
308- if providerSpecific .Name == key {
309- e .ProviderSpecific [i ] = ProviderSpecificProperty {
310- Name : key ,
311- Value : value ,
312- }
313- return
314- }
344+ if e .ProviderSpecific == nil {
345+ e .ProviderSpecific = make (ProviderSpecific )
315346 }
316-
317- e .ProviderSpecific = append (e .ProviderSpecific , ProviderSpecificProperty {Name : key , Value : value })
347+ e .ProviderSpecific .Set (key , value )
318348}
319349
320350// DeleteProviderSpecificProperty deletes any ProviderSpecificProperty of the specified name.
321351func (e * Endpoint ) DeleteProviderSpecificProperty (key string ) {
322- for i , providerSpecific := range e .ProviderSpecific {
323- if providerSpecific .Name == key {
324- e .ProviderSpecific = append (e .ProviderSpecific [:i ], e .ProviderSpecific [i + 1 :]... )
325- return
326- }
352+ if e .ProviderSpecific == nil {
353+ return
327354 }
355+ e .ProviderSpecific .Delete (key )
328356}
329357
330358// WithLabel adds or updates a label for the Endpoint.
0 commit comments