diff --git a/clouddns.go b/clouddns.go index 8520a78..6825997 100644 --- a/clouddns.go +++ b/clouddns.go @@ -175,7 +175,7 @@ func buildNomadDnsChange(dnsSpec *CloudDNSSpec, tasks []TaskInfo, pruneMissing b return nil, err } - ret := buildDnsChange(cloud_rrs, nomad_rrs, &pruneMissing) + ret := buildDnsChange(cloud_rrs, nomad_rrs, pruneMissing) return ret, nil } @@ -322,12 +322,12 @@ func uploadZonefile(dnsSpec *CloudDNSSpec, zoneFilename *string, dryRun *bool, p log.Fatal("Getting RRs for zone:", dnsSpec.zone) } - change := buildDnsChange(cloud_rrs, zone_rrs, pruneMissing) + change := buildDnsChange(cloud_rrs, zone_rrs, *pruneMissing) return processCloudDnsChange(dnsSpec, change) } -func buildDnsChange(cloud_rrs, zone_rrs []*dns.ResourceRecordSet, prune_missing *bool) *dns.Change { +func buildDnsChange(cloud_rrs, zone_rrs []*dns.ResourceRecordSet, prune_missing bool) *dns.Change { ret := dns.Change{} @@ -350,7 +350,7 @@ func buildDnsChange(cloud_rrs, zone_rrs []*dns.ResourceRecordSet, prune_missing ret.Additions = append(ret.Additions, z) } } - if *prune_missing { + if prune_missing { for _, c := range cloud_rrs { found := false if c.Type == "SOA" || c.Type == "NS" { diff --git a/clouddns_test.go b/clouddns_test.go index 086d68f..55b49c5 100644 --- a/clouddns_test.go +++ b/clouddns_test.go @@ -408,3 +408,156 @@ func Test_mergeZoneEntryIntoRrsets(t *testing.T) { }) } } + +func Test_buildTaskInfoToRrsets(t *testing.T) { + test_default_ttl := 60 + type args struct { + tasks []TaskInfo + default_ttl *int + } + tests := []struct { + name string + args args + want []*dns.ResourceRecordSet + wantErr bool + }{ + { + name: "EmptyTaskInfo", + args: args{ + tasks: []TaskInfo{}, + }, + want: []*dns.ResourceRecordSet{}, + wantErr: false, + }, + { + name: "SimpleTaskInfo", + args: args{ + tasks: []TaskInfo{ + { + jobid: "doot", + ip: "1.2.3.4", + }, + }, + default_ttl: &test_default_ttl, + }, + want: []*dns.ResourceRecordSet{ + { + Name: "doot", + Type: "A", + Ttl: int64(test_default_ttl), + Rrdatas: []string{"1.2.3.4"}, + }, + }, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := buildTaskInfoToRrsets(tt.args.tasks, tt.args.default_ttl) + if (err != nil) != tt.wantErr { + t.Errorf("buildTaskInfoToRrsets() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !rrsetListEquals(got, tt.want) { + for _, rr := range tt.want { + t.Logf("Want: %s", describeRrset(rr)) + } + for _, rr := range got { + t.Logf("Got : %s", describeRrset(rr)) + } + t.Errorf("buildTaskInfoToRrsets() = %v, want %v", got, tt.want) + } + }) + } +} + +func Test_buildDnsChange(t *testing.T) { + simpleARecord := &dns.ResourceRecordSet{ + Name: "doot.doot.", + Type: "A", + Rrdatas: []string{"1.2.3.4"}, + } + otherARecord := &dns.ResourceRecordSet{ + Name: "doot.doot.", + Type: "A", + Rrdatas: []string{"5.6.7.8"}, + } + simpleCnameRecord := &dns.ResourceRecordSet{ + Name: "otherdoot.doot.", + Type: "CNAME", + Rrdatas: []string{"doot.doot."}, + } + + type args struct { + cloud_rrs []*dns.ResourceRecordSet + zone_rrs []*dns.ResourceRecordSet + prune_missing bool + } + tests := []struct { + name string + args args + want *dns.Change + }{ + { + name: "BothEmpty", + args: args{ + cloud_rrs: []*dns.ResourceRecordSet{}, + zone_rrs: []*dns.ResourceRecordSet{}, + prune_missing: false, + }, + want: &dns.Change{}, + }, + { + name: "SingleRecordIntoEmptyCloud", + args: args{ + cloud_rrs: []*dns.ResourceRecordSet{}, + zone_rrs: []*dns.ResourceRecordSet{simpleARecord}, + prune_missing: false, + }, + want: &dns.Change{ + Additions: []*dns.ResourceRecordSet{simpleARecord}, + }, + }, + { + name: "AdditionalRecordIntoNonEmptyCloud", + args: args{ + cloud_rrs: []*dns.ResourceRecordSet{simpleCnameRecord}, + zone_rrs: []*dns.ResourceRecordSet{simpleCnameRecord, simpleARecord}, + prune_missing: false, + }, + want: &dns.Change{ + Additions: []*dns.ResourceRecordSet{simpleARecord}, + }, + }, + { + name: "PruneMissing", + args: args{ + cloud_rrs: []*dns.ResourceRecordSet{simpleCnameRecord, simpleARecord}, + zone_rrs: []*dns.ResourceRecordSet{simpleCnameRecord}, + prune_missing: true, + }, + want: &dns.Change{ + Deletions: []*dns.ResourceRecordSet{simpleARecord}, + }, + }, + { + name: "ReplaceExistingRecord", + args: args{ + cloud_rrs: []*dns.ResourceRecordSet{simpleARecord}, + zone_rrs: []*dns.ResourceRecordSet{otherARecord}, + prune_missing: true, + }, + want: &dns.Change{ + Deletions: []*dns.ResourceRecordSet{simpleARecord}, + Additions: []*dns.ResourceRecordSet{otherARecord}, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := buildDnsChange(tt.args.cloud_rrs, tt.args.zone_rrs, tt.args.prune_missing); !reflect.DeepEqual(got, tt.want) { + t.Errorf("buildDnsChange() = %v, want %v", got, tt.want) + } + }) + } +}