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  `