github.com/cbroglie/terraform@v0.7.0-rc3.0.20170410193827-735dfc416d46/builtin/providers/ns1/resource_record_test.go (about) 1 package ns1 2 3 import ( 4 "fmt" 5 "reflect" 6 "sort" 7 "testing" 8 9 "github.com/hashicorp/terraform/helper/resource" 10 "github.com/hashicorp/terraform/terraform" 11 12 ns1 "gopkg.in/ns1/ns1-go.v2/rest" 13 "gopkg.in/ns1/ns1-go.v2/rest/model/dns" 14 ) 15 16 func TestAccRecord_basic(t *testing.T) { 17 var record dns.Record 18 resource.Test(t, resource.TestCase{ 19 PreCheck: func() { testAccPreCheck(t) }, 20 Providers: testAccProviders, 21 CheckDestroy: testAccCheckRecordDestroy, 22 Steps: []resource.TestStep{ 23 resource.TestStep{ 24 Config: testAccRecordBasic, 25 Check: resource.ComposeTestCheckFunc( 26 testAccCheckRecordExists("ns1_record.it", &record), 27 testAccCheckRecordDomain(&record, "test.terraform-record-test.io"), 28 testAccCheckRecordTTL(&record, 60), 29 testAccCheckRecordUseClientSubnet(&record, true), 30 testAccCheckRecordRegionName(&record, []string{"cal"}), 31 // testAccCheckRecordAnswerMetaWeight(&record, 10), 32 testAccCheckRecordAnswerRdata(&record, "test1.terraform-record-test.io"), 33 ), 34 }, 35 }, 36 }) 37 } 38 39 func TestAccRecord_updated(t *testing.T) { 40 var record dns.Record 41 resource.Test(t, resource.TestCase{ 42 PreCheck: func() { testAccPreCheck(t) }, 43 Providers: testAccProviders, 44 CheckDestroy: testAccCheckRecordDestroy, 45 Steps: []resource.TestStep{ 46 resource.TestStep{ 47 Config: testAccRecordBasic, 48 Check: resource.ComposeTestCheckFunc( 49 testAccCheckRecordExists("ns1_record.it", &record), 50 testAccCheckRecordDomain(&record, "test.terraform-record-test.io"), 51 testAccCheckRecordTTL(&record, 60), 52 testAccCheckRecordUseClientSubnet(&record, true), 53 testAccCheckRecordRegionName(&record, []string{"cal"}), 54 // testAccCheckRecordAnswerMetaWeight(&record, 10), 55 testAccCheckRecordAnswerRdata(&record, "test1.terraform-record-test.io"), 56 ), 57 }, 58 resource.TestStep{ 59 Config: testAccRecordUpdated, 60 Check: resource.ComposeTestCheckFunc( 61 testAccCheckRecordExists("ns1_record.it", &record), 62 testAccCheckRecordDomain(&record, "test.terraform-record-test.io"), 63 testAccCheckRecordTTL(&record, 120), 64 testAccCheckRecordUseClientSubnet(&record, false), 65 testAccCheckRecordRegionName(&record, []string{"ny", "wa"}), 66 // testAccCheckRecordAnswerMetaWeight(&record, 5), 67 testAccCheckRecordAnswerRdata(&record, "test2.terraform-record-test.io"), 68 ), 69 }, 70 }, 71 }) 72 } 73 74 func TestAccRecord_SPF(t *testing.T) { 75 var record dns.Record 76 resource.Test(t, resource.TestCase{ 77 PreCheck: func() { testAccPreCheck(t) }, 78 Providers: testAccProviders, 79 CheckDestroy: testAccCheckRecordDestroy, 80 Steps: []resource.TestStep{ 81 resource.TestStep{ 82 Config: testAccRecordSPF, 83 Check: resource.ComposeTestCheckFunc( 84 testAccCheckRecordExists("ns1_record.spf", &record), 85 testAccCheckRecordDomain(&record, "terraform-record-test.io"), 86 testAccCheckRecordTTL(&record, 86400), 87 testAccCheckRecordUseClientSubnet(&record, true), 88 testAccCheckRecordAnswerRdata(&record, "v=DKIM1; k=rsa; p=XXXXXXXX"), 89 ), 90 }, 91 }, 92 }) 93 } 94 95 func testAccCheckRecordExists(n string, record *dns.Record) resource.TestCheckFunc { 96 return func(s *terraform.State) error { 97 rs, ok := s.RootModule().Resources[n] 98 if !ok { 99 return fmt.Errorf("Not found: %v", n) 100 } 101 102 if rs.Primary.ID == "" { 103 return fmt.Errorf("NoID is set") 104 } 105 106 client := testAccProvider.Meta().(*ns1.Client) 107 108 p := rs.Primary 109 110 foundRecord, _, err := client.Records.Get(p.Attributes["zone"], p.Attributes["domain"], p.Attributes["type"]) 111 if err != nil { 112 return fmt.Errorf("Record not found") 113 } 114 115 if foundRecord.Domain != p.Attributes["domain"] { 116 return fmt.Errorf("Record not found") 117 } 118 119 *record = *foundRecord 120 121 return nil 122 } 123 } 124 125 func testAccCheckRecordDestroy(s *terraform.State) error { 126 client := testAccProvider.Meta().(*ns1.Client) 127 128 var recordDomain string 129 var recordZone string 130 var recordType string 131 132 for _, rs := range s.RootModule().Resources { 133 if rs.Type != "ns1_record" { 134 continue 135 } 136 137 if rs.Type == "ns1_record" { 138 recordType = rs.Primary.Attributes["type"] 139 recordDomain = rs.Primary.Attributes["domain"] 140 recordZone = rs.Primary.Attributes["zone"] 141 } 142 } 143 144 foundRecord, _, err := client.Records.Get(recordZone, recordDomain, recordType) 145 if err != ns1.ErrRecordMissing { 146 return fmt.Errorf("Record still exists: %#v %#v", foundRecord, err) 147 } 148 149 return nil 150 } 151 152 func testAccCheckRecordDomain(r *dns.Record, expected string) resource.TestCheckFunc { 153 return func(s *terraform.State) error { 154 if r.Domain != expected { 155 return fmt.Errorf("Domain: got: %#v want: %#v", r.Domain, expected) 156 } 157 return nil 158 } 159 } 160 161 func testAccCheckRecordTTL(r *dns.Record, expected int) resource.TestCheckFunc { 162 return func(s *terraform.State) error { 163 if r.TTL != expected { 164 return fmt.Errorf("TTL: got: %#v want: %#v", r.TTL, expected) 165 } 166 return nil 167 } 168 } 169 170 func testAccCheckRecordUseClientSubnet(r *dns.Record, expected bool) resource.TestCheckFunc { 171 return func(s *terraform.State) error { 172 if *r.UseClientSubnet != expected { 173 return fmt.Errorf("UseClientSubnet: got: %#v want: %#v", *r.UseClientSubnet, expected) 174 } 175 return nil 176 } 177 } 178 179 func testAccCheckRecordRegionName(r *dns.Record, expected []string) resource.TestCheckFunc { 180 return func(s *terraform.State) error { 181 regions := make([]string, len(r.Regions)) 182 183 i := 0 184 for k := range r.Regions { 185 regions[i] = k 186 i++ 187 } 188 sort.Strings(regions) 189 sort.Strings(expected) 190 if !reflect.DeepEqual(regions, expected) { 191 return fmt.Errorf("Regions: got: %#v want: %#v", regions, expected) 192 } 193 return nil 194 } 195 } 196 197 func testAccCheckRecordAnswerMetaWeight(r *dns.Record, expected float64) resource.TestCheckFunc { 198 return func(s *terraform.State) error { 199 recordAnswer := r.Answers[0] 200 recordMetas := recordAnswer.Meta 201 weight := recordMetas.Weight.(float64) 202 if weight != expected { 203 return fmt.Errorf("Answers[0].Meta.Weight: got: %#v want: %#v", weight, expected) 204 } 205 return nil 206 } 207 } 208 209 func testAccCheckRecordAnswerRdata(r *dns.Record, expected string) resource.TestCheckFunc { 210 return func(s *terraform.State) error { 211 recordAnswer := r.Answers[0] 212 recordAnswerString := recordAnswer.Rdata[0] 213 if recordAnswerString != expected { 214 return fmt.Errorf("Answers[0].Rdata[0]: got: %#v want: %#v", recordAnswerString, expected) 215 } 216 return nil 217 } 218 } 219 220 const testAccRecordBasic = ` 221 resource "ns1_record" "it" { 222 zone = "${ns1_zone.test.zone}" 223 domain = "test.${ns1_zone.test.zone}" 224 type = "CNAME" 225 ttl = 60 226 227 // meta { 228 // weight = 5 229 // connections = 3 230 // // up = false // Ignored by d.GetOk("meta.0.up") due to known issue 231 // } 232 233 answers { 234 answer = "test1.terraform-record-test.io" 235 region = "cal" 236 237 // meta { 238 // weight = 10 239 // up = true 240 // } 241 } 242 243 regions { 244 name = "cal" 245 // meta { 246 // up = true 247 // us_state = ["CA"] 248 // } 249 } 250 251 filters { 252 filter = "up" 253 } 254 255 filters { 256 filter = "geotarget_country" 257 } 258 259 filters { 260 filter = "select_first_n" 261 config = {N=1} 262 } 263 } 264 265 resource "ns1_zone" "test" { 266 zone = "terraform-record-test.io" 267 } 268 ` 269 270 const testAccRecordUpdated = ` 271 resource "ns1_record" "it" { 272 zone = "${ns1_zone.test.zone}" 273 domain = "test.${ns1_zone.test.zone}" 274 type = "CNAME" 275 ttl = 120 276 use_client_subnet = false 277 278 // meta { 279 // weight = 5 280 // connections = 3 281 // // up = false // Ignored by d.GetOk("meta.0.up") due to known issue 282 // } 283 284 answers { 285 answer = "test2.terraform-record-test.io" 286 region = "ny" 287 288 // meta { 289 // weight = 5 290 // up = true 291 // } 292 } 293 294 regions { 295 name = "wa" 296 // meta { 297 // us_state = ["WA"] 298 // } 299 } 300 301 regions { 302 name = "ny" 303 // meta { 304 // us_state = ["NY"] 305 // } 306 } 307 308 filters { 309 filter = "up" 310 } 311 312 filters { 313 filter = "geotarget_country" 314 } 315 } 316 317 resource "ns1_zone" "test" { 318 zone = "terraform-record-test.io" 319 } 320 ` 321 322 const testAccRecordSPF = ` 323 resource "ns1_record" "spf" { 324 zone = "${ns1_zone.test.zone}" 325 domain = "${ns1_zone.test.zone}" 326 type = "SPF" 327 ttl = 86400 328 use_client_subnet = "true" 329 answers = { 330 answer = "v=DKIM1; k=rsa; p=XXXXXXXX" 331 } 332 } 333 334 resource "ns1_zone" "test" { 335 zone = "terraform-record-test.io" 336 } 337 `