github.com/jmbataller/terraform@v0.6.8-0.20151125192640-b7a12e3a580c/builtin/providers/vsphere/resource_vsphere_virtual_machine_test.go (about) 1 package vsphere 2 3 import ( 4 "fmt" 5 "os" 6 "testing" 7 8 "github.com/hashicorp/terraform/helper/resource" 9 "github.com/hashicorp/terraform/terraform" 10 "github.com/vmware/govmomi" 11 "github.com/vmware/govmomi/find" 12 "github.com/vmware/govmomi/object" 13 "golang.org/x/net/context" 14 ) 15 16 func TestAccVSphereVirtualMachine_basic(t *testing.T) { 17 var vm virtualMachine 18 var locationOpt string 19 var datastoreOpt string 20 21 if v := os.Getenv("VSPHERE_DATACENTER"); v != "" { 22 locationOpt += fmt.Sprintf(" datacenter = \"%s\"\n", v) 23 } 24 if v := os.Getenv("VSPHERE_CLUSTER"); v != "" { 25 locationOpt += fmt.Sprintf(" cluster = \"%s\"\n", v) 26 } 27 if v := os.Getenv("VSPHERE_RESOURCE_POOL"); v != "" { 28 locationOpt += fmt.Sprintf(" resource_pool = \"%s\"\n", v) 29 } 30 if v := os.Getenv("VSPHERE_DATASTORE"); v != "" { 31 datastoreOpt = fmt.Sprintf(" datastore = \"%s\"\n", v) 32 } 33 template := os.Getenv("VSPHERE_TEMPLATE") 34 gateway := os.Getenv("VSPHERE_NETWORK_GATEWAY") 35 label := os.Getenv("VSPHERE_NETWORK_LABEL") 36 ip_address := os.Getenv("VSPHERE_NETWORK_IP_ADDRESS") 37 38 resource.Test(t, resource.TestCase{ 39 PreCheck: func() { testAccPreCheck(t) }, 40 Providers: testAccProviders, 41 CheckDestroy: testAccCheckVSphereVirtualMachineDestroy, 42 Steps: []resource.TestStep{ 43 resource.TestStep{ 44 Config: fmt.Sprintf( 45 testAccCheckVSphereVirtualMachineConfig_basic, 46 locationOpt, 47 gateway, 48 label, 49 ip_address, 50 datastoreOpt, 51 template, 52 ), 53 Check: resource.ComposeTestCheckFunc( 54 testAccCheckVSphereVirtualMachineExists("vsphere_virtual_machine.foo", &vm), 55 resource.TestCheckResourceAttr( 56 "vsphere_virtual_machine.foo", "name", "terraform-test"), 57 resource.TestCheckResourceAttr( 58 "vsphere_virtual_machine.foo", "vcpu", "2"), 59 resource.TestCheckResourceAttr( 60 "vsphere_virtual_machine.foo", "memory", "4096"), 61 resource.TestCheckResourceAttr( 62 "vsphere_virtual_machine.foo", "disk.#", "2"), 63 resource.TestCheckResourceAttr( 64 "vsphere_virtual_machine.foo", "disk.0.template", template), 65 resource.TestCheckResourceAttr( 66 "vsphere_virtual_machine.foo", "network_interface.#", "1"), 67 resource.TestCheckResourceAttr( 68 "vsphere_virtual_machine.foo", "network_interface.0.label", label), 69 ), 70 }, 71 }, 72 }) 73 } 74 75 func TestAccVSphereVirtualMachine_dhcp(t *testing.T) { 76 var vm virtualMachine 77 var locationOpt string 78 var datastoreOpt string 79 80 if v := os.Getenv("VSPHERE_DATACENTER"); v != "" { 81 locationOpt += fmt.Sprintf(" datacenter = \"%s\"\n", v) 82 } 83 if v := os.Getenv("VSPHERE_CLUSTER"); v != "" { 84 locationOpt += fmt.Sprintf(" cluster = \"%s\"\n", v) 85 } 86 if v := os.Getenv("VSPHERE_RESOURCE_POOL"); v != "" { 87 locationOpt += fmt.Sprintf(" resource_pool = \"%s\"\n", v) 88 } 89 if v := os.Getenv("VSPHERE_DATASTORE"); v != "" { 90 datastoreOpt = fmt.Sprintf(" datastore = \"%s\"\n", v) 91 } 92 template := os.Getenv("VSPHERE_TEMPLATE") 93 label := os.Getenv("VSPHERE_NETWORK_LABEL_DHCP") 94 95 resource.Test(t, resource.TestCase{ 96 PreCheck: func() { testAccPreCheck(t) }, 97 Providers: testAccProviders, 98 CheckDestroy: testAccCheckVSphereVirtualMachineDestroy, 99 Steps: []resource.TestStep{ 100 resource.TestStep{ 101 Config: fmt.Sprintf( 102 testAccCheckVSphereVirtualMachineConfig_dhcp, 103 locationOpt, 104 label, 105 datastoreOpt, 106 template, 107 ), 108 Check: resource.ComposeTestCheckFunc( 109 testAccCheckVSphereVirtualMachineExists("vsphere_virtual_machine.bar", &vm), 110 resource.TestCheckResourceAttr( 111 "vsphere_virtual_machine.bar", "name", "terraform-test"), 112 resource.TestCheckResourceAttr( 113 "vsphere_virtual_machine.bar", "vcpu", "2"), 114 resource.TestCheckResourceAttr( 115 "vsphere_virtual_machine.bar", "memory", "4096"), 116 resource.TestCheckResourceAttr( 117 "vsphere_virtual_machine.bar", "disk.#", "1"), 118 resource.TestCheckResourceAttr( 119 "vsphere_virtual_machine.bar", "disk.0.template", template), 120 resource.TestCheckResourceAttr( 121 "vsphere_virtual_machine.bar", "network_interface.#", "1"), 122 resource.TestCheckResourceAttr( 123 "vsphere_virtual_machine.bar", "network_interface.0.label", label), 124 ), 125 }, 126 }, 127 }) 128 } 129 130 func testAccCheckVSphereVirtualMachineDestroy(s *terraform.State) error { 131 client := testAccProvider.Meta().(*govmomi.Client) 132 finder := find.NewFinder(client.Client, true) 133 134 for _, rs := range s.RootModule().Resources { 135 if rs.Type != "vsphere_virtual_machine" { 136 continue 137 } 138 139 dc, err := finder.Datacenter(context.TODO(), rs.Primary.Attributes["datacenter"]) 140 if err != nil { 141 return fmt.Errorf("error %s", err) 142 } 143 144 dcFolders, err := dc.Folders(context.TODO()) 145 if err != nil { 146 return fmt.Errorf("error %s", err) 147 } 148 149 _, err = object.NewSearchIndex(client.Client).FindChild(context.TODO(), dcFolders.VmFolder, rs.Primary.Attributes["name"]) 150 if err == nil { 151 return fmt.Errorf("Record still exists") 152 } 153 } 154 155 return nil 156 } 157 158 func testAccCheckVSphereVirtualMachineExists(n string, vm *virtualMachine) resource.TestCheckFunc { 159 return func(s *terraform.State) error { 160 rs, ok := s.RootModule().Resources[n] 161 if !ok { 162 return fmt.Errorf("Not found: %s", n) 163 } 164 165 if rs.Primary.ID == "" { 166 return fmt.Errorf("No ID is set") 167 } 168 169 client := testAccProvider.Meta().(*govmomi.Client) 170 finder := find.NewFinder(client.Client, true) 171 172 dc, err := finder.Datacenter(context.TODO(), rs.Primary.Attributes["datacenter"]) 173 if err != nil { 174 return fmt.Errorf("error %s", err) 175 } 176 177 dcFolders, err := dc.Folders(context.TODO()) 178 if err != nil { 179 return fmt.Errorf("error %s", err) 180 } 181 182 _, err = object.NewSearchIndex(client.Client).FindChild(context.TODO(), dcFolders.VmFolder, rs.Primary.Attributes["name"]) 183 184 *vm = virtualMachine{ 185 name: rs.Primary.ID, 186 } 187 188 return nil 189 } 190 } 191 192 const testAccCheckVSphereVirtualMachineConfig_basic = ` 193 resource "vsphere_virtual_machine" "foo" { 194 name = "terraform-test" 195 %s 196 vcpu = 2 197 memory = 4096 198 gateway = "%s" 199 network_interface { 200 label = "%s" 201 ip_address = "%s" 202 subnet_mask = "255.255.255.0" 203 } 204 disk { 205 %s 206 template = "%s" 207 iops = 500 208 } 209 disk { 210 size = 1 211 iops = 500 212 } 213 } 214 ` 215 216 const testAccCheckVSphereVirtualMachineConfig_dhcp = ` 217 resource "vsphere_virtual_machine" "bar" { 218 name = "terraform-test" 219 %s 220 vcpu = 2 221 memory = 4096 222 network_interface { 223 label = "%s" 224 } 225 disk { 226 %s 227 template = "%s" 228 } 229 } 230 `