HETZNER: create and modify multiple records in batches (#925)

Signed-off-by: Jakob Ackermann <das7pad@outlook.com>
This commit is contained in:
Jakob Ackermann 2020-11-02 01:30:16 +01:00 committed by GitHub
parent 61bf50d4d7
commit 152fa95031
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 51 additions and 4 deletions

View file

@ -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

View file

@ -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)

View file

@ -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"`