github.com/vmware/govmomi@v0.51.0/cli/flags/folder.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 flags 6 7 import ( 8 "context" 9 "flag" 10 "fmt" 11 "os" 12 13 "github.com/vmware/govmomi/object" 14 ) 15 16 type FolderFlag struct { 17 common 18 19 *DatacenterFlag 20 21 name string 22 folder *object.Folder 23 } 24 25 var folderFlagKey = flagKey("folder") 26 27 func NewFolderFlag(ctx context.Context) (*FolderFlag, context.Context) { 28 if v := ctx.Value(folderFlagKey); v != nil { 29 return v.(*FolderFlag), ctx 30 } 31 32 v := &FolderFlag{} 33 v.DatacenterFlag, ctx = NewDatacenterFlag(ctx) 34 ctx = context.WithValue(ctx, folderFlagKey, v) 35 return v, ctx 36 } 37 38 func (flag *FolderFlag) Register(ctx context.Context, f *flag.FlagSet) { 39 flag.RegisterOnce(func() { 40 flag.DatacenterFlag.Register(ctx, f) 41 42 env := "GOVC_FOLDER" 43 value := os.Getenv(env) 44 usage := fmt.Sprintf("Inventory folder [%s]", env) 45 f.StringVar(&flag.name, "folder", value, usage) 46 }) 47 } 48 49 func (flag *FolderFlag) Process(ctx context.Context) error { 50 return flag.ProcessOnce(func() error { 51 if err := flag.DatacenterFlag.Process(ctx); err != nil { 52 return err 53 } 54 return nil 55 }) 56 } 57 58 func (flag *FolderFlag) IsSet() bool { 59 return flag.name != "" 60 } 61 62 func (flag *FolderFlag) Folder() (*object.Folder, error) { 63 if flag.folder != nil { 64 return flag.folder, nil 65 } 66 67 finder, err := flag.Finder() 68 if err != nil { 69 return nil, err 70 } 71 72 if flag.folder, err = finder.FolderOrDefault(context.TODO(), flag.name); err != nil { 73 return nil, err 74 } 75 76 return flag.folder, nil 77 } 78 79 func (flag *FolderFlag) FolderIfSpecified() (*object.Folder, error) { 80 if flag.name == "" { 81 return nil, nil 82 } 83 return flag.Folder() 84 } 85 86 func (flag *FolderFlag) FolderOrDefault(kind string) (*object.Folder, error) { 87 if flag.folder != nil { 88 return flag.folder, nil 89 } 90 91 if flag.name != "" { 92 return flag.Folder() 93 } 94 95 // RootFolder, no dc required 96 if kind == "/" { 97 client, err := flag.Client() 98 if err != nil { 99 return nil, err 100 } 101 102 flag.folder = object.NewRootFolder(client) 103 return flag.folder, nil 104 } 105 106 dc, err := flag.Datacenter() 107 if err != nil { 108 return nil, err 109 } 110 111 folders, err := dc.Folders(context.TODO()) 112 if err != nil { 113 return nil, err 114 } 115 116 switch kind { 117 case "vm": 118 flag.folder = folders.VmFolder 119 case "host": 120 flag.folder = folders.HostFolder 121 case "datastore": 122 flag.folder = folders.DatastoreFolder 123 case "network": 124 flag.folder = folders.NetworkFolder 125 default: 126 panic(kind) 127 } 128 129 return flag.folder, nil 130 }