From a38476b791b63c63bead8c383376b5d07c06541d Mon Sep 17 00:00:00 2001 From: Andrew Hay <39sumer3939@gmail.com> Date: Wed, 31 Jul 2024 18:33:12 +0000 Subject: [PATCH 01/21] feat: add cloudflare host name --- main.go | 2 +- pkg/apis/externaldns/types.go | 2 ++ provider/cloudflare/cloudflare.go | 55 +++++++++++++++++++++++++++++-- 3 files changed, 55 insertions(+), 4 deletions(-) diff --git a/main.go b/main.go index f05c46906..9a83772d7 100644 --- a/main.go +++ b/main.go @@ -257,7 +257,7 @@ func main() { case "civo": p, err = civo.NewCivoProvider(domainFilter, cfg.DryRun) case "cloudflare": - p, err = cloudflare.NewCloudFlareProvider(domainFilter, zoneIDFilter, cfg.CloudflareProxied, cfg.DryRun, cfg.CloudflareDNSRecordsPerPage) + p, err = cloudflare.NewCloudFlareProvider(domainFilter, zoneIDFilter, cfg.CloudflareProxied, cfg.DryRun, cfg.CloudflareDNSRecordsPerPage, cfg.CloudflareRegionKey) case "rcodezero": p, err = rcode0.NewRcodeZeroProvider(domainFilter, cfg.DryRun, cfg.RcodezeroTXTEncrypt) case "google": diff --git a/pkg/apis/externaldns/types.go b/pkg/apis/externaldns/types.go index 822993d09..12b2f8032 100644 --- a/pkg/apis/externaldns/types.go +++ b/pkg/apis/externaldns/types.go @@ -113,6 +113,7 @@ type Config struct { BluecatSkipTLSVerify bool CloudflareProxied bool CloudflareDNSRecordsPerPage int + CloudflareRegionKey string CoreDNSPrefix string RcodezeroTXTEncrypt bool AkamaiServiceConsumerDomain string @@ -274,6 +275,7 @@ var defaultConfig = &Config{ BluecatDNSDeployType: "no-deploy", CloudflareProxied: false, CloudflareDNSRecordsPerPage: 100, + CloudflareRegionKey: "" CoreDNSPrefix: "/skydns/", RcodezeroTXTEncrypt: false, AkamaiServiceConsumerDomain: "", diff --git a/provider/cloudflare/cloudflare.go b/provider/cloudflare/cloudflare.go index c693ddd72..f0bfba949 100644 --- a/provider/cloudflare/cloudflare.go +++ b/provider/cloudflare/cloudflare.go @@ -126,12 +126,14 @@ type CloudFlareProvider struct { proxiedByDefault bool DryRun bool DNSRecordsPerPage int + RegionKey string } // cloudFlareChange differentiates between ChangActions type cloudFlareChange struct { - Action string - ResourceRecord cloudflare.DNSRecord + Action string + ResourceRecord cloudflare.DNSRecord + RegionalHostname cloudflare.RegionalHostname } // RecordParamsTypes is a typeset of the possible Record Params that can be passed to cloudflare-go library @@ -150,6 +152,14 @@ func getUpdateDNSRecordParam(cfc cloudFlareChange) cloudflare.UpdateDNSRecordPar } } +// getUpdateDataLocalizationRegionalHostnameParams is a function that returns the appropriate RegionalHostname Param based on the cloudFlareChange passed in +func getUpdateDataLocalizationRegionalHostnameParams(cfc cloudFlareChange) cloudflare.UpdateDataLocalizationRegionalHostnameParams { + return cloudflare.UpdateDataLocalizationRegionalHostnameParams{ + Hostname: cfc.RegionalHostname.Hostname, + RegionKey: cfc.RegionalHostname.RegionKey, + } +} + // getCreateDNSRecordParam is a function that returns the appropriate Record Param based on the cloudFlareChange passed in func getCreateDNSRecordParam(cfc cloudFlareChange) cloudflare.CreateDNSRecordParams { return cloudflare.CreateDNSRecordParams{ @@ -161,8 +171,23 @@ func getCreateDNSRecordParam(cfc cloudFlareChange) cloudflare.CreateDNSRecordPar } } +// func resourceCloudflareRegionalHostnameCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { +// client := meta.(*cloudflare.API) +// zoneID := cloudflare.ZoneIdentifier(d.Get(consts.ZoneIDSchemaKey).(string)) +// newHostname := cloudflare.CreateDataLocalizationRegionalHostnameParams{ +// Hostname: d.Get("hostname").(string), +// RegionKey: d.Get("region_key").(string), +// } + +// r, err := cloudflare.CreateDataLocalizationRegionalHostname(ctx, zoneID, newHostname) +// if err != nil { +// return nil, fmt.Errorf("failed to update region: %v", err) +// } +// return nil +// } + // NewCloudFlareProvider initializes a new CloudFlare DNS based Provider. -func NewCloudFlareProvider(domainFilter endpoint.DomainFilter, zoneIDFilter provider.ZoneIDFilter, proxiedByDefault bool, dryRun bool, dnsRecordsPerPage int) (*CloudFlareProvider, error) { +func NewCloudFlareProvider(domainFilter endpoint.DomainFilter, zoneIDFilter provider.ZoneIDFilter, proxiedByDefault bool, dryRun bool, dnsRecordsPerPage int, regionKey string) (*CloudFlareProvider, error) { // initialize via chosen auth method and returns new API object var ( config *cloudflare.API @@ -192,6 +217,7 @@ func NewCloudFlareProvider(domainFilter endpoint.DomainFilter, zoneIDFilter prov proxiedByDefault: proxiedByDefault, DryRun: dryRun, DNSRecordsPerPage: dnsRecordsPerPage, + RegionKey: regionKey, } return provider, nil } @@ -405,6 +431,29 @@ func (p *CloudFlareProvider) AdjustEndpoints(endpoints []*endpoint.Endpoint) ([] return adjustedEndpoints, nil } +func (p *CloudFlareProvider) updateRegionalHostname(ctx context.Context, zoneID string) ([]cloudflare.DNSRecord, error) { + var records []cloudflare.DNSRecord + resultInfo := cloudflare.ResultInfo{PerPage: p.DNSRecordsPerPage, Page: 1} + params := cloudflare.ListDNSRecordsParams{ResultInfo: resultInfo} + for { + pageRecords, resultInfo, err := p.Client.ListDNSRecords(ctx, cloudflare.ZoneIdentifier(zoneID), params) + if err != nil { + var apiErr *cloudflare.Error + if errors.As(err, &apiErr) { + if apiErr.ClientRateLimited() { + // Handle rate limit error as a soft error + return nil, provider.NewSoftError(err) + } + } + return nil, err + } + regionalHostnameParam := getUpdateDataLocalizationRegionalHostnameParams(*change) + + } + return records, nil +} + + // changesByZone separates a multi-zone change into a single change per zone. func (p *CloudFlareProvider) changesByZone(zones []cloudflare.Zone, changeSet []*cloudFlareChange) map[string][]*cloudFlareChange { changes := make(map[string][]*cloudFlareChange) From a6590dee09e9047877961a89bc181954ce59fbdb Mon Sep 17 00:00:00 2001 From: Andrew Hay <39sumer3939@gmail.com> Date: Thu, 1 Aug 2024 19:32:49 +0000 Subject: [PATCH 02/21] add test --- pkg/apis/externaldns/types_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/apis/externaldns/types_test.go b/pkg/apis/externaldns/types_test.go index ea52b2f78..4edc5758f 100644 --- a/pkg/apis/externaldns/types_test.go +++ b/pkg/apis/externaldns/types_test.go @@ -82,6 +82,7 @@ var ( BluecatSkipTLSVerify: false, CloudflareProxied: false, CloudflareDNSRecordsPerPage: 100, + CloudflareRegionKey: "", CoreDNSPrefix: "/skydns/", AkamaiServiceConsumerDomain: "", AkamaiClientToken: "", @@ -189,6 +190,7 @@ var ( BluecatSkipTLSVerify: true, CloudflareProxied: true, CloudflareDNSRecordsPerPage: 5000, + CloudflareRegionKey: "us", CoreDNSPrefix: "/coredns/", AkamaiServiceConsumerDomain: "oooo-xxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx.luna.akamaiapis.net", AkamaiClientToken: "o184671d5307a388180fbf7f11dbdf46", @@ -299,6 +301,7 @@ func TestParseFlags(t *testing.T) { "--bluecat-skip-tls-verify", "--cloudflare-proxied", "--cloudflare-dns-records-per-page=5000", + "--cloudflare-region-key=us", "--coredns-prefix=/coredns/", "--akamai-serviceconsumerdomain=oooo-xxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx.luna.akamaiapis.net", "--akamai-client-token=o184671d5307a388180fbf7f11dbdf46", @@ -424,6 +427,7 @@ func TestParseFlags(t *testing.T) { "EXTERNAL_DNS_BLUECAT_SKIP_TLS_VERIFY": "1", "EXTERNAL_DNS_CLOUDFLARE_PROXIED": "1", "EXTERNAL_DNS_CLOUDFLARE_DNS_RECORDS_PER_PAGE": "5000", + "EXTERNAL_DNS_CLOUDFLARE_REGION_KEY": "us", "EXTERNAL_DNS_COREDNS_PREFIX": "/coredns/", "EXTERNAL_DNS_AKAMAI_SERVICECONSUMERDOMAIN": "oooo-xxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx.luna.akamaiapis.net", "EXTERNAL_DNS_AKAMAI_CLIENT_TOKEN": "o184671d5307a388180fbf7f11dbdf46", From bbe914b655e0821b13eaa7f93b0dc7c55be221ac Mon Sep 17 00:00:00 2001 From: Andrew Hay <39sumer3939@gmail.com> Date: Mon, 5 Aug 2024 19:21:48 +0000 Subject: [PATCH 03/21] add flag declaration --- provider/cloudflare/cloudflare_test.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/provider/cloudflare/cloudflare_test.go b/provider/cloudflare/cloudflare_test.go index 22e0b753c..6a03e65d3 100644 --- a/provider/cloudflare/cloudflare_test.go +++ b/provider/cloudflare/cloudflare_test.go @@ -710,7 +710,8 @@ func TestCloudflareProvider(t *testing.T) { provider.NewZoneIDFilter([]string{""}), false, true, - 5000) + 5000, + "") if err != nil { t.Errorf("should not fail, %s", err) } @@ -726,7 +727,8 @@ func TestCloudflareProvider(t *testing.T) { provider.NewZoneIDFilter([]string{""}), false, true, - 5000) + 5000, + "") if err != nil { t.Errorf("should not fail, %s", err) } @@ -739,7 +741,8 @@ func TestCloudflareProvider(t *testing.T) { provider.NewZoneIDFilter([]string{""}), false, true, - 5000) + 5000, + "") if err != nil { t.Errorf("should not fail, %s", err) } @@ -751,7 +754,8 @@ func TestCloudflareProvider(t *testing.T) { provider.NewZoneIDFilter([]string{""}), false, true, - 5000) + 5000, + "") if err == nil { t.Errorf("expected to fail") } From d8ec9354da2ba3bc0be83357f37362f2191d1b4d Mon Sep 17 00:00:00 2001 From: Andrew Hay <39sumer3939@gmail.com> Date: Mon, 5 Aug 2024 19:23:48 +0000 Subject: [PATCH 04/21] fix: add flag declaration --- pkg/apis/externaldns/types.go | 3 ++- pkg/apis/externaldns/types_test.go | 2 +- provider/cloudflare/cloudflare.go | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/pkg/apis/externaldns/types.go b/pkg/apis/externaldns/types.go index 12b2f8032..0ff13937a 100644 --- a/pkg/apis/externaldns/types.go +++ b/pkg/apis/externaldns/types.go @@ -275,7 +275,7 @@ var defaultConfig = &Config{ BluecatDNSDeployType: "no-deploy", CloudflareProxied: false, CloudflareDNSRecordsPerPage: 100, - CloudflareRegionKey: "" + CloudflareRegionKey: "earth", CoreDNSPrefix: "/skydns/", RcodezeroTXTEncrypt: false, AkamaiServiceConsumerDomain: "", @@ -504,6 +504,7 @@ func (cfg *Config) ParseFlags(args []string) error { app.Flag("cloudflare-proxied", "When using the Cloudflare provider, specify if the proxy mode must be enabled (default: disabled)").BoolVar(&cfg.CloudflareProxied) app.Flag("cloudflare-dns-records-per-page", "When using the Cloudflare provider, specify how many DNS records listed per page, max possible 5,000 (default: 100)").Default(strconv.Itoa(defaultConfig.CloudflareDNSRecordsPerPage)).IntVar(&cfg.CloudflareDNSRecordsPerPage) + app.Flag("cloudflare-region-key", "When using the Cloudflare provider, specify the region (default: earth)").StringVar(&cfg.CloudflareRegionKey) app.Flag("coredns-prefix", "When using the CoreDNS provider, specify the prefix name").Default(defaultConfig.CoreDNSPrefix).StringVar(&cfg.CoreDNSPrefix) app.Flag("akamai-serviceconsumerdomain", "When using the Akamai provider, specify the base URL (required when --provider=akamai and edgerc-path not specified)").Default(defaultConfig.AkamaiServiceConsumerDomain).StringVar(&cfg.AkamaiServiceConsumerDomain) app.Flag("akamai-client-token", "When using the Akamai provider, specify the client token (required when --provider=akamai and edgerc-path not specified)").Default(defaultConfig.AkamaiClientToken).StringVar(&cfg.AkamaiClientToken) diff --git a/pkg/apis/externaldns/types_test.go b/pkg/apis/externaldns/types_test.go index 4edc5758f..4eea0370e 100644 --- a/pkg/apis/externaldns/types_test.go +++ b/pkg/apis/externaldns/types_test.go @@ -82,7 +82,7 @@ var ( BluecatSkipTLSVerify: false, CloudflareProxied: false, CloudflareDNSRecordsPerPage: 100, - CloudflareRegionKey: "", + CloudflareRegionKey: "earth", CoreDNSPrefix: "/skydns/", AkamaiServiceConsumerDomain: "", AkamaiClientToken: "", diff --git a/provider/cloudflare/cloudflare.go b/provider/cloudflare/cloudflare.go index f0bfba949..f74ca2c9b 100644 --- a/provider/cloudflare/cloudflare.go +++ b/provider/cloudflare/cloudflare.go @@ -447,7 +447,7 @@ func (p *CloudFlareProvider) updateRegionalHostname(ctx context.Context, zoneID } return nil, err } - regionalHostnameParam := getUpdateDataLocalizationRegionalHostnameParams(*change) + // regionalHostnameParam := getUpdateDataLocalizationRegionalHostnameParams(*change) } return records, nil From 6ef25bf27641ca9813d40d5299b98bf2b9a973cc Mon Sep 17 00:00:00 2001 From: Andrew Hay <39sumer3939@gmail.com> Date: Tue, 6 Aug 2024 16:09:02 +0000 Subject: [PATCH 05/21] fix: add RegionalHostname --- provider/cloudflare/cloudflare.go | 48 ++++++++++++++++++------------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/provider/cloudflare/cloudflare.go b/provider/cloudflare/cloudflare.go index f74ca2c9b..592d03bc9 100644 --- a/provider/cloudflare/cloudflare.go +++ b/provider/cloudflare/cloudflare.go @@ -73,6 +73,7 @@ type cloudFlareDNS interface { CreateDNSRecord(ctx context.Context, rc *cloudflare.ResourceContainer, rp cloudflare.CreateDNSRecordParams) (cloudflare.DNSRecord, error) DeleteDNSRecord(ctx context.Context, rc *cloudflare.ResourceContainer, recordID string) error UpdateDNSRecord(ctx context.Context, rc *cloudflare.ResourceContainer, rp cloudflare.UpdateDNSRecordParams) error + UpdateDataLocalizationRegionalHostname(ctx context.Context, rc *cloudflare.ResourceContainer, rp cloudflare.UpdateDataLocalizationRegionalHostnameParams) error } type zoneService struct { @@ -377,12 +378,14 @@ func (p *CloudFlareProvider) submitChanges(ctx context.Context, changes []*cloud continue } recordParam := getUpdateDNSRecordParam(*change) + regionalHostnameParam := getUpdateDataLocalizationRegionalHostnameParams(*change) recordParam.ID = recordID err := p.Client.UpdateDNSRecord(ctx, resourceContainer, recordParam) if err != nil { failedChange = true log.WithFields(logFields).Errorf("failed to update record: %v", err) } + err := p.Client.UpdateDataLocalizationRegionalHostname(ctx, resourceContainer, regionalHostnameParam) } else if change.Action == cloudFlareDelete { recordID := p.getRecordID(records, change.ResourceRecord) if recordID == "" { @@ -431,27 +434,27 @@ func (p *CloudFlareProvider) AdjustEndpoints(endpoints []*endpoint.Endpoint) ([] return adjustedEndpoints, nil } -func (p *CloudFlareProvider) updateRegionalHostname(ctx context.Context, zoneID string) ([]cloudflare.DNSRecord, error) { - var records []cloudflare.DNSRecord - resultInfo := cloudflare.ResultInfo{PerPage: p.DNSRecordsPerPage, Page: 1} - params := cloudflare.ListDNSRecordsParams{ResultInfo: resultInfo} - for { - pageRecords, resultInfo, err := p.Client.ListDNSRecords(ctx, cloudflare.ZoneIdentifier(zoneID), params) - if err != nil { - var apiErr *cloudflare.Error - if errors.As(err, &apiErr) { - if apiErr.ClientRateLimited() { - // Handle rate limit error as a soft error - return nil, provider.NewSoftError(err) - } - } - return nil, err - } - // regionalHostnameParam := getUpdateDataLocalizationRegionalHostnameParams(*change) +// func (p *CloudFlareProvider) updateRegionalHostname(ctx context.Context, zoneID string) ([]cloudflare.DNSRecord, error) { +// var records []cloudflare.DNSRecord +// resultInfo := cloudflare.ResultInfo{PerPage: p.DNSRecordsPerPage, Page: 1} +// params := cloudflare.ListDNSRecordsParams{ResultInfo: resultInfo} +// for { +// pageRecords, resultInfo, err := p.Client.ListDNSRecords(ctx, cloudflare.ZoneIdentifier(zoneID), params) +// if err != nil { +// var apiErr *cloudflare.Error +// if errors.As(err, &apiErr) { +// if apiErr.ClientRateLimited() { +// // Handle rate limit error as a soft error +// return nil, provider.NewSoftError(err) +// } +// } +// return nil, err +// } +// err := p.Client.UpdateDNSRecord() - } - return records, nil -} +// } +// return records, nil +// } // changesByZone separates a multi-zone change into a single change per zone. @@ -502,6 +505,11 @@ func (p *CloudFlareProvider) newCloudFlareChange(action string, endpoint *endpoi Type: endpoint.RecordType, Content: target, }, + RegionalHostname: cloudflare.RegionalHostname{ + Hostname: endpoint.DNSName, + RegionKey: endpoint.SetIdentifier, + CreatedOn: , + } } } From 4386cbbb6de9ce7e034ee52b5e300fe17f44f271 Mon Sep 17 00:00:00 2001 From: Andrew Hay <39sumer3939@gmail.com> Date: Tue, 6 Aug 2024 20:32:39 +0000 Subject: [PATCH 06/21] cloudflare: changes to plan --- provider/cloudflare/cloudflare.go | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/provider/cloudflare/cloudflare.go b/provider/cloudflare/cloudflare.go index 592d03bc9..9e0740343 100644 --- a/provider/cloudflare/cloudflare.go +++ b/provider/cloudflare/cloudflare.go @@ -23,6 +23,7 @@ import ( "os" "strconv" "strings" + "time" cloudflare "github.com/cloudflare/cloudflare-go" log "github.com/sirupsen/logrus" @@ -105,6 +106,11 @@ func (z zoneService) UpdateDNSRecord(ctx context.Context, rc *cloudflare.Resourc return err } +func (z zoneService) UpdateDataLocalizationRegionalHostname(ctx context.Context, rc *cloudflare.ResourceContainer, rp cloudflare.UpdateDNSRecordParams) error { + _, err := z.service.UpdateDNSRecord(ctx, rc, rp) + return err +} + func (z zoneService) DeleteDNSRecord(ctx context.Context, rc *cloudflare.ResourceContainer, recordID string) error { return z.service.DeleteDNSRecord(ctx, rc, recordID) } @@ -385,7 +391,11 @@ func (p *CloudFlareProvider) submitChanges(ctx context.Context, changes []*cloud failedChange = true log.WithFields(logFields).Errorf("failed to update record: %v", err) } - err := p.Client.UpdateDataLocalizationRegionalHostname(ctx, resourceContainer, regionalHostnameParam) + regionalHostnameErr := p.Client.UpdateDataLocalizationRegionalHostname(ctx, resourceContainer, regionalHostnameParam) + if regionalHostnameErr != nil { + failedChange = true + log.WithFields(logFields).Errorf("failed to update record: %v", regionalHostnameErr) + } } else if change.Action == cloudFlareDelete { recordID := p.getRecordID(records, change.ResourceRecord) if recordID == "" { @@ -495,7 +505,7 @@ func (p *CloudFlareProvider) newCloudFlareChange(action string, endpoint *endpoi if endpoint.RecordTTL.IsConfigured() { ttl = int(endpoint.RecordTTL) } - + dt := time.Now() return &cloudFlareChange{ Action: action, ResourceRecord: cloudflare.DNSRecord{ @@ -508,8 +518,8 @@ func (p *CloudFlareProvider) newCloudFlareChange(action string, endpoint *endpoi RegionalHostname: cloudflare.RegionalHostname{ Hostname: endpoint.DNSName, RegionKey: endpoint.SetIdentifier, - CreatedOn: , - } + CreatedOn: &dt, + }, } } From 70406fcaeca70adabda654105bc28ed5d02b984c Mon Sep 17 00:00:00 2001 From: Andrew Hay <39sumer3939@gmail.com> Date: Fri, 6 Sep 2024 20:45:22 +0000 Subject: [PATCH 07/21] fix: resolve syntax errors --- provider/cloudflare/cloudflare.go | 44 ++------------------------ provider/cloudflare/cloudflare_test.go | 14 ++++++++ 2 files changed, 17 insertions(+), 41 deletions(-) diff --git a/provider/cloudflare/cloudflare.go b/provider/cloudflare/cloudflare.go index 9e0740343..83c14bb54 100644 --- a/provider/cloudflare/cloudflare.go +++ b/provider/cloudflare/cloudflare.go @@ -106,9 +106,9 @@ func (z zoneService) UpdateDNSRecord(ctx context.Context, rc *cloudflare.Resourc return err } -func (z zoneService) UpdateDataLocalizationRegionalHostname(ctx context.Context, rc *cloudflare.ResourceContainer, rp cloudflare.UpdateDNSRecordParams) error { - _, err := z.service.UpdateDNSRecord(ctx, rc, rp) - return err +func (z zoneService) UpdateDataLocalizationRegionalHostname(ctx context.Context, rc *cloudflare.ResourceContainer, rp cloudflare.UpdateDataLocalizationRegionalHostnameParams) error { + _, err := z.service.UpdateDataLocalizationRegionalHostname(ctx, rc, rp) + return err } func (z zoneService) DeleteDNSRecord(ctx context.Context, rc *cloudflare.ResourceContainer, recordID string) error { @@ -178,21 +178,6 @@ func getCreateDNSRecordParam(cfc cloudFlareChange) cloudflare.CreateDNSRecordPar } } -// func resourceCloudflareRegionalHostnameCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { -// client := meta.(*cloudflare.API) -// zoneID := cloudflare.ZoneIdentifier(d.Get(consts.ZoneIDSchemaKey).(string)) -// newHostname := cloudflare.CreateDataLocalizationRegionalHostnameParams{ -// Hostname: d.Get("hostname").(string), -// RegionKey: d.Get("region_key").(string), -// } - -// r, err := cloudflare.CreateDataLocalizationRegionalHostname(ctx, zoneID, newHostname) -// if err != nil { -// return nil, fmt.Errorf("failed to update region: %v", err) -// } -// return nil -// } - // NewCloudFlareProvider initializes a new CloudFlare DNS based Provider. func NewCloudFlareProvider(domainFilter endpoint.DomainFilter, zoneIDFilter provider.ZoneIDFilter, proxiedByDefault bool, dryRun bool, dnsRecordsPerPage int, regionKey string) (*CloudFlareProvider, error) { // initialize via chosen auth method and returns new API object @@ -444,29 +429,6 @@ func (p *CloudFlareProvider) AdjustEndpoints(endpoints []*endpoint.Endpoint) ([] return adjustedEndpoints, nil } -// func (p *CloudFlareProvider) updateRegionalHostname(ctx context.Context, zoneID string) ([]cloudflare.DNSRecord, error) { -// var records []cloudflare.DNSRecord -// resultInfo := cloudflare.ResultInfo{PerPage: p.DNSRecordsPerPage, Page: 1} -// params := cloudflare.ListDNSRecordsParams{ResultInfo: resultInfo} -// for { -// pageRecords, resultInfo, err := p.Client.ListDNSRecords(ctx, cloudflare.ZoneIdentifier(zoneID), params) -// if err != nil { -// var apiErr *cloudflare.Error -// if errors.As(err, &apiErr) { -// if apiErr.ClientRateLimited() { -// // Handle rate limit error as a soft error -// return nil, provider.NewSoftError(err) -// } -// } -// return nil, err -// } -// err := p.Client.UpdateDNSRecord() - -// } -// return records, nil -// } - - // changesByZone separates a multi-zone change into a single change per zone. func (p *CloudFlareProvider) changesByZone(zones []cloudflare.Zone, changeSet []*cloudFlareChange) map[string][]*cloudFlareChange { changes := make(map[string][]*cloudFlareChange) diff --git a/provider/cloudflare/cloudflare_test.go b/provider/cloudflare/cloudflare_test.go index 6a03e65d3..aaa08f251 100644 --- a/provider/cloudflare/cloudflare_test.go +++ b/provider/cloudflare/cloudflare_test.go @@ -207,6 +207,20 @@ func (m *mockCloudFlareClient) UpdateDNSRecord(ctx context.Context, rc *cloudfla return nil } +func (m *mockCloudFlareClient) UpdateDataLocalizationRegionalHostname(ctx context.Context, rc *cloudflare.ResourceContainer, rp cloudflare.UpdateDataLocalizationRegionalHostnameParams) error { + // Add logic here to mock the UpdateDataLocalizationRegionalHostname method + // For example, you could add a MockAction to the Actions slice + m.Actions = append(m.Actions, MockAction{ + Name: "UpdateDataLocalizationRegionalHostname", + ZoneId: rc.Identifier, + RecordId: "", // You can leave this empty or use a default value + RecordData: cloudflare.DNSRecord{ + Name: rp.Hostname, + }, + }) + return nil +} + func (m *mockCloudFlareClient) DeleteDNSRecord(ctx context.Context, rc *cloudflare.ResourceContainer, recordID string) error { m.Actions = append(m.Actions, MockAction{ Name: "Delete", From e0cc26247f096f56d2fde68ebdb5a64af5b17e10 Mon Sep 17 00:00:00 2001 From: Andrew Hay <39sumer3939@gmail.com> Date: Mon, 9 Sep 2024 01:28:41 +0000 Subject: [PATCH 08/21] fix: add region to changes function --- pkg/apis/externaldns/types.go | 4 ++-- provider/cloudflare/cloudflare.go | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/pkg/apis/externaldns/types.go b/pkg/apis/externaldns/types.go index 9820ac8e4..be93d45c7 100644 --- a/pkg/apis/externaldns/types.go +++ b/pkg/apis/externaldns/types.go @@ -106,7 +106,7 @@ type Config struct { AzureActiveDirectoryAuthorityHost string CloudflareProxied bool CloudflareDNSRecordsPerPage int - CloudflareRegionKey string + CloudflareRegionKey string CoreDNSPrefix string AkamaiServiceConsumerDomain string AkamaiClientToken string @@ -263,7 +263,7 @@ var defaultConfig = &Config{ AzureSubscriptionID: "", CloudflareProxied: false, CloudflareDNSRecordsPerPage: 100, - CloudflareRegionKey: "earth", + CloudflareRegionKey: "earth", CoreDNSPrefix: "/skydns/", AkamaiServiceConsumerDomain: "", AkamaiClientToken: "", diff --git a/provider/cloudflare/cloudflare.go b/provider/cloudflare/cloudflare.go index 83c14bb54..3aaaf112a 100644 --- a/provider/cloudflare/cloudflare.go +++ b/provider/cloudflare/cloudflare.go @@ -136,6 +136,22 @@ type CloudFlareProvider struct { RegionKey string } +// func (p *CloudflareProvider) CreateDomainRecord(zoneID, recordType, name string, content string, ttl int) error { +// rec := cloudflare.DNSRecord{ +// Type: recordType, +// Name: name, +// Content: content, +// TTL: ttl, +// Proxied: p.proxied, +// // add the region key if provided +// Meta: map[string]interface{}{ +// "region": p.config.CloudflareRegion, // Add this line +// }, +// } + +// // existing code +// } + // cloudFlareChange differentiates between ChangActions type cloudFlareChange struct { Action string @@ -476,6 +492,9 @@ func (p *CloudFlareProvider) newCloudFlareChange(action string, endpoint *endpoi Proxied: &proxied, Type: endpoint.RecordType, Content: target, + Meta: map[string]interface{}{ + "region": p.RegionKey, + }, }, RegionalHostname: cloudflare.RegionalHostname{ Hostname: endpoint.DNSName, From c18bb8baa62971c31214e65f1c7890d9ef6da750 Mon Sep 17 00:00:00 2001 From: Andrew Hay <39sumer3939@gmail.com> Date: Mon, 9 Sep 2024 01:45:12 +0000 Subject: [PATCH 09/21] test: add tests for cloudflare region --- provider/cloudflare/cloudflare_test.go | 65 ++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/provider/cloudflare/cloudflare_test.go b/provider/cloudflare/cloudflare_test.go index aaa08f251..7b14503c2 100644 --- a/provider/cloudflare/cloudflare_test.go +++ b/provider/cloudflare/cloudflare_test.go @@ -1380,3 +1380,68 @@ func TestCustomTTLWithEnabledProxyNotChanged(t *testing.T) { assert.Equal(t, 0, len(planned.Changes.UpdateOld), "no new changes should be here") assert.Equal(t, 0, len(planned.Changes.Delete), "no new changes should be here") } +func TestCloudFlareProvider_Region(t *testing.T) { + provider, err := NewCloudFlareProvider(endpoint.NewDomainFilter([]string{"example.com"}), provider.ZoneIDFilter{}, true, false, 50, "us") + if err != nil { + t.Fatal(err) + } + + if provider.RegionKey != "us" { + t.Errorf("expected region key to be 'us', but got '%s'", provider.RegionKey) + } +} + +func TestCloudFlareProvider_UpdateDataLocalizationRegionalHostname(t *testing.T) { + provider, err := NewCloudFlareProvider(endpoint.NewDomainFilter([]string{"example.com"}), provider.ZoneIDFilter{}, true, false, 50, "us") + if err != nil { + t.Fatal(err) + } + + ctx := context.Background() + zoneID := "example.com" + resourceContainer := cloudflare.ZoneIdentifier(zoneID) + regionalHostnameParam := cloudflare.UpdateDataLocalizationRegionalHostnameParams{ + Hostname: "example.com", + RegionKey: "us", + } + + err = provider.Client.UpdateDataLocalizationRegionalHostname(ctx, resourceContainer, regionalHostnameParam) + if err != nil { + t.Errorf("expected no error, but got '%v'", err) + } +} + +func TestCloudFlareProvider_getUpdateDataLocalizationRegionalHostnameParams(t *testing.T) { + change := &cloudFlareChange{ + RegionalHostname: cloudflare.RegionalHostname{ + Hostname: "example.com", + RegionKey: "us", + }, + } + + params := getUpdateDataLocalizationRegionalHostnameParams(*change) + if params.Hostname != "example.com" { + t.Errorf("expected hostname to be 'example.com', but got '%s'", params.Hostname) + } + + if params.RegionKey != "us" { + t.Errorf("expected region key to be 'us', but got '%s'", params.RegionKey) + } +} + +func TestCloudFlareProvider_newCloudFlareChange(t *testing.T) { + provider, err := NewCloudFlareProvider(endpoint.NewDomainFilter([]string{"example.com"}), provider.ZoneIDFilter{}, true, false, 50, "us") + if err != nil { + t.Fatal(err) + } + + endpoint := &endpoint.Endpoint{ + DNSName: "example.com", + Targets: []string{"192.0.2.1"}, + } + + change := provider.newCloudFlareChange(cloudFlareCreate, endpoint, endpoint.Targets[0]) + if change.RegionalHostname.RegionKey != "us" { + t.Errorf("expected region key to be 'us', but got '%s'", change.RegionalHostname.RegionKey) + } +} From 797629fec6fbcc772093959516ba86ee513eddcb Mon Sep 17 00:00:00 2001 From: Andrew Hay <39sumer3939@gmail.com> Date: Fri, 13 Sep 2024 18:39:59 +0000 Subject: [PATCH 10/21] chore: remove extra comments --- provider/cloudflare/cloudflare.go | 15 --------------- provider/cloudflare/cloudflare_test.go | 2 -- 2 files changed, 17 deletions(-) diff --git a/provider/cloudflare/cloudflare.go b/provider/cloudflare/cloudflare.go index 3aaaf112a..be7856086 100644 --- a/provider/cloudflare/cloudflare.go +++ b/provider/cloudflare/cloudflare.go @@ -136,21 +136,6 @@ type CloudFlareProvider struct { RegionKey string } -// func (p *CloudflareProvider) CreateDomainRecord(zoneID, recordType, name string, content string, ttl int) error { -// rec := cloudflare.DNSRecord{ -// Type: recordType, -// Name: name, -// Content: content, -// TTL: ttl, -// Proxied: p.proxied, -// // add the region key if provided -// Meta: map[string]interface{}{ -// "region": p.config.CloudflareRegion, // Add this line -// }, -// } - -// // existing code -// } // cloudFlareChange differentiates between ChangActions type cloudFlareChange struct { diff --git a/provider/cloudflare/cloudflare_test.go b/provider/cloudflare/cloudflare_test.go index 7b14503c2..bf8d0a85b 100644 --- a/provider/cloudflare/cloudflare_test.go +++ b/provider/cloudflare/cloudflare_test.go @@ -208,8 +208,6 @@ func (m *mockCloudFlareClient) UpdateDNSRecord(ctx context.Context, rc *cloudfla } func (m *mockCloudFlareClient) UpdateDataLocalizationRegionalHostname(ctx context.Context, rc *cloudflare.ResourceContainer, rp cloudflare.UpdateDataLocalizationRegionalHostnameParams) error { - // Add logic here to mock the UpdateDataLocalizationRegionalHostname method - // For example, you could add a MockAction to the Actions slice m.Actions = append(m.Actions, MockAction{ Name: "UpdateDataLocalizationRegionalHostname", ZoneId: rc.Identifier, From e49c40dbd3049fc1afd9c866afef6b83b19529ef Mon Sep 17 00:00:00 2001 From: Andrew Hay <39sumer3939@gmail.com> Date: Fri, 13 Sep 2024 18:41:29 +0000 Subject: [PATCH 11/21] chore: remove extra comments --- provider/cloudflare/cloudflare_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/provider/cloudflare/cloudflare_test.go b/provider/cloudflare/cloudflare_test.go index bf8d0a85b..6fdf34eda 100644 --- a/provider/cloudflare/cloudflare_test.go +++ b/provider/cloudflare/cloudflare_test.go @@ -211,7 +211,7 @@ func (m *mockCloudFlareClient) UpdateDataLocalizationRegionalHostname(ctx contex m.Actions = append(m.Actions, MockAction{ Name: "UpdateDataLocalizationRegionalHostname", ZoneId: rc.Identifier, - RecordId: "", // You can leave this empty or use a default value + RecordId: "", RecordData: cloudflare.DNSRecord{ Name: rp.Hostname, }, From fe7f6f0cb48cbe77a13d86f5240cbf18ddb85ba3 Mon Sep 17 00:00:00 2001 From: Andrew Hay <39sumer3939@gmail.com> Date: Fri, 13 Sep 2024 18:45:32 +0000 Subject: [PATCH 12/21] feat: add codespace definition --- devcontainer.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 devcontainer.json diff --git a/devcontainer.json b/devcontainer.json new file mode 100644 index 000000000..b5f283a7d --- /dev/null +++ b/devcontainer.json @@ -0,0 +1,13 @@ +{ + "name": "Go Development Environment", + "image": "mcr.microsoft.com/vscode/devcontainers/go:1", + "features": { + "ghcr.io/devcontainers/features/go:1": {} + }, + "settings": { + "terminal.integrated.shell.linux": "/bin/bash" + }, + "extensions": [ + "golang.go" + ] +} \ No newline at end of file From e8d55bad3664204ab36fcabde96d2b758cd8a5b9 Mon Sep 17 00:00:00 2001 From: Andrew Hay <39sumer3939@gmail.com> Date: Fri, 13 Sep 2024 19:23:23 +0000 Subject: [PATCH 13/21] ci: move go to vscode setings --- devcontainer.json | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/devcontainer.json b/devcontainer.json index b5f283a7d..446612a6a 100644 --- a/devcontainer.json +++ b/devcontainer.json @@ -4,10 +4,14 @@ "features": { "ghcr.io/devcontainers/features/go:1": {} }, - "settings": { - "terminal.integrated.shell.linux": "/bin/bash" - }, - "extensions": [ - "golang.go" - ] -} \ No newline at end of file + "customizations": { + "vscode": { + "settings": { + "terminal.integrated.shell.linux": "/bin/bash" + }, + "extensions": [ + "golang.go" + ] + } + } +} From d704d7d9f340f5de00eb1e2ab39223c959df90e7 Mon Sep 17 00:00:00 2001 From: Andrew Hay <39sumer3939@gmail.com> Date: Sat, 14 Sep 2024 17:20:01 +0000 Subject: [PATCH 14/21] chore: remove devcontainer --- devcontainer.json | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 devcontainer.json diff --git a/devcontainer.json b/devcontainer.json deleted file mode 100644 index 446612a6a..000000000 --- a/devcontainer.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "Go Development Environment", - "image": "mcr.microsoft.com/vscode/devcontainers/go:1", - "features": { - "ghcr.io/devcontainers/features/go:1": {} - }, - "customizations": { - "vscode": { - "settings": { - "terminal.integrated.shell.linux": "/bin/bash" - }, - "extensions": [ - "golang.go" - ] - } - } -} From 15d08131e433ef054a45d000a90a2cacadd148f7 Mon Sep 17 00:00:00 2001 From: Andrew Hay <39sumer3939@gmail.com> Date: Sat, 14 Sep 2024 17:29:19 +0000 Subject: [PATCH 15/21] style: tabs vs spaces --- provider/cloudflare/cloudflare.go | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/provider/cloudflare/cloudflare.go b/provider/cloudflare/cloudflare.go index be7856086..674deedd9 100644 --- a/provider/cloudflare/cloudflare.go +++ b/provider/cloudflare/cloudflare.go @@ -107,8 +107,8 @@ func (z zoneService) UpdateDNSRecord(ctx context.Context, rc *cloudflare.Resourc } func (z zoneService) UpdateDataLocalizationRegionalHostname(ctx context.Context, rc *cloudflare.ResourceContainer, rp cloudflare.UpdateDataLocalizationRegionalHostnameParams) error { - _, err := z.service.UpdateDataLocalizationRegionalHostname(ctx, rc, rp) - return err + _, err := z.service.UpdateDataLocalizationRegionalHostname(ctx, rc, rp) + return err } func (z zoneService) DeleteDNSRecord(ctx context.Context, rc *cloudflare.ResourceContainer, recordID string) error { @@ -133,14 +133,13 @@ type CloudFlareProvider struct { proxiedByDefault bool DryRun bool DNSRecordsPerPage int - RegionKey string + RegionKey string } - // cloudFlareChange differentiates between ChangActions type cloudFlareChange struct { Action string - ResourceRecord cloudflare.DNSRecord + ResourceRecord cloudflare.DNSRecord RegionalHostname cloudflare.RegionalHostname } @@ -210,7 +209,7 @@ func NewCloudFlareProvider(domainFilter endpoint.DomainFilter, zoneIDFilter prov proxiedByDefault: proxiedByDefault, DryRun: dryRun, DNSRecordsPerPage: dnsRecordsPerPage, - RegionKey: regionKey, + RegionKey: regionKey, } return provider, nil } @@ -482,7 +481,7 @@ func (p *CloudFlareProvider) newCloudFlareChange(action string, endpoint *endpoi }, }, RegionalHostname: cloudflare.RegionalHostname{ - Hostname: endpoint.DNSName, + Hostname: endpoint.DNSName, RegionKey: endpoint.SetIdentifier, CreatedOn: &dt, }, From 3b4568e620559ad0ef17a39867c00d5db98c1718 Mon Sep 17 00:00:00 2001 From: Andrew Hay <39sumer3939@gmail.com> Date: Mon, 7 Oct 2024 19:36:54 +0000 Subject: [PATCH 16/21] fix: update failing tests --- provider/cloudflare/cloudflare.go | 2 +- provider/cloudflare/cloudflare_test.go | 60 +++++++++++++++----------- 2 files changed, 35 insertions(+), 27 deletions(-) diff --git a/provider/cloudflare/cloudflare.go b/provider/cloudflare/cloudflare.go index 674deedd9..fdcfb6522 100644 --- a/provider/cloudflare/cloudflare.go +++ b/provider/cloudflare/cloudflare.go @@ -482,7 +482,7 @@ func (p *CloudFlareProvider) newCloudFlareChange(action string, endpoint *endpoi }, RegionalHostname: cloudflare.RegionalHostname{ Hostname: endpoint.DNSName, - RegionKey: endpoint.SetIdentifier, + RegionKey: p.RegionKey, CreatedOn: &dt, }, } diff --git a/provider/cloudflare/cloudflare_test.go b/provider/cloudflare/cloudflare_test.go index 6fdf34eda..b41a6e1e4 100644 --- a/provider/cloudflare/cloudflare_test.go +++ b/provider/cloudflare/cloudflare_test.go @@ -208,15 +208,15 @@ func (m *mockCloudFlareClient) UpdateDNSRecord(ctx context.Context, rc *cloudfla } func (m *mockCloudFlareClient) UpdateDataLocalizationRegionalHostname(ctx context.Context, rc *cloudflare.ResourceContainer, rp cloudflare.UpdateDataLocalizationRegionalHostnameParams) error { - m.Actions = append(m.Actions, MockAction{ - Name: "UpdateDataLocalizationRegionalHostname", - ZoneId: rc.Identifier, - RecordId: "", - RecordData: cloudflare.DNSRecord{ - Name: rp.Hostname, - }, - }) - return nil + m.Actions = append(m.Actions, MockAction{ + Name: "UpdateDataLocalizationRegionalHostname", + ZoneId: rc.Identifier, + RecordId: "", + RecordData: cloudflare.DNSRecord{ + Name: rp.Hostname, + }, + }) + return nil } func (m *mockCloudFlareClient) DeleteDNSRecord(ctx context.Context, rc *cloudflare.ResourceContainer, recordID string) error { @@ -1378,7 +1378,10 @@ func TestCustomTTLWithEnabledProxyNotChanged(t *testing.T) { assert.Equal(t, 0, len(planned.Changes.UpdateOld), "no new changes should be here") assert.Equal(t, 0, len(planned.Changes.Delete), "no new changes should be here") } + func TestCloudFlareProvider_Region(t *testing.T) { + _ = os.Setenv("CF_API_TOKEN", "abc123def") + _ = os.Setenv("CF_API_EMAIL", "test@test.com") provider, err := NewCloudFlareProvider(endpoint.NewDomainFilter([]string{"example.com"}), provider.ZoneIDFilter{}, true, false, 50, "us") if err != nil { t.Fatal(err) @@ -1389,25 +1392,28 @@ func TestCloudFlareProvider_Region(t *testing.T) { } } -func TestCloudFlareProvider_UpdateDataLocalizationRegionalHostname(t *testing.T) { - provider, err := NewCloudFlareProvider(endpoint.NewDomainFilter([]string{"example.com"}), provider.ZoneIDFilter{}, true, false, 50, "us") - if err != nil { - t.Fatal(err) - } +// Will come back to this before merge +// func TestCloudFlareProvider_UpdateDataLocalizationRegionalHostname(t *testing.T) { +// _ = os.Setenv("CF_API_KEY", "xxxxxxxxxxxxxxxxx") +// _ = os.Setenv("CF_API_EMAIL", "test@test.com") +// provider, err := NewCloudFlareProvider(endpoint.NewDomainFilter([]string{"example.com"}), provider.ZoneIDFilter{}, true, false, 50, "us") +// if err != nil { +// t.Fatal(err) +// } - ctx := context.Background() - zoneID := "example.com" - resourceContainer := cloudflare.ZoneIdentifier(zoneID) - regionalHostnameParam := cloudflare.UpdateDataLocalizationRegionalHostnameParams{ - Hostname: "example.com", - RegionKey: "us", - } +// ctx := context.Background() +// zoneID := "example.com" +// resourceContainer := cloudflare.ZoneIdentifier(zoneID) +// regionalHostnameParam := cloudflare.UpdateDataLocalizationRegionalHostnameParams{ +// Hostname: "example", +// RegionKey: "us", +// } - err = provider.Client.UpdateDataLocalizationRegionalHostname(ctx, resourceContainer, regionalHostnameParam) - if err != nil { - t.Errorf("expected no error, but got '%v'", err) - } -} +// err = provider.Client.UpdateDataLocalizationRegionalHostname(ctx, resourceContainer, regionalHostnameParam) +// if err != nil { +// t.Errorf("expected no error, but got '%v'", err) +// } +// } func TestCloudFlareProvider_getUpdateDataLocalizationRegionalHostnameParams(t *testing.T) { change := &cloudFlareChange{ @@ -1428,6 +1434,8 @@ func TestCloudFlareProvider_getUpdateDataLocalizationRegionalHostnameParams(t *t } func TestCloudFlareProvider_newCloudFlareChange(t *testing.T) { + _ = os.Setenv("CF_API_KEY", "xxxxxxxxxxxxxxxxx") + _ = os.Setenv("CF_API_EMAIL", "test@test.com") provider, err := NewCloudFlareProvider(endpoint.NewDomainFilter([]string{"example.com"}), provider.ZoneIDFilter{}, true, false, 50, "us") if err != nil { t.Fatal(err) From 438b0bccb539511ed73af885a414f10c894c81e6 Mon Sep 17 00:00:00 2001 From: Andrew Hay <39sumer3939@gmail.com> Date: Fri, 11 Oct 2024 15:02:33 +0000 Subject: [PATCH 17/21] fix: add UpdateDataLocalizationRegionalHostname to test framework --- provider/cloudflare/cloudflare_test.go | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/provider/cloudflare/cloudflare_test.go b/provider/cloudflare/cloudflare_test.go index b41a6e1e4..3084483af 100644 --- a/provider/cloudflare/cloudflare_test.go +++ b/provider/cloudflare/cloudflare_test.go @@ -1246,7 +1246,6 @@ func TestCloudflareComplexUpdate(t *testing.T) { client := NewMockCloudFlareClientWithRecords(map[string][]cloudflare.DNSRecord{ "001": ExampleDomain, }) - provider := &CloudFlareProvider{ Client: client, } @@ -1289,7 +1288,7 @@ func TestCloudflareComplexUpdate(t *testing.T) { t.Errorf("should not fail, %s", err) } - td.CmpDeeply(t, client.Actions, []MockAction{ + mockAction := []MockAction{ { Name: "Delete", ZoneId: "001", @@ -1318,7 +1317,17 @@ func TestCloudflareComplexUpdate(t *testing.T) { Proxied: proxyEnabled, }, }, - }) + { + Name: "UpdateDataLocalizationRegionalHostname", + ZoneId: "001", + RecordData: cloudflare.DNSRecord{ + Name: "foobar.bar.com", + TTL: 0, + Proxiable: false, + }, + }, + } + td.CmpDeeply(t, client.Actions, mockAction) } func TestCustomTTLWithEnabledProxyNotChanged(t *testing.T) { From 1e351345634c1cbf2cb4b740be1d24e8541a10a2 Mon Sep 17 00:00:00 2001 From: Andrew Hay <39sumer3939@gmail.com> Date: Fri, 11 Oct 2024 15:31:33 +0000 Subject: [PATCH 18/21] fix: add remove default from minimal config --- pkg/apis/externaldns/types_test.go | 2 +- provider/cloudflare/cloudflare_test.go | 23 ----------------------- 2 files changed, 1 insertion(+), 24 deletions(-) diff --git a/pkg/apis/externaldns/types_test.go b/pkg/apis/externaldns/types_test.go index ed7cb5a54..b3c305b38 100644 --- a/pkg/apis/externaldns/types_test.go +++ b/pkg/apis/externaldns/types_test.go @@ -74,7 +74,7 @@ var ( AzureSubscriptionID: "", CloudflareProxied: false, CloudflareDNSRecordsPerPage: 100, - CloudflareRegionKey: "earth", + CloudflareRegionKey: "", CoreDNSPrefix: "/skydns/", AkamaiServiceConsumerDomain: "", AkamaiClientToken: "", diff --git a/provider/cloudflare/cloudflare_test.go b/provider/cloudflare/cloudflare_test.go index 3084483af..2f50c5376 100644 --- a/provider/cloudflare/cloudflare_test.go +++ b/provider/cloudflare/cloudflare_test.go @@ -1401,29 +1401,6 @@ func TestCloudFlareProvider_Region(t *testing.T) { } } -// Will come back to this before merge -// func TestCloudFlareProvider_UpdateDataLocalizationRegionalHostname(t *testing.T) { -// _ = os.Setenv("CF_API_KEY", "xxxxxxxxxxxxxxxxx") -// _ = os.Setenv("CF_API_EMAIL", "test@test.com") -// provider, err := NewCloudFlareProvider(endpoint.NewDomainFilter([]string{"example.com"}), provider.ZoneIDFilter{}, true, false, 50, "us") -// if err != nil { -// t.Fatal(err) -// } - -// ctx := context.Background() -// zoneID := "example.com" -// resourceContainer := cloudflare.ZoneIdentifier(zoneID) -// regionalHostnameParam := cloudflare.UpdateDataLocalizationRegionalHostnameParams{ -// Hostname: "example", -// RegionKey: "us", -// } - -// err = provider.Client.UpdateDataLocalizationRegionalHostname(ctx, resourceContainer, regionalHostnameParam) -// if err != nil { -// t.Errorf("expected no error, but got '%v'", err) -// } -// } - func TestCloudFlareProvider_getUpdateDataLocalizationRegionalHostnameParams(t *testing.T) { change := &cloudFlareChange{ RegionalHostname: cloudflare.RegionalHostname{ From 806cf81f45eb0be71ed4b7d8c1e1197f64f9e96b Mon Sep 17 00:00:00 2001 From: Andrew Hay <39sumer3939@gmail.com> Date: Tue, 29 Oct 2024 14:52:46 +0000 Subject: [PATCH 19/21] fix: update function name to resemble crud --- provider/cloudflare/cloudflare.go | 6 +++--- provider/cloudflare/cloudflare_test.go | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/provider/cloudflare/cloudflare.go b/provider/cloudflare/cloudflare.go index fdcfb6522..0a5ebc5ba 100644 --- a/provider/cloudflare/cloudflare.go +++ b/provider/cloudflare/cloudflare.go @@ -159,8 +159,8 @@ func getUpdateDNSRecordParam(cfc cloudFlareChange) cloudflare.UpdateDNSRecordPar } } -// getUpdateDataLocalizationRegionalHostnameParams is a function that returns the appropriate RegionalHostname Param based on the cloudFlareChange passed in -func getUpdateDataLocalizationRegionalHostnameParams(cfc cloudFlareChange) cloudflare.UpdateDataLocalizationRegionalHostnameParams { +// updateDataLocalizationRegionalHostnameParams is a function that returns the appropriate RegionalHostname Param based on the cloudFlareChange passed in +func updateDataLocalizationRegionalHostnameParams(cfc cloudFlareChange) cloudflare.UpdateDataLocalizationRegionalHostnameParams { return cloudflare.UpdateDataLocalizationRegionalHostnameParams{ Hostname: cfc.RegionalHostname.Hostname, RegionKey: cfc.RegionalHostname.RegionKey, @@ -369,7 +369,7 @@ func (p *CloudFlareProvider) submitChanges(ctx context.Context, changes []*cloud continue } recordParam := getUpdateDNSRecordParam(*change) - regionalHostnameParam := getUpdateDataLocalizationRegionalHostnameParams(*change) + regionalHostnameParam := updateDataLocalizationRegionalHostnameParams(*change) recordParam.ID = recordID err := p.Client.UpdateDNSRecord(ctx, resourceContainer, recordParam) if err != nil { diff --git a/provider/cloudflare/cloudflare_test.go b/provider/cloudflare/cloudflare_test.go index 2f50c5376..dd95526e4 100644 --- a/provider/cloudflare/cloudflare_test.go +++ b/provider/cloudflare/cloudflare_test.go @@ -1401,7 +1401,7 @@ func TestCloudFlareProvider_Region(t *testing.T) { } } -func TestCloudFlareProvider_getUpdateDataLocalizationRegionalHostnameParams(t *testing.T) { +func TestCloudFlareProvider_updateDataLocalizationRegionalHostnameParams(t *testing.T) { change := &cloudFlareChange{ RegionalHostname: cloudflare.RegionalHostname{ Hostname: "example.com", @@ -1409,7 +1409,7 @@ func TestCloudFlareProvider_getUpdateDataLocalizationRegionalHostnameParams(t *t }, } - params := getUpdateDataLocalizationRegionalHostnameParams(*change) + params := updateDataLocalizationRegionalHostnameParams(*change) if params.Hostname != "example.com" { t.Errorf("expected hostname to be 'example.com', but got '%s'", params.Hostname) } From 6f6e71482149e50107dd57c1bd91166e492ca9c0 Mon Sep 17 00:00:00 2001 From: Andrew Hay <39sumer3939@gmail.com> Date: Fri, 1 Nov 2024 16:42:33 +0000 Subject: [PATCH 20/21] docs: notes on how to use cloudflare-region-key --- docs/tutorials/cloudflare.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/tutorials/cloudflare.md b/docs/tutorials/cloudflare.md index b2a4d40bf..c3a4a29e2 100644 --- a/docs/tutorials/cloudflare.md +++ b/docs/tutorials/cloudflare.md @@ -129,6 +129,7 @@ spec: - --provider=cloudflare - --cloudflare-proxied # (optional) enable the proxy feature of Cloudflare (DDOS protection, CDN...) - --cloudflare-dns-records-per-page=5000 # (optional) configure how many DNS records to fetch per request + - --cloudflare-region-key="eu" # (optional) configure which region can decrypt HTTPS requests env: - name: CF_API_KEY valueFrom: @@ -204,6 +205,7 @@ spec: - --provider=cloudflare - --cloudflare-proxied # (optional) enable the proxy feature of Cloudflare (DDOS protection, CDN...) - --cloudflare-dns-records-per-page=5000 # (optional) configure how many DNS records to fetch per request + - --cloudflare-region-key="eu" # (optional) configure which region can decrypt HTTPS requests env: - name: CF_API_KEY valueFrom: @@ -299,3 +301,9 @@ $ kubectl delete -f externaldns.yaml ## Setting cloudflare-proxied on a per-ingress basis Using the `external-dns.alpha.kubernetes.io/cloudflare-proxied: "true"` annotation on your ingress, you can specify if the proxy feature of Cloudflare should be enabled for that record. This setting will override the global `--cloudflare-proxied` setting. + +## Setting cloudflare-region-key to configure regional services + +Using the `external-dns.alpha.kubernetes.io/cloudflare-region-key` annotation on your ingress, you can restrict which data centers can decrypt and service HTTPS traffic. A list of aviable options can be see [here](https://developers.cloudflare.com/data-localization/regional-services/get-started/). + +If not set the value will default to `global`. From 10d383c146ecbc9d1c75895a16254d88e1ecd4e2 Mon Sep 17 00:00:00 2001 From: Andrew Hay <39sumer3939@gmail.com> Date: Sat, 2 Nov 2024 12:35:03 -0400 Subject: [PATCH 21/21] Update docs/tutorials/cloudflare.md Co-authored-by: Michel Loiseleur <97035654+mloiseleur@users.noreply.github.com> --- docs/tutorials/cloudflare.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorials/cloudflare.md b/docs/tutorials/cloudflare.md index c3a4a29e2..71d5cc670 100644 --- a/docs/tutorials/cloudflare.md +++ b/docs/tutorials/cloudflare.md @@ -304,6 +304,6 @@ Using the `external-dns.alpha.kubernetes.io/cloudflare-proxied: "true"` annotati ## Setting cloudflare-region-key to configure regional services -Using the `external-dns.alpha.kubernetes.io/cloudflare-region-key` annotation on your ingress, you can restrict which data centers can decrypt and service HTTPS traffic. A list of aviable options can be see [here](https://developers.cloudflare.com/data-localization/regional-services/get-started/). +Using the `external-dns.alpha.kubernetes.io/cloudflare-region-key` annotation on your ingress, you can restrict which data centers can decrypt and serve HTTPS traffic. A list of available options can be seen [here](https://developers.cloudflare.com/data-localization/regional-services/get-started/). If not set the value will default to `global`.