Last active
August 9, 2021 16:50
-
-
Save agrare/8024343da804953824f0a35a699136f2 to your computer and use it in GitHub Desktop.
This file contains hidden or 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 hidden or 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