Skip to content

Commit 8d78f54

Browse files
authored
Merge pull request #3763 from dougm/issue-1265
govc: Support Datastore Cluster in import.ova command
2 parents 2c0cb4f + ab3050b commit 8d78f54

File tree

2 files changed

+77
-1
lines changed

2 files changed

+77
-1
lines changed

cli/importx/ovf.go

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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+
}

govc/test/import.bats

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,3 +271,20 @@ load test_helper
271271
assert_equal ttylinux "$name"
272272
assert_equal 16.1 "$version"
273273
}
274+
275+
@test "import datastore cluster" {
276+
vcsim_env -pod 1 -ds 3
277+
278+
unset GOVC_DATASTORE
279+
280+
pod=DC0_POD0
281+
282+
run govc import.ova -ds $pod "$GOVC_IMAGES/$TTYLINUX_NAME.ova"
283+
assert_failure # datastore cluster "DC0_POD0" has no datastores
284+
285+
run govc object.mv /DC0/datastore/LocalDS_* $pod
286+
assert_success
287+
288+
run govc import.ova -ds $pod "$GOVC_IMAGES/$TTYLINUX_NAME.ova"
289+
assert_success
290+
}

0 commit comments

Comments
 (0)