From 4f16a89b0379a7c09e284579ce04763995da6c8b Mon Sep 17 00:00:00 2001 From: Fernandez Ludovic Date: Wed, 2 Sep 2020 02:56:43 +0200 Subject: [PATCH] feat: replaces FastDNS by EdgeDNS. --- README.md | 26 +-- cmd/zz_gen_cmd_dnshelp.go | 23 --- docs/content/dns/zz_gen_edgedns.md | 2 +- docs/content/dns/zz_gen_fastdns.md | 62 ------ providers/dns/dns_providers.go | 7 +- providers/dns/edgedns/edgedns.toml | 2 +- providers/dns/fastdns/fastdns.go | 172 ----------------- providers/dns/fastdns/fastdns.toml | 24 --- providers/dns/fastdns/fastdns_test.go | 267 -------------------------- 9 files changed, 17 insertions(+), 568 deletions(-) delete mode 100644 docs/content/dns/zz_gen_fastdns.md delete mode 100644 providers/dns/fastdns/fastdns.go delete mode 100644 providers/dns/fastdns/fastdns.toml delete mode 100644 providers/dns/fastdns/fastdns_test.go diff --git a/README.md b/README.md index dd18cff8..6f0f0d21 100644 --- a/README.md +++ b/README.md @@ -52,18 +52,18 @@ Detailed documentation is available [here](https://go-acme.github.io/lego/dns). | [Constellix](https://go-acme.github.io/lego/dns/constellix/) | [deSEC.io](https://go-acme.github.io/lego/dns/desec/) | [Designate DNSaaS for Openstack](https://go-acme.github.io/lego/dns/designate/) | [Digital Ocean](https://go-acme.github.io/lego/dns/digitalocean/) | | [DNS Made Easy](https://go-acme.github.io/lego/dns/dnsmadeeasy/) | [DNSimple](https://go-acme.github.io/lego/dns/dnsimple/) | [DNSPod](https://go-acme.github.io/lego/dns/dnspod/) | [Domain Offensive (do.de)](https://go-acme.github.io/lego/dns/dode/) | | [DreamHost](https://go-acme.github.io/lego/dns/dreamhost/) | [Duck DNS](https://go-acme.github.io/lego/dns/duckdns/) | [Dyn](https://go-acme.github.io/lego/dns/dyn/) | [Dynu](https://go-acme.github.io/lego/dns/dynu/) | -| [EasyDNS](https://go-acme.github.io/lego/dns/easydns/) | [Exoscale](https://go-acme.github.io/lego/dns/exoscale/) | [External program](https://go-acme.github.io/lego/dns/exec/) | [FastDNS (Deprecated)](https://go-acme.github.io/lego/dns/fastdns/) | -| [Gandi Live DNS (v5)](https://go-acme.github.io/lego/dns/gandiv5/) | [Gandi](https://go-acme.github.io/lego/dns/gandi/) | [Glesys](https://go-acme.github.io/lego/dns/glesys/) | [Go Daddy](https://go-acme.github.io/lego/dns/godaddy/) | -| [Google Cloud](https://go-acme.github.io/lego/dns/gcloud/) | [Hetzner](https://go-acme.github.io/lego/dns/hetzner/) | [Hosting.de](https://go-acme.github.io/lego/dns/hostingde/) | [HTTP request](https://go-acme.github.io/lego/dns/httpreq/) | -| [HyperOne](https://go-acme.github.io/lego/dns/hyperone/) | [Internet Initiative Japan](https://go-acme.github.io/lego/dns/iij/) | [INWX](https://go-acme.github.io/lego/dns/inwx/) | [Joker](https://go-acme.github.io/lego/dns/joker/) | -| [Joohoi's ACME-DNS](https://go-acme.github.io/lego/dns/acme-dns/) | [Linode (v4)](https://go-acme.github.io/lego/dns/linode/) | [Liquid Web](https://go-acme.github.io/lego/dns/liquidweb/) | [LuaDNS](https://go-acme.github.io/lego/dns/luadns/) | -| [Manual](https://go-acme.github.io/lego/dns/manual/) | [MyDNS.jp](https://go-acme.github.io/lego/dns/mydnsjp/) | [MythicBeasts](https://go-acme.github.io/lego/dns/mythicbeasts/) | [Name.com](https://go-acme.github.io/lego/dns/namedotcom/) | -| [Namecheap](https://go-acme.github.io/lego/dns/namecheap/) | [Namesilo](https://go-acme.github.io/lego/dns/namesilo/) | [Netcup](https://go-acme.github.io/lego/dns/netcup/) | [Netlify](https://go-acme.github.io/lego/dns/netlify/) | -| [NIFCloud](https://go-acme.github.io/lego/dns/nifcloud/) | [NS1](https://go-acme.github.io/lego/dns/ns1/) | [Open Telekom Cloud](https://go-acme.github.io/lego/dns/otc/) | [Oracle Cloud](https://go-acme.github.io/lego/dns/oraclecloud/) | -| [OVH](https://go-acme.github.io/lego/dns/ovh/) | [PowerDNS](https://go-acme.github.io/lego/dns/pdns/) | [Rackspace](https://go-acme.github.io/lego/dns/rackspace/) | [reg.ru](https://go-acme.github.io/lego/dns/regru/) | -| [RFC2136](https://go-acme.github.io/lego/dns/rfc2136/) | [RimuHosting](https://go-acme.github.io/lego/dns/rimuhosting/) | [Sakura Cloud](https://go-acme.github.io/lego/dns/sakuracloud/) | [Scaleway](https://go-acme.github.io/lego/dns/scaleway/) | -| [Selectel](https://go-acme.github.io/lego/dns/selectel/) | [Servercow](https://go-acme.github.io/lego/dns/servercow/) | [Stackpath](https://go-acme.github.io/lego/dns/stackpath/) | [TransIP](https://go-acme.github.io/lego/dns/transip/) | -| [VegaDNS](https://go-acme.github.io/lego/dns/vegadns/) | [Versio.[nl/eu/uk]](https://go-acme.github.io/lego/dns/versio/) | [Vscale](https://go-acme.github.io/lego/dns/vscale/) | [Vultr](https://go-acme.github.io/lego/dns/vultr/) | -| [Yandex](https://go-acme.github.io/lego/dns/yandex/) | [Zone.ee](https://go-acme.github.io/lego/dns/zoneee/) | [Zonomi](https://go-acme.github.io/lego/dns/zonomi/) | | +| [EasyDNS](https://go-acme.github.io/lego/dns/easydns/) | [Exoscale](https://go-acme.github.io/lego/dns/exoscale/) | [External program](https://go-acme.github.io/lego/dns/exec/) | [Gandi Live DNS (v5)](https://go-acme.github.io/lego/dns/gandiv5/) | +| [Gandi](https://go-acme.github.io/lego/dns/gandi/) | [Glesys](https://go-acme.github.io/lego/dns/glesys/) | [Go Daddy](https://go-acme.github.io/lego/dns/godaddy/) | [Google Cloud](https://go-acme.github.io/lego/dns/gcloud/) | +| [Hetzner](https://go-acme.github.io/lego/dns/hetzner/) | [Hosting.de](https://go-acme.github.io/lego/dns/hostingde/) | [HTTP request](https://go-acme.github.io/lego/dns/httpreq/) | [HyperOne](https://go-acme.github.io/lego/dns/hyperone/) | +| [Internet Initiative Japan](https://go-acme.github.io/lego/dns/iij/) | [INWX](https://go-acme.github.io/lego/dns/inwx/) | [Joker](https://go-acme.github.io/lego/dns/joker/) | [Joohoi's ACME-DNS](https://go-acme.github.io/lego/dns/acme-dns/) | +| [Linode (v4)](https://go-acme.github.io/lego/dns/linode/) | [Liquid Web](https://go-acme.github.io/lego/dns/liquidweb/) | [LuaDNS](https://go-acme.github.io/lego/dns/luadns/) | [Manual](https://go-acme.github.io/lego/dns/manual/) | +| [MyDNS.jp](https://go-acme.github.io/lego/dns/mydnsjp/) | [MythicBeasts](https://go-acme.github.io/lego/dns/mythicbeasts/) | [Name.com](https://go-acme.github.io/lego/dns/namedotcom/) | [Namecheap](https://go-acme.github.io/lego/dns/namecheap/) | +| [Namesilo](https://go-acme.github.io/lego/dns/namesilo/) | [Netcup](https://go-acme.github.io/lego/dns/netcup/) | [Netlify](https://go-acme.github.io/lego/dns/netlify/) | [NIFCloud](https://go-acme.github.io/lego/dns/nifcloud/) | +| [NS1](https://go-acme.github.io/lego/dns/ns1/) | [Open Telekom Cloud](https://go-acme.github.io/lego/dns/otc/) | [Oracle Cloud](https://go-acme.github.io/lego/dns/oraclecloud/) | [OVH](https://go-acme.github.io/lego/dns/ovh/) | +| [PowerDNS](https://go-acme.github.io/lego/dns/pdns/) | [Rackspace](https://go-acme.github.io/lego/dns/rackspace/) | [reg.ru](https://go-acme.github.io/lego/dns/regru/) | [RFC2136](https://go-acme.github.io/lego/dns/rfc2136/) | +| [RimuHosting](https://go-acme.github.io/lego/dns/rimuhosting/) | [Sakura Cloud](https://go-acme.github.io/lego/dns/sakuracloud/) | [Scaleway](https://go-acme.github.io/lego/dns/scaleway/) | [Selectel](https://go-acme.github.io/lego/dns/selectel/) | +| [Servercow](https://go-acme.github.io/lego/dns/servercow/) | [Stackpath](https://go-acme.github.io/lego/dns/stackpath/) | [TransIP](https://go-acme.github.io/lego/dns/transip/) | [VegaDNS](https://go-acme.github.io/lego/dns/vegadns/) | +| [Versio.[nl/eu/uk]](https://go-acme.github.io/lego/dns/versio/) | [Vscale](https://go-acme.github.io/lego/dns/vscale/) | [Vultr](https://go-acme.github.io/lego/dns/vultr/) | [Yandex](https://go-acme.github.io/lego/dns/yandex/) | +| [Zone.ee](https://go-acme.github.io/lego/dns/zoneee/) | [Zonomi](https://go-acme.github.io/lego/dns/zonomi/) | | | diff --git a/cmd/zz_gen_cmd_dnshelp.go b/cmd/zz_gen_cmd_dnshelp.go index b750b454..aee8c87e 100644 --- a/cmd/zz_gen_cmd_dnshelp.go +++ b/cmd/zz_gen_cmd_dnshelp.go @@ -44,7 +44,6 @@ func allDNSCodes() string { "edgedns", "exec", "exoscale", - "fastdns", "gandi", "gandiv5", "gcloud", @@ -737,28 +736,6 @@ func displayDNSHelp(name string) error { ew.writeln() ew.writeln(`More information: https://go-acme.github.io/lego/dns/exoscale`) - case "fastdns": - // generated from: providers/dns/fastdns/fastdns.toml - ew.writeln(`Configuration for FastDNS (Deprecated).`) - ew.writeln(`Code: 'fastdns'`) - ew.writeln(`Since: 'v0.5.0'`) - ew.writeln() - - ew.writeln(`Credentials:`) - ew.writeln(` - "AKAMAI_ACCESS_TOKEN": Access token`) - ew.writeln(` - "AKAMAI_CLIENT_SECRET": Client secret`) - ew.writeln(` - "AKAMAI_CLIENT_TOKEN": Client token`) - ew.writeln(` - "AKAMAI_HOST": API host`) - ew.writeln() - - ew.writeln(`Additional Configuration:`) - ew.writeln(` - "AKAMAI_POLLING_INTERVAL": Time between DNS propagation check`) - ew.writeln(` - "AKAMAI_PROPAGATION_TIMEOUT": Maximum waiting time for DNS propagation`) - ew.writeln(` - "AKAMAI_TTL": The TTL of the TXT record used for the DNS challenge`) - - ew.writeln() - ew.writeln(`More information: https://go-acme.github.io/lego/dns/fastdns`) - case "gandi": // generated from: providers/dns/gandi/gandi.toml ew.writeln(`Configuration for Gandi.`) diff --git a/docs/content/dns/zz_gen_edgedns.md b/docs/content/dns/zz_gen_edgedns.md index 124dafe5..817d243c 100644 --- a/docs/content/dns/zz_gen_edgedns.md +++ b/docs/content/dns/zz_gen_edgedns.md @@ -11,7 +11,7 @@ slug: edgedns Since: v3.9.0 -Akamai edgedns supercedes fastdns; implementing a DNS provider for solving the DNS-01 challenge using Akamai EdgeDNS +Akamai edgedns supercedes FastDNS; implementing a DNS provider for solving the DNS-01 challenge using Akamai EdgeDNS diff --git a/docs/content/dns/zz_gen_fastdns.md b/docs/content/dns/zz_gen_fastdns.md deleted file mode 100644 index f622f3cc..00000000 --- a/docs/content/dns/zz_gen_fastdns.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: "FastDNS (Deprecated)" -date: 2019-03-03T16:39:46+01:00 -draft: false -slug: fastdns ---- - - - - - -Since: v0.5.0 - -Configuration for [FastDNS (Deprecated)](https://www.akamai.com/us/en/products/security/fast-dns.jsp). - - - - -- Code: `fastdns` - -{{% notice note %}} -_Please contribute by adding a CLI example._ -{{% /notice %}} - - - - -## Credentials - -| Environment Variable Name | Description | -|-----------------------|-------------| -| `AKAMAI_ACCESS_TOKEN` | Access token | -| `AKAMAI_CLIENT_SECRET` | Client secret | -| `AKAMAI_CLIENT_TOKEN` | Client token | -| `AKAMAI_HOST` | API host | - -The environment variable names can be suffixed by `_FILE` to reference a file instead of a value. -More information [here](/lego/dns/#configuration-and-credentials). - - -## Additional Configuration - -| Environment Variable Name | Description | -|--------------------------------|-------------| -| `AKAMAI_POLLING_INTERVAL` | Time between DNS propagation check | -| `AKAMAI_PROPAGATION_TIMEOUT` | Maximum waiting time for DNS propagation | -| `AKAMAI_TTL` | The TTL of the TXT record used for the DNS challenge | - -The environment variable names can be suffixed by `_FILE` to reference a file instead of a value. -More information [here](/lego/dns/#configuration-and-credentials). - - - - -## More information - -- [API documentation](https://developer.akamai.com/api/web_performance/fast_dns_record_management/v1.html) -- [Go client](https://github.com/akamai/AkamaiOPEN-edgegrid-golang) - - - - diff --git a/providers/dns/dns_providers.go b/providers/dns/dns_providers.go index f950bbea..08d714ff 100644 --- a/providers/dns/dns_providers.go +++ b/providers/dns/dns_providers.go @@ -35,7 +35,6 @@ import ( "github.com/go-acme/lego/v3/providers/dns/edgedns" "github.com/go-acme/lego/v3/providers/dns/exec" "github.com/go-acme/lego/v3/providers/dns/exoscale" - "github.com/go-acme/lego/v3/providers/dns/fastdns" "github.com/go-acme/lego/v3/providers/dns/gandi" "github.com/go-acme/lego/v3/providers/dns/gandiv5" "github.com/go-acme/lego/v3/providers/dns/gcloud" @@ -140,12 +139,10 @@ func NewDNSChallengeProviderByName(name string) (challenge.Provider, error) { return dyn.NewDNSProvider() case "dynu": return dynu.NewDNSProvider() - case "edgedns": - return edgedns.NewDNSProvider() - case "fastdns": - return fastdns.NewDNSProvider() case "easydns": return easydns.NewDNSProvider() + case "edgedns", "fastdns": // "fastdns" is for compatibility with v3, must be dropped in v5 + return edgedns.NewDNSProvider() case "exec": return exec.NewDNSProvider() case "exoscale": diff --git a/providers/dns/edgedns/edgedns.toml b/providers/dns/edgedns/edgedns.toml index 1dc8d378..908fe79a 100644 --- a/providers/dns/edgedns/edgedns.toml +++ b/providers/dns/edgedns/edgedns.toml @@ -1,7 +1,7 @@ Name = "Akamai EdgeDNS" Description = ''' -Akamai edgedns supercedes fastdns; implementing a DNS provider for solving the DNS-01 challenge using Akamai EdgeDNS +Akamai edgedns supercedes FastDNS; implementing a DNS provider for solving the DNS-01 challenge using Akamai EdgeDNS ''' URL = "https://www.akamai.com/us/en/products/security/edge-dns.jsp" Code = "edgedns" diff --git a/providers/dns/fastdns/fastdns.go b/providers/dns/fastdns/fastdns.go deleted file mode 100644 index 7c97f071..00000000 --- a/providers/dns/fastdns/fastdns.go +++ /dev/null @@ -1,172 +0,0 @@ -// Package fastdns implements a DNS provider for solving the DNS-01 challenge using FastDNS. -package fastdns - -import ( - "errors" - "fmt" - "reflect" - "time" - - configdns "github.com/akamai/AkamaiOPEN-edgegrid-golang/configdns-v1" - "github.com/akamai/AkamaiOPEN-edgegrid-golang/edgegrid" - "github.com/go-acme/lego/v3/challenge/dns01" - "github.com/go-acme/lego/v3/platform/config/env" -) - -// Environment variables names. -const ( - envNamespace = "AKAMAI_" - - EnvHost = envNamespace + "HOST" - EnvClientToken = envNamespace + "CLIENT_TOKEN" - EnvClientSecret = envNamespace + "CLIENT_SECRET" - EnvAccessToken = envNamespace + "ACCESS_TOKEN" - - EnvTTL = envNamespace + "TTL" - EnvPropagationTimeout = envNamespace + "PROPAGATION_TIMEOUT" - EnvPollingInterval = envNamespace + "POLLING_INTERVAL" -) - -// Config is used to configure the creation of the DNSProvider. -type Config struct { - edgegrid.Config - PropagationTimeout time.Duration - PollingInterval time.Duration - TTL int -} - -// NewDefaultConfig returns a default configuration for the DNSProvider. -func NewDefaultConfig() *Config { - return &Config{ - TTL: env.GetOrDefaultInt(EnvTTL, dns01.DefaultTTL), - PropagationTimeout: env.GetOrDefaultSecond(EnvPropagationTimeout, dns01.DefaultPropagationTimeout), - PollingInterval: env.GetOrDefaultSecond(EnvPollingInterval, dns01.DefaultPollingInterval), - } -} - -// DNSProvider implements the challenge.Provider interface. -type DNSProvider struct { - config *Config -} - -// NewDNSProvider uses the supplied environment variables to return a DNSProvider instance: -// AKAMAI_HOST, AKAMAI_CLIENT_TOKEN, AKAMAI_CLIENT_SECRET, AKAMAI_ACCESS_TOKEN. -func NewDNSProvider() (*DNSProvider, error) { - values, err := env.Get(EnvHost, EnvClientToken, EnvClientSecret, EnvAccessToken) - if err != nil { - return nil, fmt.Errorf("fastdns: %w", err) - } - - config := NewDefaultConfig() - config.Config = edgegrid.Config{ - Host: values[EnvHost], - ClientToken: values[EnvClientToken], - ClientSecret: values[EnvClientSecret], - AccessToken: values[EnvAccessToken], - MaxBody: 131072, - } - - return NewDNSProviderConfig(config) -} - -// NewDNSProviderConfig return a DNSProvider instance configured for FastDNS. -func NewDNSProviderConfig(config *Config) (*DNSProvider, error) { - if config == nil { - return nil, errors.New("fastdns: the configuration of the DNS provider is nil") - } - - if config.ClientToken == "" || config.ClientSecret == "" || config.AccessToken == "" || config.Host == "" { - return nil, errors.New("fastdns: credentials are missing") - } - - return &DNSProvider{config: config}, nil -} - -// Present creates a TXT record to fulfill the dns-01 challenge. -func (d *DNSProvider) Present(domain, token, keyAuth string) error { - fqdn, value := dns01.GetRecord(domain, keyAuth) - zoneName, recordName, err := d.findZoneAndRecordName(fqdn, domain) - if err != nil { - return fmt.Errorf("fastdns: %w", err) - } - - configdns.Init(d.config.Config) - - zone, err := configdns.GetZone(zoneName) - if err != nil { - return fmt.Errorf("fastdns: %w", err) - } - - record := configdns.NewTxtRecord() - _ = record.SetField("name", recordName) - _ = record.SetField("ttl", d.config.TTL) - _ = record.SetField("target", value) - _ = record.SetField("active", true) - - for _, r := range zone.Zone.Txt { - if r != nil && reflect.DeepEqual(r.ToMap(), record.ToMap()) { - return nil - } - } - - return d.createRecord(zone, record) -} - -// CleanUp removes the record matching the specified parameters. -func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error { - fqdn, _ := dns01.GetRecord(domain, keyAuth) - zoneName, recordName, err := d.findZoneAndRecordName(fqdn, domain) - if err != nil { - return fmt.Errorf("fastdns: %w", err) - } - - configdns.Init(d.config.Config) - - zone, err := configdns.GetZone(zoneName) - if err != nil { - return fmt.Errorf("fastdns: %w", err) - } - - var removed bool - for _, r := range zone.Zone.Txt { - if r != nil && r.Name == recordName { - if zone.RemoveRecord(r) != nil { - return fmt.Errorf("fastdns: %w", err) - } - removed = true - } - } - - if removed { - return zone.Save() - } - - return nil -} - -// Timeout returns the timeout and interval to use when checking for DNS propagation. -// Adjusting here to cope with spikes in propagation times. -func (d *DNSProvider) Timeout() (timeout, interval time.Duration) { - return d.config.PropagationTimeout, d.config.PollingInterval -} - -func (d *DNSProvider) findZoneAndRecordName(fqdn, domain string) (string, string, error) { - zone, err := dns01.FindZoneByFqdn(dns01.ToFqdn(domain)) - if err != nil { - return "", "", err - } - zone = dns01.UnFqdn(zone) - name := dns01.UnFqdn(fqdn) - name = name[:len(name)-len("."+zone)] - - return zone, name, nil -} - -func (d *DNSProvider) createRecord(zone *configdns.Zone, record *configdns.TxtRecord) error { - err := zone.AddRecord(record) - if err != nil { - return err - } - - return zone.Save() -} diff --git a/providers/dns/fastdns/fastdns.toml b/providers/dns/fastdns/fastdns.toml deleted file mode 100644 index 010897d7..00000000 --- a/providers/dns/fastdns/fastdns.toml +++ /dev/null @@ -1,24 +0,0 @@ -Name = "FastDNS (Deprecated)" -Description = '''''' -URL = "https://www.akamai.com/us/en/products/security/fast-dns.jsp" -Code = "fastdns" -Since = "v0.5.0" - -Example = '''''' - -[Configuration] - [Configuration.Credentials] - AKAMAI_HOST = "API host" - AKAMAI_CLIENT_TOKEN = "Client token" - AKAMAI_CLIENT_SECRET = "Client secret" - AKAMAI_ACCESS_TOKEN = "Access token" - [Configuration.Additional] - AKAMAI_POLLING_INTERVAL = "Time between DNS propagation check" - AKAMAI_PROPAGATION_TIMEOUT = "Maximum waiting time for DNS propagation" - AKAMAI_TTL = "The TTL of the TXT record used for the DNS challenge" - -[Links] - API = "https://developer.akamai.com/api/web_performance/fast_dns_record_management/v1.html" - GoClient = "https://github.com/akamai/AkamaiOPEN-edgegrid-golang" - - diff --git a/providers/dns/fastdns/fastdns_test.go b/providers/dns/fastdns/fastdns_test.go deleted file mode 100644 index 907a8919..00000000 --- a/providers/dns/fastdns/fastdns_test.go +++ /dev/null @@ -1,267 +0,0 @@ -package fastdns - -import ( - "testing" - "time" - - "github.com/go-acme/lego/v3/platform/tester" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -const envDomain = envNamespace + "TEST_DOMAIN" - -var envTest = tester.NewEnvTest( - EnvHost, - EnvClientToken, - EnvClientSecret, - EnvAccessToken). - WithDomain(envDomain) - -func TestNewDNSProvider(t *testing.T) { - testCases := []struct { - desc string - envVars map[string]string - expected string - }{ - { - desc: "success", - envVars: map[string]string{ - EnvHost: "A", - EnvClientToken: "B", - EnvClientSecret: "C", - EnvAccessToken: "D", - }, - }, - { - desc: "missing credentials", - envVars: map[string]string{ - EnvHost: "", - EnvClientToken: "", - EnvClientSecret: "", - EnvAccessToken: "", - }, - expected: "fastdns: some credentials information are missing: AKAMAI_HOST,AKAMAI_CLIENT_TOKEN,AKAMAI_CLIENT_SECRET,AKAMAI_ACCESS_TOKEN", - }, - { - desc: "missing host", - envVars: map[string]string{ - EnvHost: "", - EnvClientToken: "B", - EnvClientSecret: "C", - EnvAccessToken: "D", - }, - expected: "fastdns: some credentials information are missing: AKAMAI_HOST", - }, - { - desc: "missing client token", - envVars: map[string]string{ - EnvHost: "A", - EnvClientToken: "", - EnvClientSecret: "C", - EnvAccessToken: "D", - }, - expected: "fastdns: some credentials information are missing: AKAMAI_CLIENT_TOKEN", - }, - { - desc: "missing client secret", - envVars: map[string]string{ - EnvHost: "A", - EnvClientToken: "B", - EnvClientSecret: "", - EnvAccessToken: "D", - }, - expected: "fastdns: some credentials information are missing: AKAMAI_CLIENT_SECRET", - }, - { - desc: "missing access token", - envVars: map[string]string{ - EnvHost: "A", - EnvClientToken: "B", - EnvClientSecret: "C", - EnvAccessToken: "", - }, - expected: "fastdns: some credentials information are missing: AKAMAI_ACCESS_TOKEN", - }, - } - - for _, test := range testCases { - t.Run(test.desc, func(t *testing.T) { - defer envTest.RestoreEnv() - envTest.ClearEnv() - - envTest.Apply(test.envVars) - - p, err := NewDNSProvider() - - if len(test.expected) == 0 { - require.NoError(t, err) - require.NotNil(t, p) - require.NotNil(t, p.config) - } else { - require.EqualError(t, err, test.expected) - } - }) - } -} - -func TestNewDNSProviderConfig(t *testing.T) { - testCases := []struct { - desc string - host string - clientToken string - clientSecret string - accessToken string - expected string - }{ - { - desc: "success", - host: "A", - clientToken: "B", - clientSecret: "C", - accessToken: "D", - }, - { - desc: "missing credentials", - expected: "fastdns: credentials are missing", - }, - { - desc: "missing host", - host: "", - clientToken: "B", - clientSecret: "C", - accessToken: "D", - expected: "fastdns: credentials are missing", - }, - { - desc: "missing client token", - host: "A", - clientToken: "", - clientSecret: "C", - accessToken: "D", - expected: "fastdns: credentials are missing", - }, - { - desc: "missing client secret", - host: "A", - clientToken: "B", - clientSecret: "", - accessToken: "B", - expected: "fastdns: credentials are missing", - }, - { - desc: "missing access token", - host: "A", - clientToken: "B", - clientSecret: "C", - accessToken: "", - expected: "fastdns: credentials are missing", - }, - } - - for _, test := range testCases { - t.Run(test.desc, func(t *testing.T) { - config := NewDefaultConfig() - config.ClientToken = test.clientToken - config.ClientSecret = test.clientSecret - config.Host = test.host - config.AccessToken = test.accessToken - - p, err := NewDNSProviderConfig(config) - - if len(test.expected) == 0 { - require.NoError(t, err) - require.NotNil(t, p) - require.NotNil(t, p.config) - } else { - require.EqualError(t, err, test.expected) - } - }) - } -} - -func TestDNSProvider_findZoneAndRecordName(t *testing.T) { - config := NewDefaultConfig() - config.Host = "somehost" - config.ClientToken = "someclienttoken" - config.ClientSecret = "someclientsecret" - config.AccessToken = "someaccesstoken" - - provider, err := NewDNSProviderConfig(config) - require.NoError(t, err) - - type expected struct { - zone string - recordName string - } - - testCases := []struct { - desc string - fqdn string - domain string - expected expected - }{ - { - desc: "Extract root record name", - fqdn: "_acme-challenge.bar.com.", - domain: "bar.com", - expected: expected{ - zone: "bar.com", - recordName: "_acme-challenge", - }, - }, - { - desc: "Extract sub record name", - fqdn: "_acme-challenge.foo.bar.com.", - domain: "foo.bar.com", - expected: expected{ - zone: "bar.com", - recordName: "_acme-challenge.foo", - }, - }, - } - - for _, test := range testCases { - test := test - t.Run(test.desc, func(t *testing.T) { - t.Parallel() - - zone, recordName, err := provider.findZoneAndRecordName(test.fqdn, test.domain) - require.NoError(t, err) - assert.Equal(t, test.expected.zone, zone) - assert.Equal(t, test.expected.recordName, recordName) - }) - } -} - -func TestLivePresent(t *testing.T) { - if !envTest.IsLiveTest() { - t.Skip("skipping live test") - } - - envTest.RestoreEnv() - provider, err := NewDNSProvider() - require.NoError(t, err) - - err = provider.Present(envTest.GetDomain(), "", "123d==") - require.NoError(t, err) - - // Present Twice to handle create / update - err = provider.Present(envTest.GetDomain(), "", "123d==") - require.NoError(t, err) -} - -func TestLiveCleanUp(t *testing.T) { - if !envTest.IsLiveTest() { - t.Skip("skipping live test") - } - - envTest.RestoreEnv() - provider, err := NewDNSProvider() - require.NoError(t, err) - - time.Sleep(1 * time.Second) - - err = provider.CleanUp(envTest.GetDomain(), "", "123d==") - require.NoError(t, err) -}