github.com/vmware/govmomi@v0.37.1/govc/metric/performance.go (about) 1 /* 2 Copyright (c) 2017 VMware, Inc. All Rights Reserved. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package metric 18 19 import ( 20 "context" 21 "flag" 22 "fmt" 23 "strconv" 24 25 "github.com/vmware/govmomi/govc/flags" 26 "github.com/vmware/govmomi/performance" 27 ) 28 29 type PerformanceFlag struct { 30 *flags.DatacenterFlag 31 *flags.OutputFlag 32 33 m *performance.Manager 34 35 interval string 36 } 37 38 func NewPerformanceFlag(ctx context.Context) (*PerformanceFlag, context.Context) { 39 f := &PerformanceFlag{} 40 f.DatacenterFlag, ctx = flags.NewDatacenterFlag(ctx) 41 f.OutputFlag, ctx = flags.NewOutputFlag(ctx) 42 return f, ctx 43 } 44 45 func (f *PerformanceFlag) Register(ctx context.Context, fs *flag.FlagSet) { 46 f.DatacenterFlag.Register(ctx, fs) 47 f.OutputFlag.Register(ctx, fs) 48 49 fs.StringVar(&f.interval, "i", "real", "Interval ID (real|day|week|month|year)") 50 } 51 52 func (f *PerformanceFlag) Process(ctx context.Context) error { 53 if err := f.DatacenterFlag.Process(ctx); err != nil { 54 return err 55 } 56 if err := f.OutputFlag.Process(ctx); err != nil { 57 return err 58 } 59 60 return nil 61 } 62 63 func (f *PerformanceFlag) Manager(ctx context.Context) (*performance.Manager, error) { 64 if f.m != nil { 65 return f.m, nil 66 } 67 68 c, err := f.Client() 69 if err != nil { 70 return nil, err 71 } 72 73 f.m = performance.NewManager(c) 74 75 f.m.Sort = true 76 77 return f.m, err 78 } 79 80 func (f *PerformanceFlag) Interval(val int32) int32 { 81 var interval int32 82 83 if f.interval != "" { 84 if i, ok := performance.Intervals[f.interval]; ok { 85 interval = i 86 } else { 87 n, err := strconv.ParseUint(f.interval, 10, 32) 88 if err != nil { 89 panic(err) 90 } 91 interval = int32(n) 92 } 93 } 94 95 if interval == 0 { 96 if val == -1 { 97 // realtime not supported 98 return 300 99 } 100 101 return val 102 } 103 104 return interval 105 } 106 107 func (f *PerformanceFlag) ErrNotFound(name string) error { 108 return fmt.Errorf("counter %q not found", name) 109 }