@@ -13,8 +13,11 @@ import (
1313 "github.com/vmware/govmomi/cli"
1414 "github.com/vmware/govmomi/cli/flags"
1515 "github.com/vmware/govmomi/fault"
16+ "github.com/vmware/govmomi/find"
1617 "github.com/vmware/govmomi/object"
1718 "github.com/vmware/govmomi/ovf/importer"
19+ "github.com/vmware/govmomi/property"
20+ "github.com/vmware/govmomi/vim25/mo"
1821 "github.com/vmware/govmomi/vim25/types"
1922)
2023
@@ -164,7 +167,7 @@ func (cmd *ovfx) Prepare(f *flag.FlagSet) (string, error) {
164167 return "" , err
165168 }
166169
167- cmd .Importer .Datastore , err = cmd .DatastoreFlag . Datastore ()
170+ cmd .Importer .Datastore , err = cmd .datastore ()
168171 if err != nil {
169172 return "" , err
170173 }
@@ -220,3 +223,59 @@ func (cmd *ovfx) Prepare(f *flag.FlagSet) (string, error) {
220223
221224 return f .Arg (0 ), nil
222225}
226+
227+ func (f * ovfx ) datastore () (* object.Datastore , error ) {
228+ ctx := context .Background ()
229+
230+ ds , err := f .Datastore ()
231+ if err == nil {
232+ return ds , nil
233+ }
234+ if _ , ok := err .(* find.NotFoundError ); ! ok {
235+ return nil , err
236+ }
237+
238+ finder , err := f .DatastoreFlag .Finder ()
239+ if err != nil {
240+ return nil , err
241+ }
242+
243+ pod , err := finder .DatastoreCluster (ctx , f .Name )
244+ if err != nil {
245+ return nil , err
246+ }
247+
248+ var folder mo.Folder
249+
250+ err = pod .Properties (ctx , pod .Reference (), []string {"childEntity" }, & folder )
251+ if err != nil {
252+ return nil , err
253+ }
254+
255+ if len (folder .ChildEntity ) == 0 {
256+ return nil , fmt .Errorf ("datastore cluster %q has no datastores" , f .Name )
257+ }
258+
259+ pc := property .DefaultCollector (pod .Client ())
260+
261+ var stores []mo.Datastore
262+
263+ err = pc .Retrieve (ctx , folder .ChildEntity , []string {"info.freeSpace" }, & stores )
264+ if err != nil {
265+ return nil , err
266+ }
267+
268+ // choose Datastore from DatastoreCluster (StoragePod) with the most free space
269+ var ref types.ManagedObjectReference
270+ var max int64
271+
272+ for _ , ds := range stores {
273+ space := ds .Info .GetDatastoreInfo ().FreeSpace
274+ if space > max {
275+ max = space
276+ ref = ds .Reference ()
277+ }
278+ }
279+
280+ return object .NewDatastore (pod .Client (), ref ), nil
281+ }
0 commit comments