diff --git a/docs/tutorials/civo.md b/docs/tutorials/civo.md index 32166a1e8..7da6cbce0 100644 --- a/docs/tutorials/civo.md +++ b/docs/tutorials/civo.md @@ -2,7 +2,7 @@ This tutorial describes how to setup ExternalDNS for usage within a Kubernetes cluster using Civo DNS Manager. -Make sure to use **>0.12.2** version of ExternalDNS for this tutorial. +Make sure to use **>0.13.5** version of ExternalDNS for this tutorial. ## Managing DNS with Civo @@ -12,8 +12,7 @@ If you want to learn about how to use Civo DNS Manager read the following tutori ## Get Civo Token -Copy the token in the settings fo your account - +Copy the token in the settings for your account The environment variable `CIVO_TOKEN` will be needed to run ExternalDNS with Civo. ## Deploy ExternalDNS diff --git a/provider/civo/civo.go b/provider/civo/civo.go index bd61bd98e..3f6dd9e0e 100644 --- a/provider/civo/civo.go +++ b/provider/civo/civo.go @@ -46,6 +46,11 @@ type CivoChanges struct { Updates []*CivoChangeUpdate } +// Empty returns true if there are no changes +func (c *CivoChanges) Empty() bool { + return len(c.Creates) == 0 && len(c.Updates) == 0 && len(c.Deletes) == 0 +} + // CivoChangeCreate Civo Domain Record Creates type CivoChangeCreate struct { Domain civogo.DNSDomain @@ -169,6 +174,11 @@ func (p *CivoProvider) fetchZones(ctx context.Context) ([]civogo.DNSDomain, erro // submitChanges takes a zone and a collection of Changes and sends them as a single transaction. func (p *CivoProvider) submitChanges(ctx context.Context, changes CivoChanges) error { + if changes.Empty() { + log.Info("All records are already up to date") + return nil + } + for _, change := range changes.Creates { logFields := log.Fields{ "Type": change.Options.Type, diff --git a/provider/civo/civo_test.go b/provider/civo/civo_test.go index 6d637d077..6a05a7d8f 100644 --- a/provider/civo/civo_test.go +++ b/provider/civo/civo_test.go @@ -809,6 +809,154 @@ func TestCivo_submitChangesDelete(t *testing.T) { assert.NoError(t, err) } +func TestCivoChangesEmpty(t *testing.T) { + // Test empty CivoChanges + c := &CivoChanges{} + assert.True(t, c.Empty()) + + // Test CivoChanges with Creates + c = &CivoChanges{ + Creates: []*CivoChangeCreate{ + { + Domain: civogo.DNSDomain{ + ID: "12345", + AccountID: "1", + Name: "example.com", + }, + Options: &civogo.DNSRecordConfig{ + Type: civogo.DNSRecordTypeA, + Name: "www", + Value: "192.1.1.1", + Priority: 0, + TTL: 600, + }, + }, + }, + } + assert.False(t, c.Empty()) + + // Test CivoChanges with Updates + c = &CivoChanges{ + Updates: []*CivoChangeUpdate{ + { + Domain: civogo.DNSDomain{ + ID: "12345", + AccountID: "1", + Name: "example.com", + }, + DomainRecord: civogo.DNSRecord{ + ID: "76cc107f-fbef-4e2b-b97f-f5d34f4075d3", + AccountID: "1", + DNSDomainID: "12345", + Name: "mail", + Value: "192.168.1.2", + Type: "MX", + Priority: 10, + TTL: 600, + }, + Options: civogo.DNSRecordConfig{ + Type: "MX", + Name: "mail", + Value: "192.168.1.3", + Priority: 10, + TTL: 600, + }, + }, + }, + } + assert.False(t, c.Empty()) + + // Test CivoChanges with Deletes + c = &CivoChanges{ + Deletes: []*CivoChangeDelete{ + { + Domain: civogo.DNSDomain{ + ID: "12345", + AccountID: "1", + Name: "example.com", + }, + DomainRecord: civogo.DNSRecord{ + ID: "76cc107f-fbef-4e2b-b97f-f5d34f4075d3", + AccountID: "1", + DNSDomainID: "12345", + Name: "mail", + Value: "192.168.1.3", + Type: "MX", + Priority: 10, + TTL: 600, + }, + }, + }, + } + assert.False(t, c.Empty()) + + // Test CivoChanges with Creates, Updates, and Deletes + c = &CivoChanges{ + Creates: []*CivoChangeCreate{ + { + Domain: civogo.DNSDomain{ + ID: "12345", + AccountID: "1", + Name: "example.com", + }, + Options: &civogo.DNSRecordConfig{ + Type: civogo.DNSRecordTypeA, + Name: "www", + Value: "192.1.1.1", + Priority: 0, + TTL: 600, + }, + }, + }, + Updates: []*CivoChangeUpdate{ + { + Domain: civogo.DNSDomain{ + ID: "12345", + AccountID: "1", + Name: "example.com", + }, + DomainRecord: civogo.DNSRecord{ + ID: "76cc107f-fbef-4e2b-b97f-f5d34f4075d3", + AccountID: "1", + DNSDomainID: "12345", + Name: "mail", + Value: "192.168.1.2", + Type: "MX", + Priority: 10, + TTL: 600, + }, + Options: civogo.DNSRecordConfig{ + Type: "MX", + Name: "mail", + Value: "192.168.1.3", + Priority: 10, + TTL: 600, + }, + }, + }, + Deletes: []*CivoChangeDelete{ + { + Domain: civogo.DNSDomain{ + ID: "12345", + AccountID: "1", + Name: "example.com", + }, + DomainRecord: civogo.DNSRecord{ + ID: "76cc107f-fbef-4e2b-b97f-f5d34f4075d3", + AccountID: "1", + DNSDomainID: "12345", + Name: "mail", + Value: "192.168.1.3", + Type: "MX", + Priority: 10, + TTL: 600, + }, + }, + }, + } + assert.False(t, c.Empty()) +} + // This function is an adapted copy of the testify package's ElementsMatch function with the // call to ObjectsAreEqual replaced with cmp.Equal which better handles struct's with pointers to // other structs. It also ignores ordering when comparing unlike cmp.Equal.