Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@agrare
Last active August 9, 2021 16:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save agrare/8024343da804953824f0a35a699136f2 to your computer and use it in GitHub Desktop.
Save agrare/8024343da804953824f0a35a699136f2 to your computer and use it in GitHub Desktop.
package main
import (
"context"
"fmt"
liburl "net/url"
"github.com/vmware/govmomi"
"github.com/vmware/govmomi/property"
"github.com/vmware/govmomi/session"
"github.com/vmware/govmomi/vim25"
"github.com/vmware/govmomi/vim25/methods"
"github.com/vmware/govmomi/vim25/soap"
"github.com/vmware/govmomi/vim25/types"
)
//
// Types
const (
Folder = "Folder"
VirtualMachine = "VirtualMachine"
Datacenter = "Datacenter"
Cluster = "ClusterComputeResource"
Host = "HostSystem"
Network = "Network"
DVPortGroup = "DistributedVirtualPortgroup"
DVSwitch = "VmwareDistributedVirtualSwitch"
Datastore = "Datastore"
)
//
// Fields
const (
// Common
fName = "name"
fParent = "parent"
fHost = "host"
fNetwork = "network"
fDatastore = "datastore"
// Folders
fVmFolder = "vmFolder"
fHostFolder = "hostFolder"
fNetFolder = "networkFolder"
fDsFolder = "datastoreFolder"
fChildEntity = "childEntity"
// Cluster
fDasEnabled = "configuration.dasConfig.enabled"
fDasVmCfg = "configuration.dasVmConfig"
fDrsEnabled = "configuration.drsConfig.enabled"
fDrsVmBehavior = "configuration.drsConfig.defaultVmBehavior"
fDrsVmCfg = "configuration.drsVmConfig"
// Host
fVm = "vm"
fProductName = "config.product.name"
fProductVersion = "config.product.version"
fVSwitch = "config.network.vswitch"
fPortGroup = "config.network.portgroup"
fPNIC = "config.network.pnic"
fVNIC = "config.network.vnic"
fInMaintMode = "summary.runtime.inMaintenanceMode"
fCpuSockets = "summary.hardware.numCpuPkgs"
fCpuCores = "summary.hardware.numCpuCores"
fThumbprint = "summary.config.sslThumbprint"
fMgtServerIp = "summary.managementServerIp"
// Network
fTag = "tag"
// PortGroup
fDVSwitch = "config.distributedVirtualSwitch"
// DV Switch
fDVSwitchHost = "config.host"
// Datastore
fDsType = "summary.type"
fCapacity = "summary.capacity"
fFreeSpace = "summary.freeSpace"
fDsMaintMode = "summary.maintenanceMode"
// VM
fUUID = "config.uuid"
fFirmware = "config.firmware"
fFtInfo = "config.ftInfo"
fCpuAffinity = "config.cpuAffinity"
fCpuHotAddEnabled = "config.cpuHotAddEnabled"
fCpuHotRemoveEnabled = "config.cpuHotRemoveEnabled"
fMemoryHotAddEnabled = "config.memoryHotAddEnabled"
fNumCpu = "config.hardware.numCPU"
fNumCoresPerSocket = "config.hardware.numCoresPerSocket"
fMemorySize = "config.hardware.memoryMB"
fDevices = "config.hardware.device"
fExtraConfig = "config.extraConfig"
fChangeTracking = "config.changeTrackingEnabled"
fGuestName = "summary.config.guestFullName"
fBalloonedMemory = "summary.quickStats.balloonedMemory"
fVmIpAddress = "summary.guest.ipAddress"
fStorageUsed = "summary.storage.committed"
fRuntimeHost = "runtime.host"
fPowerState = "runtime.powerState"
fConnectionState = "runtime.connectionState"
fSnapshot = "snapshot"
fIsTemplate = "config.template"
)
//
// Selections
const (
TraverseFolders = "traverseFolders"
)
//
// Actions
const (
Enter = "enter"
Leave = "leave"
Modify = "modify"
Assign = "assign"
)
var TsDFolder = &types.TraversalSpec{
Type: Folder,
Path: fChildEntity,
SelectSet: []types.BaseSelectionSpec{
&types.SelectionSpec{
Name: TraverseFolders,
},
},
}
//
// Datacenter/VM traversal Spec.
var TsDatacenterVM = &types.TraversalSpec{
Type: Datacenter,
Path: fVmFolder,
SelectSet: []types.BaseSelectionSpec{
&types.SelectionSpec{
Name: TraverseFolders,
},
},
}
//
// Datacenter/Host traversal Spec.
var TsDatacenterHost = &types.TraversalSpec{
Type: Datacenter,
Path: fHostFolder,
SelectSet: []types.BaseSelectionSpec{
&types.SelectionSpec{
Name: TraverseFolders,
},
},
}
//
// Datacenter/Host traversal Spec.
var TsClusterHostSystem = &types.TraversalSpec{
Type: Cluster,
Path: fHost,
SelectSet: []types.BaseSelectionSpec{
&types.SelectionSpec{
Name: TraverseFolders,
},
},
}
//
// Datacenter/Host traversal Spec.
var TsDatacenterNet = &types.TraversalSpec{
Type: Datacenter,
Path: fNetFolder,
SelectSet: []types.BaseSelectionSpec{
&types.SelectionSpec{
Name: TraverseFolders,
},
},
}
//
// Datacenter/Datastore traversal Spec.
var TsDatacenterDatastore = &types.TraversalSpec{
Type: Datacenter,
Path: fDsFolder,
SelectSet: []types.BaseSelectionSpec{
&types.SelectionSpec{
Name: TraverseFolders,
},
},
}
//
// Root Folder traversal Spec
var TsRootFolder = &types.TraversalSpec{
SelectionSpec: types.SelectionSpec{
Name: TraverseFolders,
},
Type: Folder,
Path: fChildEntity,
SelectSet: []types.BaseSelectionSpec{
TsDFolder,
TsDatacenterVM,
TsDatacenterHost,
TsDatacenterNet,
TsDatacenterDatastore,
TsClusterHostSystem,
},
}
func main() {
ctx := context.Background()
url, err := soap.ParseURL("https://localhost:8989")
if err != nil {
fmt.Println(err)
return
}
soapClient := soap.NewClient(url, true)
vimClient, err := vim25.NewClient(ctx, soapClient)
if err != nil {
fmt.Println(err)
return
}
client := &govmomi.Client{
SessionManager: session.NewManager(vimClient),
Client: vimClient,
}
err = client.Login(ctx, liburl.UserPassword("user", "pass"))
if err != nil {
fmt.Println(err)
return
}
pc := property.DefaultCollector(client.Client)
pc, err = pc.Create(ctx)
if err != nil {
fmt.Println(err)
return
}
filterSpec := property.WaitFilter{
CreateFilter: types.CreateFilter{
This: pc.Reference(),
Spec: types.PropertyFilterSpec{
ObjectSet: []types.ObjectSpec{
types.ObjectSpec{
Obj: client.ServiceContent.RootFolder,
SelectSet: []types.BaseSelectionSpec{
TsRootFolder,
},
},
},
PropSet: []types.PropertySpec{
types.PropertySpec{
Type: "Folder",
PathSet: []string{
"name",
},
},
},
},
},
Options: &types.WaitOptions{},
}
err = pc.CreateFilter(ctx, filterSpec.CreateFilter)
if err != nil {
fmt.Println(err)
return
}
req := types.WaitForUpdatesEx{
This: pc.Reference(),
Options: filterSpec.Options,
}
for {
response, err := methods.WaitForUpdatesEx(ctx, client, &req)
if err != nil {
fmt.Println(err)
break
}
updateSet := response.Returnval
if updateSet == nil {
break
}
req.Version = updateSet.Version
for _, fs := range updateSet.FilterSet {
for _, objectUpdate := range fs.ObjectSet {
fmt.Println(objectUpdate)
}
}
if updateSet.Truncated == nil || !*updateSet.Truncated {
break
}
}
pc.Destroy(ctx)
client.Logout(ctx)
}
package main
import (
"context"
"fmt"
liburl "net/url"
"github.com/vmware/govmomi"
"github.com/vmware/govmomi/property"
"github.com/vmware/govmomi/session"
"github.com/vmware/govmomi/vim25"
"github.com/vmware/govmomi/vim25/methods"
"github.com/vmware/govmomi/vim25/soap"
"github.com/vmware/govmomi/vim25/types"
)
//
// Types
const (
Folder = "Folder"
VirtualMachine = "VirtualMachine"
Datacenter = "Datacenter"
Cluster = "ClusterComputeResource"
Host = "HostSystem"
Network = "Network"
DVPortGroup = "DistributedVirtualPortgroup"
DVSwitch = "VmwareDistributedVirtualSwitch"
Datastore = "Datastore"
)
//
// Fields
const (
// Common
fName = "name"
fParent = "parent"
fHost = "host"
fNetwork = "network"
fDatastore = "datastore"
// Folders
fVmFolder = "vmFolder"
fHostFolder = "hostFolder"
fNetFolder = "networkFolder"
fDsFolder = "datastoreFolder"
fChildEntity = "childEntity"
// Cluster
fDasEnabled = "configuration.dasConfig.enabled"
fDasVmCfg = "configuration.dasVmConfig"
fDrsEnabled = "configuration.drsConfig.enabled"
fDrsVmBehavior = "configuration.drsConfig.defaultVmBehavior"
fDrsVmCfg = "configuration.drsVmConfig"
// Host
fVm = "vm"
fProductName = "config.product.name"
fProductVersion = "config.product.version"
fVSwitch = "config.network.vswitch"
fPortGroup = "config.network.portgroup"
fPNIC = "config.network.pnic"
fVNIC = "config.network.vnic"
fInMaintMode = "summary.runtime.inMaintenanceMode"
fCpuSockets = "summary.hardware.numCpuPkgs"
fCpuCores = "summary.hardware.numCpuCores"
fThumbprint = "summary.config.sslThumbprint"
fMgtServerIp = "summary.managementServerIp"
// Network
fTag = "tag"
// PortGroup
fDVSwitch = "config.distributedVirtualSwitch"
// DV Switch
fDVSwitchHost = "config.host"
// Datastore
fDsType = "summary.type"
fCapacity = "summary.capacity"
fFreeSpace = "summary.freeSpace"
fDsMaintMode = "summary.maintenanceMode"
// VM
fUUID = "config.uuid"
fFirmware = "config.firmware"
fFtInfo = "config.ftInfo"
fCpuAffinity = "config.cpuAffinity"
fCpuHotAddEnabled = "config.cpuHotAddEnabled"
fCpuHotRemoveEnabled = "config.cpuHotRemoveEnabled"
fMemoryHotAddEnabled = "config.memoryHotAddEnabled"
fNumCpu = "config.hardware.numCPU"
fNumCoresPerSocket = "config.hardware.numCoresPerSocket"
fMemorySize = "config.hardware.memoryMB"
fDevices = "config.hardware.device"
fExtraConfig = "config.extraConfig"
fChangeTracking = "config.changeTrackingEnabled"
fGuestName = "summary.config.guestFullName"
fBalloonedMemory = "summary.quickStats.balloonedMemory"
fVmIpAddress = "summary.guest.ipAddress"
fStorageUsed = "summary.storage.committed"
fRuntimeHost = "runtime.host"
fPowerState = "runtime.powerState"
fConnectionState = "runtime.connectionState"
fSnapshot = "snapshot"
fIsTemplate = "config.template"
)
//
// Selections
const (
TraverseFolders = "traverseFolders"
)
//
// Actions
const (
Enter = "enter"
Leave = "leave"
Modify = "modify"
Assign = "assign"
)
//
// Datacenter/VM traversal Spec.
var TsDatacenterVM = &types.TraversalSpec{
Type: Datacenter,
Path: fVmFolder,
SelectSet: []types.BaseSelectionSpec{
&types.SelectionSpec{
Name: TraverseFolders,
},
},
}
//
// Datacenter/Host traversal Spec.
var TsDatacenterHost = &types.TraversalSpec{
Type: Datacenter,
Path: fHostFolder,
SelectSet: []types.BaseSelectionSpec{
&types.SelectionSpec{
Name: TraverseFolders,
},
},
}
//
// Datacenter/Host traversal Spec.
var TsClusterHostSystem = &types.TraversalSpec{
Type: Cluster,
Path: fHost,
SelectSet: []types.BaseSelectionSpec{
&types.SelectionSpec{
Name: TraverseFolders,
},
},
}
//
// Datacenter/Host traversal Spec.
var TsDatacenterNet = &types.TraversalSpec{
Type: Datacenter,
Path: fNetFolder,
SelectSet: []types.BaseSelectionSpec{
&types.SelectionSpec{
Name: TraverseFolders,
},
},
}
//
// Datacenter/Datastore traversal Spec.
var TsDatacenterDatastore = &types.TraversalSpec{
Type: Datacenter,
Path: fDsFolder,
SelectSet: []types.BaseSelectionSpec{
&types.SelectionSpec{
Name: TraverseFolders,
},
},
}
//
// Root Folder traversal Spec
var TsRootFolder = &types.TraversalSpec{
SelectionSpec: types.SelectionSpec{
Name: TraverseFolders,
},
Type: Folder,
Path: fChildEntity,
SelectSet: []types.BaseSelectionSpec{
&types.SelectionSpec{
Name: TraverseFolders,
},
TsDatacenterVM,
TsDatacenterHost,
TsDatacenterNet,
TsDatacenterDatastore,
TsClusterHostSystem,
},
}
func main() {
ctx := context.Background()
url, err := soap.ParseURL("https://localhost:8989")
if err != nil {
fmt.Println(err)
return
}
soapClient := soap.NewClient(url, true)
vimClient, err := vim25.NewClient(ctx, soapClient)
if err != nil {
fmt.Println(err)
return
}
client := &govmomi.Client{
SessionManager: session.NewManager(vimClient),
Client: vimClient,
}
err = client.Login(ctx, liburl.UserPassword("user", "pass"))
if err != nil {
fmt.Println(err)
return
}
pc := property.DefaultCollector(client.Client)
pc, err = pc.Create(ctx)
if err != nil {
fmt.Println(err)
return
}
filterSpec := property.WaitFilter{
CreateFilter: types.CreateFilter{
This: pc.Reference(),
Spec: types.PropertyFilterSpec{
ObjectSet: []types.ObjectSpec{
types.ObjectSpec{
Obj: client.ServiceContent.RootFolder,
SelectSet: []types.BaseSelectionSpec{
TsRootFolder,
},
},
},
PropSet: []types.PropertySpec{
types.PropertySpec{
Type: "Folder",
PathSet: []string{
"name",
},
},
},
},
},
Options: &types.WaitOptions{},
}
err = pc.CreateFilter(ctx, filterSpec.CreateFilter)
if err != nil {
fmt.Println(err)
return
}
req := types.WaitForUpdatesEx{
This: pc.Reference(),
Options: filterSpec.Options,
}
for {
response, err := methods.WaitForUpdatesEx(ctx, client, &req)
if err != nil {
fmt.Println(err)
break
}
updateSet := response.Returnval
if updateSet == nil {
break
}
req.Version = updateSet.Version
for _, fs := range updateSet.FilterSet {
for _, objectUpdate := range fs.ObjectSet {
fmt.Println(objectUpdate)
}
}
if updateSet.Truncated == nil || !*updateSet.Truncated {
break
}
}
pc.Destroy(ctx)
client.Logout(ctx)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment