From e056ee9e67aeed0f253559ef01f8a4c2f31e1c97 Mon Sep 17 00:00:00 2001 From: Andrei Toterman Date: Tue, 24 Sep 2024 10:47:46 +0200 Subject: [PATCH] [daemon] let daemon choose mount target if not specified --- include/multipass/utils.h | 2 ++ src/daemon/daemon.cpp | 8 ++++++-- src/utils/utils.cpp | 5 +++++ tests/mock_utils.h | 1 + 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/include/multipass/utils.h b/include/multipass/utils.h index f82c33bc76..df65dc31d9 100644 --- a/include/multipass/utils.h +++ b/include/multipass/utils.h @@ -235,6 +235,8 @@ class Utils : public Singleton virtual QString make_uuid(const std::optional& seed = std::nullopt) const; virtual void sleep_for(const std::chrono::milliseconds& ms) const; virtual bool is_ipv4_valid(const std::string& ipv4) const; + + virtual Path default_mount_target(const Path& source) const; }; } // namespace multipass diff --git a/src/daemon/daemon.cpp b/src/daemon/daemon.cpp index 3c834fb65f..15ace0fc93 100644 --- a/src/daemon/daemon.cpp +++ b/src/daemon/daemon.cpp @@ -1912,7 +1912,11 @@ try // clang-format on for (const auto& path_entry : request->target_paths()) { const auto& name = path_entry.instance_name(); - const auto target_path = QDir::cleanPath(QString::fromStdString(path_entry.target_path())).toStdString(); + const auto requested_target_path = QDir::cleanPath(QString::fromStdString(path_entry.target_path())); + const auto q_target_path = requested_target_path.isEmpty() + ? MP_UTILS.default_mount_target(QString::fromStdString(request->source_path())) + : requested_target_path; + const auto target_path = q_target_path.toStdString(); auto it = operative_instances.find(name); if (it == operative_instances.end()) @@ -1922,7 +1926,7 @@ try // clang-format on } auto& vm = it->second; - if (mp::utils::invalid_target_path(QString::fromStdString(target_path))) + if (mp::utils::invalid_target_path(q_target_path)) { add_fmt_to(errors, "unable to mount to \"{}\"", target_path); continue; diff --git a/src/utils/utils.cpp b/src/utils/utils.cpp index 7d91b98587..5dacfd8dc7 100644 --- a/src/utils/utils.cpp +++ b/src/utils/utils.cpp @@ -582,6 +582,11 @@ bool mp::Utils::is_ipv4_valid(const std::string& ipv4) const return true; } +mp::Path mp::Utils::default_mount_target(const Path& source) const +{ + return source.isEmpty() ? "" : QDir{QDir::cleanPath(source)}.dirName().prepend("/home/ubuntu/"); +} + auto mp::utils::find_bridge_with(const std::vector& networks, const std::string& target_network, const std::string& bridge_type) -> std::optional diff --git a/tests/mock_utils.h b/tests/mock_utils.h index 318e288d89..a81a233a26 100644 --- a/tests/mock_utils.h +++ b/tests/mock_utils.h @@ -52,6 +52,7 @@ class MockUtils : public Utils MOCK_METHOD(QString, make_uuid, (const std::optional&), (const, override)); MOCK_METHOD(void, sleep_for, (const std::chrono::milliseconds&), (const, override)); MOCK_METHOD(bool, is_ipv4_valid, (const std::string& ipv4), (const, override)); + MOCK_METHOD(Path, default_mount_target, (const Path& source), (const, override)); MP_MOCK_SINGLETON_BOILERPLATE(MockUtils, Utils); };