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)