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