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 }