91 lines
2.7 KiB
Go
91 lines
2.7 KiB
Go
package vultr
|
|
|
|
import (
|
|
"context"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/libdns/libdns"
|
|
)
|
|
|
|
// Provider implements the libdns interfaces for DigitalOcean
|
|
type Provider struct {
|
|
Client
|
|
// APIToken is the DigitalOcean API token - see https://www.digitalocean.com/docs/apis-clis/api/create-personal-access-token/
|
|
APIToken string `json:"auth_token"`
|
|
}
|
|
|
|
// unFQDN trims any trailing "." from fqdn. DigitalOcean's API does not use FQDNs.
|
|
func (p *Provider) unFQDN(fqdn string) string {
|
|
return strings.TrimSuffix(fqdn, ".")
|
|
}
|
|
|
|
// GetRecords lists all the records in the zone.
|
|
func (p *Provider) GetRecords(ctx context.Context, zone string) ([]libdns.Record, error) {
|
|
records, err := p.getDNSEntries(ctx, p.unFQDN(zone))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return records, nil
|
|
}
|
|
|
|
// AppendRecords adds records to the zone. It returns the records that were added.
|
|
func (p *Provider) AppendRecords(ctx context.Context, zone string, records []libdns.Record) ([]libdns.Record, error) {
|
|
var appendedRecords []libdns.Record
|
|
|
|
for _, record := range records {
|
|
newRecord, err := p.addDNSRecord(ctx, p.unFQDN(zone), record)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
newRecord.TTL = time.Duration(newRecord.TTL) * time.Second
|
|
appendedRecords = append(appendedRecords, newRecord)
|
|
}
|
|
|
|
return appendedRecords, nil
|
|
}
|
|
|
|
// DeleteRecords deletes the records from the zone.
|
|
func (p *Provider) DeleteRecords(ctx context.Context, zone string, records []libdns.Record) ([]libdns.Record, error) {
|
|
var deletedRecords []libdns.Record
|
|
|
|
for _, record := range records {
|
|
deletedRecord, err := p.removeDNSRecord(ctx, p.unFQDN(zone), record)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
deletedRecord.TTL = time.Duration(deletedRecord.TTL) * time.Second
|
|
deletedRecords = append(deletedRecords, deletedRecord)
|
|
}
|
|
|
|
return deletedRecords, nil
|
|
}
|
|
|
|
// SetRecords sets the records in the zone, either by updating existing records
|
|
// or creating new ones. It returns the updated records.
|
|
func (p *Provider) SetRecords(ctx context.Context, zone string, records []libdns.Record) ([]libdns.Record, error) {
|
|
var setRecords []libdns.Record
|
|
|
|
for _, record := range records {
|
|
// TODO: if there is no ID, look up the Name, and fill it in, or call
|
|
// newRecord, err := p.addDNSEntry(ctx, zone, record)
|
|
setRecord, err := p.updateDNSRecord(ctx, p.unFQDN(zone), record)
|
|
if err != nil {
|
|
return setRecords, err
|
|
}
|
|
setRecord.TTL = time.Duration(setRecord.TTL) * time.Second
|
|
setRecords = append(setRecords, setRecord)
|
|
}
|
|
|
|
return setRecords, nil
|
|
}
|
|
|
|
// Interface guards
|
|
var (
|
|
_ libdns.RecordGetter = (*Provider)(nil)
|
|
_ libdns.RecordAppender = (*Provider)(nil)
|
|
_ libdns.RecordSetter = (*Provider)(nil)
|
|
_ libdns.RecordDeleter = (*Provider)(nil)
|
|
)
|