github.com/wangzhucn/terraform@v0.6.7-0.20151109233120-4eea011b56b3/builtin/providers/digitalocean/resource_digitalocean_record_test.go (about) 1 package digitalocean 2 3 import ( 4 "fmt" 5 "strconv" 6 "testing" 7 8 "github.com/digitalocean/godo" 9 "github.com/hashicorp/terraform/helper/resource" 10 "github.com/hashicorp/terraform/terraform" 11 ) 12 13 func TestAccDigitalOceanRecord_Basic(t *testing.T) { 14 var record godo.DomainRecord 15 16 resource.Test(t, resource.TestCase{ 17 PreCheck: func() { testAccPreCheck(t) }, 18 Providers: testAccProviders, 19 CheckDestroy: testAccCheckDigitalOceanRecordDestroy, 20 Steps: []resource.TestStep{ 21 resource.TestStep{ 22 Config: testAccCheckDigitalOceanRecordConfig_basic, 23 Check: resource.ComposeTestCheckFunc( 24 testAccCheckDigitalOceanRecordExists("digitalocean_record.foobar", &record), 25 testAccCheckDigitalOceanRecordAttributes(&record), 26 resource.TestCheckResourceAttr( 27 "digitalocean_record.foobar", "name", "terraform"), 28 resource.TestCheckResourceAttr( 29 "digitalocean_record.foobar", "domain", "foobar-test-terraform.com"), 30 resource.TestCheckResourceAttr( 31 "digitalocean_record.foobar", "value", "192.168.0.10"), 32 ), 33 }, 34 }, 35 }) 36 } 37 38 func TestAccDigitalOceanRecord_Updated(t *testing.T) { 39 var record godo.DomainRecord 40 41 resource.Test(t, resource.TestCase{ 42 PreCheck: func() { testAccPreCheck(t) }, 43 Providers: testAccProviders, 44 CheckDestroy: testAccCheckDigitalOceanRecordDestroy, 45 Steps: []resource.TestStep{ 46 resource.TestStep{ 47 Config: testAccCheckDigitalOceanRecordConfig_basic, 48 Check: resource.ComposeTestCheckFunc( 49 testAccCheckDigitalOceanRecordExists("digitalocean_record.foobar", &record), 50 testAccCheckDigitalOceanRecordAttributes(&record), 51 resource.TestCheckResourceAttr( 52 "digitalocean_record.foobar", "name", "terraform"), 53 resource.TestCheckResourceAttr( 54 "digitalocean_record.foobar", "domain", "foobar-test-terraform.com"), 55 resource.TestCheckResourceAttr( 56 "digitalocean_record.foobar", "value", "192.168.0.10"), 57 resource.TestCheckResourceAttr( 58 "digitalocean_record.foobar", "type", "A"), 59 ), 60 }, 61 resource.TestStep{ 62 Config: testAccCheckDigitalOceanRecordConfig_new_value, 63 Check: resource.ComposeTestCheckFunc( 64 testAccCheckDigitalOceanRecordExists("digitalocean_record.foobar", &record), 65 testAccCheckDigitalOceanRecordAttributesUpdated(&record), 66 resource.TestCheckResourceAttr( 67 "digitalocean_record.foobar", "name", "terraform"), 68 resource.TestCheckResourceAttr( 69 "digitalocean_record.foobar", "domain", "foobar-test-terraform.com"), 70 resource.TestCheckResourceAttr( 71 "digitalocean_record.foobar", "value", "192.168.0.11"), 72 resource.TestCheckResourceAttr( 73 "digitalocean_record.foobar", "type", "A"), 74 ), 75 }, 76 }, 77 }) 78 } 79 80 func TestAccDigitalOceanRecord_HostnameValue(t *testing.T) { 81 var record godo.DomainRecord 82 83 resource.Test(t, resource.TestCase{ 84 PreCheck: func() { testAccPreCheck(t) }, 85 Providers: testAccProviders, 86 CheckDestroy: testAccCheckDigitalOceanRecordDestroy, 87 Steps: []resource.TestStep{ 88 resource.TestStep{ 89 Config: testAccCheckDigitalOceanRecordConfig_cname, 90 Check: resource.ComposeTestCheckFunc( 91 testAccCheckDigitalOceanRecordExists("digitalocean_record.foobar", &record), 92 testAccCheckDigitalOceanRecordAttributesHostname("a", &record), 93 resource.TestCheckResourceAttr( 94 "digitalocean_record.foobar", "name", "terraform"), 95 resource.TestCheckResourceAttr( 96 "digitalocean_record.foobar", "domain", "foobar-test-terraform.com"), 97 resource.TestCheckResourceAttr( 98 "digitalocean_record.foobar", "value", "a.foobar-test-terraform.com."), 99 resource.TestCheckResourceAttr( 100 "digitalocean_record.foobar", "type", "CNAME"), 101 ), 102 }, 103 }, 104 }) 105 } 106 107 func TestAccDigitalOceanRecord_RelativeHostnameValue(t *testing.T) { 108 var record godo.DomainRecord 109 110 resource.Test(t, resource.TestCase{ 111 PreCheck: func() { testAccPreCheck(t) }, 112 Providers: testAccProviders, 113 CheckDestroy: testAccCheckDigitalOceanRecordDestroy, 114 Steps: []resource.TestStep{ 115 resource.TestStep{ 116 Config: testAccCheckDigitalOceanRecordConfig_relative_cname, 117 Check: resource.ComposeTestCheckFunc( 118 testAccCheckDigitalOceanRecordExists("digitalocean_record.foobar", &record), 119 testAccCheckDigitalOceanRecordAttributesHostname("a.b", &record), 120 resource.TestCheckResourceAttr( 121 "digitalocean_record.foobar", "name", "terraform"), 122 resource.TestCheckResourceAttr( 123 "digitalocean_record.foobar", "domain", "foobar-test-terraform.com"), 124 resource.TestCheckResourceAttr( 125 "digitalocean_record.foobar", "value", "a.b"), 126 resource.TestCheckResourceAttr( 127 "digitalocean_record.foobar", "type", "CNAME"), 128 ), 129 }, 130 }, 131 }) 132 } 133 134 func TestAccDigitalOceanRecord_ExternalHostnameValue(t *testing.T) { 135 var record godo.DomainRecord 136 137 resource.Test(t, resource.TestCase{ 138 PreCheck: func() { testAccPreCheck(t) }, 139 Providers: testAccProviders, 140 CheckDestroy: testAccCheckDigitalOceanRecordDestroy, 141 Steps: []resource.TestStep{ 142 resource.TestStep{ 143 Config: testAccCheckDigitalOceanRecordConfig_external_cname, 144 Check: resource.ComposeTestCheckFunc( 145 testAccCheckDigitalOceanRecordExists("digitalocean_record.foobar", &record), 146 testAccCheckDigitalOceanRecordAttributesHostname("a.foobar-test-terraform.net", &record), 147 resource.TestCheckResourceAttr( 148 "digitalocean_record.foobar", "name", "terraform"), 149 resource.TestCheckResourceAttr( 150 "digitalocean_record.foobar", "domain", "foobar-test-terraform.com"), 151 resource.TestCheckResourceAttr( 152 "digitalocean_record.foobar", "value", "a.foobar-test-terraform.net."), 153 resource.TestCheckResourceAttr( 154 "digitalocean_record.foobar", "type", "CNAME"), 155 ), 156 }, 157 }, 158 }) 159 } 160 161 func testAccCheckDigitalOceanRecordDestroy(s *terraform.State) error { 162 client := testAccProvider.Meta().(*godo.Client) 163 164 for _, rs := range s.RootModule().Resources { 165 if rs.Type != "digitalocean_record" { 166 continue 167 } 168 domain := rs.Primary.Attributes["domain"] 169 id, err := strconv.Atoi(rs.Primary.ID) 170 if err != nil { 171 return err 172 } 173 174 _, _, err = client.Domains.Record(domain, id) 175 176 if err == nil { 177 return fmt.Errorf("Record still exists") 178 } 179 } 180 181 return nil 182 } 183 184 func testAccCheckDigitalOceanRecordAttributes(record *godo.DomainRecord) resource.TestCheckFunc { 185 return func(s *terraform.State) error { 186 187 if record.Data != "192.168.0.10" { 188 return fmt.Errorf("Bad value: %s", record.Data) 189 } 190 191 return nil 192 } 193 } 194 195 func testAccCheckDigitalOceanRecordAttributesUpdated(record *godo.DomainRecord) resource.TestCheckFunc { 196 return func(s *terraform.State) error { 197 198 if record.Data != "192.168.0.11" { 199 return fmt.Errorf("Bad value: %s", record.Data) 200 } 201 202 return nil 203 } 204 } 205 206 func testAccCheckDigitalOceanRecordExists(n string, record *godo.DomainRecord) resource.TestCheckFunc { 207 return func(s *terraform.State) error { 208 rs, ok := s.RootModule().Resources[n] 209 210 if !ok { 211 return fmt.Errorf("Not found: %s", n) 212 } 213 214 if rs.Primary.ID == "" { 215 return fmt.Errorf("No Record ID is set") 216 } 217 218 client := testAccProvider.Meta().(*godo.Client) 219 220 domain := rs.Primary.Attributes["domain"] 221 id, err := strconv.Atoi(rs.Primary.ID) 222 if err != nil { 223 return err 224 } 225 226 foundRecord, _, err := client.Domains.Record(domain, id) 227 228 if err != nil { 229 return err 230 } 231 232 if strconv.Itoa(foundRecord.ID) != rs.Primary.ID { 233 return fmt.Errorf("Record not found") 234 } 235 236 *record = *foundRecord 237 238 return nil 239 } 240 } 241 242 func testAccCheckDigitalOceanRecordAttributesHostname(data string, record *godo.DomainRecord) resource.TestCheckFunc { 243 return func(s *terraform.State) error { 244 245 if record.Data != data { 246 return fmt.Errorf("Bad value: expected %s, got %s", data, record.Data) 247 } 248 249 return nil 250 } 251 } 252 253 const testAccCheckDigitalOceanRecordConfig_basic = ` 254 resource "digitalocean_domain" "foobar" { 255 name = "foobar-test-terraform.com" 256 ip_address = "192.168.0.10" 257 } 258 259 resource "digitalocean_record" "foobar" { 260 domain = "${digitalocean_domain.foobar.name}" 261 262 name = "terraform" 263 value = "192.168.0.10" 264 type = "A" 265 }` 266 267 const testAccCheckDigitalOceanRecordConfig_new_value = ` 268 resource "digitalocean_domain" "foobar" { 269 name = "foobar-test-terraform.com" 270 ip_address = "192.168.0.10" 271 } 272 273 resource "digitalocean_record" "foobar" { 274 domain = "${digitalocean_domain.foobar.name}" 275 276 name = "terraform" 277 value = "192.168.0.11" 278 type = "A" 279 }` 280 281 const testAccCheckDigitalOceanRecordConfig_cname = ` 282 resource "digitalocean_domain" "foobar" { 283 name = "foobar-test-terraform.com" 284 ip_address = "192.168.0.10" 285 } 286 287 resource "digitalocean_record" "foobar" { 288 domain = "${digitalocean_domain.foobar.name}" 289 290 name = "terraform" 291 value = "a.foobar-test-terraform.com." 292 type = "CNAME" 293 }` 294 295 const testAccCheckDigitalOceanRecordConfig_relative_cname = ` 296 resource "digitalocean_domain" "foobar" { 297 name = "foobar-test-terraform.com" 298 ip_address = "192.168.0.10" 299 } 300 301 resource "digitalocean_record" "foobar" { 302 domain = "${digitalocean_domain.foobar.name}" 303 304 name = "terraform" 305 value = "a.b" 306 type = "CNAME" 307 }` 308 309 const testAccCheckDigitalOceanRecordConfig_external_cname = ` 310 resource "digitalocean_domain" "foobar" { 311 name = "foobar-test-terraform.com" 312 ip_address = "192.168.0.10" 313 } 314 315 resource "digitalocean_record" "foobar" { 316 domain = "${digitalocean_domain.foobar.name}" 317 318 name = "terraform" 319 value = "a.foobar-test-terraform.net." 320 type = "CNAME" 321 }`