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 }