diff --git a/govc/test/vm.bats b/govc/test/vm.bats index a76c28c59..85c0576db 100755 --- a/govc/test/vm.bats +++ b/govc/test/vm.bats @@ -686,8 +686,15 @@ load test_helper run govc vm.disk.create -vm "$vm" -name "$vm/$name" -size 1M assert_success - result=$(govc device.ls -vm "$vm" | grep -c disk-) + disk=$(govc device.ls -vm "$vm" disk-* | awk '{print $1}') + result=$(grep -c disk- <<<"$disk") [ "$result" -eq 1 ] + + run govc vm.disk.change -vm "$vm" -disk.name "$disk" -size 2M + assert_success + + run govc vm.disk.change -vm "$vm" -disk.name "$disk" -size 1M + assert_failure # cannot shrink disk } @test "vm.disk.attach" { diff --git a/govc/vm/disk/change.go b/govc/vm/disk/change.go index e7203c9de..d57b1bd46 100644 --- a/govc/vm/disk/change.go +++ b/govc/vm/disk/change.go @@ -153,9 +153,13 @@ func (cmd *change) Run(ctx context.Context, f *flag.FlagSet) error { } if int64(cmd.bytes) != 0 { - editdisk.CapacityInKB = int64(cmd.bytes) / 1024 + editdisk.CapacityInBytes = int64(cmd.bytes) + editdisk.CapacityInKB = int64(0) // zero deprecated field } + if editdisk.StorageIOAllocation == nil { + editdisk.StorageIOAllocation = new(types.StorageIOAllocationInfo) + } editdisk.StorageIOAllocation.Limit = cmd.limit switch backing := editdisk.Backing.(type) { diff --git a/simulator/virtual_machine.go b/simulator/virtual_machine.go index 7f1929901..6fd4cc851 100644 --- a/simulator/virtual_machine.go +++ b/simulator/virtual_machine.go @@ -1184,7 +1184,10 @@ func getDiskSize(disk *types.VirtualDisk) int64 { func changedDiskSize(oldDisk *types.VirtualDisk, newDiskSpec *types.VirtualDisk) (int64, bool) { // capacity cannot be decreased - if newDiskSpec.CapacityInBytes < oldDisk.CapacityInBytes || newDiskSpec.CapacityInKB < oldDisk.CapacityInKB { + if newDiskSpec.CapacityInBytes > 0 && newDiskSpec.CapacityInBytes < oldDisk.CapacityInBytes { + return 0, false + } + if newDiskSpec.CapacityInKB > 0 && newDiskSpec.CapacityInKB < oldDisk.CapacityInKB { return 0, false } @@ -1196,10 +1199,13 @@ func changedDiskSize(oldDisk *types.VirtualDisk, newDiskSpec *types.VirtualDisk) return newDiskSpec.CapacityInBytes, true } - // CapacityInBytes and CapacityInKB indicate different values - if newDiskSpec.CapacityInBytes != newDiskSpec.CapacityInKB*1024 { - return 0, false + // if both set, CapacityInBytes and CapacityInKB must be the same + if newDiskSpec.CapacityInBytes > 0 && newDiskSpec.CapacityInKB > 0 { + if newDiskSpec.CapacityInBytes != newDiskSpec.CapacityInKB*1024 { + return 0, false + } } + return newDiskSpec.CapacityInBytes, true }