diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a41606ed..6321846c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # changelog -### unreleased +### 0.10.1 (2016-10-25) * Add object.DistributedVirtualPortgroup.Reconfigure method diff --git a/README.md b/README.md index 699f2bab0..cb6efca0e 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ A Go library for interacting with VMware vSphere APIs (ESXi and/or vCenter). -For `govc`, a CLI built on top of govmomi, check out the [govc](./govc) directory. +For `govc`, a CLI built on top of govmomi, check out the [govc](./govc) directory and [USAGE](./govc/USAGE.md) document. ## Compatibility diff --git a/govc/CHANGELOG.md b/govc/CHANGELOG.md index a99def1df..ceaacb2b0 100644 --- a/govc/CHANGELOG.md +++ b/govc/CHANGELOG.md @@ -1,6 +1,14 @@ # changelog -### unreleased +### 0.10.1 (2016-10-25) + +* Add object.destroy and object.rename commands + +* Remove datacenter.destroy command (use object.destroy instead) + +* Remove folder.destroy command (use object.destroy instead) + +* Rename folder.move_into -> object.mv * Add dvs.portgroup.change command diff --git a/govc/USAGE.md b/govc/USAGE.md index 8af2acc26..f46097b3e 100644 --- a/govc/USAGE.md +++ b/govc/USAGE.md @@ -140,14 +140,6 @@ Options: -folder= Inventory folder [GOVC_FOLDER] ``` -## datacenter.destroy - -``` -Usage: govc datacenter.destroy [OPTIONS] PATH... - -Options: -``` - ## datacenter.info ``` @@ -306,8 +298,8 @@ Copy SOURCE from the local system to DEST on DS. If SOURCE name is "-", read source from stdin. Examples: - govc datasore.upload -ds datastore1 ./config.iso vm-name/config.iso - genisoimage ... | govc datasore.upload -ds datastore1 - vm-name/config.iso + govc datastore.upload -ds datastore1 ./config.iso vm-name/config.iso + genisoimage ... | govc datastore.upload -ds datastore1 - vm-name/config.iso Options: -ds= Datastore [GOVC_DATASTORE] @@ -360,8 +352,8 @@ Eject media from CD-ROM device. If device is not specified, the first CD-ROM device is used. Examples: - govc device.floppy.eject -vm vm-1 - govc device.floppy.eject -vm vm-1 -device floppy-1 + govc device.cdrom.eject -vm vm-1 + govc device.cdrom.eject -vm vm-1 -device floppy-1 Options: -device= CD-ROM device name @@ -678,7 +670,8 @@ Usage: govc events [OPTIONS] [PATH]... Display events. Examples: - govc events vm1 vm2 + govc events vm/my-vm1 vm/my-vm2 + govc events /dc1/vm/* /dc2/vm/* govc ls -t HostSystem host/* | xargs govc events | grep -i vsan Options: @@ -807,16 +800,6 @@ Options: -pod=false Create folder(s) of type StoragePod (DatastoreCluster) ``` -## folder.destroy - -``` -Usage: govc folder.destroy [OPTIONS] FOLDER... - -Destroy one or more FOLDERs. - -Options: -``` - ## folder.info ``` @@ -825,34 +808,6 @@ Usage: govc folder.info [OPTIONS] [PATH]... Options: ``` -## folder.moveinto - -``` -Usage: govc folder.moveinto [OPTIONS] PATH... - -Move managed entities into this folder. - -Examples: - govc folder.moveinto -folder /dc1/folder-foo /dc2/folder-bar/* - -Options: - -folder= Inventory folder [GOVC_FOLDER] -``` - -## folder.rename - -``` -Usage: govc folder.rename [OPTIONS] NAME - -Rename an existing folder with NAME. - -Examples: - govc folder.rename -folder /dc1/vm/folder-foo folder-bar - -Options: - -folder= Inventory folder [GOVC_FOLDER] -``` - ## guest.chmod ``` @@ -1656,6 +1611,46 @@ Options: -t= Object type ``` +## object.destroy + +``` +Usage: govc object.destroy [OPTIONS] PATH... + +Destroy managed objects. + +Examples: + govc object.destroy /dc1/network/dvs /dc1/host/cluster + +Options: +``` + +## object.mv + +``` +Usage: govc object.mv [OPTIONS] PATH... FOLDER + +Move managed entities to FOLDER. + +Examples: + govc folder.create /dc1/host/example + govc object.mv /dc2/host/*.example.com /dc1/host/example + +Options: +``` + +## object.rename + +``` +Usage: govc object.rename [OPTIONS] PATH NAME + +Rename managed objects. + +Examples: + govc object.rename /dc1/network/dvs1 Switch1 + +Options: +``` + ## permissions.ls ``` diff --git a/govc/datacenter/destroy.go b/govc/datacenter/destroy.go deleted file mode 100644 index 9936c3504..000000000 --- a/govc/datacenter/destroy.go +++ /dev/null @@ -1,83 +0,0 @@ -/* -Copyright (c) 2014-2015 VMware, Inc. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package datacenter - -import ( - "context" - "flag" - - "github.com/vmware/govmomi/find" - "github.com/vmware/govmomi/govc/cli" - "github.com/vmware/govmomi/govc/flags" -) - -type destroy struct { - *flags.ClientFlag -} - -func init() { - cli.Register("datacenter.destroy", &destroy{}) -} - -func (cmd *destroy) Register(ctx context.Context, f *flag.FlagSet) { - cmd.ClientFlag, ctx = flags.NewClientFlag(ctx) - cmd.ClientFlag.Register(ctx, f) -} - -func (cmd *destroy) Usage() string { - return "PATH..." -} - -func (cmd *destroy) Process(ctx context.Context) error { - if err := cmd.ClientFlag.Process(ctx); err != nil { - return err - } - return nil -} - -func (cmd *destroy) Run(ctx context.Context, f *flag.FlagSet) error { - if f.NArg() == 0 { - return flag.ErrHelp - } - - client, err := cmd.ClientFlag.Client() - if err != nil { - return err - } - - finder := find.NewFinder(client, false) - - for _, path := range f.Args() { - dcs, err := finder.DatacenterList(ctx, path) - if err != nil { - return err - } - - for _, dc := range dcs { - task, err := dc.Destroy(ctx) - if err != nil { - return err - } - - if err := task.Wait(ctx); err != nil { - return err - } - } - } - - return nil -} diff --git a/govc/datastore/upload.go b/govc/datastore/upload.go index 2ccb1faff..2d9420d28 100644 --- a/govc/datastore/upload.go +++ b/govc/datastore/upload.go @@ -64,8 +64,8 @@ func (cmd *upload) Description() string { If SOURCE name is "-", read source from stdin. Examples: - govc datasore.upload -ds datastore1 ./config.iso vm-name/config.iso - genisoimage ... | govc datasore.upload -ds datastore1 - vm-name/config.iso` + govc datastore.upload -ds datastore1 ./config.iso vm-name/config.iso + genisoimage ... | govc datastore.upload -ds datastore1 - vm-name/config.iso` } func (cmd *upload) Run(ctx context.Context, f *flag.FlagSet) error { diff --git a/govc/device/cdrom/eject.go b/govc/device/cdrom/eject.go index d445ef9dd..78cce90d1 100644 --- a/govc/device/cdrom/eject.go +++ b/govc/device/cdrom/eject.go @@ -54,8 +54,8 @@ func (cmd *eject) Description() string { If device is not specified, the first CD-ROM device is used. Examples: - govc device.floppy.eject -vm vm-1 - govc device.floppy.eject -vm vm-1 -device floppy-1` + govc device.cdrom.eject -vm vm-1 + govc device.cdrom.eject -vm vm-1 -device floppy-1` } func (cmd *eject) Run(ctx context.Context, f *flag.FlagSet) error { diff --git a/govc/events/command.go b/govc/events/command.go index 6677715ba..35191739d 100644 --- a/govc/events/command.go +++ b/govc/events/command.go @@ -57,7 +57,8 @@ func (cmd *events) Description() string { return `Display events. Examples: - govc events vm1 vm2 + govc events vm/my-vm1 vm/my-vm2 + govc events /dc1/vm/* /dc2/vm/* govc ls -t HostSystem host/* | xargs govc events | grep -i vsan` } diff --git a/govc/flags/datacenter.go b/govc/flags/datacenter.go index 531bcabc7..a776ed6e9 100644 --- a/govc/flags/datacenter.go +++ b/govc/flags/datacenter.go @@ -150,6 +150,10 @@ func (flag *DatacenterFlag) ManagedObjects(ctx context.Context, args []string) ( return nil, err } + if len(elements) == 0 { + return nil, fmt.Errorf("object '%s' not found", arg) + } + for _, e := range elements { refs = append(refs, e.Object.Reference()) } diff --git a/govc/folder/move_into.go b/govc/folder/move_into.go deleted file mode 100644 index ad67d98c9..000000000 --- a/govc/folder/move_into.go +++ /dev/null @@ -1,86 +0,0 @@ -/* -Copyright (c) 2016 VMware, Inc. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package folder - -import ( - "context" - "flag" - - "github.com/vmware/govmomi/govc/cli" - "github.com/vmware/govmomi/govc/flags" -) - -type move struct { - *flags.ClientFlag - *flags.FolderFlag -} - -func init() { - cli.Register("folder.moveinto", &move{}) -} - -func (cmd *move) Register(ctx context.Context, f *flag.FlagSet) { - cmd.ClientFlag, ctx = flags.NewClientFlag(ctx) - cmd.ClientFlag.Register(ctx, f) - - cmd.FolderFlag, ctx = flags.NewFolderFlag(ctx) - cmd.FolderFlag.Register(ctx, f) -} - -func (cmd *move) Usage() string { - return "PATH..." -} - -func (cmd *move) Description() string { - return `Move managed entities into this folder. - -Examples: - govc folder.moveinto -folder /dc1/folder-foo /dc2/folder-bar/*` -} - -func (cmd *move) Process(ctx context.Context) error { - if err := cmd.ClientFlag.Process(ctx); err != nil { - return err - } - if err := cmd.FolderFlag.Process(ctx); err != nil { - return err - } - return nil -} - -func (cmd *move) Run(ctx context.Context, f *flag.FlagSet) error { - folder, err := cmd.Folder() - if err != nil { - return err - } - - if f.NArg() == 0 { - return flag.ErrHelp - } - - objs, err := cmd.ManagedObjects(ctx, f.Args()) - if err != nil { - return err - } - - task, err := folder.MoveInto(ctx, objs) - if err != nil { - return err - } - - return task.Wait(ctx) -} diff --git a/govc/main.go b/govc/main.go index 7be0da751..d55260817 100644 --- a/govc/main.go +++ b/govc/main.go @@ -56,6 +56,7 @@ import ( _ "github.com/vmware/govmomi/govc/license" _ "github.com/vmware/govmomi/govc/logs" _ "github.com/vmware/govmomi/govc/ls" + _ "github.com/vmware/govmomi/govc/object" _ "github.com/vmware/govmomi/govc/permissions" _ "github.com/vmware/govmomi/govc/pool" _ "github.com/vmware/govmomi/govc/session" diff --git a/govc/folder/destroy.go b/govc/object/destroy.go similarity index 70% rename from govc/folder/destroy.go rename to govc/object/destroy.go index 95cbcb897..7429bc51e 100644 --- a/govc/folder/destroy.go +++ b/govc/object/destroy.go @@ -14,14 +14,16 @@ See the License for the specific language governing permissions and limitations under the License. */ -package folder +package object import ( "context" "flag" + "fmt" "github.com/vmware/govmomi/govc/cli" "github.com/vmware/govmomi/govc/flags" + "github.com/vmware/govmomi/object" ) type destroy struct { @@ -29,7 +31,7 @@ type destroy struct { } func init() { - cli.Register("folder.destroy", &destroy{}) + cli.Register("object.destroy", &destroy{}) } func (cmd *destroy) Register(ctx context.Context, f *flag.FlagSet) { @@ -37,6 +39,17 @@ func (cmd *destroy) Register(ctx context.Context, f *flag.FlagSet) { cmd.DatacenterFlag.Register(ctx, f) } +func (cmd *destroy) Usage() string { + return "PATH..." +} + +func (cmd *destroy) Description() string { + return `Destroy managed objects. + +Examples: + govc object.destroy /dc1/network/dvs /dc1/host/cluster` +} + func (cmd *destroy) Process(ctx context.Context) error { if err := cmd.DatacenterFlag.Process(ctx); err != nil { return err @@ -44,40 +57,32 @@ func (cmd *destroy) Process(ctx context.Context) error { return nil } -func (cmd *destroy) Usage() string { - return "FOLDER..." -} - -func (cmd *destroy) Description() string { - return "Destroy one or more FOLDERs." -} - func (cmd *destroy) Run(ctx context.Context, f *flag.FlagSet) error { if f.NArg() == 0 { return flag.ErrHelp } - finder, err := cmd.Finder() + c, err := cmd.Client() + if err != nil { + return err + } + + objs, err := cmd.ManagedObjects(ctx, f.Args()) if err != nil { return err } - for _, arg := range f.Args() { - folders, err := finder.FolderList(ctx, arg) + for _, obj := range objs { + task, err := object.NewCommon(c, obj).Destroy(ctx) if err != nil { return err } - for _, folder := range folders { - task, err := folder.Destroy(ctx) - if err != nil { - return err - } - - err = task.Wait(ctx) - if err != nil { - return err - } + logger := cmd.ProgressLogger(fmt.Sprintf("destroying %s... ", obj)) + _, err = task.WaitForResult(ctx, logger) + logger.Wait() + if err != nil { + return err } } diff --git a/govc/object/mv.go b/govc/object/mv.go new file mode 100644 index 000000000..42c288246 --- /dev/null +++ b/govc/object/mv.go @@ -0,0 +1,92 @@ +/* +Copyright (c) 2016 VMware, Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package object + +import ( + "context" + "flag" + "fmt" + + "github.com/vmware/govmomi/govc/cli" + "github.com/vmware/govmomi/govc/flags" +) + +type mv struct { + *flags.DatacenterFlag +} + +func init() { + cli.Register("object.mv", &mv{}) +} + +func (cmd *mv) Register(ctx context.Context, f *flag.FlagSet) { + cmd.DatacenterFlag, ctx = flags.NewDatacenterFlag(ctx) + cmd.DatacenterFlag.Register(ctx, f) +} + +func (cmd *mv) Usage() string { + return "PATH... FOLDER" +} + +func (cmd *mv) Description() string { + return `Move managed entities to FOLDER. + +Examples: + govc folder.create /dc1/host/example + govc object.mv /dc2/host/*.example.com /dc1/host/example` +} + +func (cmd *mv) Process(ctx context.Context) error { + if err := cmd.DatacenterFlag.Process(ctx); err != nil { + return err + } + return nil +} + +func (cmd *mv) Run(ctx context.Context, f *flag.FlagSet) error { + if f.NArg() < 2 { + return flag.ErrHelp + } + + finder, err := cmd.Finder() + if err != nil { + return err + } + + n := f.NArg() - 1 + + folder, err := finder.Folder(ctx, f.Arg(n)) + if err != nil { + return err + } + + objs, err := cmd.ManagedObjects(ctx, f.Args()[:n]) + if err != nil { + return err + } + + task, err := folder.MoveInto(ctx, objs) + if err != nil { + return err + } + + logger := cmd.ProgressLogger(fmt.Sprintf("moving %d objects to %s... ", len(objs), folder.InventoryPath)) + _, err = task.WaitForResult(ctx, logger) + logger.Wait() + + return err +} diff --git a/govc/folder/rename.go b/govc/object/rename.go similarity index 62% rename from govc/folder/rename.go rename to govc/object/rename.go index 54db67bf9..4684cb91d 100644 --- a/govc/folder/rename.go +++ b/govc/object/rename.go @@ -14,68 +14,72 @@ See the License for the specific language governing permissions and limitations under the License. */ -package folder +package object import ( "context" "flag" + "fmt" "github.com/vmware/govmomi/govc/cli" "github.com/vmware/govmomi/govc/flags" + "github.com/vmware/govmomi/object" ) type rename struct { - *flags.ClientFlag - *flags.FolderFlag + *flags.DatacenterFlag } func init() { - cli.Register("folder.rename", &rename{}) + cli.Register("object.rename", &rename{}) } func (cmd *rename) Register(ctx context.Context, f *flag.FlagSet) { - cmd.ClientFlag, ctx = flags.NewClientFlag(ctx) - cmd.ClientFlag.Register(ctx, f) - - cmd.FolderFlag, ctx = flags.NewFolderFlag(ctx) - cmd.FolderFlag.Register(ctx, f) + cmd.DatacenterFlag, ctx = flags.NewDatacenterFlag(ctx) + cmd.DatacenterFlag.Register(ctx, f) } func (cmd *rename) Usage() string { - return "NAME" + return "PATH NAME" } func (cmd *rename) Description() string { - return `Rename an existing folder with NAME. + return `Rename managed objects. Examples: - govc folder.rename -folder /dc1/vm/folder-foo folder-bar` + govc object.rename /dc1/network/dvs1 Switch1` } func (cmd *rename) Process(ctx context.Context) error { - if err := cmd.ClientFlag.Process(ctx); err != nil { - return err - } - if err := cmd.FolderFlag.Process(ctx); err != nil { + if err := cmd.DatacenterFlag.Process(ctx); err != nil { return err } return nil } func (cmd *rename) Run(ctx context.Context, f *flag.FlagSet) error { - folder, err := cmd.Folder() + if f.NArg() != 2 { + return flag.ErrHelp + } + + c, err := cmd.Client() if err != nil { return err } - if f.NArg() != 1 { - return flag.ErrHelp + objs, err := cmd.ManagedObjects(ctx, f.Args()[:1]) + if err != nil { + return err } - task, err := folder.Rename(ctx, f.Arg(0)) + task, err := object.NewCommon(c, objs[0]).Rename(ctx, f.Arg(1)) if err != nil { return err } - return task.Wait(ctx) + logger := cmd.ProgressLogger(fmt.Sprintf("renaming %s... ", objs[0])) + _, err = task.WaitForResult(ctx, logger) + logger.Wait() + + return err } diff --git a/govc/release.sh b/govc/release.sh index 254e4de7d..271c72ac3 100755 --- a/govc/release.sh +++ b/govc/release.sh @@ -49,8 +49,8 @@ wait if [ -n "$tag" ] ; then echo "Pushing tag ${tag}..." - echo git tag -f "${tag}" - echo git push origin "refs/tags/${tag}" + git tag -f "${tag}" + git push origin "refs/tags/${tag}" fi # Generate description diff --git a/govc/test/datacenter.bats b/govc/test/datacenter.bats index 064f3a074..0b338c397 100755 --- a/govc/test/datacenter.bats +++ b/govc/test/datacenter.bats @@ -31,7 +31,7 @@ load test_helper assert_success done - run govc datacenter.destroy "${dcs[@]}" + run govc object.destroy "${dcs[@]}" assert_success for dc in ${dcs[*]}; do @@ -54,7 +54,7 @@ load test_helper run govc datacenter.create -folder "$folder" "${dcs[@]}" assert_success - run govc datacenter.destroy "$folder/*" + run govc object.destroy "$folder/*" assert_success for dc in ${dcs[*]}; do @@ -67,27 +67,15 @@ load test_helper assert_success } -@test "destroy datacenter that does not exist" { - vcsim_env - - run govc datacenter.destroy "/enoent" - assert_failure -} - @test "fails when datacenter name not specified" { run govc datacenter.create assert_failure - - run govc datacenter.destroy - assert_failure } @test "datacenter commands fail against ESX" { run govc datacenter.create something - assert_failure - assert_output "govc: ServerFaultCode: The operation is not supported on the object." + assert_failure "govc: ServerFaultCode: The operation is not supported on the object." - run govc datacenter.destroy ha-datacenter + run govc object.destroy /ha-datacenter assert_failure - assert_output "govc: The operation is not supported on the object." } diff --git a/govc/test/events.bats b/govc/test/events.bats index bd4779f7b..be689b48e 100755 --- a/govc/test/events.bats +++ b/govc/test/events.bats @@ -23,9 +23,6 @@ load test_helper @test "events vm" { vm=$(new_id) - run govc events vm/$vm - assert_success - [ ${#lines[@]} -eq 0 ] run govc vm.create -on=false $vm assert_success diff --git a/govc/test/folder.bats b/govc/test/folder.bats index 66e678510..e9524f9b5 100755 --- a/govc/test/folder.bats +++ b/govc/test/folder.bats @@ -36,7 +36,7 @@ load test_helper run govc folder.info /$GOVC_DATACENTER/vm/$name assert_success - run govc folder.destroy vm/$name + run govc object.destroy vm/$name assert_success unset GOVC_DATACENTER @@ -55,20 +55,20 @@ load test_helper run govc folder.info /$name/$child assert_failure - run govc folder.moveinto -folder /$name $child + run govc object.mv $child /$name assert_success run govc folder.info /$name/$child assert_success new=$(new_id) - run govc folder.rename -folder /$name $new + run govc object.rename /$name $new assert_success name=$new run govc folder.info /$name assert_success - run govc folder.destroy $name + run govc object.destroy $name assert_success } diff --git a/govc/test/network.bats b/govc/test/network.bats index 36f290c10..025a71805 100755 --- a/govc/test/network.bats +++ b/govc/test/network.bats @@ -150,18 +150,21 @@ load test_helper run govc dvs.create "$id" assert_success - run govc dvs.portgroup.add -dvs "$id" -type earlyBinding -nports 16 ExternalNetwork + run govc dvs.portgroup.add -dvs "$id" -type earlyBinding -nports 16 "${id}-ExternalNetwork" assert_success - run govc dvs.portgroup.add -dvs "$id" -type ephemeral -vlan 3122 InternalNetwork + run govc dvs.portgroup.add -dvs "$id" -type ephemeral -vlan 3122 "${id}-InternalNetwork" assert_success info=$(govc dvs.portgroup.info "$id" | grep VlanId: | uniq | grep 3122) [ -n "$info" ] - run govc dvs.portgroup.change -vlan 3123 InternalNetwork + run govc dvs.portgroup.change -vlan 3123 "${id}-InternalNetwork" assert_success info=$(govc dvs.portgroup.info "$id" | grep VlanId: | uniq | grep 3123) [ -n "$info" ] + + run govc object.destroy "network/${id}-ExternalNetwork" "network/${id}-InternalNetwork" "network/${id}" + assert_success } diff --git a/govc/test/object.bats b/govc/test/object.bats new file mode 100755 index 000000000..73d45a312 --- /dev/null +++ b/govc/test/object.bats @@ -0,0 +1,73 @@ +#!/usr/bin/env bats + +load test_helper + +@test "object.destroy" { + run govc object.destroy "/enoent" + assert_failure + + run govc object.destroy + assert_failure + + vm=$(new_id) + run govc vm.create "$vm" + assert_success + + # fails when powered on + run govc object.destroy "vm/$vm" + assert_failure + + run govc vm.power -off "$vm" + assert_success + + run govc object.destroy "vm/$vm" + assert_success +} + +@test "object.rename" { + run govc object.rename "/enoent" "nope" + assert_failure + + vm=$(new_id) + run govc vm.create -on=false "$vm" + assert_success + + run govc object.rename "vm/$vm" "${vm}-renamed" + assert_success + + run govc object.rename "vm/$vm" "${vm}-renamed" + assert_failure + + run govc object.destroy "vm/${vm}-renamed" + assert_success +} + +@test "object.mv" { + vcsim_env + + folder=$(new_id) + + run govc folder.create "vm/$folder" + assert_success + + for _ in $(seq 1 3) ; do + vm=$(new_id) + run govc vm.create -folder "$folder" "$vm" + assert_success + done + + result=$(govc ls "vm/$folder" | wc -l) + [ "$result" -eq "3" ] + + run govc folder.create "vm/${folder}-2" + assert_success + + run govc object.mv "vm/$folder/*" "vm/${folder}-2" + assert_success + + result=$(govc ls "vm/${folder}-2" | wc -l) + [ "$result" -eq "3" ] + + result=$(govc ls "vm/$folder" | wc -l) + [ "$result" -eq "0" ] +}