@@ -3,6 +3,7 @@ package incapsula
33import (
44 "log"
55 "strconv"
6+ "strings"
67
78 "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
89)
@@ -57,9 +58,9 @@ func resourceTXTRecord() *schema.Resource {
5758
5859func resourceTXTRecordCreate (d * schema.ResourceData , m interface {}) error {
5960 // Implement by create the TXT Records
60-
6161 client := m .(* Client )
6262 siteID := d .Get ("site_id" ).(int )
63+
6364 TXTRecordOne := d .Get ("txt_record_value_one" ).(string )
6465 TXTRecordTwo := d .Get ("txt_record_value_two" ).(string )
6566 TXTRecordThree := d .Get ("txt_record_value_three" ).(string )
@@ -76,7 +77,7 @@ func resourceTXTRecordCreate(d *schema.ResourceData, m interface{}) error {
7677 }
7778
7879 // Set the ID
79- d .SetId (d . Get ( "site_id" ).( string ))
80+ d .SetId (strconv . Itoa ( siteID ))
8081 log .Printf ("[INFO] Create Incapsula TXT Records: %s, %s, %s, %s, %s, for siteID: %d\n " , TXTRecordOne , TXTRecordTwo , TXTRecordThree , TXTRecordFour , TXTRecordFive , siteID )
8182
8283 return resourceTXTRecordRead (d , m )
@@ -85,7 +86,19 @@ func resourceTXTRecordCreate(d *schema.ResourceData, m interface{}) error {
8586func resourceTXTRecordUpdate (d * schema.ResourceData , m interface {}) error {
8687 client := m .(* Client )
8788 siteID := d .Get ("site_id" ).(int )
89+ errDelete := deleteSpecificTXTRecordIfNeeded (d , siteID , client )
90+ if errDelete != nil {
91+ return errDelete
92+ }
93+ errUpdate := updateSpecificTXTRecordIfNeeded (d , siteID , client )
94+ if errUpdate != nil {
95+ return errUpdate
96+ }
97+
98+ return resourceTXTRecordRead (d , m )
99+ }
88100
101+ func updateSpecificTXTRecordIfNeeded (d * schema.ResourceData , siteID int , client * Client ) error {
89102 if (d .HasChange ("txt_record_value_one" ) && d .Get ("txt_record_value_one" ) != "" ) ||
90103 (d .HasChange ("txt_record_value_two" ) && d .Get ("txt_record_value_two" ) != "" ) ||
91104 (d .HasChange ("txt_record_value_three" ) && d .Get ("txt_record_value_three" ) != "" ) ||
@@ -106,24 +119,68 @@ func resourceTXTRecordUpdate(d *schema.ResourceData, m interface{}) error {
106119 log .Printf ("[ERROR] Could not set Incapsula TXT Records: %s, %s, %s, %s, %s, for siteID: %d\n %s" , TXTRecordOne , TXTRecordTwo , TXTRecordThree , TXTRecordFour , TXTRecordFive , siteID , err )
107120 return err
108121 }
109-
110122 // Set the ID
111123 log .Printf ("[INFO] Update Incapsula TXT Records: %s, %s, %s, %s, %s, for siteID: %d\n " , TXTRecordOne , TXTRecordTwo , TXTRecordThree , TXTRecordFour , TXTRecordFive , siteID )
112124 }
113- return resourceTXTRecordRead (d , m )
125+ return nil
126+ }
127+
128+ func deleteSpecificTXTRecordIfNeeded (d * schema.ResourceData , siteID int , client * Client ) error {
129+ if d .HasChange ("txt_record_value_one" ) && d .Get ("txt_record_value_one" ) == "" {
130+ log .Printf ("[INFO] Delete Incapsula TXT Record 1, for siteID: %d" , siteID )
131+ err := client .DeleteTXTRecord (siteID , "1" )
132+ if err != nil {
133+ log .Printf ("[ERROR] Could not delete Incapsula TXT Records 1, for siteID: %d\n %s" , siteID , err )
134+ return err
135+ }
136+ } else if d .HasChange ("txt_record_value_two" ) && d .Get ("txt_record_value_two" ) == "" {
137+ log .Printf ("[INFO] Delete Incapsula TXT Record 2, for siteID: %d" , siteID )
138+ err := client .DeleteTXTRecord (siteID , "2" )
139+ if err != nil {
140+ log .Printf ("[ERROR] Could not delete Incapsula TXT Records 2, for siteID: %d\n %s" , siteID , err )
141+ return err
142+ }
143+ } else if d .HasChange ("txt_record_value_three" ) && d .Get ("txt_record_value_three" ) == "" {
144+ log .Printf ("[INFO] Delete Incapsula TXT Record 3, for siteID: %d" , siteID )
145+ err := client .DeleteTXTRecord (siteID , "3" )
146+ if err != nil {
147+ log .Printf ("[ERROR] Could not delete Incapsula TXT Records 3, for siteID: %d\n %s" , siteID , err )
148+ return err
149+ }
150+ } else if d .HasChange ("txt_record_value_four" ) && d .Get ("txt_record_value_four" ) == "" {
151+ log .Printf ("[INFO] Delete Incapsula TXT Record 4, for siteID: %d" , siteID )
152+ err := client .DeleteTXTRecord (siteID , "4" )
153+ if err != nil {
154+ log .Printf ("[ERROR] Could not delete Incapsula TXT Records 4, for siteID: %d\n %s" , siteID , err )
155+ return err
156+ }
157+ } else if d .HasChange ("txt_record_value_five" ) && d .Get ("txt_record_value_five" ) == "" {
158+ log .Printf ("[INFO] Delete Incapsula TXT Record 5, for siteID: %d" , siteID )
159+ err := client .DeleteTXTRecord (siteID , "5" )
160+ if err != nil {
161+ log .Printf ("[ERROR] Could not delete Incapsula TXT Records 5, for siteID: %d\n %s" , siteID , err )
162+ return err
163+ }
164+ }
165+ return nil
114166}
115167
116168func resourceTXTRecordRead (d * schema.ResourceData , m interface {}) error {
117169 // Implement by reading the TXTRecordResponse for the TXT Records
118170 client := m .(* Client )
171+ id , err := strconv .Atoi (d .Id ())
172+ if err != nil {
173+ log .Printf ("[ERROR] The ID should be numeric. Currrent value: %s" , d .Id ())
174+ return err
175+ }
119176
120- id , _ := strconv .Atoi (d .Id ())
121177 recordResponse , err := client .ReadTXTRecords (id )
178+ d .Set ("site_id" , id )
122179
123180 // Gte TXT response object
124181 if recordResponse != nil {
125182 // Res can oscillate between strings and ints
126- if recordResponse .Res == 0 {
183+ if recordResponse .Res == 0 && ! strings . Contains ( recordResponse . ResMessage , "no TXT records" ) {
127184 d .Set ("txt_record_value_one" , recordResponse .TxtRecordValueOne )
128185 d .Set ("txt_record_value_two" , recordResponse .TxtRecordValueTwo )
129186 d .Set ("txt_record_value_three" , recordResponse .TxtRecordValueThree )
@@ -135,47 +192,21 @@ func resourceTXTRecordRead(d *schema.ResourceData, m interface{}) error {
135192 if err != nil {
136193 return err
137194 }
138-
139195 return nil
140196}
141197
142198func resourceTXTRecordDelete (d * schema.ResourceData , m interface {}) error {
143199 // Implement by deleting the a TXT Record
144200 client := m .(* Client )
145- id , _ := strconv .Atoi (d .Id ())
146-
147- if d .HasChange ("txt_record_value_one" ) && d .Get ("txt_record_value_one" ) == "" {
148- log .Printf ("[INFO] Delete Incapsula TXT Record 1, for siteID: %d" , id )
149- err := client .DeleteTXTRecord (id , "1" )
150- if err != nil {
151- log .Printf ("[ERROR] Could not delete Incapsula TXT Records 1, for siteID: %d\n %s" , id , err )
152- }
153- } else if d .HasChange ("txt_record_value_two" ) && d .Get ("txt_record_value_two" ) == "" {
154- log .Printf ("[INFO] Delete Incapsula TXT Record 2, for siteID: %d" , id )
155- err := client .DeleteTXTRecord (id , "2" )
156- if err != nil {
157- log .Printf ("[ERROR] Could not delete Incapsula TXT Records 2, for siteID: %d\n %s" , id , err )
158- }
159- } else if d .HasChange ("txt_record_value_three" ) && d .Get ("txt_record_value_three" ) == "" {
160- log .Printf ("[INFO] Delete Incapsula TXT Record 3, for siteID: %d" , id )
161- err := client .DeleteTXTRecord (id , "3" )
162- if err != nil {
163- log .Printf ("[ERROR] Could not delete Incapsula TXT Records 3, for siteID: %d\n %s" , id , err )
164- }
165- } else if d .HasChange ("txt_record_value_four" ) && d .Get ("txt_record_value_four" ) == "" {
166- log .Printf ("[INFO] Delete Incapsula TXT Record 4, for siteID: %d" , id )
167- err := client .DeleteTXTRecord (id , "4" )
168- if err != nil {
169- log .Printf ("[ERROR] Could not delete Incapsula TXT Records 4, for siteID: %d\n %s" , id , err )
170- }
171- } else if d .HasChange ("txt_record_value_five" ) && d .Get ("txt_record_value_five" ) == "" {
172- log .Printf ("[INFO] Delete Incapsula TXT Record 5, for siteID: %d" , id )
173- err := client .DeleteTXTRecord (id , "5" )
174- if err != nil {
175- log .Printf ("[ERROR] Could not delete Incapsula TXT Records 5, for siteID: %d\n %s" , id , err )
176- }
201+ siteID := d .Get ("site_id" ).(int )
202+ err := client .DeleteTXTRecordAll (siteID )
203+ if err != nil {
204+ log .Printf ("[ERROR] Could not delete all Incapsula TXT Records, for siteID: %d\n %s" , siteID , err )
205+ return err
177206 }
178207
179- // Will not nil the record, they will just be empty on a delete
180- return resourceTXTRecordRead (d , m )
208+ // Set the ID to empty
209+ // Implicitly clears the resource
210+ d .SetId ("" )
211+ return nil
181212}
0 commit comments