From 061ed3a76ee615105a7583c31483dd452a31c47d Mon Sep 17 00:00:00 2001 From: Julien Brochet Date: Sat, 19 Dec 2020 11:47:59 +0100 Subject: [PATCH] feat(scaleway): update API to v2beta1 --- README.md | 2 +- cmd/scaleway-ddns/main.go | 2 +- config/config.go | 4 +-- config/data.go | 6 ++--- ddns/ddns.go | 32 +++++++++++++++-------- go.mod | 2 +- go.sum | 4 +-- scaleway-ddns.yml | 2 +- scaleway/dns.go | 54 +++++++++++++++++++++++++++++---------- 9 files changed, 74 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index 76179fa..9f1bdd3 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ docker run --rm -d --name scaleway-ddns -v `pwd`:/config aerialls/scaleway-ddns ```yaml scaleway: - organization_id: __ORGANIZATION_ID__ + project_id: __PROJECT_ID__ access_key: __ACCESS_KEY__ secret_key: __SECRET_KEY__ diff --git a/cmd/scaleway-ddns/main.go b/cmd/scaleway-ddns/main.go index 7c5c00d..57fb2c0 100644 --- a/cmd/scaleway-ddns/main.go +++ b/cmd/scaleway-ddns/main.go @@ -33,7 +33,7 @@ var rootCmd = &cobra.Command{ dns, err := scaleway.NewDNS( logger, - cfg.ScalewayConfig.OrganizationID, + cfg.ScalewayConfig.ProjectID, cfg.ScalewayConfig.AccessKey, cfg.ScalewayConfig.SecretKey, ) diff --git a/config/config.go b/config/config.go index 5134cac..c6c52aa 100644 --- a/config/config.go +++ b/config/config.go @@ -40,9 +40,9 @@ func (c *Config) validate() error { } scwCfg := c.ScalewayConfig - if scwCfg.AccessKey == "" || scwCfg.SecretKey == "" || scwCfg.OrganizationID == "" { + if scwCfg.AccessKey == "" || scwCfg.SecretKey == "" || scwCfg.ProjectID == "" { return fmt.Errorf( - "scaleway parameters (access_key, secret_key, organization_id) cannot be empty", + "scaleway parameters (access_key, secret_key, project_id) cannot be empty", ) } diff --git a/config/data.go b/config/data.go index 14980c5..55b0211 100644 --- a/config/data.go +++ b/config/data.go @@ -23,9 +23,9 @@ type IPConfig struct { // ScalewayConfig struct for the required configuration to use the Scaleway API type ScalewayConfig struct { - OrganizationID string `yaml:"organization_id"` - AccessKey string `yaml:"access_key"` - SecretKey string `yaml:"secret_key"` + ProjectID string `yaml:"project_id"` + AccessKey string `yaml:"access_key"` + SecretKey string `yaml:"secret_key"` } // DomainConfig struct for the domain parameters diff --git a/ddns/ddns.go b/ddns/ddns.go index 1480c05..38e8b83 100644 --- a/ddns/ddns.go +++ b/ddns/ddns.go @@ -87,13 +87,14 @@ func (d *DynamicDNSUpdater) UpdateRecord( return nil } - scalewayIP, err := dns.GetRecord(domain.Name, domain.Record, recordType) + scalewayRecord, err := dns.GetRecord(domain.Name, domain.Record, recordType) if err != nil { return err } - if scalewayIP == "" { - scalewayIP = "(empty)" + scalewayIP := "(empty)" + if scalewayRecord != nil { + scalewayIP = scalewayRecord.Data } currentIP, err := ip.GetPublicIP(cfg.URL) @@ -124,13 +125,24 @@ func (d *DynamicDNSUpdater) UpdateRecord( return nil } - err = dns.UpdateRecord( - domain.Name, - domain.Record, - domain.TTL, - currentIP, - recordType, - ) + if scalewayRecord != nil { + err = dns.UpdateRecord( + domain.Name, + scalewayRecord.ID, + domain.Record, + domain.TTL, + currentIP, + recordType, + ) + } else { + err = dns.AddRecord( + domain.Name, + domain.Record, + domain.TTL, + currentIP, + recordType, + ) + } if err != nil { return err diff --git a/go.mod b/go.mod index f516c1c..303ecd5 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.15 require ( github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible - github.com/scaleway/scaleway-sdk-go v1.0.0-beta.7 + github.com/scaleway/scaleway-sdk-go v1.0.0-beta.7.0.20201215142451-63cc4dfb5426 github.com/sirupsen/logrus v1.7.0 github.com/spf13/cobra v1.1.1 github.com/stretchr/testify v1.6.1 diff --git a/go.sum b/go.sum index 0356760..7b13e80 100644 --- a/go.sum +++ b/go.sum @@ -145,8 +145,8 @@ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6So github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.7 h1:Do8ksLD4Nr3pA0x0hnLOLftZgkiTDvwPDShRTUxtXpE= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.7/go.mod h1:CJJ5VAbozOl0yEw7nHB9+7BXTJbIn6h7W+f6Gau5IP8= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.7.0.20201215142451-63cc4dfb5426 h1:GX1FokVmvFfyPZA9nTuyohcE9iLOto3qw17BOdiHbRE= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.7.0.20201215142451-63cc4dfb5426/go.mod h1:CJJ5VAbozOl0yEw7nHB9+7BXTJbIn6h7W+f6Gau5IP8= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= diff --git a/scaleway-ddns.yml b/scaleway-ddns.yml index 5be84ad..5eae4bf 100644 --- a/scaleway-ddns.yml +++ b/scaleway-ddns.yml @@ -1,5 +1,5 @@ scaleway: - organization_id: __ORGANIZATION_ID__ + project_id: __PROJECT_ID__ access_key: __ACCESS_KEY__ secret_key: __SECRET_KEY__ diff --git a/scaleway/dns.go b/scaleway/dns.go index 3c534eb..02f0b1a 100644 --- a/scaleway/dns.go +++ b/scaleway/dns.go @@ -1,7 +1,7 @@ package scaleway import ( - domainAPI "github.com/scaleway/scaleway-sdk-go/api/domain/v2alpha2" + domainAPI "github.com/scaleway/scaleway-sdk-go/api/domain/v2beta1" "github.com/scaleway/scaleway-sdk-go/scw" log "github.com/sirupsen/logrus" ) @@ -15,12 +15,12 @@ type DNS struct { // NewDNS returns a new DNS instance func NewDNS( logger *log.Logger, - organizationID string, + projectID string, accessKey string, secretKey string, ) (*DNS, error) { client, err := scw.NewClient( - scw.WithDefaultOrganizationID(organizationID), + scw.WithDefaultProjectID(projectID), scw.WithAuth(accessKey, secretKey), ) @@ -34,16 +34,44 @@ func NewDNS( }, nil } -// UpdateRecord updates a DNS record from a specific domain -func (d *DNS) UpdateRecord(domain string, name string, ttl uint32, data string, recordType string) error { +// AddRecord adds a new DNS record +func (d *DNS) AddRecord(domain string, name string, ttl uint32, data string, recordType string) error { + api := domainAPI.NewAPI(d.client) + _, err := api.UpdateDNSZoneRecords(&domainAPI.UpdateDNSZoneRecordsRequest{ + DNSZone: domain, + Changes: []*domainAPI.RecordChange{ + { + Add: &domainAPI.RecordChangeAdd{ + Records: []*domainAPI.Record{ + { + Name: name, + Data: data, + Type: d.getRecordTypeFromString(recordType), + TTL: ttl, + }, + }, + }, + }, + }, + ReturnAllRecords: scw.BoolPtr(false), + }) + + if err != nil { + return err + } + + return nil +} + +// UpdateRecord updates an existing DNS record +func (d *DNS) UpdateRecord(domain string, id string, name string, ttl uint32, data string, recordType string) error { api := domainAPI.NewAPI(d.client) _, err := api.UpdateDNSZoneRecords(&domainAPI.UpdateDNSZoneRecordsRequest{ DNSZone: domain, Changes: []*domainAPI.RecordChange{ { Set: &domainAPI.RecordChangeSet{ - Name: name, - Type: d.getRecordTypeFromString(recordType), + ID: &id, Records: []*domainAPI.Record{ { Name: name, @@ -65,8 +93,8 @@ func (d *DNS) UpdateRecord(domain string, name string, ttl uint32, data string, return nil } -// GetRecord returns the value from a DNS record -func (d *DNS) GetRecord(domain string, name string, recordType string) (string, error) { +// GetRecord returns a DNS record +func (d *DNS) GetRecord(domain string, name string, recordType string) (*domainAPI.Record, error) { api := domainAPI.NewAPI(d.client) records, err := api.ListDNSZoneRecords(&domainAPI.ListDNSZoneRecordsRequest{ DNSZone: domain, @@ -75,14 +103,14 @@ func (d *DNS) GetRecord(domain string, name string, recordType string) (string, }) if err != nil { - return "", err + return nil, err } - if records.TotalCount != 1 { - return "", nil + if records.TotalCount == 0 { + return nil, nil } - return records.Records[0].Data, nil + return records.Records[0], nil } func (d *DNS) getRecordTypeFromString(recordType string) domainAPI.RecordType {