diff --git a/src/platform/backends/qemu/qemu_virtual_machine.cpp b/src/platform/backends/qemu/qemu_virtual_machine.cpp index e77ad01c03..47cd9146aa 100644 --- a/src/platform/backends/qemu/qemu_virtual_machine.cpp +++ b/src/platform/backends/qemu/qemu_virtual_machine.cpp @@ -518,6 +518,22 @@ void mp::QemuVirtualMachine::wait_until_ssh_up(std::chrono::milliseconds timeout void mp::QemuVirtualMachine::initialize_vm_process() { + for (auto it = mount_args.begin(); it != mount_args.end();) + { + const auto& source = it->second.first; + if (MP_FILEOPS.exists(source)) + { + ++it; + } + else + { + mpl::warn(vm_name, + "Removing mount with source \"{}\" as it no longer exists on the host", + source); + it = mount_args.erase(it); + } + } + vm_process = make_qemu_process( desc, ((state == State::suspended) ? std::make_optional(monitor->retrieve_metadata_for(vm_name)) diff --git a/tests/unit/qemu/test_qemu_backend.cpp b/tests/unit/qemu/test_qemu_backend.cpp index 25e9a15259..16553353f9 100644 --- a/tests/unit/qemu/test_qemu_backend.cpp +++ b/tests/unit/qemu/test_qemu_backend.cpp @@ -254,6 +254,42 @@ TEST_F(QemuBackend, machineStartShutdownSendsMonitoringEvents) machine->shutdown(); } +TEST_F(QemuBackend, startRemovesMountsWithMissingSource) +{ + EXPECT_CALL(*mock_qemu_platform_factory, make_qemu_platform(_, _)).WillOnce([this](auto&&...) { + return std::move(mock_qemu_platform); + }); + + mp::QemuVirtualMachineFactory backend{data_dir.path(), az_manager}; + process_factory->register_callback(handle_qemu_system); + + auto machine = backend.create_virtual_machine(default_description, key_provider, stub_monitor); + auto* qemu_machine = static_cast(machine.get()); + + mpt::TempDir existing_dir; + const std::string existing_source = existing_dir.path().toStdString(); + const std::string missing_source = existing_source + "/definitely-missing"; + + auto& mount_args = qemu_machine->modifiable_mount_args(); + mount_args["existing-tag"] = {existing_source, {"-virtfs", "dummy-existing-arg"}}; + mount_args["missing-tag"] = {missing_source, {"-virtfs", "dummy-missing-arg"}}; + + logger_scope.mock_logger->screen_logs(mpl::Level::warning); + logger_scope.mock_logger->expect_log( + mpl::Level::warning, + fmt::format("Removing mount with source \"{}\" as it no longer exists on the host", + missing_source)); + + machine->start(); + machine->state = mp::VirtualMachine::State::running; + + EXPECT_EQ(mount_args.size(), 1); + EXPECT_NE(mount_args.find("existing-tag"), mount_args.end()); + EXPECT_EQ(mount_args.find("missing-tag"), mount_args.end()); + + machine->shutdown(); +} + TEST_F(QemuBackend, machineStartSuspendSendsMonitoringEvent) { EXPECT_CALL(*mock_qemu_platform_factory, make_qemu_platform(_, _)).WillOnce([this](auto&&...) {