Golang Access to vSphere APIs
For
the Golang developer, this chapter shows how to install the govmomi SDK and run example
programs against vSphere APIs.
Installing the govmomi SDK for
vSphere
To access vSphere APIs using the Go language, the
govmomi
library is
most convenient. To install govmomi
, open a terminal window and
use these commands:- mkdir govmomi
- cd govmomi
- go mod init example/govmomi
- go get -u github.com/vmware/govmomi
Basic Authentication with the VIM
API Using govmomi
The
govmomi
SDK
simplifies the connection code with the govmomi.NewClient
function.
The function accepts a service URL containing basic user credentials, opens a
session with the server, and returns a client
object containing the
ServiceContent
object. ServiceContent
contains
references to specific managed objects needed to use VIM API features.package main import ( "context" "fmt" "net/url" "github.com/vmware/govmomi" "github.com/vmware/govmomi/vim25/methods" "github.com/vmware/govmomi/vim25/types" "github.com/vmware/govmomi/vapi/rest" "github.com/vmware/govmomi/vapi/tags" ) // Connection parameters. var hostname = "vc1.example.com" var username = "administrator@vsphere.local" var password = "TooSecret2C!" func main() { fmt.Println("Creating a VIM/SOAP session.") vcURL := "https://" + username + ":" + password + "@" + hostname + "/sdk" u, err := url.Parse(vcURL) if err != nil { fmt.Printf("Error parsing url %s\n", vcURL) return } ctx, cancel := context.WithCancel(context.Background()) defer cancel() vimClient, err := govmomi.NewClient(ctx, u, true) if err != nil { fmt.Printf("Error logging in: %s\n", err.Error()) return } fmt.Println("Login successful") ...
At this point, your session is
established and the session ID is stored in the
client
object. The
session ID will be passed to the server with future requests.Creating a Hello Folder with the
VIM API Using govmomi
The
ServiceContent
object contains a reference to the root folder of
the managed object hierarchy. You can invoke the CreateFolder()
method on the remote rootFolder
object to create a subfolder named
Hello Folder
.... fmt.Println("Using VIM to create Hello Folder.") req := types.CreateFolder{ This: vimClient.Client.ServiceContent.RootFolder, Name: "Hello Folder", } res, err := methods.CreateFolder(ctx, vimClient.Client, &req) if err != nil { fmt.Println(err) return } fmt.Println(res.Returnval.Type, "created") } helloFolder := res.Returnval fmt.Println(helloFolder) ...
Basic Authentication with the
Automation API Using govmomi
To create an authenticated session with the Automation API, you can use code like the
following.
... fmt.Println("Creating an Automation API session.") vapiClient := rest.NewClient(vimClient.Client) err = vapiClient.Login(ctx, url.UserPassword(username, password)) if err != nil { fmt.Println(err) return } fmt.Println("VAPI session created.") ...
Tagging the Hello World Folder
with the Automation API Using govmomi
To tag a folder, start by creating a tag
category, then create a tag in that category, and finally associate the tag with the
folder.
... fmt.Println("VAPI creating a tag category.") m := tags.NewManager(vapiClient) catId, err := m.CreateCategory(ctx, &tags.Category{ AssociableTypes: []string{"Folder"}, Cardinality: "SINGLE", Description: "example of tagging category from govmomi", Name: "hello_category", }) if err != nil { fmt.Println(err) return } fmt.Println("New category created: ", catId) fmt.Println("VAPI creating a tag in new category.") tagId, err := m.CreateTag(ctx, &tags.Tag{ CategoryID: catId, Description: "example of a tag from govmomi", Name: "hello_tag", }) if err != nil { fmt.Println(err) return } fmt.Println("New tag created: ", tagId) fmt.Println("VAPI creating association of tag with Hello Folder.") err = m.AttachTag(ctx, tagId, helloFolder) if err != nil { fmt.Println(err) return } fmt.Println("Tag attached to folder: ", tagId, helloFolder) }