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