Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ check: $(GOIMPORTS) $(GOLANGCI_LINT) $(HELM) ## Runs golangci-lint, gofmt/goimpo
@bash $(GARDENER_HACK_DIR)/check-charts.sh ./charts

# generate mock types for the following services from the SDK (space-separated list)
SDK_MOCK_SERVICES := iaas loadbalancer dns
SDK_MOCK_SERVICES := iaas loadbalancer

.PHONY: generate-mocks
generate-mocks: $(MOCKGEN)
Expand All @@ -120,6 +120,7 @@ generate-mocks: $(MOCKGEN)
INTERFACES=`go doc -all github.com/stackitcloud/stackit-sdk-go/services/$$service | grep '^type Api.* interface' | sed -n 's/^type \(.*\) interface.*/\1/p' | paste -sd,`,DefaultApi; \
$(MOCKGEN) -destination ./pkg/stackit/client/mock/$$service/$$service.go -package $$service github.com/stackitcloud/stackit-sdk-go/services/$$service $$INTERFACES; \
done
@$(MOCKGEN) -destination ./pkg/stackit/client/mock/dns/dns.go -package dns github.com/stackitcloud/stackit-sdk-go/services/dns/v1api DefaultAPI

.PHONY: generate
generate: $(CONTROLLER_GEN) $(GEN_CRD_API_REFERENCE_DOCS) $(HELM) $(MOCKGEN) $(YQ) $(YAML2JSON) $(GOIMPORTS) generate-mocks ## Generates the controller-registration, other code-gen, the imagename constants as well as executes go:generate directives
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ require (
github.com/spf13/pflag v1.0.10
github.com/stackitcloud/stackit-sdk-go/core v0.23.0
github.com/stackitcloud/stackit-sdk-go/services/authorization v0.12.0
github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.6
github.com/stackitcloud/stackit-sdk-go/services/dns v0.19.1
github.com/stackitcloud/stackit-sdk-go/services/iaas v1.3.5
github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.8.0
github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.20.1
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -469,8 +469,8 @@ github.com/stackitcloud/stackit-sdk-go/core v0.23.0 h1:zPrOhf3Xe47rKRs1fg/AqKYUi
github.com/stackitcloud/stackit-sdk-go/core v0.23.0/go.mod h1:osMglDby4csGZ5sIfhNyYq1bS1TxIdPY88+skE/kkmI=
github.com/stackitcloud/stackit-sdk-go/services/authorization v0.12.0 h1:HxPgBu04j5tj6nfZ2r0l6v4VXC0/tYOGe4sA5Addra8=
github.com/stackitcloud/stackit-sdk-go/services/authorization v0.12.0/go.mod h1:uYI9pHAA2g84jJN25ejFUxa0/JtfpPZqMDkctQ1BzJk=
github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.6 h1:GBRb49x5Nax/oQQaaf2F3kKwv8DQQOL0TQOC0C/v/Ew=
github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.6/go.mod h1:IX9iL3MigDZUmzwswTJMfYvyi118KAHrFMfjJUy5NYk=
github.com/stackitcloud/stackit-sdk-go/services/dns v0.19.1 h1:VfszhFq/Snsd0LnflS8PbM0d9cG98hOFpamfjlcTnDQ=
github.com/stackitcloud/stackit-sdk-go/services/dns v0.19.1/go.mod h1:gBv6YkB3Xf3c0ZXg2GwtWY8zExwGPF/Ag114XiiERxg=
github.com/stackitcloud/stackit-sdk-go/services/iaas v1.3.5 h1:W57+XRa8wTLsi5CV9Tqa7mGgt/PvlRM//RurXSmvII8=
github.com/stackitcloud/stackit-sdk-go/services/iaas v1.3.5/go.mod h1:lTWjW57eAq1bwfM6nsNinhoBr3MHFW/GaFasdAsYfDM=
github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.8.0 h1:DxrN85V738CRLynu6MULQHO+OXyYnkhVPgoZKULfFIs=
Expand Down
15 changes: 14 additions & 1 deletion pkg/controller/dnsrecord/actuator.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"context"
"errors"
"fmt"
"math"
"net/http"
"strings"

Expand Down Expand Up @@ -52,7 +53,7 @@ func (a *actuator) Reconcile(ctx context.Context, log logr.Logger, dns *extensio
ttl := extensionsv1alpha1helper.GetDNSRecordTTL(dns.Spec.TTL)

log.Info("Creating or updating DNS recordset", "zone", zoneID, "name", dns.Spec.Name, "type", dns.Spec.RecordType, "values", dns.Spec.Values)
if err := dnsClient.CreateOrUpdateRecordSet(ctx, zoneID, dns.Spec.Name, string(dns.Spec.RecordType), dns.Spec.Values, ttl); err != nil {
if err := dnsClient.CreateOrUpdateRecordSet(ctx, zoneID, dns.Spec.Name, string(dns.Spec.RecordType), dns.Spec.Values, toInt32(ttl)); err != nil {
if isZoneNotReadyError(err) {
return gardencorev1beta1helper.NewErrorWithCodes(err, gardencorev1beta1.ErrorConfigurationProblem)
}
Expand Down Expand Up @@ -142,3 +143,15 @@ func isZoneNotReadyError(err error) bool {
}
return stackitErr.StatusCode == http.StatusBadRequest && strings.HasPrefix(stackitErr.Message, "zone is not ready")
}

func toInt32(i int64) int32 {
if i < math.MinInt32 {
return math.MinInt32
}

if i > math.MaxInt32 {
return math.MinInt32
}

return int32(i)
}
6 changes: 3 additions & 3 deletions pkg/controller/dnsrecord/actuator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ var _ = Describe("Actuator", func() {
Describe("#Reconcile", func() {
It("should reconcile the DNSRecord", func() {
dnsMock.EXPECT().ListZones(ctx).Return(zones, nil)
dnsMock.EXPECT().CreateOrUpdateRecordSet(ctx, zone, domainName, string(extensionsv1alpha1.DNSRecordTypeA), []string{address}, int64(120)).
dnsMock.EXPECT().CreateOrUpdateRecordSet(ctx, zone, domainName, string(extensionsv1alpha1.DNSRecordTypeA), []string{address}, int32(120)).
Return(nil)

Expect(a.Reconcile(ctx, logger, dns, cluster)).To(Succeed())
Expand All @@ -112,7 +112,7 @@ var _ = Describe("Actuator", func() {

It("should fail if creating the DNS record set failed", func() {
dns.Spec.Zone = new(zone)
dnsMock.EXPECT().CreateOrUpdateRecordSet(ctx, zone, domainName, string(extensionsv1alpha1.DNSRecordTypeA), []string{address}, int64(120)).
dnsMock.EXPECT().CreateOrUpdateRecordSet(ctx, zone, domainName, string(extensionsv1alpha1.DNSRecordTypeA), []string{address}, int32(120)).
Return(errors.New("test"))

Expect(a.Reconcile(ctx, logger, dns, cluster)).To(HaveOccurred())
Expand All @@ -131,7 +131,7 @@ var _ = Describe("Actuator", func() {
It("should fail with ERR_CONFIGURATION_PROBLEM if the hosted zone was deleted", func() {
dns.Spec.Zone = new(zone)
// This error is returned when the zone was deleted, but can still be re-activated
dnsMock.EXPECT().CreateOrUpdateRecordSet(ctx, zone, domainName, string(extensionsv1alpha1.DNSRecordTypeA), []string{address}, int64(120)).
dnsMock.EXPECT().CreateOrUpdateRecordSet(ctx, zone, domainName, string(extensionsv1alpha1.DNSRecordTypeA), []string{address}, int32(120)).
Return(&stackitclient.Error{
Message: fmt.Sprintf("zone is not ready for record set %s", domainName),
StatusCode: 400,
Expand Down
38 changes: 19 additions & 19 deletions pkg/stackit/client/dns.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@ import (
"strings"

sdkconfig "github.com/stackitcloud/stackit-sdk-go/core/config"
"github.com/stackitcloud/stackit-sdk-go/services/dns"
dns "github.com/stackitcloud/stackit-sdk-go/services/dns/v1api"
"k8s.io/utils/set"

stackitv1alpha1 "github.com/stackitcloud/gardener-extension-provider-stackit/v2/pkg/apis/stackit/v1alpha1"
"github.com/stackitcloud/gardener-extension-provider-stackit/v2/pkg/stackit"
)

func NewDNSClient(ctx context.Context, endpoints stackitv1alpha1.APIEndpoints, credentials *stackit.Credentials) (DNSClient, error) {
func NewDNSClient(_ context.Context, endpoints stackitv1alpha1.APIEndpoints, credentials *stackit.Credentials) (DNSClient, error) {
options := clientOptions(endpoints, credentials)

if endpoints.DNS != nil {
Expand All @@ -25,14 +25,14 @@ func NewDNSClient(ctx context.Context, endpoints stackitv1alpha1.APIEndpoints, c
return nil, err
}
return &dnsClient{
api: apiClient,
api: apiClient.DefaultAPI,
projectID: credentials.ProjectID,
}, nil
}

type DNSClient interface {
ListZones(ctx context.Context) ([]DNSZone, error)
CreateOrUpdateRecordSet(ctx context.Context, zoneID, name, recordType string, records []string, ttl int64) error
CreateOrUpdateRecordSet(ctx context.Context, zoneID, name, recordType string, records []string, ttl int32) error
DeleteRecordSet(ctx context.Context, zoneID, name, recordType string) error
}

Expand All @@ -42,23 +42,23 @@ type DNSZone struct {
}

type dnsClient struct {
api dns.DefaultApi
api dns.DefaultAPI

projectID string
}

func (c *dnsClient) ListZones(ctx context.Context) ([]DNSZone, error) {
dnsZonesResp, err := c.api.ListZonesExecute(ctx, c.projectID)
dnsZonesResp, err := c.api.ListZones(ctx, c.projectID).Execute()
if err != nil {
return nil, err
}

if dnsZonesResp == nil || dnsZonesResp.Zones == nil {
if dnsZonesResp == nil {
return []DNSZone{}, nil
}

result := make([]DNSZone, 0, len(*dnsZonesResp.Zones))
for _, zone := range *dnsZonesResp.Zones {
result := make([]DNSZone, 0, len(dnsZonesResp.Zones))
for _, zone := range dnsZonesResp.Zones {
result = append(result, DNSZone{
ID: zone.GetId(),
DNSName: zone.GetDnsName(),
Expand All @@ -69,25 +69,25 @@ func (c *dnsClient) ListZones(ctx context.Context) ([]DNSZone, error) {
}

func (c *dnsClient) CreateOrUpdateRecordSet(ctx context.Context,
zoneID, name, recordType string, wantedRecords []string, ttl int64,
zoneID, name, recordType string, wantedRecords []string, ttl int32,
) error {
recordSet, err := c.findRecordSet(ctx, zoneID, name, recordType)
if err != nil {
return fmt.Errorf("failed to find record set: %w", err)
}

wantedRecordsPayload := []dns.RecordPayload{}
var wantedRecordsPayload []dns.RecordPayload
for _, record := range wantedRecords {
wantedRecordsPayload = append(wantedRecordsPayload, dns.RecordPayload{
Content: new(record),
Content: record,
})
}

if recordSet == nil {
_, err := c.api.CreateRecordSet(ctx, c.projectID, zoneID).CreateRecordSetPayload(dns.CreateRecordSetPayload{
Name: &name,
Records: &wantedRecordsPayload,
Type: new(dns.CreateRecordSetPayloadTypes(recordType)),
Name: name,
Records: wantedRecordsPayload,
Type: recordType,
Ttl: new(ttl),
}).Execute()
if err != nil {
Expand All @@ -103,7 +103,7 @@ func (c *dnsClient) CreateOrUpdateRecordSet(ctx context.Context,

_, err = c.api.PartialUpdateRecordSet(ctx, c.projectID, zoneID, recordSet.GetId()).PartialUpdateRecordSetPayload(dns.PartialUpdateRecordSetPayload{
Name: &name,
Records: &wantedRecordsPayload,
Records: wantedRecordsPayload,
Ttl: new(ttl),
}).Execute()
if err != nil {
Expand All @@ -122,15 +122,15 @@ func (c *dnsClient) DeleteRecordSet(ctx context.Context, zoneID, name, recordTyp
return nil
}

_, err = c.api.DeleteRecordSetExecute(ctx, c.projectID, zoneID, recordSet.GetId())
_, err = c.api.DeleteRecordSet(ctx, c.projectID, zoneID, recordSet.GetId()).Execute()
if err != nil {
return fmt.Errorf("failed to delete record set: %w", err)
}
return nil
}

func (c *dnsClient) findRecordSet(ctx context.Context, zoneID, name, recordType string) (*dns.RecordSet, error) {
resp, err := c.api.ListRecordSetsExecute(ctx, c.projectID, zoneID)
resp, err := c.api.ListRecordSets(ctx, c.projectID, zoneID).Execute()
if err != nil {
return nil, err
}
Expand All @@ -143,7 +143,7 @@ func (c *dnsClient) findRecordSet(ctx context.Context, zoneID, name, recordType
if strings.TrimSuffix(recordSet.GetName(), ".") != name {
continue
}
if string(recordSet.GetType()) != recordType {
if recordSet.GetType() != recordType {
continue
}
return &recordSet, nil
Expand Down
Loading