github.com/bendemaree/terraform@v0.5.4-0.20150613200311-f50d97d6eee6/builtin/providers/azure/resource_azure_instance_test.go (about) 1 package azure 2 3 import ( 4 "fmt" 5 "testing" 6 7 "github.com/Azure/azure-sdk-for-go/management" 8 "github.com/Azure/azure-sdk-for-go/management/hostedservice" 9 "github.com/Azure/azure-sdk-for-go/management/virtualmachine" 10 "github.com/hashicorp/terraform/helper/resource" 11 "github.com/hashicorp/terraform/terraform" 12 ) 13 14 func TestAccAzureInstance_basic(t *testing.T) { 15 var dpmt virtualmachine.DeploymentResponse 16 17 resource.Test(t, resource.TestCase{ 18 PreCheck: func() { testAccPreCheck(t) }, 19 Providers: testAccProviders, 20 CheckDestroy: testAccCheckAzureInstanceDestroy, 21 Steps: []resource.TestStep{ 22 resource.TestStep{ 23 Config: testAccAzureInstance_basic, 24 Check: resource.ComposeTestCheckFunc( 25 testAccCheckAzureInstanceExists( 26 "azure_instance.foo", &dpmt), 27 testAccCheckAzureInstanceBasicAttributes(&dpmt), 28 resource.TestCheckResourceAttr( 29 "azure_instance.foo", "name", "terraform-test"), 30 resource.TestCheckResourceAttr( 31 "azure_instance.foo", "location", "West US"), 32 resource.TestCheckResourceAttr( 33 "azure_instance.foo", "endpoint.2462817782.public_port", "22"), 34 ), 35 }, 36 }, 37 }) 38 } 39 40 func TestAccAzureInstance_advanced(t *testing.T) { 41 var dpmt virtualmachine.DeploymentResponse 42 43 resource.Test(t, resource.TestCase{ 44 PreCheck: func() { testAccPreCheck(t) }, 45 Providers: testAccProviders, 46 CheckDestroy: testAccCheckAzureInstanceDestroy, 47 Steps: []resource.TestStep{ 48 resource.TestStep{ 49 Config: testAccAzureInstance_advanced, 50 Check: resource.ComposeTestCheckFunc( 51 testAccCheckAzureInstanceExists( 52 "azure_instance.foo", &dpmt), 53 testAccCheckAzureInstanceAdvancedAttributes(&dpmt), 54 resource.TestCheckResourceAttr( 55 "azure_instance.foo", "name", "terraform-test1"), 56 resource.TestCheckResourceAttr( 57 "azure_instance.foo", "size", "Basic_A1"), 58 resource.TestCheckResourceAttr( 59 "azure_instance.foo", "subnet", "subnet1"), 60 resource.TestCheckResourceAttr( 61 "azure_instance.foo", "virtual_network", "terraform-vnet"), 62 resource.TestCheckResourceAttr( 63 "azure_instance.foo", "security_group", "terraform-security-group1"), 64 resource.TestCheckResourceAttr( 65 "azure_instance.foo", "endpoint.1814039778.public_port", "3389"), 66 ), 67 }, 68 }, 69 }) 70 } 71 72 func TestAccAzureInstance_update(t *testing.T) { 73 var dpmt virtualmachine.DeploymentResponse 74 75 resource.Test(t, resource.TestCase{ 76 PreCheck: func() { testAccPreCheck(t) }, 77 Providers: testAccProviders, 78 CheckDestroy: testAccCheckAzureInstanceDestroy, 79 Steps: []resource.TestStep{ 80 resource.TestStep{ 81 Config: testAccAzureInstance_advanced, 82 Check: resource.ComposeTestCheckFunc( 83 testAccCheckAzureInstanceExists( 84 "azure_instance.foo", &dpmt), 85 testAccCheckAzureInstanceAdvancedAttributes(&dpmt), 86 resource.TestCheckResourceAttr( 87 "azure_instance.foo", "name", "terraform-test1"), 88 resource.TestCheckResourceAttr( 89 "azure_instance.foo", "size", "Basic_A1"), 90 resource.TestCheckResourceAttr( 91 "azure_instance.foo", "subnet", "subnet1"), 92 resource.TestCheckResourceAttr( 93 "azure_instance.foo", "virtual_network", "terraform-vnet"), 94 resource.TestCheckResourceAttr( 95 "azure_instance.foo", "security_group", "terraform-security-group1"), 96 resource.TestCheckResourceAttr( 97 "azure_instance.foo", "endpoint.1814039778.public_port", "3389"), 98 ), 99 }, 100 101 resource.TestStep{ 102 Config: testAccAzureInstance_update, 103 Check: resource.ComposeTestCheckFunc( 104 testAccCheckAzureInstanceExists( 105 "azure_instance.foo", &dpmt), 106 testAccCheckAzureInstanceUpdatedAttributes(&dpmt), 107 resource.TestCheckResourceAttr( 108 "azure_instance.foo", "size", "Basic_A2"), 109 resource.TestCheckResourceAttr( 110 "azure_instance.foo", "security_group", "terraform-security-group2"), 111 resource.TestCheckResourceAttr( 112 "azure_instance.foo", "endpoint.1814039778.public_port", "3389"), 113 resource.TestCheckResourceAttr( 114 "azure_instance.foo", "endpoint.3713350066.public_port", "5985"), 115 ), 116 }, 117 }, 118 }) 119 } 120 121 func testAccCheckAzureInstanceExists( 122 n string, 123 dpmt *virtualmachine.DeploymentResponse) resource.TestCheckFunc { 124 return func(s *terraform.State) error { 125 rs, ok := s.RootModule().Resources[n] 126 if !ok { 127 return fmt.Errorf("Not found: %s", n) 128 } 129 130 if rs.Primary.ID == "" { 131 return fmt.Errorf("No instance ID is set") 132 } 133 134 mc := testAccProvider.Meta().(*Client).mgmtClient 135 vm, err := virtualmachine.NewClient(mc).GetDeployment(rs.Primary.ID, rs.Primary.ID) 136 if err != nil { 137 return err 138 } 139 140 if vm.Name != rs.Primary.ID { 141 return fmt.Errorf("Instance not found") 142 } 143 144 *dpmt = vm 145 146 return nil 147 } 148 } 149 150 func testAccCheckAzureInstanceBasicAttributes( 151 dpmt *virtualmachine.DeploymentResponse) resource.TestCheckFunc { 152 return func(s *terraform.State) error { 153 154 if dpmt.Name != "terraform-test" { 155 return fmt.Errorf("Bad name: %s", dpmt.Name) 156 } 157 158 if len(dpmt.RoleList) != 1 { 159 return fmt.Errorf( 160 "Instance %s has an unexpected number of roles: %d", dpmt.Name, len(dpmt.RoleList)) 161 } 162 163 if dpmt.RoleList[0].RoleSize != "Basic_A1" { 164 return fmt.Errorf("Bad size: %s", dpmt.RoleList[0].RoleSize) 165 } 166 167 return nil 168 } 169 } 170 171 func testAccCheckAzureInstanceAdvancedAttributes( 172 dpmt *virtualmachine.DeploymentResponse) resource.TestCheckFunc { 173 return func(s *terraform.State) error { 174 175 if dpmt.Name != "terraform-test1" { 176 return fmt.Errorf("Bad name: %s", dpmt.Name) 177 } 178 179 if dpmt.VirtualNetworkName != "terraform-vnet" { 180 return fmt.Errorf("Bad virtual network: %s", dpmt.VirtualNetworkName) 181 } 182 183 if len(dpmt.RoleList) != 1 { 184 return fmt.Errorf( 185 "Instance %s has an unexpected number of roles: %d", dpmt.Name, len(dpmt.RoleList)) 186 } 187 188 if dpmt.RoleList[0].RoleSize != "Basic_A1" { 189 return fmt.Errorf("Bad size: %s", dpmt.RoleList[0].RoleSize) 190 } 191 192 for _, c := range dpmt.RoleList[0].ConfigurationSets { 193 if c.ConfigurationSetType == virtualmachine.ConfigurationSetTypeNetwork { 194 if len(c.InputEndpoints) != 1 { 195 return fmt.Errorf( 196 "Instance %s has an unexpected number of endpoints %d", 197 dpmt.Name, len(c.InputEndpoints)) 198 } 199 200 if c.InputEndpoints[0].Name != "RDP" { 201 return fmt.Errorf("Bad endpoint name: %s", c.InputEndpoints[0].Name) 202 } 203 204 if c.InputEndpoints[0].Port != 3389 { 205 return fmt.Errorf("Bad endpoint port: %d", c.InputEndpoints[0].Port) 206 } 207 208 if len(c.SubnetNames) != 1 { 209 return fmt.Errorf( 210 "Instance %s has an unexpected number of associated subnets %d", 211 dpmt.Name, len(c.SubnetNames)) 212 } 213 214 if c.SubnetNames[0] != "subnet1" { 215 return fmt.Errorf("Bad subnet: %s", c.SubnetNames[0]) 216 } 217 218 if c.NetworkSecurityGroup != "terraform-security-group1" { 219 return fmt.Errorf("Bad security group: %s", c.NetworkSecurityGroup) 220 } 221 } 222 } 223 224 return nil 225 } 226 } 227 228 func testAccCheckAzureInstanceUpdatedAttributes( 229 dpmt *virtualmachine.DeploymentResponse) resource.TestCheckFunc { 230 return func(s *terraform.State) error { 231 232 if dpmt.Name != "terraform-test1" { 233 return fmt.Errorf("Bad name: %s", dpmt.Name) 234 } 235 236 if dpmt.VirtualNetworkName != "terraform-vnet" { 237 return fmt.Errorf("Bad virtual network: %s", dpmt.VirtualNetworkName) 238 } 239 240 if len(dpmt.RoleList) != 1 { 241 return fmt.Errorf( 242 "Instance %s has an unexpected number of roles: %d", dpmt.Name, len(dpmt.RoleList)) 243 } 244 245 if dpmt.RoleList[0].RoleSize != "Basic_A2" { 246 return fmt.Errorf("Bad size: %s", dpmt.RoleList[0].RoleSize) 247 } 248 249 for _, c := range dpmt.RoleList[0].ConfigurationSets { 250 if c.ConfigurationSetType == virtualmachine.ConfigurationSetTypeNetwork { 251 if len(c.InputEndpoints) != 2 { 252 return fmt.Errorf( 253 "Instance %s has an unexpected number of endpoints %d", 254 dpmt.Name, len(c.InputEndpoints)) 255 } 256 257 if c.InputEndpoints[1].Name != "WINRM" { 258 return fmt.Errorf("Bad endpoint name: %s", c.InputEndpoints[1].Name) 259 } 260 261 if c.InputEndpoints[1].Port != 5985 { 262 return fmt.Errorf("Bad endpoint port: %d", c.InputEndpoints[1].Port) 263 } 264 265 if len(c.SubnetNames) != 1 { 266 return fmt.Errorf( 267 "Instance %s has an unexpected number of associated subnets %d", 268 dpmt.Name, len(c.SubnetNames)) 269 } 270 271 if c.SubnetNames[0] != "subnet1" { 272 return fmt.Errorf("Bad subnet: %s", c.SubnetNames[0]) 273 } 274 275 if c.NetworkSecurityGroup != "terraform-security-group2" { 276 return fmt.Errorf("Bad security group: %s", c.NetworkSecurityGroup) 277 } 278 } 279 } 280 281 return nil 282 } 283 } 284 285 func testAccCheckAzureInstanceDestroy(s *terraform.State) error { 286 mc := testAccProvider.Meta().(*Client).mgmtClient 287 288 for _, rs := range s.RootModule().Resources { 289 if rs.Type != "azure_instance" { 290 continue 291 } 292 293 if rs.Primary.ID == "" { 294 return fmt.Errorf("No instance ID is set") 295 } 296 297 _, err := hostedservice.NewClient(mc).GetHostedService(rs.Primary.ID) 298 if err == nil { 299 return fmt.Errorf("Instance %s still exists", rs.Primary.ID) 300 } 301 302 if !management.IsResourceNotFoundError(err) { 303 return err 304 } 305 } 306 307 return nil 308 } 309 310 var testAccAzureInstance_basic = fmt.Sprintf(` 311 resource "azure_instance" "foo" { 312 name = "terraform-test" 313 image = "Ubuntu Server 14.04 LTS" 314 size = "Basic_A1" 315 storage_service_name = "%s" 316 location = "West US" 317 username = "terraform" 318 password = "Pass!admin123" 319 320 endpoint { 321 name = "SSH" 322 protocol = "tcp" 323 public_port = 22 324 private_port = 22 325 } 326 }`, testAccStorageServiceName) 327 328 var testAccAzureInstance_advanced = fmt.Sprintf(` 329 resource "azure_virtual_network" "foo" { 330 name = "terraform-vnet" 331 address_space = ["10.1.2.0/24"] 332 location = "West US" 333 334 subnet { 335 name = "subnet1" 336 address_prefix = "10.1.2.0/25" 337 } 338 339 subnet { 340 name = "subnet2" 341 address_prefix = "10.1.2.128/25" 342 } 343 } 344 345 resource "azure_security_group" "foo" { 346 name = "terraform-security-group1" 347 location = "West US" 348 } 349 350 resource "azure_security_group_rule" "foo" { 351 name = "rdp" 352 security_group_name = "${azure_security_group.foo.name}" 353 priority = 101 354 source_address_prefix = "*" 355 source_port_range = "*" 356 destination_address_prefix = "*" 357 destination_port_range = "3389" 358 action = "Deny" 359 type = "Inbound" 360 protocol = "TCP" 361 } 362 363 resource "azure_instance" "foo" { 364 name = "terraform-test1" 365 image = "Windows Server 2012 R2 Datacenter, April 2015" 366 size = "Basic_A1" 367 storage_service_name = "%s" 368 location = "West US" 369 time_zone = "America/Los_Angeles" 370 subnet = "subnet1" 371 virtual_network = "${azure_virtual_network.foo.name}" 372 security_group = "${azure_security_group.foo.name}" 373 username = "terraform" 374 password = "Pass!admin123" 375 376 endpoint { 377 name = "RDP" 378 protocol = "tcp" 379 public_port = 3389 380 private_port = 3389 381 } 382 }`, testAccStorageServiceName) 383 384 var testAccAzureInstance_update = fmt.Sprintf(` 385 resource "azure_virtual_network" "foo" { 386 name = "terraform-vnet" 387 address_space = ["10.1.2.0/24"] 388 location = "West US" 389 390 subnet { 391 name = "subnet1" 392 address_prefix = "10.1.2.0/25" 393 } 394 395 subnet { 396 name = "subnet2" 397 address_prefix = "10.1.2.128/25" 398 } 399 } 400 401 resource "azure_security_group" "foo" { 402 name = "terraform-security-group1" 403 location = "West US" 404 } 405 406 resource "azure_security_group_rule" "foo" { 407 name = "rdp" 408 security_group_name = "${azure_security_group.foo.name}" 409 priority = 101 410 source_address_prefix = "*" 411 source_port_range = "*" 412 destination_address_prefix = "*" 413 destination_port_range = "3389" 414 type = "Inbound" 415 action = "Deny" 416 protocol = "TCP" 417 } 418 419 resource "azure_security_group" "bar" { 420 name = "terraform-security-group2" 421 location = "West US" 422 } 423 424 resource "azure_security_group_rule" "bar" { 425 name = "rdp" 426 security_group_name = "${azure_security_group.bar.name}" 427 priority = 101 428 source_address_prefix = "192.168.0.0/24" 429 source_port_range = "*" 430 destination_address_prefix = "*" 431 destination_port_range = "3389" 432 type = "Inbound" 433 action = "Deny" 434 protocol = "TCP" 435 } 436 437 resource "azure_instance" "foo" { 438 name = "terraform-test1" 439 image = "Windows Server 2012 R2 Datacenter, April 2015" 440 size = "Basic_A2" 441 storage_service_name = "%s" 442 location = "West US" 443 time_zone = "America/Los_Angeles" 444 subnet = "subnet1" 445 virtual_network = "${azure_virtual_network.foo.name}" 446 security_group = "${azure_security_group.bar.name}" 447 username = "terraform" 448 password = "Pass!admin123" 449 450 endpoint { 451 name = "RDP" 452 protocol = "tcp" 453 public_port = 3389 454 private_port = 3389 455 } 456 457 endpoint { 458 name = "WINRM" 459 protocol = "tcp" 460 public_port = 5985 461 private_port = 5985 462 } 463 }`, testAccStorageServiceName)