github.com/peterbale/terraform@v0.9.0-beta2.0.20170315142748-5723acd55547/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 testAccCheckRecordExists(n string, record *dns.Record) resource.TestCheckFunc {
    75  	return func(s *terraform.State) error {
    76  		rs, ok := s.RootModule().Resources[n]
    77  		if !ok {
    78  			return fmt.Errorf("Not found: %v", n)
    79  		}
    80  
    81  		if rs.Primary.ID == "" {
    82  			return fmt.Errorf("NoID is set")
    83  		}
    84  
    85  		client := testAccProvider.Meta().(*ns1.Client)
    86  
    87  		p := rs.Primary
    88  
    89  		foundRecord, _, err := client.Records.Get(p.Attributes["zone"], p.Attributes["domain"], p.Attributes["type"])
    90  		if err != nil {
    91  			return fmt.Errorf("Record not found")
    92  		}
    93  
    94  		if foundRecord.Domain != p.Attributes["domain"] {
    95  			return fmt.Errorf("Record not found")
    96  		}
    97  
    98  		*record = *foundRecord
    99  
   100  		return nil
   101  	}
   102  }
   103  
   104  func testAccCheckRecordDestroy(s *terraform.State) error {
   105  	client := testAccProvider.Meta().(*ns1.Client)
   106  
   107  	var recordDomain string
   108  	var recordZone string
   109  	var recordType string
   110  
   111  	for _, rs := range s.RootModule().Resources {
   112  		if rs.Type != "ns1_record" {
   113  			continue
   114  		}
   115  
   116  		if rs.Type == "ns1_record" {
   117  			recordType = rs.Primary.Attributes["type"]
   118  			recordDomain = rs.Primary.Attributes["domain"]
   119  			recordZone = rs.Primary.Attributes["zone"]
   120  		}
   121  	}
   122  
   123  	foundRecord, _, err := client.Records.Get(recordDomain, recordZone, recordType)
   124  	if err != nil {
   125  		return fmt.Errorf("Record still exists: %#v", foundRecord)
   126  	}
   127  
   128  	return nil
   129  }
   130  
   131  func testAccCheckRecordDomain(r *dns.Record, expected string) resource.TestCheckFunc {
   132  	return func(s *terraform.State) error {
   133  		if r.Domain != expected {
   134  			return fmt.Errorf("Domain: got: %#v want: %#v", r.Domain, expected)
   135  		}
   136  		return nil
   137  	}
   138  }
   139  
   140  func testAccCheckRecordTTL(r *dns.Record, expected int) resource.TestCheckFunc {
   141  	return func(s *terraform.State) error {
   142  		if r.TTL != expected {
   143  			return fmt.Errorf("TTL: got: %#v want: %#v", r.TTL, expected)
   144  		}
   145  		return nil
   146  	}
   147  }
   148  
   149  func testAccCheckRecordUseClientSubnet(r *dns.Record, expected bool) resource.TestCheckFunc {
   150  	return func(s *terraform.State) error {
   151  		if *r.UseClientSubnet != expected {
   152  			return fmt.Errorf("UseClientSubnet: got: %#v want: %#v", *r.UseClientSubnet, expected)
   153  		}
   154  		return nil
   155  	}
   156  }
   157  
   158  func testAccCheckRecordRegionName(r *dns.Record, expected []string) resource.TestCheckFunc {
   159  	return func(s *terraform.State) error {
   160  		regions := make([]string, len(r.Regions))
   161  
   162  		i := 0
   163  		for k := range r.Regions {
   164  			regions[i] = k
   165  			i++
   166  		}
   167  		sort.Strings(regions)
   168  		sort.Strings(expected)
   169  		if !reflect.DeepEqual(regions, expected) {
   170  			return fmt.Errorf("Regions: got: %#v want: %#v", regions, expected)
   171  		}
   172  		return nil
   173  	}
   174  }
   175  
   176  func testAccCheckRecordAnswerMetaWeight(r *dns.Record, expected float64) resource.TestCheckFunc {
   177  	return func(s *terraform.State) error {
   178  		recordAnswer := r.Answers[0]
   179  		recordMetas := recordAnswer.Meta
   180  		weight := recordMetas.Weight.(float64)
   181  		if weight != expected {
   182  			return fmt.Errorf("Answers[0].Meta.Weight: got: %#v want: %#v", weight, expected)
   183  		}
   184  		return nil
   185  	}
   186  }
   187  
   188  func testAccCheckRecordAnswerRdata(r *dns.Record, expected string) resource.TestCheckFunc {
   189  	return func(s *terraform.State) error {
   190  		recordAnswer := r.Answers[0]
   191  		recordAnswerString := recordAnswer.Rdata[0]
   192  		if recordAnswerString != expected {
   193  			return fmt.Errorf("Answers[0].Rdata[0]: got: %#v want: %#v", recordAnswerString, expected)
   194  		}
   195  		return nil
   196  	}
   197  }
   198  
   199  const testAccRecordBasic = `
   200  resource "ns1_record" "it" {
   201    zone              = "${ns1_zone.test.zone}"
   202    domain            = "test.${ns1_zone.test.zone}"
   203    type              = "CNAME"
   204    ttl               = 60
   205  
   206    // meta {
   207    //   weight = 5
   208    //   connections = 3
   209    //   // up = false // Ignored by d.GetOk("meta.0.up") due to known issue
   210    // }
   211  
   212    answers {
   213      answer = "test1.terraform-record-test.io"
   214      region = "cal"
   215  
   216      // meta {
   217      //   weight = 10
   218      //   up = true
   219      // }
   220    }
   221  
   222    regions {
   223      name = "cal"
   224      // meta {
   225      //   up = true
   226      //   us_state = ["CA"]
   227      // }
   228    }
   229  
   230    filters {
   231      filter = "up"
   232    }
   233  
   234    filters {
   235      filter = "geotarget_country"
   236    }
   237  
   238    filters {
   239      filter = "select_first_n"
   240      config = {N=1}
   241    }
   242  }
   243  
   244  resource "ns1_zone" "test" {
   245    zone = "terraform-record-test.io"
   246  }
   247  `
   248  
   249  const testAccRecordUpdated = `
   250  resource "ns1_record" "it" {
   251    zone              = "${ns1_zone.test.zone}"
   252    domain            = "test.${ns1_zone.test.zone}"
   253    type              = "CNAME"
   254    ttl               = 120
   255    use_client_subnet = false
   256  
   257    // meta {
   258    //   weight = 5
   259    //   connections = 3
   260    //   // up = false // Ignored by d.GetOk("meta.0.up") due to known issue
   261    // }
   262  
   263    answers {
   264      answer = "test2.terraform-record-test.io"
   265      region = "ny"
   266  
   267      // meta {
   268      //   weight = 5
   269      //   up = true
   270      // }
   271    }
   272  
   273    regions {
   274      name = "wa"
   275      // meta {
   276      //   us_state = ["WA"]
   277      // }
   278    }
   279  
   280    regions {
   281      name = "ny"
   282      // meta {
   283      //   us_state = ["NY"]
   284      // }
   285    }
   286  
   287    filters {
   288      filter = "up"
   289    }
   290  
   291    filters {
   292      filter = "geotarget_country"
   293    }
   294  }
   295  
   296  resource "ns1_zone" "test" {
   297    zone = "terraform-record-test.io"
   298  }
   299  `