Fix test, add test .recover_from_resize

This commit is contained in:
Jeff Bonhag 2020-06-17 13:50:06 -04:00
parent dfd3bc915c
commit ff53c64fbc
No known key found for this signature in database
GPG Key ID: 32966F3FB5AC1129
2 changed files with 31 additions and 12 deletions

View File

@ -306,11 +306,12 @@ module VagrantPlugins
def self.resize_disk(machine, disk_config, defined_disk, controller)
machine.ui.detail(I18n.t("vagrant.cap.configure_disks.resize_disk", name: disk_config.name), prefix: true)
# grab disk to be resized port and device number
disk_info = machine.provider.driver.get_port_and_device(defined_disk["UUID"])
if defined_disk["Storage format"] == "VMDK"
LOGGER.warn("Disk type VMDK cannot be resized in VirtualBox. Vagrant will convert disk to VDI format to resize first, and then convert resized disk back to VMDK format")
# grab disk to be resized port and device number
disk_info = machine.provider.driver.get_port_and_device(defined_disk["UUID"])
# original disk information in case anything goes wrong during clone/resize
original_disk = defined_disk
backup_disk_location = "#{original_disk["Location"]}.backup"
@ -345,7 +346,6 @@ module VagrantPlugins
location: original_disk["Location"],
name: machine.name))
recover_from_resize(machine, disk_info, backup_disk_location, original_disk, vdi_disk_file, controller)
raise
ensure
# Remove backup disk file if all goes well
@ -360,7 +360,6 @@ module VagrantPlugins
defined_disk = new_disk_info
else
machine.provider.driver.resize_disk(defined_disk["Location"], disk_config.size.to_i)
disk_info = machine.provider.driver.get_port_and_device(defined_disk["UUID"])
end
disk_metadata = { uuid: defined_disk["UUID"], name: disk_config.name, controller: controller.name,
@ -379,7 +378,8 @@ module VagrantPlugins
# @param [String] backup_disk_location - The place on disk where vagrant made a backup of the original disk being resized
# @param [Hash] original_disk - The disk information from VirtualBox
# @param [String] vdi_disk_file - The place on disk where vagrant made a clone of the original disk being resized
def self.recover_from_resize(machine, disk_info, backup_disk_location, original_disk, vdi_disk_file)
# @param [VagrantPlugins::ProviderVirtualBox::Model::StorageController] controller - the storage controller to use
def self.recover_from_resize(machine, disk_info, backup_disk_location, original_disk, vdi_disk_file, controller)
begin
# move backup to original name
FileUtils.mv(backup_disk_location, original_disk["Location"], force: true)

View File

@ -108,7 +108,7 @@ describe VagrantPlugins::ProviderVirtualBox::Cap::ConfigureDisks do
context "with over the disk limit for a given device" do
let(:defined_disks) { (1..controller.limit).map { |i| double("disk-#{i}", type: :disk, primary: false) }.to_a }
it "raises an exception if the disks defined exceed the limit for a SATA Controller" do
it "raises an exception if the disks defined exceed the limit" do
expect{subject.configure_disks(machine, defined_disks)}.
to raise_error(Vagrant::Errors::VirtualBoxDisksDefinedExceedLimit)
end
@ -264,6 +264,7 @@ describe VagrantPlugins::ProviderVirtualBox::Cap::ConfigureDisks do
expect(driver).to receive(:attach_disk).with((disk_info[:port].to_i + 1).to_s,
disk_info[:device],
all_disks[1]["Location"],
"hdd",
controller.name)
subject.handle_configure_disk(machine, defined_disks[1], all_disks, controller)
@ -320,6 +321,7 @@ describe VagrantPlugins::ProviderVirtualBox::Cap::ConfigureDisks do
expect(driver).to receive(:attach_disk).with(port_and_device[:port],
port_and_device[:device],
disk_file,
"hdd",
controller.name)
subject.create_disk(machine, disk_config, controller)
@ -403,12 +405,7 @@ describe VagrantPlugins::ProviderVirtualBox::Cap::ConfigureDisks do
allow(driver).to receive(:vdi_to_vmdk).and_raise(StandardError)
expect(FileUtils).to receive(:mv).with("#{vmdk_disk_file}.backup", vmdk_disk_file, force: true).
and_return(true)
expect(driver).to receive(:attach_disk).
with(attach_info[:port], attach_info[:device], vmdk_disk_file, "hdd", controller).and_return(true)
expect(driver).to receive(:close_medium).with(vdi_disk_file).and_return(true)
expect(subject).to receive(:recover_from_resize).with(machine, attach_info, "#{vmdk_disk_file}.backup", all_disks[0], vdi_disk_file, controller)
expect{subject.resize_disk(machine, disk_config, all_disks[0], controller)}.to raise_error(Exception)
end
@ -439,6 +436,28 @@ describe VagrantPlugins::ProviderVirtualBox::Cap::ConfigureDisks do
end
end
describe ".recover_from_resize" do
let(:disk_config) { double("disk", name: "vagrant_primary", size: 1073741824.0,
primary: false, type: :disk, disk_ext: "vmdk",
provider_config: nil) }
let(:attach_info) { {port: "0", device: "0"} }
let(:vdi_disk_file) { "/home/vagrant/VirtualBox VMs/ubuntu-18.04-amd64-disk001.vdi" }
let(:vmdk_disk_file) { "/home/vagrant/VirtualBox VMs/ubuntu-18.04-amd64-disk001.vmdk" }
let(:vmdk_backup_file) { "/home/vagrant/VirtualBox VMs/ubuntu-18.04-amd64-disk001.vmdk.backup" }
it "reattaches the original disk file and closes the cloned medium" do
expect(FileUtils).to receive(:mv).with(vmdk_backup_file, vmdk_disk_file, force: true).
and_return(true)
expect(driver).to receive(:attach_disk).
with(attach_info[:port], attach_info[:device], vmdk_disk_file, "hdd", controller.name).and_return(true)
expect(driver).to receive(:close_medium).with(vdi_disk_file).and_return(true)
subject.recover_from_resize(machine, attach_info, vmdk_backup_file, all_disks[0], vdi_disk_file, controller)
end
end
describe ".handle_configure_dvd" do
let(:dvd_config) { double("dvd", file: "/tmp/untitled.iso", name: "dvd1") }