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