github.com/vmware/govmomi@v0.51.0/cli/cluster/group/info_flag.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 group 6 7 import ( 8 "context" 9 "flag" 10 "fmt" 11 12 "github.com/vmware/govmomi/cli/flags" 13 "github.com/vmware/govmomi/vim25/types" 14 ) 15 16 type InfoFlag struct { 17 *flags.ClusterFlag 18 19 groups []types.BaseClusterGroupInfo 20 21 name string 22 } 23 24 func NewInfoFlag(ctx context.Context) (*InfoFlag, context.Context) { 25 f := &InfoFlag{} 26 f.ClusterFlag, ctx = flags.NewClusterFlag(ctx) 27 return f, ctx 28 } 29 30 func (f *InfoFlag) Register(ctx context.Context, fs *flag.FlagSet) { 31 f.ClusterFlag.Register(ctx, fs) 32 33 fs.StringVar(&f.name, "name", "", "Cluster group name") 34 } 35 36 func (f *InfoFlag) Process(ctx context.Context) error { 37 return f.ClusterFlag.Process(ctx) 38 } 39 40 func (f *InfoFlag) Groups(ctx context.Context) ([]types.BaseClusterGroupInfo, error) { 41 if f.groups != nil { 42 return f.groups, nil 43 } 44 45 cluster, err := f.Cluster() 46 if err != nil { 47 return nil, err 48 } 49 50 config, err := cluster.Configuration(ctx) 51 if err != nil { 52 return nil, err 53 } 54 55 f.groups = config.Group 56 57 return f.groups, nil 58 } 59 60 type ClusterGroupInfo struct { 61 info types.BaseClusterGroupInfo 62 63 refs *[]types.ManagedObjectReference 64 65 kind string 66 } 67 68 func newGroupInfo(info types.BaseClusterGroupInfo) *ClusterGroupInfo { 69 group := &ClusterGroupInfo{info: info} 70 71 switch info := info.(type) { 72 case *types.ClusterHostGroup: 73 group.refs = &info.Host 74 group.kind = "HostSystem" 75 case *types.ClusterVmGroup: 76 group.refs = &info.Vm 77 group.kind = "VirtualMachine" 78 } 79 80 return group 81 } 82 83 func (f *InfoFlag) Group(ctx context.Context) (*ClusterGroupInfo, error) { 84 groups, err := f.Groups(ctx) 85 if err != nil { 86 return nil, err 87 } 88 89 for _, group := range groups { 90 if group.GetClusterGroupInfo().Name == f.name { 91 return newGroupInfo(group), nil 92 } 93 } 94 95 return nil, fmt.Errorf("group %q not found", f.name) 96 } 97 98 func (f *InfoFlag) Apply(ctx context.Context, update types.ArrayUpdateSpec, info types.BaseClusterGroupInfo) error { 99 spec := &types.ClusterConfigSpecEx{ 100 GroupSpec: []types.ClusterGroupSpec{ 101 { 102 ArrayUpdateSpec: update, 103 Info: info, 104 }, 105 }, 106 } 107 108 return f.Reconfigure(ctx, spec) 109 }