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  }