github.com/vmware/govmomi@v0.51.0/cli/metric/performance.go (about) 1 // © Broadcom. All Rights Reserved. 2 // The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. 3 // SPDX-License-Identifier: Apache-2.0 4 5 package metric 6 7 import ( 8 "context" 9 "flag" 10 "fmt" 11 "math" 12 "strconv" 13 14 "github.com/vmware/govmomi/cli/flags" 15 "github.com/vmware/govmomi/performance" 16 ) 17 18 type PerformanceFlag struct { 19 *flags.DatacenterFlag 20 *flags.OutputFlag 21 22 m *performance.Manager 23 24 interval string 25 } 26 27 func NewPerformanceFlag(ctx context.Context) (*PerformanceFlag, context.Context) { 28 f := &PerformanceFlag{} 29 f.DatacenterFlag, ctx = flags.NewDatacenterFlag(ctx) 30 f.OutputFlag, ctx = flags.NewOutputFlag(ctx) 31 return f, ctx 32 } 33 34 func (f *PerformanceFlag) Register(ctx context.Context, fs *flag.FlagSet) { 35 f.DatacenterFlag.Register(ctx, fs) 36 f.OutputFlag.Register(ctx, fs) 37 38 fs.StringVar(&f.interval, "i", "real", "Interval ID (real|day|week|month|year)") 39 } 40 41 func (f *PerformanceFlag) Process(ctx context.Context) error { 42 if err := f.DatacenterFlag.Process(ctx); err != nil { 43 return err 44 } 45 if err := f.OutputFlag.Process(ctx); err != nil { 46 return err 47 } 48 49 return nil 50 } 51 52 func (f *PerformanceFlag) Manager(ctx context.Context) (*performance.Manager, error) { 53 if f.m != nil { 54 return f.m, nil 55 } 56 57 c, err := f.Client() 58 if err != nil { 59 return nil, err 60 } 61 62 f.m = performance.NewManager(c) 63 64 f.m.Sort = true 65 66 return f.m, err 67 } 68 69 func (f *PerformanceFlag) Interval(val int32) int32 { 70 var interval int32 71 72 if f.interval != "" { 73 if i, ok := performance.Intervals[f.interval]; ok { 74 interval = i 75 } else { 76 n, err := strconv.ParseUint(f.interval, 10, 32) 77 if err != nil { 78 panic(err) 79 } 80 81 if n > math.MaxInt32 { 82 panic(fmt.Errorf("value out of range for int32: %d", n)) 83 } else { 84 interval = int32(n) 85 } 86 } 87 } 88 89 if interval == 0 { 90 if val == -1 { 91 // realtime not supported 92 return 300 93 } 94 95 return val 96 } 97 98 return interval 99 } 100 101 func (f *PerformanceFlag) ErrNotFound(name string) error { 102 return fmt.Errorf("counter %q not found", name) 103 }