Last active
August 9, 2021 16:50
-
-
Save agrare/8024343da804953824f0a35a699136f2 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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