github.com/andresvia/terraform@v0.6.15-0.20160412045437-d51c75946785/builtin/providers/aws/resource_aws_route_test.go (about)

     1  package aws
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  
     7  	"github.com/aws/aws-sdk-go/service/ec2"
     8  	"github.com/hashicorp/terraform/helper/resource"
     9  	"github.com/hashicorp/terraform/terraform"
    10  )
    11  
    12  func TestAccAWSRoute_basic(t *testing.T) {
    13  	var route ec2.Route
    14  
    15  	//aws creates a default route
    16  	testCheck := func(s *terraform.State) error {
    17  		if *route.DestinationCidrBlock != "10.3.0.0/16" {
    18  			return fmt.Errorf("Destination Cidr (Expected=%s, Actual=%s)\n", "10.3.0.0/16", *route.DestinationCidrBlock)
    19  		}
    20  
    21  		name := "aws_internet_gateway.foo"
    22  		gwres, ok := s.RootModule().Resources[name]
    23  		if !ok {
    24  			return fmt.Errorf("Not found: %s\n", name)
    25  		}
    26  
    27  		if *route.GatewayId != gwres.Primary.ID {
    28  			return fmt.Errorf("Internet Gateway Id (Expected=%s, Actual=%s)\n", gwres.Primary.ID, *route.GatewayId)
    29  		}
    30  
    31  		return nil
    32  	}
    33  
    34  	resource.Test(t, resource.TestCase{
    35  		PreCheck: func() {
    36  			testAccPreCheck(t)
    37  		},
    38  		Providers:    testAccProviders,
    39  		CheckDestroy: testAccCheckAWSRouteDestroy,
    40  		Steps: []resource.TestStep{
    41  			resource.TestStep{
    42  				Config: testAccAWSRouteBasicConfig,
    43  				Check: resource.ComposeTestCheckFunc(
    44  					testAccCheckAWSRouteExists("aws_route.bar", &route),
    45  					testCheck,
    46  				),
    47  			},
    48  		},
    49  	})
    50  }
    51  
    52  func TestAccAWSRoute_changeCidr(t *testing.T) {
    53  	var route ec2.Route
    54  	var routeTable ec2.RouteTable
    55  
    56  	//aws creates a default route
    57  	testCheck := func(s *terraform.State) error {
    58  		if *route.DestinationCidrBlock != "10.3.0.0/16" {
    59  			return fmt.Errorf("Destination Cidr (Expected=%s, Actual=%s)\n", "10.3.0.0/16", *route.DestinationCidrBlock)
    60  		}
    61  
    62  		name := "aws_internet_gateway.foo"
    63  		gwres, ok := s.RootModule().Resources[name]
    64  		if !ok {
    65  			return fmt.Errorf("Not found: %s\n", name)
    66  		}
    67  
    68  		if *route.GatewayId != gwres.Primary.ID {
    69  			return fmt.Errorf("Internet Gateway Id (Expected=%s, Actual=%s)\n", gwres.Primary.ID, *route.GatewayId)
    70  		}
    71  
    72  		return nil
    73  	}
    74  
    75  	testCheckChange := func(s *terraform.State) error {
    76  		if *route.DestinationCidrBlock != "10.2.0.0/16" {
    77  			return fmt.Errorf("Destination Cidr (Expected=%s, Actual=%s)\n", "10.2.0.0/16", *route.DestinationCidrBlock)
    78  		}
    79  
    80  		name := "aws_internet_gateway.foo"
    81  		gwres, ok := s.RootModule().Resources[name]
    82  		if !ok {
    83  			return fmt.Errorf("Not found: %s\n", name)
    84  		}
    85  
    86  		if *route.GatewayId != gwres.Primary.ID {
    87  			return fmt.Errorf("Internet Gateway Id (Expected=%s, Actual=%s)\n", gwres.Primary.ID, *route.GatewayId)
    88  		}
    89  
    90  		if rtlen := len(routeTable.Routes); rtlen != 2 {
    91  			return fmt.Errorf("Route Table has too many routes (Expected=%d, Actual=%d)\n", rtlen, 2)
    92  		}
    93  
    94  		return nil
    95  	}
    96  
    97  	resource.Test(t, resource.TestCase{
    98  		PreCheck: func() {
    99  			testAccPreCheck(t)
   100  		},
   101  		Providers:    testAccProviders,
   102  		CheckDestroy: testAccCheckAWSRouteDestroy,
   103  		Steps: []resource.TestStep{
   104  			resource.TestStep{
   105  				Config: testAccAWSRouteBasicConfig,
   106  				Check: resource.ComposeTestCheckFunc(
   107  					testAccCheckAWSRouteExists("aws_route.bar", &route),
   108  					testCheck,
   109  				),
   110  			},
   111  			resource.TestStep{
   112  				Config: testAccAWSRouteBasicConfigChangeCidr,
   113  				Check: resource.ComposeTestCheckFunc(
   114  					testAccCheckAWSRouteExists("aws_route.bar", &route),
   115  					testAccCheckRouteTableExists("aws_route_table.foo", &routeTable),
   116  					testCheckChange,
   117  				),
   118  			},
   119  		},
   120  	})
   121  }
   122  
   123  func TestAccAWSRoute_noopdiff(t *testing.T) {
   124  	var route ec2.Route
   125  	var routeTable ec2.RouteTable
   126  
   127  	testCheck := func(s *terraform.State) error {
   128  		return nil
   129  	}
   130  
   131  	testCheckChange := func(s *terraform.State) error {
   132  		return nil
   133  	}
   134  
   135  	resource.Test(t, resource.TestCase{
   136  		PreCheck: func() {
   137  			testAccPreCheck(t)
   138  		},
   139  		Providers:    testAccProviders,
   140  		CheckDestroy: testAccCheckAWSRouteDestroy,
   141  		Steps: []resource.TestStep{
   142  			resource.TestStep{
   143  				Config: testAccAWSRouteNoopChange,
   144  				Check: resource.ComposeTestCheckFunc(
   145  					testAccCheckAWSRouteExists("aws_route.test", &route),
   146  					testCheck,
   147  				),
   148  			},
   149  			resource.TestStep{
   150  				Config: testAccAWSRouteNoopChange,
   151  				Check: resource.ComposeTestCheckFunc(
   152  					testAccCheckAWSRouteExists("aws_route.test", &route),
   153  					testAccCheckRouteTableExists("aws_route_table.test", &routeTable),
   154  					testCheckChange,
   155  				),
   156  			},
   157  		},
   158  	})
   159  }
   160  
   161  // Acceptance test if mixed inline and external routes are implemented
   162  /*
   163  func TestAccAWSRoute_mix(t *testing.T) {
   164  	var rt ec2.RouteTable
   165  	var route ec2.Route
   166  
   167  	//aws creates a default route
   168  	testCheck := func(s *terraform.State) error {
   169  		if *route.DestinationCidrBlock != "0.0.0.0/0" {
   170  			return fmt.Errorf("Destination Cidr (Expected=%s, Actual=%s)\n", "0.0.0.0/0", *route.DestinationCidrBlock)
   171  		}
   172  
   173  		name := "aws_internet_gateway.foo"
   174  		gwres, ok := s.RootModule().Resources[name]
   175  		if !ok {
   176  			return fmt.Errorf("Not found: %s\n", name)
   177  		}
   178  
   179  		if *route.GatewayId != gwres.Primary.ID {
   180  			return fmt.Errorf("Internet Gateway Id (Expected=%s, Actual=%s)\n", gwres.Primary.ID, *route.GatewayId)
   181  		}
   182  
   183  		if len(rt.Routes) != 3 {
   184  			return fmt.Errorf("bad routes: %#v", rt.Routes)
   185  		}
   186  
   187  		routes := make(map[string]*ec2.Route)
   188  		for _, r := range rt.Routes {
   189  			routes[*r.DestinationCidrBlock] = r
   190  		}
   191  
   192  		if _, ok := routes["10.1.0.0/16"]; !ok {
   193  			return fmt.Errorf("Missing route %s: %#v", "10.1.0.0/16", rt.Routes)
   194  		}
   195  		if _, ok := routes["10.2.0.0/16"]; !ok {
   196  			return fmt.Errorf("Missing route %s: %#v", "10.2.0.0/16", rt.Routes)
   197  		}
   198  		if _, ok := routes["0.0.0.0/0"]; !ok {
   199  			return fmt.Errorf("Missing route %s: %#v", "0.0.0.0/0", rt.Routes)
   200  		}
   201  
   202  		return nil
   203  	}
   204  
   205  	resource.Test(t, resource.TestCase{
   206  		PreCheck:     func() { testAccPreCheck(t) },
   207  		Providers:    testAccProviders,
   208  		CheckDestroy: testAccCheckAWSRouteDestroy,
   209  		Steps: []resource.TestStep{
   210  			resource.TestStep{
   211  				Config: testAccAWSRouteMixConfig,
   212  				Check: resource.ComposeTestCheckFunc(
   213  					testAccCheckRouteTableExists("aws_route_table.foo", &rt),
   214  					testAccCheckAWSRouteExists("aws_route.bar", &route),
   215  					testCheck,
   216  				),
   217  			},
   218  		},
   219  	})
   220  }
   221  */
   222  
   223  func testAccCheckAWSRouteExists(n string, res *ec2.Route) resource.TestCheckFunc {
   224  	return func(s *terraform.State) error {
   225  		rs, ok := s.RootModule().Resources[n]
   226  		if !ok {
   227  			return fmt.Errorf("Not found: %s\n", n)
   228  		}
   229  
   230  		if rs.Primary.ID == "" {
   231  			return fmt.Errorf("No ID is set")
   232  		}
   233  
   234  		conn := testAccProvider.Meta().(*AWSClient).ec2conn
   235  		r, err := findResourceRoute(
   236  			conn,
   237  			rs.Primary.Attributes["route_table_id"],
   238  			rs.Primary.Attributes["destination_cidr_block"],
   239  		)
   240  
   241  		if err != nil {
   242  			return err
   243  		}
   244  
   245  		if r == nil {
   246  			return fmt.Errorf("Route not found")
   247  		}
   248  
   249  		*res = *r
   250  
   251  		return nil
   252  	}
   253  }
   254  
   255  func testAccCheckAWSRouteDestroy(s *terraform.State) error {
   256  	for _, rs := range s.RootModule().Resources {
   257  		if rs.Type != "aws_route" {
   258  			continue
   259  		}
   260  
   261  		conn := testAccProvider.Meta().(*AWSClient).ec2conn
   262  		route, err := findResourceRoute(
   263  			conn,
   264  			rs.Primary.Attributes["route_table_id"],
   265  			rs.Primary.Attributes["destination_cidr_block"],
   266  		)
   267  
   268  		if route == nil && err == nil {
   269  			return nil
   270  		}
   271  	}
   272  
   273  	return nil
   274  }
   275  
   276  var testAccAWSRouteBasicConfig = fmt.Sprint(`
   277  resource "aws_vpc" "foo" {
   278  	cidr_block = "10.1.0.0/16"
   279  }
   280  
   281  resource "aws_internet_gateway" "foo" {
   282  	vpc_id = "${aws_vpc.foo.id}"
   283  }
   284  
   285  resource "aws_route_table" "foo" {
   286  	vpc_id = "${aws_vpc.foo.id}"
   287  }
   288  
   289  resource "aws_route" "bar" {
   290  	route_table_id = "${aws_route_table.foo.id}"
   291  	destination_cidr_block = "10.3.0.0/16"
   292  	gateway_id = "${aws_internet_gateway.foo.id}"
   293  }
   294  `)
   295  
   296  var testAccAWSRouteBasicConfigChangeCidr = fmt.Sprint(`
   297  resource "aws_vpc" "foo" {
   298  	cidr_block = "10.1.0.0/16"
   299  }
   300  
   301  resource "aws_internet_gateway" "foo" {
   302  	vpc_id = "${aws_vpc.foo.id}"
   303  }
   304  
   305  resource "aws_route_table" "foo" {
   306  	vpc_id = "${aws_vpc.foo.id}"
   307  }
   308  
   309  resource "aws_route" "bar" {
   310  	route_table_id = "${aws_route_table.foo.id}"
   311  	destination_cidr_block = "10.2.0.0/16"
   312  	gateway_id = "${aws_internet_gateway.foo.id}"
   313  }
   314  `)
   315  
   316  // Acceptance test if mixed inline and external routes are implemented
   317  var testAccAWSRouteMixConfig = fmt.Sprint(`
   318  resource "aws_vpc" "foo" {
   319  	cidr_block = "10.1.0.0/16"
   320  }
   321  
   322  resource "aws_internet_gateway" "foo" {
   323  	vpc_id = "${aws_vpc.foo.id}"
   324  }
   325  
   326  resource "aws_route_table" "foo" {
   327  	vpc_id = "${aws_vpc.foo.id}"
   328  
   329  	route {
   330  		cidr_block = "10.2.0.0/16"
   331  		gateway_id = "${aws_internet_gateway.foo.id}"
   332  	}
   333  }
   334  
   335  resource "aws_route" "bar" {
   336  	route_table_id = "${aws_route_table.foo.id}"
   337  	destination_cidr_block = "0.0.0.0/0"
   338  	gateway_id = "${aws_internet_gateway.foo.id}"
   339  }
   340  `)
   341  
   342  var testAccAWSRouteNoopChange = fmt.Sprint(`
   343  resource "aws_vpc" "test" {
   344    cidr_block = "10.10.0.0/16"
   345  }
   346  
   347  resource "aws_route_table" "test" {
   348    vpc_id = "${aws_vpc.test.id}"
   349  }
   350  
   351  resource "aws_subnet" "test" {
   352    vpc_id = "${aws_vpc.test.id}"
   353    cidr_block = "10.10.10.0/24"
   354  }
   355  
   356  resource "aws_route" "test" {
   357    route_table_id = "${aws_route_table.test.id}"
   358    destination_cidr_block = "0.0.0.0/0"
   359    instance_id = "${aws_instance.nat.id}"
   360  }
   361  
   362  resource "aws_instance" "nat" {
   363    ami = "ami-9abea4fb"
   364    instance_type = "t2.nano"
   365    subnet_id = "${aws_subnet.test.id}"
   366  }
   367  `)