github.com/vmware/govmomi@v0.51.0/cli/datastore/vsan/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 vsan 6 7 import ( 8 "context" 9 "flag" 10 "fmt" 11 "net/url" 12 "text/tabwriter" 13 14 "github.com/vmware/govmomi/cli" 15 "github.com/vmware/govmomi/cli/flags" 16 "github.com/vmware/govmomi/object" 17 "github.com/vmware/govmomi/vim25/mo" 18 ) 19 20 type ls struct { 21 *flags.DatastoreFlag 22 23 long bool 24 orphan bool 25 } 26 27 func init() { 28 cli.Register("datastore.vsan.dom.ls", &ls{}) 29 } 30 31 func (cmd *ls) Register(ctx context.Context, f *flag.FlagSet) { 32 cmd.DatastoreFlag, ctx = flags.NewDatastoreFlag(ctx) 33 cmd.DatastoreFlag.Register(ctx, f) 34 35 f.BoolVar(&cmd.long, "l", false, "Long listing") 36 f.BoolVar(&cmd.orphan, "o", false, "List orphan objects") 37 } 38 39 func (cmd *ls) Process(ctx context.Context) error { 40 if err := cmd.DatastoreFlag.Process(ctx); err != nil { 41 return err 42 } 43 return nil 44 } 45 46 func (cmd *ls) Usage() string { 47 return "[UUID]..." 48 } 49 50 func (cmd *ls) Description() string { 51 return `List vSAN DOM objects in DS. 52 53 Examples: 54 govc datastore.vsan.dom.ls 55 govc datastore.vsan.dom.ls -ds vsanDatastore -l 56 govc datastore.vsan.dom.ls -l d85aa758-63f5-500a-3150-0200308e589c` 57 } 58 59 func (cmd *ls) Run(ctx context.Context, f *flag.FlagSet) error { 60 ds, err := cmd.Datastore() 61 if err != nil { 62 return err 63 } 64 65 var mds mo.Datastore 66 err = ds.Properties(ctx, ds.Reference(), []string{"summary"}, &mds) 67 if err != nil { 68 return err 69 } 70 71 if mds.Summary.Type != "vsan" { 72 return flag.ErrHelp 73 } 74 75 hosts, err := ds.AttachedHosts(ctx) 76 if err != nil { 77 return err 78 } 79 80 if len(hosts) == 0 { 81 return flag.ErrHelp 82 } 83 84 m, err := hosts[0].ConfigManager().VsanInternalSystem(ctx) 85 if err != nil { 86 return err 87 } 88 89 ids, err := m.QueryVsanObjectUuidsByFilter(ctx, f.Args(), 0, 0) 90 if err != nil { 91 return err 92 } 93 94 if len(ids) == 0 { 95 return nil 96 } 97 98 if !cmd.long && !cmd.orphan { 99 for _, id := range ids { 100 fmt.Fprintln(cmd.Out, id) 101 } 102 103 return nil 104 } 105 106 objs, err := m.GetVsanObjExtAttrs(ctx, ids) 107 if err != nil { 108 return err 109 } 110 111 u, err := url.Parse(mds.Summary.Url) 112 if err != nil { 113 return err 114 } 115 116 tw := tabwriter.NewWriter(cmd.Out, 2, 0, 2, ' ', 0) 117 cmd.Out = tw 118 119 for id, obj := range objs { 120 path := obj.DatastorePath(u.Path) 121 122 if cmd.orphan { 123 _, err = ds.Stat(ctx, path) 124 if err == nil { 125 continue 126 } 127 128 switch err.(type) { 129 case object.DatastoreNoSuchDirectoryError, object.DatastoreNoSuchFileError: 130 default: 131 return err 132 } 133 134 if !cmd.long { 135 fmt.Fprintln(cmd.Out, id) 136 continue 137 } 138 } 139 140 fmt.Fprintf(cmd.Out, "%s\t%s\t%s\n", id, obj.Class, path) 141 } 142 143 return tw.Flush() 144 }