github.com/vmware/govmomi@v0.51.0/cli/datastore/disk/info.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 disk 6 7 import ( 8 "context" 9 "flag" 10 "fmt" 11 "io" 12 "strings" 13 "text/tabwriter" 14 15 "github.com/vmware/govmomi/cli" 16 "github.com/vmware/govmomi/cli/flags" 17 "github.com/vmware/govmomi/object" 18 ) 19 20 type info struct { 21 *flags.DatastoreFlag 22 23 c bool 24 d bool 25 p bool 26 27 uuid bool 28 } 29 30 func init() { 31 cli.Register("datastore.disk.info", &info{}) 32 } 33 34 func (cmd *info) Register(ctx context.Context, f *flag.FlagSet) { 35 cmd.DatastoreFlag, ctx = flags.NewDatastoreFlag(ctx) 36 cmd.DatastoreFlag.Register(ctx, f) 37 38 f.BoolVar(&cmd.c, "c", false, "Chain format") 39 f.BoolVar(&cmd.d, "d", false, "Include datastore in output") 40 f.BoolVar(&cmd.p, "p", true, "Include parents") 41 f.BoolVar(&cmd.uuid, "uuid", false, "Include disk UUID") 42 } 43 44 func (cmd *info) Process(ctx context.Context) error { 45 if err := cmd.DatastoreFlag.Process(ctx); err != nil { 46 return err 47 } 48 return nil 49 } 50 51 func (cmd *info) Usage() string { 52 return "VMDK" 53 } 54 55 func (cmd *info) Description() string { 56 return `Query VMDK info on DS. 57 58 Examples: 59 govc datastore.disk.info disks/disk1.vmdk` 60 } 61 62 func fullPath(s string) string { 63 return s 64 } 65 66 func dsPath(s string) string { 67 var p object.DatastorePath 68 69 if p.FromString(s) { 70 return p.Path 71 } 72 73 return s 74 } 75 76 var infoPath = dsPath 77 78 var queryUUID func(string) string 79 80 type infoResult []object.VirtualDiskInfo 81 82 func (r infoResult) Write(w io.Writer) error { 83 tw := tabwriter.NewWriter(w, 2, 0, 2, ' ', 0) 84 85 for _, info := range r { 86 fmt.Fprintf(tw, "Name:\t%s\n", infoPath(info.Name)) 87 if queryUUID != nil { 88 fmt.Fprintf(tw, " UUID:\t%s\n", queryUUID(info.Name)) 89 } 90 fmt.Fprintf(tw, " Type:\t%s\n", info.DiskType) 91 fmt.Fprintf(tw, " Parent:\t%s\n", infoPath(info.Parent)) 92 } 93 94 return tw.Flush() 95 } 96 97 type chainResult []object.VirtualDiskInfo 98 99 func (r chainResult) Write(w io.Writer) error { 100 for i, info := range r { 101 fmt.Fprint(w, strings.Repeat(" ", i*2)) 102 fmt.Fprintln(w, infoPath(info.Name)) 103 } 104 105 return nil 106 } 107 108 func (cmd *info) Run(ctx context.Context, f *flag.FlagSet) error { 109 if f.NArg() != 1 { 110 return flag.ErrHelp 111 } 112 113 dc, err := cmd.Datacenter() 114 if err != nil { 115 return err 116 } 117 118 ds, err := cmd.Datastore() 119 if err != nil { 120 return err 121 } 122 123 m := object.NewVirtualDiskManager(ds.Client()) 124 125 if cmd.uuid { 126 queryUUID = func(name string) string { 127 id, _ := m.QueryVirtualDiskUuid(ctx, name, dc) 128 return id 129 } 130 } 131 132 info, err := m.QueryVirtualDiskInfo(ctx, ds.Path(f.Arg(0)), dc, cmd.p) 133 if err != nil { 134 return err 135 } 136 137 if cmd.d { 138 infoPath = fullPath 139 } 140 141 var r flags.OutputWriter = infoResult(info) 142 143 if cmd.c { 144 r = chainResult(info) 145 } 146 147 return cmd.WriteResult(r) 148 }