github.com/vmware/govmomi@v0.51.0/cli/vm/rdm/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 rdm 6 7 import ( 8 "context" 9 "flag" 10 "fmt" 11 "io" 12 "os" 13 "strings" 14 "text/tabwriter" 15 16 "github.com/vmware/govmomi/cli" 17 "github.com/vmware/govmomi/cli/flags" 18 "github.com/vmware/govmomi/object" 19 "github.com/vmware/govmomi/vim25/types" 20 ) 21 22 type ls struct { 23 *flags.VirtualMachineFlag 24 *flags.OutputFlag 25 } 26 27 func init() { 28 cli.Register("vm.rdm.ls", &ls{}) 29 } 30 31 func (cmd *ls) Register(ctx context.Context, f *flag.FlagSet) { 32 33 cmd.VirtualMachineFlag, ctx = flags.NewVirtualMachineFlag(ctx) 34 cmd.VirtualMachineFlag.Register(ctx, f) 35 cmd.OutputFlag, ctx = flags.NewOutputFlag(ctx) 36 cmd.OutputFlag.Register(ctx, f) 37 } 38 39 func (cmd *ls) Description() string { 40 return `List available devices that could be attach to VM with RDM. 41 42 Examples: 43 govc vm.rdm.ls -vm VM` 44 } 45 46 func (cmd *ls) Process(ctx context.Context) error { 47 48 if err := cmd.VirtualMachineFlag.Process(ctx); err != nil { 49 return err 50 } 51 if err := cmd.OutputFlag.Process(ctx); err != nil { 52 return err 53 } 54 return nil 55 } 56 57 func (cmd *ls) Run(ctx context.Context, f *flag.FlagSet) error { 58 vm, err := cmd.VirtualMachine() 59 if err != nil { 60 return err 61 } 62 63 if vm == nil { 64 return flag.ErrHelp 65 } 66 67 vmConfigOptions, err := queryConfigTarget(ctx, vm) 68 if err != nil { 69 return err 70 } 71 72 res := infoResult{ 73 Disks: vmConfigOptions.ScsiDisk, 74 } 75 return cmd.WriteResult(&res) 76 } 77 78 type infoResult struct { 79 Disks []types.VirtualMachineScsiDiskDeviceInfo `json:"disks"` 80 } 81 82 func (r *infoResult) Write(w io.Writer) error { 83 tw := tabwriter.NewWriter(os.Stdout, 2, 0, 2, ' ', 0) 84 for _, disk := range r.Disks { 85 fmt.Fprintf(tw, "Name:\t%s\n", disk.Name) 86 fmt.Fprintf(tw, " Device name:\t%s\n", disk.Disk.DeviceName) 87 fmt.Fprintf(tw, " Device path:\t%s\n", disk.Disk.DevicePath) 88 fmt.Fprintf(tw, " Canonical Name:\t%s\n", disk.Disk.CanonicalName) 89 90 var uids []string 91 for _, descriptor := range disk.Disk.Descriptor { 92 uids = append(uids, descriptor.Id) 93 } 94 95 fmt.Fprintf(tw, " UIDS:\t%s\n", strings.Join(uids, " ,")) 96 } 97 return tw.Flush() 98 } 99 100 func queryConfigTarget(ctx context.Context, m *object.VirtualMachine) (*types.ConfigTarget, error) { 101 b, err := m.EnvironmentBrowser(ctx) 102 if err != nil { 103 return nil, err 104 } 105 return b.QueryConfigTarget(ctx, nil) 106 }