diff --git a/log.txt b/log.txt index 3dcc6fe..b0915b5 100644 --- a/log.txt +++ b/log.txt @@ -202,3 +202,22 @@ 2023/08/31 09:38:30 Starting execution. Built on from sha1 2023/08/31 09:38:30 Setting timezone to 'Australia/Sydney' 2023/08/31 09:38:30 Connecting to vCenter https://vc.lab.local/sdk +2023/08/31 11:15:23 Starting execution. Built on from sha1 +2023/08/31 11:15:23 Setting timezone to 'Australia/Sydney' +2023/08/31 11:15:23 Connecting to vCenter https://vc.lab.local/sdk +2023/08/31 11:16:03 Starting execution. Built on from sha1 +2023/08/31 11:16:03 Setting timezone to 'Australia/Sydney' +2023/08/31 11:16:03 Connecting to vCenter https://vc.lab.local/sdk +2023/08/31 11:19:29 Starting execution. Built on from sha1 +2023/08/31 11:19:29 Setting timezone to 'Australia/Sydney' +2023/08/31 11:19:29 Connecting to vCenter https://vc.lab.local/sdk +2023/08/31 11:19:45 Starting execution. Built on from sha1 +2023/08/31 11:19:45 Setting timezone to 'Australia/Sydney' +2023/08/31 11:19:45 Connecting to vCenter https://vc.lab.local/sdk +2023/08/31 11:20:39 Starting execution. Built on from sha1 +2023/08/31 11:20:39 Setting timezone to 'Australia/Sydney' +2023/08/31 11:20:39 Connecting to vCenter https://vc.lab.local/sdk +2023/08/31 11:55:53 Starting execution. Built on from sha1 +2023/08/31 11:55:53 Setting timezone to 'Australia/Sydney' +2023/08/31 11:55:53 Connecting to vCenter https://vc.lab.local/sdk +2023/08/31 11:55:53 Cluster: Cluster diff --git a/main.go b/main.go index 31129b2..b07c593 100644 --- a/main.go +++ b/main.go @@ -2,6 +2,7 @@ package main import ( "context" + "encoding/json" "flag" "fmt" "log" @@ -29,8 +30,19 @@ var ( location *time.Location sha1ver string // sha1 revision used to build the program buildTime string // when the executable was built + results []DrsResults ) +type DrsResults struct { + ClusterName string + DrsScore int32 + NumVmsDrsBucket0To20 int32 + NumVmsDrsBucket21To40 int32 + NumVmsDrsBucket41To60 int32 + NumVmsDrsBucket61To80 int32 + NumVmsDrsBucket81To100 int32 +} + /* func findPerfCounter(perfManager *vim25.PerformanceManager, counterName string) (*vim25.PerfCounterInfo, error) { perfCounters, err := perfManager.QueryPerfCounter(context.Background(), nil) @@ -255,7 +267,6 @@ func query(t reflect.Type) { func getNumVmsPerDrsScoreBucket(client *govmomi.Client) error { //properties := []string{"drsVmConfig.numVmPerDrsScoreBucket"} - properties := []string{"configurationEx"} ctx := context.Background() m := view.NewManager(client.Client) @@ -269,27 +280,46 @@ func getNumVmsPerDrsScoreBucket(client *govmomi.Client) error { err = clusters.Retrieve(ctx, []string{"ClusterComputeResource"}, nil, &clusterList) if err != nil { + log.Printf("Error retrieving cluster list : '%s'\n", err) return err } for _, cluster := range clusterList { - fmt.Printf("Cluster: %s\n", cluster.Name) + log.Printf("Cluster: %s\n", cluster.Name) pc := property.DefaultCollector(client.Client) - - //var clusterProps *types.ComputeResourceSummary clusterProps := mo.ClusterComputeResource{} - err := pc.RetrieveOne(ctx, cluster.Reference(), properties, &clusterProps) + //err := pc.RetrieveOne(ctx, cluster.Reference(), properties, &clusterProps) + err := pc.RetrieveOne(ctx, cluster.Reference(), nil, &clusterProps) if err != nil { - fmt.Printf("Error retrieving property : '%s'\n", err) + log.Printf("Error retrieving property : '%s'\n", err) return err } - foo := clusterProps.ConfigurationEx - bar := foo.GetComputeResourceConfigInfo() - fmt.Printf("foo: %v\n", foo) - fmt.Printf("bar: %v\n", bar) + // Properties defined at https://vdc-download.vmware.com/vmwb-repository/dcr-public/bf660c0a-f060-46e8-a94d-4b5e6ffc77ad/208bc706-e281-49b6-a0ce-b402ec19ef82/SDK/vsphere-ws/docs/ReferenceGuide/vim.ClusterComputeResource.Summary.html + ccr := clusterProps.Summary.(*types.ClusterComputeResourceSummary) + /* + fmt.Printf("DRS Score: %v\n", ccr.DrsScore) + fmt.Printf("VMs in DRS Score Bucket 0%% to 20%% : %d\n", ccr.NumVmsPerDrsScoreBucket[0]) + fmt.Printf("VMs in DRS Score Bucket 21%% to 40%% : %d\n", ccr.NumVmsPerDrsScoreBucket[1]) + fmt.Printf("VMs in DRS Score Bucket 41%% to 60%% : %d\n", ccr.NumVmsPerDrsScoreBucket[2]) + fmt.Printf("VMs in DRS Score Bucket 61%% to 80%% : %d\n", ccr.NumVmsPerDrsScoreBucket[3]) + fmt.Printf("VMs in DRS Score Bucket 81%% to 100%% : %d\n", ccr.NumVmsPerDrsScoreBucket[4]) + */ + + // Create a new result + result := DrsResults{ + ClusterName: cluster.Name, + DrsScore: ccr.DrsScore, + NumVmsDrsBucket0To20: ccr.NumVmsPerDrsScoreBucket[0], + NumVmsDrsBucket21To40: ccr.NumVmsPerDrsScoreBucket[1], + NumVmsDrsBucket41To60: ccr.NumVmsPerDrsScoreBucket[2], + NumVmsDrsBucket61To80: ccr.NumVmsPerDrsScoreBucket[3], + NumVmsDrsBucket81To100: ccr.NumVmsPerDrsScoreBucket[4], + } + // Append to list of all results + results = append(results, result) /* // Print properties (fields) @@ -306,12 +336,6 @@ func getNumVmsPerDrsScoreBucket(client *govmomi.Client) error { fmt.Printf("Method %d: %s\n", i, method.Name) } */ - - //bar := types.ClusterConfigInfoEx(foo).getNumVmsPerDrsScoreBucket() - //fmt.Printf("%v\n", clusterProps) - - //fmt.Printf("Cluster: %s\n", clusterProps.Name) - //fmt.Printf("NumVmsPerDrsScoreBucket: %d\n", clusterProps.DrsVmConfig.NumVmPerDrsScoreBucket) } return nil @@ -374,7 +398,15 @@ func main() { //getSpecificVMMetrics(ctx, c.Client, *vmName) err = getNumVmsPerDrsScoreBucket(c) if err != nil { - fmt.Println("Error retrieving NumVmsPerDrsScoreBucket:", err) + log.Printf("Error retrieving NumVmsPerDrsScoreBucket: %s\n", err) return } + + // Output final results in JSON + if len(results) > 0 { + j, _ := json.Marshal(results) + fmt.Println(string(j)) + } else { + fmt.Println("{}") + } } diff --git a/packages/chatgpt.go b/packages/chatgpt.go deleted file mode 100644 index afee2d5..0000000 --- a/packages/chatgpt.go +++ /dev/null @@ -1,116 +0,0 @@ -package chatgpt - -import ( - "context" - "fmt" - "log" - "net/url" - - "github.com/vmware/govmomi" - "github.com/vmware/govmomi/property" - "github.com/vmware/govmomi/view" - "github.com/vmware/govmomi/vim25" - "github.com/vmware/govmomi/vim25/mo" -) - -func connectToVCenter() (*govmomi.Client, error) { - vcenterURL := "https://vc.lab.local/sdk" - vcenterUsername := "nathan" - vcenterPassword := "VMware1!" - - u, err := url.Parse(vcenterURL) - if err != nil { - return nil, err - } - - ctx := context.Background() - client, err := govmomi.NewClient(ctx, u, true) - if err != nil { - return nil, err - } - - err = client.Login(ctx, vcenterUsername, vcenterPassword) - if err != nil { - return nil, err - } - - return client, nil -} - -func getClusterConfigInfoEx(ctx context.Context, clusterRef *vim25.ClusterComputeResource) (*vim25.ClusterConfigInfoEx, error) { - properties := []string{"configurationEx"} - - pc := property.DefaultCollector(clusterRef.Client()) - - var clusterProps vim25.ClusterComputeResource - - err := pc.RetrieveOne(ctx, clusterRef.Reference(), properties, &clusterProps) - if err != nil { - return nil, err - } - - return clusterProps.ConfigurationEx, nil -} - -func findClusterByName(ctx context.Context, client *vim25.Client, name string) mo.ClusterComputeResource { - // Create a container view so that we can search vCenter - m := view.NewManager(client) - cv, _ := m.CreateContainerView(ctx, c.ServiceContent.RootFolder, []string{"ClusterComputeResource"}, true) - - var clusters []mo.ClusterComputeResource - log.Printf("Searching for Cluster '%s'\n", name) - err := cv.Retrieve(ctx, []string{"ClusterComputeResource"}, []string{"summary", "name"}, &clusters) - if err != nil { - log.Printf("Failed searching for Cluster %s : %s\n", name, err) - return mo.ClusterComputeResource{} - } else { - for _, cluster := range clusters { - if cluster.Name == name { - log.Printf("Found corresponding Cluster with MoRef '%s'\n", cluster.Reference()) - return cluster - } - } - } - - // If we reached here then we didn't find the Cluster - return mo.ClusterComputeResource{} -} - -func main() { - client, err := connectToVCenter() - if err != nil { - fmt.Println("Error connecting to vCenter:", err) - return - } - defer client.Logout(context.Background()) - - // Specify the cluster reference based on your environment - // For example: clusterRef := &vim25.ClusterComputeResource{} - clusterRef := findClusterByName(context.Background(), client.Client, "Cluster") - - clusterConfigInfoEx, err := getClusterConfigInfoEx(context.Background(), clusterRef) - if err != nil { - fmt.Println("Error retrieving ClusterConfigInfoEx:", err) - return - } - - // Access and print various data from clusterConfigInfoEx - fmt.Printf("Cluster Name: %s\n", clusterConfigInfoEx.Name) - fmt.Printf("Cluster DRS Enabled: %t\n", clusterConfigInfoEx.DrsConfig.Enabled) - // ... other properties ... - - fmt.Println("Cluster DRS Automation Level:") - fmt.Printf(" Default: %s\n", clusterConfigInfoEx.DrsConfig.DefaultVmBehavior) - fmt.Printf(" Enable: %s\n", clusterConfigInfoEx.DrsConfig.Enabled.Value) - fmt.Printf(" Override: %s\n", clusterConfigInfoEx.DrsConfig.VmOverrideBehavior) - - fmt.Printf("Cluster Admission Control: %t\n", clusterConfigInfoEx.AdmissionControlInfo.Enabled) - // ... other properties ... - - // Access and print data about HostGroups - for _, hostGroup := range clusterConfigInfoEx.HostGroup { - fmt.Printf("Host Group Name: %s\n", hostGroup.Name) - fmt.Printf("Host Group Vms: %v\n", hostGroup.Vm) - // ... other properties ... - } -}