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