github.com/vmware/govmomi@v0.51.0/cli/namespace/cluster/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 cluster
     6  
     7  import (
     8  	"context"
     9  	"encoding/json"
    10  	"flag"
    11  	"fmt"
    12  	"io"
    13  	"os"
    14  	"text/tabwriter"
    15  
    16  	"github.com/vmware/govmomi/cli"
    17  	"github.com/vmware/govmomi/cli/flags"
    18  	"github.com/vmware/govmomi/find"
    19  	"github.com/vmware/govmomi/object"
    20  	"github.com/vmware/govmomi/vapi/namespace"
    21  )
    22  
    23  type ls struct {
    24  	*flags.ClientFlag
    25  	*flags.OutputFlag
    26  
    27  	long bool
    28  }
    29  
    30  func init() {
    31  	cli.Register("namespace.cluster.ls", &ls{})
    32  }
    33  
    34  func (cmd *ls) Register(ctx context.Context, f *flag.FlagSet) {
    35  	cmd.ClientFlag, ctx = flags.NewClientFlag(ctx)
    36  	cmd.OutputFlag, ctx = flags.NewOutputFlag(ctx)
    37  	cmd.ClientFlag.Register(ctx, f)
    38  	cmd.OutputFlag.Register(ctx, f)
    39  
    40  	f.BoolVar(&cmd.long, "l", false, "Long listing format")
    41  }
    42  
    43  func (cmd *ls) Process(ctx context.Context) error {
    44  	if err := cmd.ClientFlag.Process(ctx); err != nil {
    45  		return err
    46  	}
    47  	return cmd.OutputFlag.Process(ctx)
    48  }
    49  
    50  func (cmd *ls) Description() string {
    51  	return `List namepace enabled clusters.
    52  
    53  Examples:
    54    govc namespace.cluster.ls
    55    govc namespace.cluster.ls -l
    56    govc namespace.cluster.ls -json | jq .`
    57  }
    58  
    59  type lsWriter struct {
    60  	cmd     *ls
    61  	Cluster []namespace.ClusterSummary `json:"cluster"`
    62  }
    63  
    64  func (r *lsWriter) Write(w io.Writer) error {
    65  	tw := tabwriter.NewWriter(os.Stdout, 2, 0, 2, ' ', 0)
    66  
    67  	for _, cluster := range r.Cluster {
    68  		path, err := r.path(cluster)
    69  		if err != nil {
    70  			return err
    71  		}
    72  		fmt.Fprintf(tw, "%s", path)
    73  		if r.cmd.long {
    74  			fmt.Fprintf(tw, "\t%s", cluster.ConfigStatus)
    75  			fmt.Fprintf(tw, "\t%s", cluster.KubernetesStatus)
    76  		}
    77  		fmt.Fprintf(tw, "\n")
    78  	}
    79  	return tw.Flush()
    80  }
    81  
    82  func (r *lsWriter) path(cluster namespace.ClusterSummary) (string, error) {
    83  	ref := cluster.Reference()
    84  
    85  	c, err := r.cmd.Client()
    86  	if err != nil {
    87  		return "", err
    88  	}
    89  
    90  	finder := find.NewFinder(c, false)
    91  	obj, err := finder.ObjectReference(context.Background(), ref)
    92  	if err != nil {
    93  		return "", err
    94  	}
    95  
    96  	return obj.(*object.ClusterComputeResource).InventoryPath, nil
    97  }
    98  
    99  func (r *lsWriter) MarshalJSON() ([]byte, error) {
   100  	return json.Marshal(r.Cluster)
   101  }
   102  
   103  func (r *lsWriter) Dump() any {
   104  	return r.Cluster
   105  }
   106  
   107  func (cmd *ls) Run(ctx context.Context, f *flag.FlagSet) error {
   108  	c, err := cmd.RestClient()
   109  	if err != nil {
   110  		return err
   111  	}
   112  
   113  	m := namespace.NewManager(c)
   114  	clusters, err := m.ListClusters(ctx)
   115  	if err != nil {
   116  		return err
   117  	}
   118  
   119  	return cmd.WriteResult(&lsWriter{cmd, clusters})
   120  }