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  `