Skip to content

Commit db56372

Browse files
authored
Merge pull request #49 from stackitcloud/chore/migrate-dns-sdk-v1api-
chore: migrate to stackit-sdk-go v1api and update API calls
2 parents 7ef3570 + 4d03742 commit db56372

20 files changed

+190
-179
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ require (
1111
github.com/spf13/pflag v1.0.10
1212
github.com/spf13/viper v1.21.0
1313
github.com/stackitcloud/stackit-sdk-go/core v0.24.1
14-
github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.6
14+
github.com/stackitcloud/stackit-sdk-go/services/dns v0.19.2
1515
github.com/stretchr/testify v1.11.1
1616
go.uber.org/mock v0.6.0
1717
go.uber.org/zap v1.27.1

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,8 @@ github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU=
155155
github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY=
156156
github.com/stackitcloud/stackit-sdk-go/core v0.24.1 h1:IrG0XBlJivUpXC4Y6TE+6FeSxNPs1JQXsero0ivwh0o=
157157
github.com/stackitcloud/stackit-sdk-go/core v0.24.1/go.mod h1:osMglDby4csGZ5sIfhNyYq1bS1TxIdPY88+skE/kkmI=
158-
github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.6 h1:GBRb49x5Nax/oQQaaf2F3kKwv8DQQOL0TQOC0C/v/Ew=
159-
github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.6/go.mod h1:IX9iL3MigDZUmzwswTJMfYvyi118KAHrFMfjJUy5NYk=
158+
github.com/stackitcloud/stackit-sdk-go/services/dns v0.19.2 h1:PE7TXoR2ZjVym5E4apZFJxEkApAid1/Z4x1Mz2QIcD0=
159+
github.com/stackitcloud/stackit-sdk-go/services/dns v0.19.2/go.mod h1:3NZpITg0qJ+f1y0RUTcXKc4e122tFhHDIVm2mY0wWsw=
160160
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
161161
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
162162
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=

internal/stackitprovider/apply_changes.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import (
55
"fmt"
66
"sync"
77

8-
stackitdnsclient "github.com/stackitcloud/stackit-sdk-go/services/dns"
8+
stackitdnsclient "github.com/stackitcloud/stackit-sdk-go/services/dns/v1api"
99
"go.uber.org/zap"
1010
"sigs.k8s.io/external-dns/endpoint"
1111
"sigs.k8s.io/external-dns/plan"
@@ -124,7 +124,7 @@ func (d *StackitDNSProvider) createRRSet(
124124
return fmt.Errorf("no matching zone found for %s", change.DNSName)
125125
}
126126

127-
logFields := getLogFields(change, CREATE, *resultZone.Id)
127+
logFields := getLogFields(change, CREATE, resultZone.Id)
128128
d.logger.Info("create record set", logFields...)
129129

130130
if d.dryRun {
@@ -138,7 +138,7 @@ func (d *StackitDNSProvider) createRRSet(
138138
rrSetPayload := getStackitRecordSetPayload(change)
139139

140140
// ignore all errors to just retry on next run
141-
_, err := d.apiClient.CreateRecordSet(ctx, d.projectId, *resultZone.Id).CreateRecordSetPayload(rrSetPayload).Execute()
141+
_, err := d.apiClient.DefaultAPI.CreateRecordSet(ctx, d.projectId, resultZone.Id).CreateRecordSetPayload(rrSetPayload).Execute()
142142
if err != nil {
143143
d.logger.Error("error creating record set", zap.Error(err))
144144

@@ -163,7 +163,7 @@ func (d *StackitDNSProvider) updateRRSet(
163163
return err
164164
}
165165

166-
logFields := getLogFields(change, UPDATE, *resultRRSet.Id)
166+
logFields := getLogFields(change, UPDATE, resultRRSet.Id)
167167
d.logger.Info("update record set", logFields...)
168168

169169
if d.dryRun {
@@ -174,7 +174,7 @@ func (d *StackitDNSProvider) updateRRSet(
174174

175175
rrSet := getStackitPartialUpdateRecordSetPayload(change)
176176

177-
_, err = d.apiClient.PartialUpdateRecordSet(ctx, d.projectId, *resultZone.Id, *resultRRSet.Id).PartialUpdateRecordSetPayload(rrSet).Execute()
177+
_, err = d.apiClient.DefaultAPI.PartialUpdateRecordSet(ctx, d.projectId, resultZone.Id, resultRRSet.Id).PartialUpdateRecordSetPayload(rrSet).Execute()
178178
if err != nil {
179179
d.logger.Error("error updating record set", zap.Error(err))
180180

@@ -199,7 +199,7 @@ func (d *StackitDNSProvider) deleteRRSet(
199199
return err
200200
}
201201

202-
logFields := getLogFields(change, DELETE, *resultRRSet.Id)
202+
logFields := getLogFields(change, DELETE, resultRRSet.Id)
203203
d.logger.Info("delete record set", logFields...)
204204

205205
if d.dryRun {
@@ -208,7 +208,7 @@ func (d *StackitDNSProvider) deleteRRSet(
208208
return nil
209209
}
210210

211-
_, err = d.apiClient.DeleteRecordSet(ctx, d.projectId, *resultZone.Id, *resultRRSet.Id).Execute()
211+
_, err = d.apiClient.DefaultAPI.DeleteRecordSet(ctx, d.projectId, resultZone.Id, resultRRSet.Id).Execute()
212212
if err != nil {
213213
d.logger.Error("error deleting record set", zap.Error(err))
214214

internal/stackitprovider/apply_changes_test.go

Lines changed: 35 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import (
88
"net/http/httptest"
99
"testing"
1010

11-
stackitdnsclient "github.com/stackitcloud/stackit-sdk-go/services/dns"
11+
stackitdnsclient "github.com/stackitcloud/stackit-sdk-go/services/dns/v1api"
1212
"github.com/stretchr/testify/assert"
1313
"sigs.k8s.io/external-dns/endpoint"
1414
"sigs.k8s.io/external-dns/plan"
@@ -114,8 +114,7 @@ func TestNoRRSetFound(t *testing.T) {
114114
ctx := context.Background()
115115
validZoneResponse := getValidResponseZoneAllBytes(t)
116116
rrSets := getValidResponseRRSetAll()
117-
rrSet := *rrSets.RrSets
118-
*rrSet[0].Name = "notfound.test.com"
117+
rrSets.RrSets[0].Name = "notfound.test.com"
119118
validRRSetResponse, err := json.Marshal(rrSets)
120119
assert.NoError(t, err)
121120

@@ -375,42 +374,56 @@ func getValidResponseZoneAllBytes(t *testing.T) []byte {
375374

376375
func getValidZoneResponseAll() stackitdnsclient.ListZonesResponse {
377376
return stackitdnsclient.ListZonesResponse{
378-
ItemsPerPage: pointerTo(int64(10)),
379-
Message: pointerTo("success"),
380-
TotalItems: pointerTo(int64(2)),
381-
TotalPages: pointerTo(int64(1)),
382-
Zones: &[]stackitdnsclient.Zone{
383-
{Id: pointerTo("1234"), DnsName: pointerTo("test.com")},
384-
{Id: pointerTo("5678"), DnsName: pointerTo("test2.com")},
377+
ItemsPerPage: int32(10),
378+
Message: new("success"),
379+
TotalItems: int32(2),
380+
TotalPages: int32(1),
381+
Zones: []stackitdnsclient.Zone{
382+
{Id: "1234", DnsName: "test.com"},
383+
{Id: "5678", DnsName: "test2.com"},
385384
},
386385
}
387386
}
388387

389388
func getValidResponseRRSetAllBytes(t *testing.T) []byte {
390389
t.Helper()
391390

392-
rrSets := getValidResponseRRSetAll()
393-
validRRSetResponse, err := json.Marshal(rrSets)
391+
rrSetResponse := getValidRecordSetResponse()
392+
validRRSetResponse, err := json.Marshal(rrSetResponse)
394393
assert.NoError(t, err)
395394

396395
return validRRSetResponse
397396
}
398397

398+
func getValidRecordSetResponse() stackitdnsclient.RecordSetResponse {
399+
return stackitdnsclient.RecordSetResponse{
400+
Message: new("success"),
401+
Rrset: stackitdnsclient.RecordSet{
402+
Name: "test.com",
403+
Type: "A",
404+
Ttl: int32(300),
405+
Records: []stackitdnsclient.Record{
406+
{Content: "1.2.3.4"},
407+
},
408+
},
409+
}
410+
}
411+
399412
func getValidResponseRRSetAll() stackitdnsclient.ListRecordSetsResponse {
400413
return stackitdnsclient.ListRecordSetsResponse{
401-
ItemsPerPage: pointerTo(int64(20)),
402-
Message: pointerTo("success"),
403-
RrSets: &[]stackitdnsclient.RecordSet{
414+
ItemsPerPage: int32(20),
415+
Message: new("success"),
416+
RrSets: []stackitdnsclient.RecordSet{
404417
{
405-
Name: pointerTo("test.com"),
406-
Type: pointerTo(stackitdnsclient.RECORDSETTYPE_A),
407-
Ttl: pointerTo(int64(300)),
408-
Records: &[]stackitdnsclient.Record{
409-
{Content: pointerTo("1.2.3.4")},
418+
Name: "test.com",
419+
Type: "A",
420+
Ttl: int32(300),
421+
Records: []stackitdnsclient.Record{
422+
{Content: "1.2.3.4"},
410423
},
411424
},
412425
},
413-
TotalItems: pointerTo(int64(2)),
414-
TotalPages: pointerTo(int64(1)),
426+
TotalItems: int32(2),
427+
TotalPages: int32(1),
415428
}
416429
}

internal/stackitprovider/helper.go

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package stackitprovider
22

33
import (
4+
"math"
45
"strings"
56

6-
stackitdnsclient "github.com/stackitcloud/stackit-sdk-go/services/dns"
7+
stackitdnsclient "github.com/stackitcloud/stackit-sdk-go/services/dns/v1api"
78
"go.uber.org/zap"
89
"sigs.k8s.io/external-dns/endpoint"
910
)
@@ -20,10 +21,7 @@ func findBestMatchingZone(
2021

2122
for i := range zones {
2223
zone := &zones[i]
23-
if zone.DnsName == nil {
24-
continue
25-
}
26-
if l := len(*zone.DnsName); l > count && strings.Contains(rrSetName, *zone.DnsName) {
24+
if l := len(zone.DnsName); l > count && strings.Contains(rrSetName, zone.DnsName) {
2725
count = l
2826
domainZone = zone
2927
}
@@ -43,10 +41,7 @@ func findRRSet(
4341
) (*stackitdnsclient.RecordSet, bool) {
4442
for i := range rrSets {
4543
rrSet := &rrSets[i]
46-
if rrSet.Name == nil || rrSet.Type == nil {
47-
continue
48-
}
49-
if *rrSet.Name == rrSetName && string(*rrSet.Type) == recordType {
44+
if rrSet.Name == rrSetName && rrSet.Type == recordType {
5045
return rrSet, true
5146
}
5247
}
@@ -77,15 +72,15 @@ func getStackitRecordSetPayload(change *endpoint.Endpoint) stackitdnsclient.Crea
7772
records := make([]stackitdnsclient.RecordPayload, len(change.Targets))
7873
for i := range change.Targets {
7974
records[i] = stackitdnsclient.RecordPayload{
80-
Content: &change.Targets[i],
75+
Content: change.Targets[i],
8176
}
8277
}
8378

8479
return stackitdnsclient.CreateRecordSetPayload{
85-
Name: &change.DNSName,
86-
Records: &records,
87-
Ttl: pointerTo(int64(change.RecordTTL)),
88-
Type: (stackitdnsclient.CreateRecordSetPayloadGetTypeAttributeType)(&change.RecordType),
80+
Name: change.DNSName,
81+
Records: records,
82+
Ttl: safeTTLToInt32(change.RecordTTL),
83+
Type: change.RecordType,
8984
}
9085
}
9186

@@ -94,14 +89,14 @@ func getStackitPartialUpdateRecordSetPayload(change *endpoint.Endpoint) stackitd
9489
records := make([]stackitdnsclient.RecordPayload, len(change.Targets))
9590
for i := range change.Targets {
9691
records[i] = stackitdnsclient.RecordPayload{
97-
Content: &change.Targets[i],
92+
Content: change.Targets[i],
9893
}
9994
}
10095

10196
return stackitdnsclient.PartialUpdateRecordSetPayload{
10297
Name: &change.DNSName,
103-
Records: &records,
104-
Ttl: pointerTo(int64(change.RecordTTL)),
98+
Records: records,
99+
Ttl: safeTTLToInt32(change.RecordTTL),
105100
}
106101
}
107102

@@ -116,7 +111,18 @@ func getLogFields(change *endpoint.Endpoint, action string, id string) []zap.Fie
116111
}
117112
}
118113

119-
// pointerTo returns a pointer to the given value.
120-
func pointerTo[T any](v T) *T {
114+
// safeTTLToInt32 safely converts an endpoint.TTL (int64) to *int32, clamping to valid bounds.
115+
func safeTTLToInt32(ttl endpoint.TTL) *int32 {
116+
var v int32
117+
118+
switch {
119+
case int64(ttl) > math.MaxInt32:
120+
v = math.MaxInt32
121+
case int64(ttl) < 0:
122+
v = 0
123+
default:
124+
v = int32(ttl) // #nosec G115 -- bounds checked above
125+
}
126+
121127
return &v
122128
}

internal/stackitprovider/helper_test.go

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import (
44
"reflect"
55
"testing"
66

7-
stackitdnsclient "github.com/stackitcloud/stackit-sdk-go/services/dns"
7+
stackitdnsclient "github.com/stackitcloud/stackit-sdk-go/services/dns/v1api"
88
"go.uber.org/zap"
99
"sigs.k8s.io/external-dns/endpoint"
1010
)
@@ -72,15 +72,15 @@ func TestGetStackitRRSetRecordPost(t *testing.T) {
7272
},
7373
}
7474
expected := stackitdnsclient.CreateRecordSetPayload{
75-
Name: pointerTo("test."),
76-
Ttl: pointerTo(int64(300)),
77-
Type: (stackitdnsclient.CreateRecordSetPayloadGetTypeAttributeType)(pointerTo("A")),
78-
Records: &[]stackitdnsclient.RecordPayload{
75+
Name: "test.",
76+
Ttl: new(int32(300)),
77+
Type: "A",
78+
Records: []stackitdnsclient.RecordPayload{
7979
{
80-
Content: pointerTo("192.0.2.1"),
80+
Content: "192.0.2.1",
8181
},
8282
{
83-
Content: pointerTo("192.0.2.2"),
83+
Content: "192.0.2.2",
8484
},
8585
},
8686
}
@@ -94,9 +94,9 @@ func TestFindBestMatchingZone(t *testing.T) {
9494
t.Parallel()
9595

9696
zones := []stackitdnsclient.Zone{
97-
{DnsName: pointerTo("foo.com")},
98-
{DnsName: pointerTo("bar.com")},
99-
{DnsName: pointerTo("baz.com")},
97+
{DnsName: "foo.com"},
98+
{DnsName: "bar.com"},
99+
{DnsName: "baz.com"},
100100
}
101101

102102
tests := []struct {
@@ -125,9 +125,9 @@ func TestFindRRSet(t *testing.T) {
125125
t.Parallel()
126126

127127
rrSets := []stackitdnsclient.RecordSet{
128-
{Name: pointerTo("www.foo.com"), Type: pointerTo(stackitdnsclient.RECORDSETTYPE_A)},
129-
{Name: pointerTo("www.bar.com"), Type: pointerTo(stackitdnsclient.RECORDSETTYPE_A)},
130-
{Name: pointerTo("www.baz.com"), Type: pointerTo(stackitdnsclient.RECORDSETTYPE_A)},
128+
{Name: "www.foo.com", Type: "A"},
129+
{Name: "www.bar.com", Type: "A"},
130+
{Name: "www.baz.com", Type: "A"},
131131
}
132132

133133
tests := []struct {
@@ -196,14 +196,14 @@ func TestGetStackitRRSetRecordPatch(t *testing.T) {
196196
}
197197

198198
expected := stackitdnsclient.PartialUpdateRecordSetPayload{
199-
Name: pointerTo("test."),
200-
Ttl: pointerTo(int64(300)),
201-
Records: &[]stackitdnsclient.RecordPayload{
199+
Name: new("test."),
200+
Ttl: new(int32(300)),
201+
Records: []stackitdnsclient.RecordPayload{
202202
{
203-
Content: pointerTo("192.0.2.1"),
203+
Content: "192.0.2.1",
204204
},
205205
{
206-
Content: pointerTo("192.0.2.2"),
206+
Content: "192.0.2.2",
207207
},
208208
},
209209
}

internal/stackitprovider/records.go

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package stackitprovider
33
import (
44
"context"
55

6-
stackitdnsclient "github.com/stackitcloud/stackit-sdk-go/services/dns"
6+
stackitdnsclient "github.com/stackitcloud/stackit-sdk-go/services/dns/v1api"
77
"sigs.k8s.io/external-dns/endpoint"
88
"sigs.k8s.io/external-dns/provider"
99
)
@@ -25,10 +25,7 @@ func (d *StackitDNSProvider) Records(ctx context.Context) ([]*endpoint.Endpoint,
2525

2626
for i := range zones {
2727
zone := &zones[i]
28-
if zone.Id == nil {
29-
continue
30-
}
31-
zoneIdsChannel <- *zone.Id
28+
zoneIdsChannel <- zone.Id
3229
}
3330

3431
for i := 0; i < len(zones); i++ {
@@ -104,23 +101,20 @@ func (d *StackitDNSProvider) collectEndPoints(
104101
}
105102

106103
func recordSetCoreFields(r *stackitdnsclient.RecordSet) (name string, recordType string, ttl endpoint.TTL, records []stackitdnsclient.Record, ok bool) {
107-
if r == nil || r.Type == nil || r.Name == nil || r.Ttl == nil || r.Records == nil {
104+
if r == nil || len(r.Records) == 0 {
108105
return "", "", 0, nil, false
109106
}
110107

111-
return *r.Name, string(*r.Type), endpoint.TTL(*r.Ttl), *r.Records, true
108+
return r.Name, r.Type, endpoint.TTL(r.Ttl), r.Records, true
112109
}
113110

114111
func endpointsFromRecords(name, recordType string, ttl endpoint.TTL, records []stackitdnsclient.Record) []*endpoint.Endpoint {
115112
endpoints := make([]*endpoint.Endpoint, 0, len(records))
116113

117114
for i := range records {
118115
rec := &records[i]
119-
if rec.Content == nil {
120-
continue
121-
}
122116

123-
endpoints = append(endpoints, endpoint.NewEndpointWithTTL(name, recordType, ttl, *rec.Content))
117+
endpoints = append(endpoints, endpoint.NewEndpointWithTTL(name, recordType, ttl, rec.Content))
124118
}
125119

126120
return endpoints

0 commit comments

Comments
 (0)