1
0
Fork 0
This commit is contained in:
Henrik Hautakoski 2025-10-13 16:58:42 +02:00
parent 49563af412
commit 555c553686
18 changed files with 481 additions and 742 deletions

View file

@ -0,0 +1,44 @@
package vultr
import (
"context"
"errors"
"net/http"
"testing"
"github.com/vultr/govultr/v3"
)
type mock struct {
t *testing.T
ListReturn map[string][]govultr.DomainRecord
updateError error
}
func (m mock) Create(ctx context.Context, domain string, domainRecordReq *govultr.DomainRecordReq) (*govultr.DomainRecord, *http.Response, error) {
m.t.Error("Create called when it should not have been")
return nil, nil, nil
}
func (m mock) List(ctx context.Context, domain string, options *govultr.ListOptions) ([]govultr.DomainRecord, *govultr.Meta, *http.Response, error) {
records, ok := m.ListReturn[domain]
if !ok {
return nil, nil, nil, errors.New("not found")
}
return records, nil, nil, nil
}
func (m mock) Get(ctx context.Context, domain, recordID string) (*govultr.DomainRecord, *http.Response, error) {
m.t.Error("Get called when it should not have been")
return nil, nil, nil
}
func (m mock) Update(ctx context.Context, domain, recordID string, domainRecordReq *govultr.DomainRecordReq) error {
return m.updateError
}
func (m mock) Delete(ctx context.Context, domain, recordID string) error {
m.t.Error("Delete called when it should not have been")
return nil
}

View file

@ -0,0 +1,69 @@
package vultr
import (
"context"
"errors"
"net"
"dnsupdater/dns"
"github.com/vultr/govultr/v3"
"golang.org/x/oauth2"
)
type Service struct {
api govultr.DomainRecordService
}
func New(token string) Service {
ctx := context.Background()
config := &oauth2.Config{}
ts := config.TokenSource(ctx, &oauth2.Token{AccessToken: token})
client := govultr.NewClient(oauth2.NewClient(ctx, ts))
return Service{
api: client.DomainRecord,
}
}
func Factory(args map[string]any) (any, error) {
t, ok := args["token"]
if !ok {
return nil, errors.New("did not find token")
}
token, ok := t.(string)
if !ok {
return nil, errors.New("token must be a string")
}
return New(token), nil
}
func (p Service) List(domain_name string) (dns.RecordList, error) {
fetchedRecords, _, _, err := p.api.List(context.Background(), domain_name, nil)
if err != nil {
return nil, err
}
records := dns.RecordList{}
for _, record := range fetchedRecords {
if record.Type != "A" {
continue
}
records.Add(dns.Record{
Id: record.ID,
Name: record.Name,
Ip: net.ParseIP(record.Data),
})
}
return records, nil
}
func (p Service) Update(domain, recordID, ip string) error {
return p.api.Update(context.Background(), domain, recordID, &govultr.DomainRecordReq{
Data: ip,
})
}

View file

@ -0,0 +1,96 @@
package vultr
import (
"errors"
"net"
"testing"
"dnsupdater/dns"
"github.com/vultr/govultr/v3"
"github.com/stretchr/testify/assert"
)
func TestVultrService_List(t *testing.T) {
expected := dns.RecordList{
{
Id: "656939ee-f942-4ce2-af1d-3bd68c764e96",
Name: "sub1",
Ip: net.IPv4(201, 110, 66, 72),
},
{
Id: "c80118f4-f04c-4ad2-8ec2-16eb15cc8aca",
Name: "sub2",
Ip: net.IPv4(242, 124, 218, 187),
},
}
service := Service{
api: mock{
t: t,
ListReturn: map[string][]govultr.DomainRecord{
"example.com": {
{
ID: "656939ee-f942-4ce2-af1d-3bd68c764e96",
Type: "A",
Name: "sub1",
Data: "201.110.66.72",
Priority: 2,
TTL: 1800,
},
{
ID: "c80118f4-f04c-4ad2-8ec2-16eb15cc8aca",
Type: "A",
Name: "sub2",
Data: "242.124.218.187",
Priority: 1,
TTL: 1800,
},
},
},
},
}
records, err := service.List("example.com")
assert.NoError(t, err)
assert.Equal(t, expected, records)
// Fetch invalid
_, err = service.List("noexists.com")
assert.Error(t, err)
}
func TestVultrService_Update(t *testing.T) {
mockApi := mock{
t: t,
ListReturn: map[string][]govultr.DomainRecord{
"example.com": {
{
ID: "6cabe6ba-1ea1-405d-b66d-cd56ecac45ce",
Type: "A",
Name: "www",
Data: "80.17.42.157",
Priority: 10,
TTL: 360,
},
},
},
}
service := Service{
api: &mockApi,
}
err := service.Update("example.com", "6cabe6ba-1ea1-405d-b66d-cd56ecac45ce", net.IPv4(221, 135, 170, 186).String())
assert.NoError(t, err)
mockApi.updateError = errors.New("Error")
err = service.Update("invalid.com", "332b40fc-0ddf-436c-a0c7-46586b928ac2", net.IPv4(72, 82, 118, 186).String())
assert.Error(t, err)
err = service.Update("example.com", "6cabe6ba-1ea1-405d-b66d-cd56ecac45ce", net.IPv4(221, 135, 170, 186).String())
assert.Error(t, err)
}