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