// This function opens a virtual machine on the host // and returns a VM instance. // // Parameters: // // VmxFile: The path name of the virtual machine configuration file on the // local host. // // Password: If VM is encrypted, this is the password for VIX to be able to // open it. // // Remarks: // // * This function opens a virtual machine on the host instance // The virtual machine is identified by vmxFile, which is a path name to the // configuration file (.VMX file) for that virtual machine. // // * The format of the path name depends on the host operating system. // For example, a path name for a Windows host requires backslash as a // directory separator, whereas a Linux host requires a forward slash. If the // path name includes backslash characters, you need to precede each one with // an escape character. For VMware Server 2.x, the path contains a preceeding // data store, for example [storage1] vm/vm.vmx. // // * For VMware Server hosts, a virtual machine must be registered before you // can open it. You can register a virtual machine by opening it with the // VMware Server Console, through the vmware-cmd command with the register // parameter, or with Host.RegisterVM(). // // * For vSphere, the virtual machine opened may not be the one desired if more // than one Datacenter contains VmxFile. // // * To open an encrypted virtual machine, pass its correspondent password. // // Since VMware Workstation 7.0 func (h *Host) OpenVM(vmxFile, password string) (*VM, error) { var jobHandle C.VixHandle = C.VIX_INVALID_HANDLE var propertyHandle C.VixHandle = C.VIX_INVALID_HANDLE var vmHandle C.VixHandle = C.VIX_INVALID_HANDLE var err C.VixError = C.VIX_OK defer C.Vix_ReleaseHandle(propertyHandle) defer C.Vix_ReleaseHandle(jobHandle) if password != "" { cpassword := C.CString(password) defer C.free(unsafe.Pointer(cpassword)) err = C.alloc_vm_pwd_proplist(h.handle, &propertyHandle, cpassword) if C.VIX_OK != err { return nil, &Error{ Operation: "host.OpenVM", Code: int(err & 0xFFFF), Text: C.GoString(C.Vix_GetErrorText(err, nil)), } } } cVmxFile := C.CString(vmxFile) defer C.free(unsafe.Pointer(cVmxFile)) jobHandle = C.VixHost_OpenVM(h.handle, cVmxFile, C.VIX_VMOPEN_NORMAL, propertyHandle, nil, // callbackProc nil) // clientData err = C.get_vix_handle(jobHandle, C.VIX_PROPERTY_JOB_RESULT_HANDLE, &vmHandle, C.VIX_PROPERTY_NONE) if C.VIX_OK != err { return nil, &Error{ Operation: "host.OpenVM.get_vix_handle", Code: int(err & 0xFFFF), Text: C.GoString(C.Vix_GetErrorText(err, nil)), } } return NewVirtualMachine(vmHandle, vmxFile) }
// Connects to a Provider // // Parameters: // // config: See type ConnectConfig documentation for details // // Remarks: // * To specify the local host (where the API client runs) with VMware // Workstation and VMware Player, pass empty values for the hostname, port, // login, and password parameters or just don't set them. // // * With vCenter Server, ESX/ESXi hosts, and VMware Server 2.0, the URL for // the hostname argument may specify the port. // Otherwise a HTTPS connection is attempted on port 443. HTTPS is strongly // recommended. // Port numbers are set during installation of Server 2.0. The installer's // default HTTP and HTTPS values are 8222 and 8333 for Server on Windows, or // (if not already in use) 80 and 443 for Server on Linux, and 902 for the // automation socket, authd. If connecting to a virtual machine through a // firewall, port 902 and the communicating port must be opened to allow // guest operations. // // * If a VMware ESX host is being managed by a VMware VCenter Server, you // should call VixHost_Connect with the hostname or IP address of the VCenter // server, not the ESX host. // Connecting directly to an ESX host while bypassing its VCenter Server can // cause state inconsistency. // // * On Windows, this function should not be called multiple times with // different service providers in the same process; doing so will result in // a VIX_E_WRAPPER_MULTIPLE_SERVICEPROVIDERS error. // A single client process can connect to multiple hosts as long as it // connects using the same service provider type. // // * To enable SSL certificate verification, set the value of the options // parameter to include the bit flag specified by VERIFY_SSL_CERT. // This option can also be set in the VMware config file by assigning // vix.enableSslCertificateCheck as TRUE or FALSE. // // The vix.sslCertificateFile config option specifies the path to a file // containing CA certificates in PEM format. // // The vix.sslCertificateDirectory config option can specify a directory // containing files that each contain a CA certificate. // Upon encountering a SSL validation error, the host handle is not created // with a resulting error code of E_NET_HTTP_SSL_SECURITY. // // * With VMware vCenter Server and ESX/ESXi 4.0 hosts, an existing VI API // session can be used instead of the username/password pair to authenticate // when connecting. To use an existing VI API session, a VI "clone ticket" // is required; call the VI API AcquireCloneTicket() method of the // SessionManager object to get this ticket. // Using the ticket string returned by this method, call vix.Connect() // with "" as the 'username' and the ticket as the 'password'. // // Since VMware Server 1.0 func Connect(config ConnectConfig) (*Host, error) { var jobHandle C.VixHandle = C.VIX_INVALID_HANDLE var hostHandle C.VixHandle = C.VIX_INVALID_HANDLE var err C.VixError = C.VIX_OK chostname := C.CString(config.Hostname) cusername := C.CString(config.Username) cpassword := C.CString(config.Password) defer C.free(unsafe.Pointer(chostname)) defer C.free(unsafe.Pointer(cusername)) defer C.free(unsafe.Pointer(cpassword)) jobHandle = C.VixHost_Connect(C.VIX_API_VERSION, C.VixServiceProvider(config.Provider), chostname, C.int(config.Port), cusername, cpassword, C.VixHostOptions(config.Options), C.VIX_INVALID_HANDLE, // propertyListHandle nil, // callbackProc nil) // clientData err = C.get_vix_handle(jobHandle, C.VIX_PROPERTY_JOB_RESULT_HANDLE, &hostHandle, C.VIX_PROPERTY_NONE) defer C.Vix_ReleaseHandle(jobHandle) if C.VIX_OK != err { return nil, &Error{ Operation: "vix.Connect", Code: int(err & 0xFFFF), Text: C.GoString(C.Vix_GetErrorText(err, nil)), } } host := &Host{ handle: hostHandle, Provider: config.Provider, } runtime.SetFinalizer(host, cleanupHost) return host, nil }