@@ -33,6 +33,7 @@ import (
3333 "golang.org/x/sync/errgroup"
3434
3535 "sigs.k8s.io/external-dns/endpoint"
36+ "sigs.k8s.io/external-dns/internal/idna"
3637 "sigs.k8s.io/external-dns/pkg/apis/externaldns"
3738 "sigs.k8s.io/external-dns/plan"
3839 "sigs.k8s.io/external-dns/provider"
@@ -156,43 +157,55 @@ func (p *OVHProvider) Records(ctx context.Context) ([]*endpoint.Endpoint, error)
156157 return endpoints , nil
157158}
158159
159- func planChangesByZoneName (zones []string , changes * plan.Changes ) map [string ]* plan.Changes {
160+ func planChangesByZoneName (zones []string , changes * plan.Changes ) ( map [string ]* plan.Changes , error ) {
160161 zoneNameIDMapper := provider.ZoneIDName {}
161162 for _ , zone := range zones {
162163 zoneNameIDMapper .Add (zone , zone )
163164 }
164165
165166 output := map [string ]* plan.Changes {}
166167 for _ , endpt := range changes .Delete {
167- _ , zoneName := zoneNameIDMapper .FindZone (endpt .DNSName )
168+ zoneName , _ := zoneNameIDMapper .FindZone (endpt .DNSName )
169+ if zoneName == "" {
170+ return nil , provider .NewSoftError (fmt .Errorf ("record %q have not found matching DNS zone in OVH provider" , endpt .DNSName ))
171+ }
168172 if _ , ok := output [zoneName ]; ! ok {
169173 output [zoneName ] = & plan.Changes {}
170174 }
171175 output [zoneName ].Delete = append (output [zoneName ].Delete , endpt )
172176 }
173177 for _ , endpt := range changes .Create {
174- _ , zoneName := zoneNameIDMapper .FindZone (endpt .DNSName )
178+ zoneName , _ := zoneNameIDMapper .FindZone (endpt .DNSName )
179+ if zoneName == "" {
180+ return nil , provider .NewSoftError (fmt .Errorf ("record %q have not found matching DNS zone in OVH provider" , endpt .DNSName ))
181+ }
175182 if _ , ok := output [zoneName ]; ! ok {
176183 output [zoneName ] = & plan.Changes {}
177184 }
178185 output [zoneName ].Create = append (output [zoneName ].Create , endpt )
179186 }
180187 for _ , endpt := range changes .UpdateOld {
181- _ , zoneName := zoneNameIDMapper .FindZone (endpt .DNSName )
188+ zoneName , _ := zoneNameIDMapper .FindZone (endpt .DNSName )
189+ if zoneName == "" {
190+ return nil , provider .NewSoftError (fmt .Errorf ("record %q have not found matching DNS zone in OVH provider" , endpt .DNSName ))
191+ }
182192 if _ , ok := output [zoneName ]; ! ok {
183193 output [zoneName ] = & plan.Changes {}
184194 }
185195 output [zoneName ].UpdateOld = append (output [zoneName ].UpdateOld , endpt )
186196 }
187197 for _ , endpt := range changes .UpdateNew {
188- _ , zoneName := zoneNameIDMapper .FindZone (endpt .DNSName )
198+ zoneName , _ := zoneNameIDMapper .FindZone (endpt .DNSName )
199+ if zoneName == "" {
200+ return nil , provider .NewSoftError (fmt .Errorf ("record %q have not found matching DNS zone in OVH provider" , endpt .DNSName ))
201+ }
189202 if _ , ok := output [zoneName ]; ! ok {
190203 output [zoneName ] = & plan.Changes {}
191204 }
192205 output [zoneName ].UpdateNew = append (output [zoneName ].UpdateNew , endpt )
193206 }
194207
195- return output
208+ return output , nil
196209}
197210
198211func (p * OVHProvider ) computeSingleZoneChanges (_ context.Context , zoneName string , existingRecords []ovhRecord , changes * plan.Changes ) ([]ovhChange , error ) {
@@ -264,7 +277,10 @@ func (p *OVHProvider) ApplyChanges(ctx context.Context, changes *plan.Changes) e
264277 }
265278 }
266279
267- changesByZoneName := planChangesByZoneName (zones , changes )
280+ changesByZoneName , err := planChangesByZoneName (zones , changes )
281+ if err != nil {
282+ return err
283+ }
268284 eg , ctx := errgroup .WithContext (ctx )
269285
270286 for zoneName , changes := range changesByZoneName {
@@ -553,6 +569,13 @@ func (p *OVHProvider) newOvhChangeCreateDelete(action int, endpoints []*endpoint
553569}
554570
555571func convertDNSNameIntoSubDomain (DNSName string , zoneName string ) string { // nolint: gocritic // captLocal
572+ if name , err := idna .Profile .ToUnicode (DNSName ); err == nil {
573+ DNSName = name
574+ }
575+ if name , err := idna .Profile .ToUnicode (zoneName ); err == nil {
576+ zoneName = name
577+ }
578+
556579 if DNSName == zoneName {
557580 return ""
558581 }
0 commit comments