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