Skip to content

Commit 52b6376

Browse files
author
Jérôme BECOT
committed
feat: Allow to update NS definition in zone
1 parent ae97f2a commit 52b6376

File tree

1 file changed

+52
-6
lines changed

1 file changed

+52
-6
lines changed

powerdns/resource_powerdns_zone.go

Lines changed: 52 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ func resourcePDNSZone() *schema.Resource {
4949
Type: schema.TypeSet,
5050
Elem: &schema.Schema{Type: schema.TypeString},
5151
Optional: true,
52-
ForceNew: true,
5352
},
5453

5554
"masters": {
@@ -141,7 +140,7 @@ func resourcePDNSZoneRead(d *schema.ResourceData, meta interface{}) error {
141140
d.Set("account", zoneInfo.Account)
142141
d.Set("soa_edit_api", zoneInfo.SoaEditAPI)
143142

144-
if zoneInfo.Kind != "Slave" {
143+
if zoneInfo.Kind != "Slave" && len(d.Get("nameservers").(*schema.Set).List()) > 0 {
145144
nameservers, err := client.ListRecordsInRRSet(zoneInfo.Name, zoneInfo.Name, "NS")
146145
if err != nil {
147146
return fmt.Errorf("couldn't fetch zone %s nameservers from PowerDNS: %v", zoneInfo.Name, err)
@@ -168,15 +167,62 @@ func resourcePDNSZoneUpdate(d *schema.ResourceData, meta interface{}) error {
168167
client := meta.(*Client)
169168

170169
zoneInfo := ZoneInfo{}
171-
shouldUpdate := false
172170
if d.HasChange("kind") {
173171
zoneInfo.Kind = d.Get("kind").(string)
174-
shouldUpdate = true
172+
c := client.UpdateZone(d.Id(), zoneInfo)
173+
174+
if c != nil {
175+
return c
176+
}
175177
}
176178

177-
if shouldUpdate {
178-
return client.UpdateZone(d.Id(), zoneInfo)
179+
if d.HasChange("nameservers") {
180+
nameservers := d.Get("nameservers").(*schema.Set).List()
181+
zone := d.Get("name").(string)
182+
183+
if len(nameservers) > 0 {
184+
nsTTL := 0
185+
nsRecords, _ := client.ListRecordsInRRSet(zone, zone, "NS")
186+
187+
if len(nsRecords) > 0 {
188+
nsTTL = nsRecords[0].TTL
189+
} else {
190+
soaRecord, _ := client.ListRecordsInRRSet(zone, zone, "SOA")
191+
nsTTL = soaRecord[0].TTL
192+
}
193+
194+
rrSet := ResourceRecordSet{
195+
Name: d.Get("name").(string),
196+
Type: "NS",
197+
TTL: nsTTL,
198+
}
199+
200+
records := make([]Record, 0, len(nameservers))
201+
for _, recContent := range nameservers {
202+
records = append(records,
203+
Record{Name: rrSet.Name,
204+
Type: rrSet.Type,
205+
TTL: nsTTL,
206+
Content: recContent.(string),
207+
SetPtr: false})
208+
}
209+
210+
rrSet.Records = records
211+
212+
log.Printf("[DEBUG] Updating PowerDNS NS Record: %#v", rrSet)
213+
214+
_, err := client.ReplaceRecordSet(d.Get("name").(string), rrSet)
215+
if err != nil {
216+
return fmt.Errorf("Failed to update PowerDNS NS Record: %s", err)
217+
}
218+
} else {
219+
err := client.DeleteRecordSet(zone, zone, "NS")
220+
if err != nil {
221+
return fmt.Errorf("Failed to remove PowerDNS NS Record: %s", err)
222+
}
223+
}
179224
}
225+
resourcePDNSZoneRead(d, meta)
180226
return nil
181227
}
182228

0 commit comments

Comments
 (0)