/vendor/github.com/terraform-providers/terraform-provider-aws/aws/resource_aws_route_test.go

https://github.com/kris-nova/terraformctl · Go · 509 lines · 451 code · 54 blank · 4 comment · 34 complexity · 14f5cb8c855f959b01f637aff065495d MD5 · raw file

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