github.com/arvindram03/terraform@v0.3.7-0.20150212015210-408f838db36d/builtin/providers/azure/resource_virtual_machine_test.go (about)

     1  package azure
     2  
     3  import (
     4  	"fmt"
     5  	"math/rand"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/hashicorp/terraform/helper/resource"
    10  	"github.com/hashicorp/terraform/terraform"
    11  	"github.com/MSOpenTech/azure-sdk-for-go/clients/vmClient"
    12  )
    13  
    14  func TestAccAzureVirtualMachine_Basic(t *testing.T) {
    15  	var VMDeployment vmClient.VMDeployment
    16  
    17  	// The VM name can only be used once globally within azure,
    18  	// so we need to generate a random one
    19  	rand.Seed(time.Now().UnixNano())
    20  	vmName := fmt.Sprintf("tf-test-vm-%d", rand.Int31())
    21  
    22  	resource.Test(t, resource.TestCase{
    23  		PreCheck:     func() { testAccPreCheck(t) },
    24  		Providers:    testAccProviders,
    25  		CheckDestroy: testAccCheckAzureVirtualMachineDestroy,
    26  		Steps: []resource.TestStep{
    27  			resource.TestStep{
    28  				Config: testAccCheckAzureVirtualMachineConfig_basic(vmName),
    29  				Check: resource.ComposeTestCheckFunc(
    30  					testAccCheckAzureVirtualMachineExists("azure_virtual_machine.foobar", &VMDeployment),
    31  					testAccCheckAzureVirtualMachineAttributes(&VMDeployment, vmName),
    32  					resource.TestCheckResourceAttr(
    33  						"azure_virtual_machine.foobar", "name", vmName),
    34  					resource.TestCheckResourceAttr(
    35  						"azure_virtual_machine.foobar", "location", "West US"),
    36  					resource.TestCheckResourceAttr(
    37  						"azure_virtual_machine.foobar", "image", "b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu-14_04-LTS-amd64-server-20140724-en-us-30GB"),
    38  					resource.TestCheckResourceAttr(
    39  						"azure_virtual_machine.foobar", "size", "Basic_A1"),
    40  					resource.TestCheckResourceAttr(
    41  						"azure_virtual_machine.foobar", "username", "foobar"),
    42  				),
    43  			},
    44  		},
    45  	})
    46  }
    47  
    48  func TestAccAzureVirtualMachine_Endpoints(t *testing.T) {
    49  	var VMDeployment vmClient.VMDeployment
    50  
    51  	// The VM name can only be used once globally within azure,
    52  	// so we need to generate a random one
    53  	rand.Seed(time.Now().UnixNano())
    54  	vmName := fmt.Sprintf("tf-test-vm-%d", rand.Int31())
    55  
    56  	resource.Test(t, resource.TestCase{
    57  		PreCheck:     func() { testAccPreCheck(t) },
    58  		Providers:    testAccProviders,
    59  		CheckDestroy: testAccCheckAzureVirtualMachineDestroy,
    60  		Steps: []resource.TestStep{
    61  			resource.TestStep{
    62  				Config: testAccCheckAzureVirtualMachineConfig_endpoints(vmName),
    63  				Check: resource.ComposeTestCheckFunc(
    64  					testAccCheckAzureVirtualMachineExists("azure_virtual_machine.foobar", &VMDeployment),
    65  					testAccCheckAzureVirtualMachineAttributes(&VMDeployment, vmName),
    66  					testAccCheckAzureVirtualMachineEndpoint(&VMDeployment, "tcp", 80),
    67  				),
    68  			},
    69  		},
    70  	})
    71  }
    72  
    73  func testAccCheckAzureVirtualMachineDestroy(s *terraform.State) error {
    74  	for _, rs := range s.RootModule().Resources {
    75  		if rs.Type != "azure_virtual_machine" {
    76  			continue
    77  		}
    78  
    79  		_, err := vmClient.GetVMDeployment(rs.Primary.ID, rs.Primary.ID)
    80  		if err == nil {
    81  			return fmt.Errorf("Azure Virtual Machine (%s) still exists", rs.Primary.ID)
    82  		}
    83  	}
    84  
    85  	return nil
    86  }
    87  
    88  func testAccCheckAzureVirtualMachineExists(n string, VMDeployment *vmClient.VMDeployment) resource.TestCheckFunc {
    89  	return func(s *terraform.State) error {
    90  		rs, ok := s.RootModule().Resources[n]
    91  		if !ok {
    92  			return fmt.Errorf("Not found: %s", n)
    93  		}
    94  
    95  		if rs.Primary.ID == "" {
    96  			return fmt.Errorf("No Azure Virtual Machine ID is set")
    97  		}
    98  
    99  		retrieveVMDeployment, err := vmClient.GetVMDeployment(rs.Primary.ID, rs.Primary.ID)
   100  		if err != nil {
   101  			return err
   102  		}
   103  
   104  		if retrieveVMDeployment.Name != rs.Primary.ID {
   105  			return fmt.Errorf("Azure Virtual Machine not found %s %s", VMDeployment.Name, rs.Primary.ID)
   106  		}
   107  
   108  		*VMDeployment = *retrieveVMDeployment
   109  
   110  		return nil
   111  	}
   112  }
   113  
   114  func testAccCheckAzureVirtualMachineAttributes(VMDeployment *vmClient.VMDeployment, vmName string) resource.TestCheckFunc {
   115  	return func(s *terraform.State) error {
   116  		if VMDeployment.Name != vmName {
   117  			return fmt.Errorf("Bad name: %s != %s", VMDeployment.Name, vmName)
   118  		}
   119  
   120  		return nil
   121  	}
   122  }
   123  
   124  func testAccCheckAzureVirtualMachineEndpoint(VMDeployment *vmClient.VMDeployment, protocol string, publicPort int) resource.TestCheckFunc {
   125  	return func(s *terraform.State) error {
   126  		roleInstances := VMDeployment.RoleInstanceList.RoleInstance
   127  		if len(roleInstances) == 0 {
   128  			return fmt.Errorf("Azure virtual machine does not have role instances")
   129  		}
   130  
   131  		for i := 0; i < len(roleInstances); i++ {
   132  			instanceEndpoints := roleInstances[i].InstanceEndpoints.InstanceEndpoint
   133  			if len(instanceEndpoints) == 0 {
   134  				return fmt.Errorf("Azure virtual machine does not have endpoints")
   135  			}
   136  			endpointFound := 0
   137  			for j := 0; i < len(instanceEndpoints); i++ {
   138  				if instanceEndpoints[j].Protocol == protocol && instanceEndpoints[j].PublicPort == publicPort {
   139  					endpointFound = 1
   140  					break
   141  				}
   142  			}
   143  			if endpointFound == 0 {
   144  				return fmt.Errorf("Azure virtual machine does not have endpoint %s/%d", protocol, publicPort)
   145  			}
   146  		}
   147  
   148  		return nil
   149  	}
   150  }
   151  
   152  func testAccCheckAzureVirtualMachineConfig_basic(vmName string) string {
   153  	return fmt.Sprintf(`
   154  resource "azure_virtual_machine" "foobar" {
   155      name = "%s"
   156      location = "West US"
   157      image = "b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu-14_04-LTS-amd64-server-20140724-en-us-30GB"
   158      size = "Basic_A1"
   159      username  = "foobar"
   160  }
   161  `, vmName)
   162  }
   163  
   164  func testAccCheckAzureVirtualMachineConfig_endpoints(vmName string) string {
   165  	return fmt.Sprintf(`
   166  resource "azure_virtual_machine" "foobar" {
   167      name = "%s"
   168      location = "West US"
   169      image = "b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu-14_04-LTS-amd64-server-20140724-en-us-30GB"
   170      size = "Basic_A1"
   171      username  = "foobar"
   172      endpoint {
   173          name = "http"
   174          protocol = "tcp"
   175          port = 80
   176          local_port = 80
   177      }
   178  }
   179  `, vmName)
   180  }