From 152fa9503106a35e33e4ad37db884c462bd0e7a0 Mon Sep 17 00:00:00 2001 From: Jakob Ackermann Date: Mon, 2 Nov 2020 01:30:16 +0100 Subject: [PATCH] HETZNER: create and modify multiple records in batches (#925) Signed-off-by: Jakob Ackermann --- providers/hetzner/api.go | 26 ++++++++++++++++++++++++++ providers/hetzner/hetznerProvider.go | 21 +++++++++++++++++---- providers/hetzner/types.go | 8 ++++++++ 3 files changed, 51 insertions(+), 4 deletions(-) diff --git a/providers/hetzner/api.go b/providers/hetzner/api.go index 1d8c7c2ab..0ac41a247 100644 --- a/providers/hetzner/api.go +++ b/providers/hetzner/api.go @@ -29,6 +29,32 @@ func checkIsLockedSystemRecord(record record) error { return nil } +func (api *hetznerProvider) bulkCreateRecords(records []record) error { + for _, record := range records { + if err := checkIsLockedSystemRecord(record); err != nil { + return err + } + } + + request := bulkCreateRecordsRequest{ + Records: records, + } + return api.request("/records/bulk", "POST", request, nil) +} + +func (api *hetznerProvider) bulkUpdateRecords(records []record) error { + for _, record := range records { + if err := checkIsLockedSystemRecord(record); err != nil { + return err + } + } + + request := bulkUpdateRecordsRequest{ + Records: records, + } + return api.request("/records/bulk", "PUT", request, nil) +} + func (api *hetznerProvider) createRecord(record record) error { if err := checkIsLockedSystemRecord(record); err != nil { return err diff --git a/providers/hetzner/hetznerProvider.go b/providers/hetzner/hetznerProvider.go index 9fe901615..2fd12fad9 100644 --- a/providers/hetzner/hetznerProvider.go +++ b/providers/hetzner/hetznerProvider.go @@ -3,6 +3,7 @@ package hetzner import ( "encoding/json" "fmt" + "strings" "github.com/StackExchange/dnscontrol/v3/models" "github.com/StackExchange/dnscontrol/v3/pkg/diff" @@ -107,25 +108,37 @@ func (api *hetznerProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*mo corrections = append(corrections, corr) } + var createRecords []record + createDescription := []string{"Batch creation of records:"} for _, m := range create { record := fromRecordConfig(m.Desired, zone) + createRecords = append(createRecords, *record) + createDescription = append(createDescription, m.String()) + } + if len(createRecords) > 0 { corr := &models.Correction{ - Msg: m.String(), + Msg: strings.Join(createDescription, "\n\t"), F: func() error { - return api.createRecord(*record) + return api.bulkCreateRecords(createRecords) }, } corrections = append(corrections, corr) } + var modifyRecords []record + modifyDescription := []string{"Batch modification of records:"} for _, m := range modify { id := m.Existing.Original.(*record).ID record := fromRecordConfig(m.Desired, zone) record.ID = id + modifyRecords = append(modifyRecords, *record) + modifyDescription = append(modifyDescription, m.String()) + } + if len(modifyRecords) > 0 { corr := &models.Correction{ - Msg: m.String(), + Msg: strings.Join(modifyDescription, "\n\t"), F: func() error { - return api.updateRecord(*record) + return api.bulkUpdateRecords(modifyRecords) }, } corrections = append(corrections, corr) diff --git a/providers/hetzner/types.go b/providers/hetzner/types.go index d72fadd21..23c5fa19b 100644 --- a/providers/hetzner/types.go +++ b/providers/hetzner/types.go @@ -4,6 +4,14 @@ import ( "github.com/StackExchange/dnscontrol/v3/models" ) +type bulkCreateRecordsRequest struct { + Records []record `json:"records"` +} + +type bulkUpdateRecordsRequest struct { + Records []record `json:"records"` +} + type createRecordRequest struct { Name string `json:"name"` TTL int `json:"ttl"`