github.com/vmware/govmomi@v0.51.0/cli/cluster/rule/ls.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 rule
     6  
     7  import (
     8  	"context"
     9  	"flag"
    10  	"fmt"
    11  	"io"
    12  
    13  	"github.com/vmware/govmomi/cli"
    14  )
    15  
    16  type ls struct {
    17  	*InfoFlag
    18  }
    19  
    20  func init() {
    21  	cli.Register("cluster.rule.ls", &ls{})
    22  }
    23  
    24  func (cmd *ls) Register(ctx context.Context, f *flag.FlagSet) {
    25  	cmd.InfoFlag, ctx = NewInfoFlag(ctx)
    26  	cmd.InfoFlag.Register(ctx, f)
    27  }
    28  
    29  func (cmd *ls) Process(ctx context.Context) error {
    30  	return cmd.InfoFlag.Process(ctx)
    31  }
    32  
    33  func (cmd *ls) Description() string {
    34  	return `List cluster rules and rule members.
    35  
    36  Examples:
    37    govc cluster.rule.ls -cluster my_cluster
    38    govc cluster.rule.ls -cluster my_cluster -name my_rule
    39    govc cluster.rule.ls -cluster my_cluster -l
    40    govc cluster.rule.ls -cluster my_cluster -name my_rule -l`
    41  }
    42  
    43  type ruleResult []string
    44  
    45  func (r ruleResult) Write(w io.Writer) error {
    46  	for i := range r {
    47  		fmt.Fprintln(w, r[i])
    48  	}
    49  
    50  	return nil
    51  }
    52  
    53  func (cmd *ls) Run(ctx context.Context, f *flag.FlagSet) error {
    54  	var res ruleResult
    55  
    56  	if cmd.name == "" {
    57  		rules, err := cmd.Rules(ctx)
    58  		if err != nil {
    59  			return err
    60  		}
    61  
    62  		for _, g := range rules {
    63  			ruleName := g.GetClusterRuleInfo().Name
    64  			if cmd.Long {
    65  				ruleTypeInfo := GetExtendedClusterRuleInfo(g).ruleType
    66  				res = append(res, fmt.Sprintf("%s (%s)", ruleName, ruleTypeInfo))
    67  			} else {
    68  				res = append(res, ruleName)
    69  			}
    70  		}
    71  	} else {
    72  		rule, err := cmd.Rule(ctx)
    73  		if err != nil {
    74  			return err
    75  		}
    76  
    77  		switch rule.ruleType {
    78  		case "ClusterAffinityRuleSpec", "ClusterAntiAffinityRuleSpec":
    79  			names, err := cmd.Names(ctx, *rule.refs)
    80  			if err != nil {
    81  				cmd.WriteResult(res)
    82  				return err
    83  			}
    84  
    85  			for _, ref := range *rule.refs {
    86  				res = extendedAppend(res, cmd.Long, names[ref], "VM")
    87  			}
    88  		case "ClusterVmHostRuleInfo":
    89  			res = extendedAppend(res, cmd.Long, rule.vmGroupName, "vmGroupName")
    90  			res = extendedAppend(res, cmd.Long, rule.affineHostGroupName, "affineHostGroupName")
    91  			res = extendedAppend(res, cmd.Long, rule.antiAffineHostGroupName, "antiAffineHostGroupName")
    92  		case "ClusterDependencyRuleInfo":
    93  			res = extendedAppend(res, cmd.Long, rule.VmGroup, "VmGroup")
    94  			res = extendedAppend(res, cmd.Long, rule.DependsOnVmGroup, "DependsOnVmGroup")
    95  		default:
    96  			res = append(res, "unknown rule type, no further rule details known")
    97  		}
    98  
    99  	}
   100  
   101  	return cmd.WriteResult(res)
   102  }
   103  
   104  func extendedAppend(res ruleResult, long bool, entryValue string, entryType string) ruleResult {
   105  	var newres ruleResult
   106  	if long {
   107  		newres = append(res, fmt.Sprintf("%s (%s)", entryValue, entryType))
   108  	} else {
   109  		newres = append(res, entryValue)
   110  	}
   111  	return newres
   112  }