vsphere/resource_vsphere_virtual_machine.go
func resourceVSphereVirtualMachineCreateBare(d *schema.ResourceData, meta interface{}) (*object.VirtualMachine, error) {
	log.Printf("[DEBUG] %s: VM being created from scratch", resourceVSphereVirtualMachineIDString(d))
	client := meta.(*VSphereClient).vimClient
	poolID := d.Get("resource_pool_id").(string)
	pool, err := resourcepool.FromID(client, poolID)
	if err != nil {
		return nil, fmt.Errorf("could not find resource pool ID %q: %s", poolID, err)
	}

	// Find the folder based off the path to the resource pool. Basically what we
	// are saying here is that the VM folder that we are placing this VM in needs
	// to be in the same hierarchy as the resource pool - so in other words, the
	// same datacenter.
	fo, err := folder.VirtualMachineFolderFromObject(client, pool, d.Get("folder").(string))
	if err != nil {
		return nil, err
	}
	var hs *object.HostSystem
	if v, ok := d.GetOk("host_system_id"); ok {
		hsID := v.(string)
		var err error
		if hs, err = hostsystem.FromID(client, hsID); err != nil {
			return nil, fmt.Errorf("error locating host system at ID %q: %s", hsID, err)
		}
	}

	// Validate that the host is part of the resource pool before proceeding
	if err := resourcepool.ValidateHost(client, pool, hs); err != nil {
		return nil, err
	}

	// Ready to start making the VM here. First expand our main config spec.
	spec, err := expandVirtualMachineConfigSpec(d, client)
	if err != nil {
		return nil, fmt.Errorf("error in virtual machine configuration: %s", err)
	}

	// Now we need to get the default device set - this is available in the
	// environment info in the resource pool, which we can then filter through
	// our device CRUD lifecycles to get a full deviceChange attribute for our
	// configspec.
	devices, err := resourcepool.DefaultDevices(client, pool, d.Get("guest_id").(string))
	if err != nil {
		return nil, fmt.Errorf("error loading default device list: %s", err)
	}
	log.Printf("[DEBUG] Default devices: %s", virtualdevice.DeviceListString(devices))

	if spec.DeviceChange, err = applyVirtualDevices(d, client, devices); err != nil {
		return nil, err
	}

	// Create the VM according the right API path - if we have a datastore
	// cluster, use the SDRS API, if not, use the standard API.
	var vm *object.VirtualMachine
	if _, ok := d.GetOk("datastore_cluster_id"); ok {
		vm, err = resourceVSphereVirtualMachineCreateBareWithSDRS(d, meta, fo, spec, pool, hs)
	} else {
		vm, err = resourceVSphereVirtualMachineCreateBareStandard(d, meta, fo, spec, pool, hs)
	}
	if err != nil {
		return nil, err
	}

	// VM is created. Set the ID now before proceeding, in case the rest of the
	// process here fails.
	vprops, err := virtualmachine.Properties(vm)
	if err != nil {
		return nil, fmt.Errorf("cannot fetch properties of created virtual machine: %s", err)
	}
	log.Printf("[DEBUG] VM %q - UUID is %q", vm.InventoryPath, vprops.Config.Uuid)
	d.SetId(vprops.Config.Uuid)

	// Start the virtual machine
	if err := virtualmachine.PowerOn(vm); err != nil {
		return nil, fmt.Errorf("error powering on virtual machine: %s", err)
	}
	return vm, nil
}
func resourceVSphereVirtualMachineCreateBare(d *schema.ResourceData, meta interface{}) (*object.VirtualMachine, error) {
	log.Printf("[DEBUG] %s: VM being created from scratch", resourceVSphereVirtualMachineIDString(d))
	client := meta.(*VSphereClient).vimClient
	poolID := d.Get("resource_pool_id").(string)
	pool, err := resourcepool.FromID(client, poolID)
	if err != nil {
		return nil, fmt.Errorf("could not find resource pool ID %q: %s", poolID, err)
	}

	// Find the folder based off the path to the resource pool. Basically what we
	// are saying here is that the VM folder that we are placing this VM in needs
	// to be in the same hierarchy as the resource pool - so in other words, the
	// same datacenter.
	fo, err := folder.VirtualMachineFolderFromObject(client, pool, d.Get("folder").(string))
	if err != nil {
		return nil, err
	}
	var hs *object.HostSystem
	if v, ok := d.GetOk("host_system_id"); ok {
		hsID := v.(string)
		var err error
		if hs, err = hostsystem.FromID(client, hsID); err != nil {
			return nil, fmt.Errorf("error locating host system at ID %q: %s", hsID, err)
		}
	}

	// Validate that the host is part of the resource pool before proceeding
	if err := resourcepool.ValidateHost(client, pool, hs); err != nil {
		return nil, err
	}

	// Ready to start making the VM here. First expand our main config spec.
	spec, err := expandVirtualMachineConfigSpec(d, client)
	if err != nil {
		return nil, fmt.Errorf("error in virtual machine configuration: %s", err)
	}

	// Now we need to get the default device set - this is available in the
	// environment info in the resource pool, which we can then filter through
	// our device CRUD lifecycles to get a full deviceChange attribute for our
	// configspec.
	devices, err := resourcepool.DefaultDevices(client, pool, d.Get("guest_id").(string))
	if err != nil {
		return nil, fmt.Errorf("error loading default device list: %s", err)
	}
	log.Printf("[DEBUG] Default devices: %s", virtualdevice.DeviceListString(devices))

	if spec.DeviceChange, err = applyVirtualDevices(d, client, devices); err != nil {
		return nil, err
	}

	// Create the VM according the right API path - if we have a datastore
	// cluster, use the SDRS API, if not, use the standard API.
	var vm *object.VirtualMachine
	if _, ok := d.GetOk("datastore_cluster_id"); ok {
		vm, err = resourceVSphereVirtualMachineCreateBareWithSDRS(d, meta, fo, spec, pool, hs)
	} else {
		vm, err = resourceVSphereVirtualMachineCreateBareStandard(d, meta, fo, spec, pool, hs)
	}
	if err != nil {
		return nil, err
	}

	// VM is created. Set the ID now before proceeding, in case the rest of the
	// process here fails.
	vprops, err := virtualmachine.Properties(vm)
	if err != nil {
		return nil, fmt.Errorf("cannot fetch properties of created virtual machine: %s", err)
	}
	log.Printf("[DEBUG] VM %q - UUID is %q", vm.InventoryPath, vprops.Config.Uuid)
	d.SetId(vprops.Config.Uuid)

	// Start the virtual machine
	if err := virtualmachine.PowerOn(vm); err != nil {
		return nil, fmt.Errorf("error powering on virtual machine: %s", err)
	}
	return vm, nil
}
func resourceVSphereVirtualMachineCreateBare ( d * schema . ResourceData , meta interface { } ) ( * object . VirtualMachine , error ) { log . Printf ( " " , resourceVSphereVirtualMachineIDString ( d ) ) client := meta . ( * VSphereClient ) . vimClient poolID := d . Get ( " " ) . ( string ) pool , err := resourcepool . FromID ( client , poolID ) if err != nil { return nil , fmt . Errorf ( " " , poolID , err ) } // Find the folder based off the path to the resource pool. Basically what we // are saying here is that the VM folder that we are placing this VM in needs // to be in the same hierarchy as the resource pool - so in other words, the // same datacenter. fo , err := folder . VirtualMachineFolderFromObject ( client , pool , d . Get ( " " ) . ( string ) ) if err != nil { return nil , err } var hs * object . HostSystem if v , ok := d . GetOk ( " " ) ; ok { hsID := v . ( string ) var err error if hs , err = hostsystem . FromID ( client , hsID ) ; err != nil { return nil , fmt . Errorf ( " " , hsID , err ) } } // Validate that the host is part of the resource pool before proceeding if err := resourcepool . ValidateHost ( client , pool , hs ) ; err != nil { return nil , err } // Ready to start making the VM here. First expand our main config spec. spec , err := expandVirtualMachineConfigSpec ( d , client ) if err != nil { return nil , fmt . Errorf ( " " , err ) } // Now we need to get the default device set - this is available in the // environment info in the resource pool, which we can then filter through // our device CRUD lifecycles to get a full deviceChange attribute for our // configspec. devices , err := resourcepool . DefaultDevices ( client , pool , d . Get ( " " ) . ( string ) ) if err != nil { return nil , fmt . Errorf ( " " , err ) } log . Printf ( " " , virtualdevice . DeviceListString ( devices ) ) if spec . DeviceChange , err = applyVirtualDevices ( d , client , devices ) ; err != nil { return nil , err } // Create the VM according the right API path - if we have a datastore // cluster, use the SDRS API, if not, use the standard API. var vm * object . VirtualMachine if _ , ok := d . GetOk ( " " ) ; ok { vm , err = resourceVSphereVirtualMachineCreateBareWithSDRS ( d , meta , fo , spec , pool , hs ) } else { vm , err = resourceVSphereVirtualMachineCreateBareStandard ( d , meta , fo , spec , pool , hs ) } if err != nil { return nil , err } // VM is created. Set the ID now before proceeding, in case the rest of the // process here fails. vprops , err := virtualmachine . Properties ( vm ) if err != nil { return nil , fmt . Errorf ( " " , err ) } log . Printf ( " " , vm . InventoryPath , vprops . Config . Uuid ) d . SetId ( vprops . Config . Uuid ) // Start the virtual machine if err := virtualmachine . PowerOn ( vm ) ; err != nil { return nil , fmt . Errorf ( " " , err ) } return vm , nil }
// resourceVSphereVirtualMachineCreateBare contains the "bare metal" VM
// deploy path. The VM is returned.
resourceVSphereVirtualMachineCreateBare contains the bare metal VM deploy path . The VM is returned .