github.com/koding/terraform@v0.6.4-0.20170608090606-5d7e0339779d/builtin/providers/azurerm/resource_arm_subnet_test.go (about)

     1  package azurerm
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"net/http"
     7  	"strings"
     8  	"testing"
     9  
    10  	"github.com/hashicorp/terraform/helper/acctest"
    11  	"github.com/hashicorp/terraform/helper/resource"
    12  	"github.com/hashicorp/terraform/terraform"
    13  )
    14  
    15  func TestAccAzureRMSubnet_basic(t *testing.T) {
    16  
    17  	ri := acctest.RandInt()
    18  	config := testAccAzureRMSubnet_basic(ri)
    19  
    20  	resource.Test(t, resource.TestCase{
    21  		PreCheck:     func() { testAccPreCheck(t) },
    22  		Providers:    testAccProviders,
    23  		CheckDestroy: testCheckAzureRMSubnetDestroy,
    24  		Steps: []resource.TestStep{
    25  			resource.TestStep{
    26  				Config: config,
    27  				Check: resource.ComposeTestCheckFunc(
    28  					testCheckAzureRMSubnetExists("azurerm_subnet.test"),
    29  				),
    30  			},
    31  		},
    32  	})
    33  }
    34  
    35  func TestAccAzureRMSubnet_routeTableUpdate(t *testing.T) {
    36  
    37  	ri := acctest.RandInt()
    38  	initConfig := testAccAzureRMSubnet_routeTable(ri)
    39  	updatedConfig := testAccAzureRMSubnet_updatedRouteTable(ri)
    40  
    41  	resource.Test(t, resource.TestCase{
    42  		PreCheck:     func() { testAccPreCheck(t) },
    43  		Providers:    testAccProviders,
    44  		CheckDestroy: testCheckAzureRMSubnetDestroy,
    45  		Steps: []resource.TestStep{
    46  			resource.TestStep{
    47  				Config: initConfig,
    48  				Check: resource.ComposeTestCheckFunc(
    49  					testCheckAzureRMSubnetExists("azurerm_subnet.test"),
    50  				),
    51  			},
    52  
    53  			resource.TestStep{
    54  				Config: updatedConfig,
    55  				Check: resource.ComposeTestCheckFunc(
    56  					testCheckAzureRMSubnetRouteTableExists("azurerm_subnet.test", fmt.Sprintf("acctest-%d", ri)),
    57  				),
    58  			},
    59  		},
    60  	})
    61  }
    62  
    63  func TestAccAzureRMSubnet_disappears(t *testing.T) {
    64  
    65  	ri := acctest.RandInt()
    66  	config := testAccAzureRMSubnet_basic(ri)
    67  
    68  	resource.Test(t, resource.TestCase{
    69  		PreCheck:     func() { testAccPreCheck(t) },
    70  		Providers:    testAccProviders,
    71  		CheckDestroy: testCheckAzureRMSubnetDestroy,
    72  		Steps: []resource.TestStep{
    73  			resource.TestStep{
    74  				Config: config,
    75  				Check: resource.ComposeTestCheckFunc(
    76  					testCheckAzureRMSubnetExists("azurerm_subnet.test"),
    77  					testCheckAzureRMSubnetDisappears("azurerm_subnet.test"),
    78  				),
    79  				ExpectNonEmptyPlan: true,
    80  			},
    81  		},
    82  	})
    83  }
    84  
    85  func testCheckAzureRMSubnetExists(name string) resource.TestCheckFunc {
    86  	return func(s *terraform.State) error {
    87  		// Ensure we have enough information in state to look up in API
    88  		rs, ok := s.RootModule().Resources[name]
    89  		if !ok {
    90  			return fmt.Errorf("Not found: %s", name)
    91  		}
    92  
    93  		log.Printf("[INFO] Checking Subnet addition.")
    94  
    95  		name := rs.Primary.Attributes["name"]
    96  		vnetName := rs.Primary.Attributes["virtual_network_name"]
    97  		resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"]
    98  		if !hasResourceGroup {
    99  			return fmt.Errorf("Bad: no resource group found in state for subnet: %s", name)
   100  		}
   101  
   102  		conn := testAccProvider.Meta().(*ArmClient).subnetClient
   103  
   104  		resp, err := conn.Get(resourceGroup, vnetName, name, "")
   105  		if err != nil {
   106  			return fmt.Errorf("Bad: Get on subnetClient: %s", err)
   107  		}
   108  
   109  		if resp.StatusCode == http.StatusNotFound {
   110  			return fmt.Errorf("Bad: Subnet %q (resource group: %q) does not exist", name, resourceGroup)
   111  		}
   112  
   113  		if resp.RouteTable == nil {
   114  			return fmt.Errorf("Bad: Subnet %q (resource group: %q) does not contain route tables after add", name, resourceGroup)
   115  		}
   116  
   117  		return nil
   118  	}
   119  }
   120  
   121  func testCheckAzureRMSubnetRouteTableExists(subnetName string, routeTableId string) resource.TestCheckFunc {
   122  	return func(s *terraform.State) error {
   123  		// Ensure we have enough information in state to look up in API
   124  		rs, ok := s.RootModule().Resources[subnetName]
   125  		if !ok {
   126  			return fmt.Errorf("Not found: %s", subnetName)
   127  		}
   128  
   129  		log.Printf("[INFO] Checking Subnet update.")
   130  
   131  		name := rs.Primary.Attributes["name"]
   132  		vnetName := rs.Primary.Attributes["virtual_network_name"]
   133  		resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"]
   134  		if !hasResourceGroup {
   135  			return fmt.Errorf("Bad: no resource group found in state for subnet: %s", name)
   136  		}
   137  
   138  		vnetConn := testAccProvider.Meta().(*ArmClient).vnetClient
   139  		vnetResp, vnetErr := vnetConn.Get(resourceGroup, vnetName, "")
   140  		if vnetErr != nil {
   141  			return fmt.Errorf("Bad: Get on vnetClient: %s", vnetErr)
   142  		}
   143  
   144  		if vnetResp.Subnets == nil {
   145  			return fmt.Errorf("Bad: Vnet %q (resource group: %q) does not have subnets after update", vnetName, resourceGroup)
   146  		}
   147  
   148  		conn := testAccProvider.Meta().(*ArmClient).subnetClient
   149  
   150  		resp, err := conn.Get(resourceGroup, vnetName, name, "")
   151  		if err != nil {
   152  			return fmt.Errorf("Bad: Get on subnetClient: %s", err)
   153  		}
   154  
   155  		if resp.StatusCode == http.StatusNotFound {
   156  			return fmt.Errorf("Bad: Subnet %q (resource group: %q) does not exist", subnetName, resourceGroup)
   157  		}
   158  
   159  		if resp.RouteTable == nil {
   160  			return fmt.Errorf("Bad: Subnet %q (resource group: %q) does not contain route tables after update", subnetName, resourceGroup)
   161  		}
   162  
   163  		if !strings.Contains(*resp.RouteTable.ID, routeTableId) {
   164  			return fmt.Errorf("Bad: Subnet %q (resource group: %q) does not have route table %q", subnetName, resourceGroup, routeTableId)
   165  		}
   166  
   167  		return nil
   168  	}
   169  }
   170  
   171  func testCheckAzureRMSubnetDisappears(name string) resource.TestCheckFunc {
   172  	return func(s *terraform.State) error {
   173  		// Ensure we have enough information in state to look up in API
   174  		rs, ok := s.RootModule().Resources[name]
   175  		if !ok {
   176  			return fmt.Errorf("Not found: %s", name)
   177  		}
   178  
   179  		name := rs.Primary.Attributes["name"]
   180  		vnetName := rs.Primary.Attributes["virtual_network_name"]
   181  		resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"]
   182  		if !hasResourceGroup {
   183  			return fmt.Errorf("Bad: no resource group found in state for subnet: %s", name)
   184  		}
   185  
   186  		conn := testAccProvider.Meta().(*ArmClient).subnetClient
   187  
   188  		_, error := conn.Delete(resourceGroup, vnetName, name, make(chan struct{}))
   189  		err := <-error
   190  		if err != nil {
   191  			return fmt.Errorf("Bad: Delete on subnetClient: %s", err)
   192  		}
   193  
   194  		return nil
   195  	}
   196  }
   197  
   198  func testCheckAzureRMSubnetDestroy(s *terraform.State) error {
   199  	conn := testAccProvider.Meta().(*ArmClient).subnetClient
   200  
   201  	for _, rs := range s.RootModule().Resources {
   202  		if rs.Type != "azurerm_subnet" {
   203  			continue
   204  		}
   205  
   206  		name := rs.Primary.Attributes["name"]
   207  		vnetName := rs.Primary.Attributes["virtual_network_name"]
   208  		resourceGroup := rs.Primary.Attributes["resource_group_name"]
   209  
   210  		resp, err := conn.Get(resourceGroup, vnetName, name, "")
   211  
   212  		if err != nil {
   213  			return nil
   214  		}
   215  
   216  		if resp.StatusCode != http.StatusNotFound {
   217  			return fmt.Errorf("Subnet still exists:\n%#v", resp.SubnetPropertiesFormat)
   218  		}
   219  	}
   220  
   221  	return nil
   222  }
   223  
   224  func testAccAzureRMSubnet_basic(rInt int) string {
   225  	return fmt.Sprintf(`
   226  resource "azurerm_resource_group" "test" {
   227      name = "acctestRG-%d"
   228      location = "West US"
   229  }
   230  
   231  resource "azurerm_virtual_network" "test" {
   232      name = "acctestvirtnet%d"
   233      address_space = ["10.0.0.0/16"]
   234      location = "West US"
   235      resource_group_name = "${azurerm_resource_group.test.name}"
   236  }
   237  
   238  resource "azurerm_subnet" "test" {
   239      name = "acctestsubnet%d"
   240      resource_group_name = "${azurerm_resource_group.test.name}"
   241      virtual_network_name = "${azurerm_virtual_network.test.name}"
   242      address_prefix = "10.0.2.0/24"
   243  	route_table_id = "${azurerm_route_table.test.id}" 
   244  }
   245  
   246  resource "azurerm_route_table" "test" {
   247  	name = "acctestroutetable%d"
   248  	resource_group_name = "${azurerm_resource_group.test.name}"
   249  	location = "West US"
   250  }
   251  
   252  resource "azurerm_route" "test" {
   253  	name = "acctestroute%d"
   254  	resource_group_name = "${azurerm_resource_group.test.name}"
   255  	route_table_name  = "${azurerm_route_table.test.name}" 
   256  
   257  	address_prefix = "10.100.0.0/14" 
   258  	next_hop_type = "VirtualAppliance" 
   259  	next_hop_in_ip_address = "10.10.1.1" 
   260  }
   261  `, rInt, rInt, rInt, rInt, rInt)
   262  }
   263  
   264  func testAccAzureRMSubnet_routeTable(rInt int) string {
   265  	return fmt.Sprintf(`
   266  resource "azurerm_resource_group" "test" {
   267      name = "acctestRG-%d"
   268      location = "West US"
   269  }
   270  
   271  resource "azurerm_virtual_network" "test" {
   272      name = "acctestvirtnet%d"
   273      address_space = ["10.0.0.0/16"]
   274      location = "West US"
   275      resource_group_name = "${azurerm_resource_group.test.name}"
   276  }
   277  
   278  resource "azurerm_subnet" "test" {
   279      name = "acctestsubnet%d"
   280      resource_group_name = "${azurerm_resource_group.test.name}"
   281      virtual_network_name = "${azurerm_virtual_network.test.name}"
   282      address_prefix = "10.0.2.0/24"
   283  	route_table_id       = "${azurerm_route_table.test.id}"
   284  }
   285  
   286  resource "azurerm_route_table" "test" {
   287    name                = "acctest-%d"
   288    location            = "West US"
   289    resource_group_name = "${azurerm_resource_group.test.name}"
   290  }
   291  
   292  resource "azurerm_route" "route_a" {
   293    name                = "acctest-%d"
   294    resource_group_name = "${azurerm_resource_group.test.name}"
   295    route_table_name    = "${azurerm_route_table.test.name}"
   296  
   297    address_prefix         = "10.100.0.0/14"
   298    next_hop_type          = "VirtualAppliance"
   299    next_hop_in_ip_address = "10.10.1.1"
   300  }`, rInt, rInt, rInt, rInt, rInt)
   301  }
   302  
   303  func testAccAzureRMSubnet_updatedRouteTable(rInt int) string {
   304  	return fmt.Sprintf(`
   305  resource "azurerm_resource_group" "test" {
   306      name = "acctestRG-%d"
   307      location = "West US"
   308  	tags {
   309  		environment = "Testing"
   310  	}
   311  }
   312  
   313  resource "azurerm_network_security_group" "test_secgroup" {
   314      name = "acctest-%d"
   315      location = "West US"
   316      resource_group_name = "${azurerm_resource_group.test.name}"
   317  
   318      security_rule {
   319          name = "acctest-%d"
   320          priority = 100
   321          direction = "Inbound"
   322          access = "Allow"
   323          protocol = "Tcp"
   324          source_port_range = "*"
   325          destination_port_range = "*"
   326          source_address_prefix = "*"
   327          destination_address_prefix = "*"
   328      }
   329  
   330      tags {
   331          environment = "Testing"
   332      }
   333  }
   334  
   335  resource "azurerm_virtual_network" "test" {
   336      name = "acctestvirtnet%d"
   337      address_space = ["10.0.0.0/16"]
   338      location = "West US"
   339      resource_group_name = "${azurerm_resource_group.test.name}"
   340  	tags {
   341  		environment = "Testing"
   342  	}
   343  }
   344  
   345  resource "azurerm_subnet" "test" {
   346      name = "acctestsubnet%d"
   347      resource_group_name = "${azurerm_resource_group.test.name}"
   348      virtual_network_name = "${azurerm_virtual_network.test.name}"
   349      address_prefix = "10.0.2.0/24"
   350  	route_table_id       = "${azurerm_route_table.test.id}"
   351  }
   352  
   353  resource "azurerm_route_table" "test" {
   354    name                = "acctest-%d"
   355    location            = "West US"
   356    resource_group_name = "${azurerm_resource_group.test.name}"
   357    tags {
   358      environment = "Testing"
   359    }
   360  }
   361  
   362  resource "azurerm_route" "route_a" {
   363    name                = "acctest-%d"
   364    resource_group_name = "${azurerm_resource_group.test.name}"
   365    route_table_name    = "${azurerm_route_table.test.name}"
   366  
   367    address_prefix         = "10.100.0.0/14"
   368    next_hop_type          = "VirtualAppliance"
   369    next_hop_in_ip_address = "10.10.1.1"
   370  }`, rInt, rInt, rInt, rInt, rInt, rInt, rInt)
   371  }