@@ -49,7 +49,6 @@ func resourcePDNSZone() *schema.Resource {
49
49
Type : schema .TypeSet ,
50
50
Elem : & schema.Schema {Type : schema .TypeString },
51
51
Optional : true ,
52
- ForceNew : true ,
53
52
},
54
53
55
54
"masters" : {
@@ -141,7 +140,7 @@ func resourcePDNSZoneRead(d *schema.ResourceData, meta interface{}) error {
141
140
d .Set ("account" , zoneInfo .Account )
142
141
d .Set ("soa_edit_api" , zoneInfo .SoaEditAPI )
143
142
144
- if zoneInfo .Kind != "Slave" {
143
+ if zoneInfo .Kind != "Slave" && len ( d . Get ( "nameservers" ).( * schema. Set ). List ()) > 0 {
145
144
nameservers , err := client .ListRecordsInRRSet (zoneInfo .Name , zoneInfo .Name , "NS" )
146
145
if err != nil {
147
146
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 {
168
167
client := meta .(* Client )
169
168
170
169
zoneInfo := ZoneInfo {}
171
- shouldUpdate := false
172
170
if d .HasChange ("kind" ) {
173
171
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
+ }
175
177
}
176
178
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
+ }
179
224
}
225
+ resourcePDNSZoneRead (d , meta )
180
226
return nil
181
227
}
182
228
0 commit comments