From 9274fa3286028bf14a0e50f6769cad0b32d2f1e9 Mon Sep 17 00:00:00 2001 From: Daniel Hilst Date: Mon, 10 Feb 2025 19:15:27 -0300 Subject: [PATCH] Removing Runner from Cluster --- include/cloysterhpc/cluster.h | 18 +- include/cloysterhpc/functions.h | 3 + include/cloysterhpc/presenter/Presenter.h | 4 +- .../presenter/PresenterGeneralSettings.h | 2 +- .../cloysterhpc/presenter/PresenterHostId.h | 2 +- .../presenter/PresenterInfiniband.h | 2 +- .../cloysterhpc/presenter/PresenterInstall.h | 2 +- .../presenter/PresenterInstructions.h | 2 +- .../cloysterhpc/presenter/PresenterLocale.h | 2 +- .../presenter/PresenterMailSystem.h | 2 +- .../cloysterhpc/presenter/PresenterNetwork.h | 4 +- .../cloysterhpc/presenter/PresenterNodes.h | 2 +- .../PresenterNodesOperationalSystem.h | 2 +- .../presenter/PresenterQueueSystem.h | 2 +- .../presenter/PresenterRepository.h | 2 +- include/cloysterhpc/presenter/PresenterTime.h | 2 +- .../cloysterhpc/presenter/PresenterWelcome.h | 2 +- include/cloysterhpc/queuesystem/pbs.h | 4 +- include/cloysterhpc/queuesystem/queuesystem.h | 6 +- include/cloysterhpc/queuesystem/slurm.h | 4 +- include/cloysterhpc/services/shell.h | 4 +- include/cloysterhpc/services/xcat.h | 4 +- src/cluster.cpp | 221 +++++++----------- src/functions.cpp | 22 +- src/main.cpp | 2 +- src/presenter/PresenterGeneralSettings.cpp | 2 +- src/presenter/PresenterHostId.cpp | 2 +- src/presenter/PresenterInfiniband.cpp | 2 +- src/presenter/PresenterInstall.cpp | 2 +- src/presenter/PresenterInstructions.cpp | 2 +- src/presenter/PresenterLocale.cpp | 2 +- src/presenter/PresenterMailSystem.cpp | 16 +- src/presenter/PresenterNetwork.cpp | 4 +- src/presenter/PresenterNodes.cpp | 2 +- .../PresenterNodesOperationalSystem.cpp | 2 +- src/presenter/PresenterQueueSystem.cpp | 7 +- src/presenter/PresenterRepository.cpp | 2 +- src/presenter/PresenterTime.cpp | 2 +- src/presenter/PresenterWelcome.cpp | 2 +- src/queuesystem/pbs.cpp | 2 +- src/queuesystem/queuesystem.cpp | 15 +- src/queuesystem/slurm.cpp | 2 +- src/services/shell.cpp | 16 +- src/services/xcat.cpp | 3 +- 44 files changed, 185 insertions(+), 224 deletions(-) diff --git a/include/cloysterhpc/cluster.h b/include/cloysterhpc/cluster.h index e63988b1..37b0f20b 100644 --- a/include/cloysterhpc/cluster.h +++ b/include/cloysterhpc/cluster.h @@ -35,7 +35,6 @@ * environment, including headnode, nodes, networks, provisioner, timezone, * locale, and more. */ -template class Cluster { public: /** @@ -57,10 +56,11 @@ class Cluster { Headnode m_headnode; Provisioner m_provisioner { Provisioner::xCAT }; std::optional m_ofed; - std::optional>> m_queueSystem {}; + std::optional> m_queueSystem {}; std::optional m_mailSystem {}; std::vector m_nodes; - std::unique_ptr m_runner; + // @TODO Removing m_runner from Cluster + // std::unique_ptr m_runner; std::shared_ptr m_systemdBus; bool m_firewall { false }; @@ -75,7 +75,7 @@ class Cluster { DiskImage m_diskImage; // Relace repository with generic repository - std::optional> m_repos = std::nullopt; + std::optional> m_repos = std::nullopt; public: Cluster(); @@ -83,8 +83,6 @@ class Cluster { [[nodiscard]] Headnode& getHeadnode(); [[nodiscard]] const Headnode& getHeadnode() const; - std::unique_ptr getRunner() const; - [[nodiscard]] std::string_view getName() const; void setName(std::string_view name); [[nodiscard]] std::string_view getCompanyName() const; @@ -108,7 +106,7 @@ class Cluster { std::shared_ptr getDaemonBus(); void initRepoManager(); - RepoManager& getRepoManager(); + RepoManager& getRepoManager(); /** @@ -188,11 +186,11 @@ class Cluster { std::optional getOFED() const; void setOFED(OFED::Kind kind); - std::optional>>& getQueueSystem(); - void setQueueSystem(QueueSystem::Kind kind); + std::optional>& getQueueSystem(); + void setQueueSystem(QueueSystem::Kind kind); std::optional& getMailSystem(); - void setMailSystem(Postfix::Profile profile); + void setMailSystem(Postfix::Profile profile, std::shared_ptr runner); const std::filesystem::path& getDiskImage() const; void setDiskImage(const std::filesystem::path& diskImagePath); diff --git a/include/cloysterhpc/functions.h b/include/cloysterhpc/functions.h index 4f8b209b..a062c313 100644 --- a/include/cloysterhpc/functions.h +++ b/include/cloysterhpc/functions.h @@ -12,11 +12,14 @@ #include #include +#include namespace cloyster { // Globals extern bool dryRun; +std::shared_ptr getRunner(); + /** * A command proxy, to us to be able to get the * command output while the command is running diff --git a/include/cloysterhpc/presenter/Presenter.h b/include/cloysterhpc/presenter/Presenter.h index f6c07088..566bb62d 100644 --- a/include/cloysterhpc/presenter/Presenter.h +++ b/include/cloysterhpc/presenter/Presenter.h @@ -20,7 +20,7 @@ class Presenter { // ref& // - https://youtu.be/xnqTKD8uD64?t=1145 // - http://tinyurl.com/gotw91 - std::unique_ptr>& m_model; + std::unique_ptr& m_model; std::unique_ptr& m_view; struct Messages { @@ -30,7 +30,7 @@ class Presenter { }; }; - Presenter(std::unique_ptr>& model, std::unique_ptr& view) + Presenter(std::unique_ptr& model, std::unique_ptr& view) : m_model(model) , m_view(view) { diff --git a/include/cloysterhpc/presenter/PresenterGeneralSettings.h b/include/cloysterhpc/presenter/PresenterGeneralSettings.h index b407ed68..9a7c236e 100644 --- a/include/cloysterhpc/presenter/PresenterGeneralSettings.h +++ b/include/cloysterhpc/presenter/PresenterGeneralSettings.h @@ -35,7 +35,7 @@ class PresenterGeneralSettings : public Presenter { public: PresenterGeneralSettings( - std::unique_ptr>& model, std::unique_ptr& view); + std::unique_ptr& model, std::unique_ptr& view); }; #endif // CLOYSTERHPC_PRESENTERGENERALSETTINGS_H_ diff --git a/include/cloysterhpc/presenter/PresenterHostId.h b/include/cloysterhpc/presenter/PresenterHostId.h index f64e4114..e3f2e66d 100644 --- a/include/cloysterhpc/presenter/PresenterHostId.h +++ b/include/cloysterhpc/presenter/PresenterHostId.h @@ -24,7 +24,7 @@ class PresenterHostId : public Presenter { public: PresenterHostId( - std::unique_ptr>& model, std::unique_ptr& view); + std::unique_ptr& model, std::unique_ptr& view); }; #endif // CLOYSTERHPC_PRESENTERHOSTID_H_ diff --git a/include/cloysterhpc/presenter/PresenterInfiniband.h b/include/cloysterhpc/presenter/PresenterInfiniband.h index 09dc4b97..34587a0f 100644 --- a/include/cloysterhpc/presenter/PresenterInfiniband.h +++ b/include/cloysterhpc/presenter/PresenterInfiniband.h @@ -27,7 +27,7 @@ class PresenterInfiniband : public Presenter { }; public: - PresenterInfiniband(std::unique_ptr>& model, + PresenterInfiniband(std::unique_ptr& model, std::unique_ptr& view, NetworkCreator& nc); }; diff --git a/include/cloysterhpc/presenter/PresenterInstall.h b/include/cloysterhpc/presenter/PresenterInstall.h index 156aad38..c844b477 100644 --- a/include/cloysterhpc/presenter/PresenterInstall.h +++ b/include/cloysterhpc/presenter/PresenterInstall.h @@ -14,7 +14,7 @@ class PresenterInstall : public Presenter { public: PresenterInstall( - std::unique_ptr>& model, std::unique_ptr& view); + std::unique_ptr& model, std::unique_ptr& view); }; #endif // CLOYSTERHPC_PRESENTERINSTALL_H_ diff --git a/include/cloysterhpc/presenter/PresenterInstructions.h b/include/cloysterhpc/presenter/PresenterInstructions.h index 23a5ff3b..bcf566e1 100644 --- a/include/cloysterhpc/presenter/PresenterInstructions.h +++ b/include/cloysterhpc/presenter/PresenterInstructions.h @@ -25,7 +25,7 @@ class PresenterInstructions : public Presenter { public: PresenterInstructions( - std::unique_ptr>& model, std::unique_ptr& view); + std::unique_ptr& model, std::unique_ptr& view); }; #endif // CLOYSTERHPC_PRESENTERINSTRUCTIONS_H_ diff --git a/include/cloysterhpc/presenter/PresenterLocale.h b/include/cloysterhpc/presenter/PresenterLocale.h index a754fbb2..6c1108c7 100644 --- a/include/cloysterhpc/presenter/PresenterLocale.h +++ b/include/cloysterhpc/presenter/PresenterLocale.h @@ -19,7 +19,7 @@ class PresenterLocale : public Presenter { public: PresenterLocale( - std::unique_ptr>& model, std::unique_ptr& view); + std::unique_ptr& model, std::unique_ptr& view); }; #endif // CLOYSTERHPC_PRESENTERLOCALE_H_ diff --git a/include/cloysterhpc/presenter/PresenterMailSystem.h b/include/cloysterhpc/presenter/PresenterMailSystem.h index dc29773e..48269d1e 100644 --- a/include/cloysterhpc/presenter/PresenterMailSystem.h +++ b/include/cloysterhpc/presenter/PresenterMailSystem.h @@ -50,7 +50,7 @@ class PresenterMailSystem : public Presenter { public: PresenterMailSystem( - std::unique_ptr>& model, std::unique_ptr& view); + std::unique_ptr& model, std::unique_ptr& view); }; #endif // CLOYSTERHPC_PRESENTERMAILSYSTEM_H_ diff --git a/include/cloysterhpc/presenter/PresenterNetwork.h b/include/cloysterhpc/presenter/PresenterNetwork.h index cc41e967..a7e12422 100644 --- a/include/cloysterhpc/presenter/PresenterNetwork.h +++ b/include/cloysterhpc/presenter/PresenterNetwork.h @@ -41,7 +41,7 @@ class NetworkCreator { bool checkIfInterfaceRegistered(std::string_view interface); - void saveNetworksToModel(Cluster& model); + void saveNetworksToModel(Cluster& model); std::size_t getSelectedInterfaces(); }; @@ -127,7 +127,7 @@ class PresenterNetwork : public Presenter { const std::vector& interfaceList, NetworkCreatorData& ncd); public: - PresenterNetwork(std::unique_ptr>& model, + PresenterNetwork(std::unique_ptr& model, std::unique_ptr& view, NetworkCreator& nc, Network::Profile profile = Network::Profile::External, Network::Type type = Network::Type::Ethernet); diff --git a/include/cloysterhpc/presenter/PresenterNodes.h b/include/cloysterhpc/presenter/PresenterNodes.h index ed4214a9..d8310ff5 100644 --- a/include/cloysterhpc/presenter/PresenterNodes.h +++ b/include/cloysterhpc/presenter/PresenterNodes.h @@ -60,7 +60,7 @@ class PresenterNodes : public Presenter { public: PresenterNodes( - std::unique_ptr>& model, std::unique_ptr& view); + std::unique_ptr& model, std::unique_ptr& view); }; #endif // CLOYSTERHPC_PRESENTERNODES_H_ diff --git a/include/cloysterhpc/presenter/PresenterNodesOperationalSystem.h b/include/cloysterhpc/presenter/PresenterNodesOperationalSystem.h index f5c854c3..743c621b 100644 --- a/include/cloysterhpc/presenter/PresenterNodesOperationalSystem.h +++ b/include/cloysterhpc/presenter/PresenterNodesOperationalSystem.h @@ -81,7 +81,7 @@ class PresenterNodesOperationalSystem : public Presenter { public: PresenterNodesOperationalSystem( - std::unique_ptr>& model, std::unique_ptr& view); + std::unique_ptr& model, std::unique_ptr& view); }; #endif // CLOYSTERHPC_PRESENTERNODESOPERATIONALSYSTEM_H_ diff --git a/include/cloysterhpc/presenter/PresenterQueueSystem.h b/include/cloysterhpc/presenter/PresenterQueueSystem.h index f55f782c..d86eca9d 100644 --- a/include/cloysterhpc/presenter/PresenterQueueSystem.h +++ b/include/cloysterhpc/presenter/PresenterQueueSystem.h @@ -39,7 +39,7 @@ class PresenterQueueSystem : public Presenter { public: PresenterQueueSystem( - std::unique_ptr>& model, std::unique_ptr& view); + std::unique_ptr& model, std::unique_ptr& view); }; #endif // CLOYSTERHPC_PRESENTERQUEUESYSTEM_H_ diff --git a/include/cloysterhpc/presenter/PresenterRepository.h b/include/cloysterhpc/presenter/PresenterRepository.h index 5443ae3d..7362c8cf 100644 --- a/include/cloysterhpc/presenter/PresenterRepository.h +++ b/include/cloysterhpc/presenter/PresenterRepository.h @@ -22,5 +22,5 @@ class PresenterRepository : public Presenter { public: PresenterRepository( - std::unique_ptr>& model, std::unique_ptr& view); + std::unique_ptr& model, std::unique_ptr& view); }; diff --git a/include/cloysterhpc/presenter/PresenterTime.h b/include/cloysterhpc/presenter/PresenterTime.h index 23767279..2305fb93 100644 --- a/include/cloysterhpc/presenter/PresenterTime.h +++ b/include/cloysterhpc/presenter/PresenterTime.h @@ -35,7 +35,7 @@ class PresenterTime : public Presenter { }; public: - PresenterTime(std::unique_ptr>& model, std::unique_ptr& view); + PresenterTime(std::unique_ptr& model, std::unique_ptr& view); }; #endif // CLOYSTERHPC_PRESENTERTIMEZONE_H_ diff --git a/include/cloysterhpc/presenter/PresenterWelcome.h b/include/cloysterhpc/presenter/PresenterWelcome.h index ac2ff6d4..d61dafae 100644 --- a/include/cloysterhpc/presenter/PresenterWelcome.h +++ b/include/cloysterhpc/presenter/PresenterWelcome.h @@ -27,7 +27,7 @@ class PresenterWelcome : public Presenter { public: PresenterWelcome( - std::unique_ptr>& model, std::unique_ptr& view); + std::unique_ptr& model, std::unique_ptr& view); }; #endif // CLOYSTERHPC_PRESENTERWELCOME_H_ diff --git a/include/cloysterhpc/queuesystem/pbs.h b/include/cloysterhpc/queuesystem/pbs.h index 78774a94..d88a9189 100644 --- a/include/cloysterhpc/queuesystem/pbs.h +++ b/include/cloysterhpc/queuesystem/pbs.h @@ -9,7 +9,7 @@ #include #include -class PBS : public QueueSystem { +class PBS : public QueueSystem { public: enum class ExecutionPlace { Shared, Scatter }; @@ -21,7 +21,7 @@ class PBS : public QueueSystem { ExecutionPlace getExecutionPlace(void); public: - explicit PBS(const Cluster& cluster); + explicit PBS(const Cluster& cluster); }; #endif // CLOYSTERHPC_PBS_H_ diff --git a/include/cloysterhpc/queuesystem/queuesystem.h b/include/cloysterhpc/queuesystem/queuesystem.h index 1fafedfc..abb19b07 100644 --- a/include/cloysterhpc/queuesystem/queuesystem.h +++ b/include/cloysterhpc/queuesystem/queuesystem.h @@ -12,10 +12,8 @@ #include // Forward declaration of Cluster -template class Cluster; -template class QueueSystem { public: enum class Kind { None, SLURM, PBS }; @@ -25,7 +23,7 @@ class QueueSystem { std::string m_defaultQueue; protected: - const Cluster& m_cluster; + const Cluster& m_cluster; public: void setKind(Kind kind); @@ -34,7 +32,7 @@ class QueueSystem { void setDefaultQueue(std::string_view); std::string_view getDefaultQueue(); - explicit QueueSystem(const Cluster& cluster); + explicit QueueSystem(const Cluster& cluster); virtual ~QueueSystem() = default; }; diff --git a/include/cloysterhpc/queuesystem/slurm.h b/include/cloysterhpc/queuesystem/slurm.h index ad1b17dd..c01b84ab 100644 --- a/include/cloysterhpc/queuesystem/slurm.h +++ b/include/cloysterhpc/queuesystem/slurm.h @@ -12,12 +12,12 @@ * @class SLURM * @brief Manages SLURM server installation and configuration. */ -class SLURM : public QueueSystem { +class SLURM : public QueueSystem { private: bool m_accounting { false }; public: - explicit SLURM(const Cluster& cluster); + explicit SLURM(const Cluster& cluster); /** * @brief Installs the SLURM server package on the system. diff --git a/include/cloysterhpc/services/shell.h b/include/cloysterhpc/services/shell.h index 71995083..abba471e 100644 --- a/include/cloysterhpc/services/shell.h +++ b/include/cloysterhpc/services/shell.h @@ -20,7 +20,7 @@ */ class Shell : public Execution { private: - const std::unique_ptr>& m_cluster; + const std::unique_ptr& m_cluster; private: /** @@ -178,7 +178,7 @@ class Shell : public Execution { * * @param cluster A reference to a unique pointer managing a Cluster object. */ - explicit Shell(const std::unique_ptr>& cluster); + explicit Shell(const std::unique_ptr& cluster); /** * @brief Installs and configures the system. * diff --git a/include/cloysterhpc/services/xcat.h b/include/cloysterhpc/services/xcat.h index 33f5cf7c..5fd36937 100644 --- a/include/cloysterhpc/services/xcat.h +++ b/include/cloysterhpc/services/xcat.h @@ -44,7 +44,7 @@ class XCAT : public Provisioner { enum class NodeType { Compute, Service }; private: - const std::unique_ptr>& m_cluster; + const std::unique_ptr& m_cluster; struct { std::vector otherpkgs = {}; @@ -251,7 +251,7 @@ class XCAT : public Provisioner { */ static void resetNodes(); - explicit XCAT(const std::unique_ptr>& cluster); + explicit XCAT(const std::unique_ptr& cluster); }; #endif // CLOYSTERHPC_XCAT_H_ diff --git a/src/cluster.cpp b/src/cluster.cpp index e61dda9b..11697dfe 100644 --- a/src/cluster.cpp +++ b/src/cluster.cpp @@ -41,11 +41,10 @@ static constexpr std::unique_ptr makeRunner(const bool option) } } -template <> -Cluster::Cluster() +Cluster::Cluster() { // @TODO Why runner is unique if a lot of classes required to run commands? - m_runner = makeRunner(cloyster::dryRun); + // m_runner = makeRunner(cloyster::dryRun); m_systemdBus = std::make_shared( "org.freedesktop.systemd1", "/org/freedesktop/systemd1"); } @@ -53,126 +52,104 @@ Cluster::Cluster() // Cluster::~Cluster() = default; -template <> -std::shared_ptr Cluster::getDaemonBus() { return m_systemdBus; } +std::shared_ptr Cluster::getDaemonBus() { return m_systemdBus; } -template <> -Headnode& Cluster::getHeadnode() { return m_headnode; } +Headnode& Cluster::getHeadnode() { return m_headnode; } -template <> const Headnode& Cluster::getHeadnode() const +const Headnode& Cluster::getHeadnode() const { return m_headnode; } -template -std::unique_ptr Cluster::getRunner() const -{ - return m_runner; -} +//template +//std::unique_ptr Cluster::getRunner() const +//{ +// return m_runner; +//} -template <> -std::string_view Cluster::getName() const { return m_name; } +std::string_view Cluster::getName() const { return m_name; } -template <> -void Cluster::setName(std::string_view name) { m_name = name; } +void Cluster::setName(std::string_view name) { m_name = name; } -template <> -std::string_view Cluster::getCompanyName() const { return m_companyName; } +std::string_view Cluster::getCompanyName() const { return m_companyName; } -template <> -void Cluster::setCompanyName(std::string_view companyName) +void Cluster::setCompanyName(std::string_view companyName) { m_companyName = companyName; } -template <> -std::string_view Cluster::getAdminMail() const { return m_adminMail; } +std::string_view Cluster::getAdminMail() const { return m_adminMail; } -template <> -void Cluster::setAdminMail(std::string_view adminMail) +void Cluster::setAdminMail(std::string_view adminMail) { m_adminMail = adminMail; } -template <> -bool Cluster::isFirewall() const { return m_firewall; } +bool Cluster::isFirewall() const { return m_firewall; } -template <> -void Cluster::setFirewall(bool firewall) { m_firewall = firewall; } +void Cluster::setFirewall(bool firewall) { m_firewall = firewall; } -template <> -Cluster::SELinuxMode Cluster::getSELinux() const { return m_selinux; } +Cluster::SELinuxMode Cluster::getSELinux() const { return m_selinux; } -template <> -void Cluster::setSELinux(Cluster::SELinuxMode mode) { m_selinux = mode; } +void Cluster::setSELinux(Cluster::SELinuxMode mode) { m_selinux = mode; } -template <> -Timezone& Cluster::getTimezone() { return m_timezone; } +Timezone& Cluster::getTimezone() { return m_timezone; } -template <> -void Cluster::setTimezone(const std::string& tz) { m_timezone.setTimezone(tz); } +void Cluster::setTimezone(const std::string& tz) { m_timezone.setTimezone(tz); } -template <> -const Locale& Cluster::getLocale() const { return m_locale; } +const Locale& Cluster::getLocale() const { return m_locale; } -template <> -void Cluster::setLocale(const Locale& locale) { m_locale = locale; } +void Cluster::setLocale(const Locale& locale) { m_locale = locale; } -template <> -void Cluster::setLocale(const std::string& locale) +void Cluster::setLocale(const std::string& locale) { m_locale.setLocale(locale); } -template <> -const std::string Cluster::getDomainName() const +const std::string Cluster::getDomainName() const { std::string fqdn = m_headnode.getFQDN(); return fqdn.substr(fqdn.find_first_of('.') + 1); } -template <> -void Cluster::setDomainName(const std::string& domainName) +void Cluster::setDomainName(const std::string& domainName) { // Force FQDN update if domainName is changed: m_headnode.setFQDN( fmt::format("{}.{}", m_headnode.getHostname(), domainName)); } -template <> -std::list>& Cluster::getNetworks() +std::list>& Cluster::getNetworks() { return m_network; } -template -void Cluster::initRepoManager() -{ - if (cloyster::dryRun) { - m_repos.emplace(RepoManager(*getRunner(), m_headnode.getOS())); - } else { - m_repos.emplace(RepoManager(*getRunner(), m_headnode.getOS())); - } -} - -// @TODO Remove this after as part of the repository refactoring -template -RepoManager& Cluster::getRepoManager() -{ - if (!m_repos) { - initRepoManager(); - } - return m_repos.value(); -} +// void Cluster::initRepoManager() +// { +// if (cloyster::dryRun) { +// m_repos.emplace(RepoManager(*getRunner(), m_headnode.getOS())); +// } else { +// m_repos.emplace(RepoManager(*getRunner(), m_headnode.getOS())); +// } +// } -template <> -RepoManager& Cluster::getRepoManager() +// @TODO Remove this after as part of the repository refactoring +// template +// RepoManager& Cluster::getRepoManager() +// { +// if (!m_repos) { +// initRepoManager(); +// } +// +// return m_repos.value(); +// } + +RepoManager& Cluster::getRepoManager() { // @This should not happen throw std::logic_error("Not implemented"); } -template <> -Network& Cluster::getNetwork(Network::Profile profile) +Network& Cluster::getNetwork(Network::Profile profile) { for (auto& network : m_network) { if (network->getProfile() == profile) { @@ -202,26 +179,22 @@ const std::list Cluster::getNet(Network::Profile profile) { } #endif -template <> -void Cluster::addNetwork() +void Cluster::addNetwork() { m_network.emplace_back(std::make_unique()); } -template <> -void Cluster::addNetwork(Network::Profile profile) +void Cluster::addNetwork(Network::Profile profile) { m_network.emplace_back(std::make_unique(profile)); } -template <> -void Cluster::addNetwork(Network::Profile profile, Network::Type type) +void Cluster::addNetwork(Network::Profile profile, Network::Type type) { m_network.emplace_back(std::make_unique(profile, type)); } -template <> -void Cluster::addNetwork(Network::Profile profile, Network::Type type, +void Cluster::addNetwork(Network::Profile profile, Network::Type type, const std::string& ip, const std::string& subnetMask, const std::string& gateway, const uint16_t& vlan, const std::string& domainName, const std::vector
& nameserver) @@ -230,8 +203,7 @@ void Cluster::addNetwork(Network::Profile profile, Network::Type typ profile, type, ip, subnetMask, gateway, vlan, domainName, nameserver)); } -template <> -void Cluster::addNetwork(Network::Profile profile, Network::Type type, +void Cluster::addNetwork(Network::Profile profile, Network::Type type, const std::string& ip, const std::string& subnetMask, const std::string& gateway, const uint16_t& vlan, const std::string& domainName, const std::vector& nameserver) @@ -246,56 +218,47 @@ void Cluster::addNetwork(Network::Profile profile, Network::Type typ formattedNameservers); } -template <> -void Cluster::addNetwork(std::unique_ptr&& network) +void Cluster::addNetwork(std::unique_ptr&& network) { m_network.emplace_back(std::move(network)); } -template <> -bool Cluster::isUpdateSystem() const { return m_updateSystem; } +bool Cluster::isUpdateSystem() const { return m_updateSystem; } -template <> -void Cluster::setUpdateSystem(bool updateSystem) +void Cluster::setUpdateSystem(bool updateSystem) { m_updateSystem = updateSystem; } -template <> -Cluster::Provisioner Cluster::getProvisioner() const { return m_provisioner; } +Cluster::Provisioner Cluster::getProvisioner() const { return m_provisioner; } -template <> -void Cluster::setProvisioner(Cluster::Provisioner provisioner) +void Cluster::setProvisioner(Cluster::Provisioner provisioner) { m_provisioner = provisioner; } -template <> -std::optional Cluster::getOFED() const { return m_ofed; } +std::optional Cluster::getOFED() const { return m_ofed; } -template <> -void Cluster::setOFED(OFED::Kind kind) { m_ofed = OFED(kind); } +void Cluster::setOFED(OFED::Kind kind) { m_ofed = OFED(kind); } -template <> -std::optional>>& Cluster::getQueueSystem() +std::optional>& Cluster::getQueueSystem() { return m_queueSystem; } -template <> -void Cluster::setQueueSystem(QueueSystem::Kind kind) +void Cluster::setQueueSystem(QueueSystem::Kind kind) { switch (kind) { - case QueueSystem::Kind::None: + case QueueSystem::Kind::None: m_queueSystem = std::nullopt; break; - case QueueSystem::Kind::SLURM: + case QueueSystem::Kind::SLURM: // m_queueSystem = std::unique_ptr(new SLURM()); m_queueSystem = std::make_unique(*this); break; - case QueueSystem::Kind::PBS: + case QueueSystem::Kind::PBS: // m_queueSystem = std::unique_ptr(new PBS()); m_queueSystem = std::make_unique(*this); break; @@ -303,23 +266,19 @@ void Cluster::setQueueSystem(QueueSystem::Kind kind) } -template <> -std::optional& Cluster::getMailSystem() { return m_mailSystem; } +std::optional& Cluster::getMailSystem() { return m_mailSystem; } -template <> -void Cluster::setMailSystem(Postfix::Profile profile) +void Cluster::setMailSystem(Postfix::Profile profile, std::shared_ptr runner) { - m_mailSystem.emplace(m_systemdBus, *m_runner, profile); + m_mailSystem.emplace(m_systemdBus, *runner, profile); } -template <> -const std::filesystem::path& Cluster::getDiskImage() const +const std::filesystem::path& Cluster::getDiskImage() const { return m_diskImage.getPath(); } -template <> -void Cluster::setDiskImage(const std::filesystem::path& diskImagePath) +void Cluster::setDiskImage(const std::filesystem::path& diskImagePath) { // BUG: This does not hanble ~ expansion for userdir if (std::filesystem::exists(diskImagePath)) { @@ -330,31 +289,26 @@ void Cluster::setDiskImage(const std::filesystem::path& diskImagePat } } -template <> -const std::vector& Cluster::getNodes() const { return m_nodes; } +const std::vector& Cluster::getNodes() const { return m_nodes; } -template <> -void Cluster::addNode(std::string_view hostname, OS& os, CPU& cpu, +void Cluster::addNode(std::string_view hostname, OS& os, CPU& cpu, std::list&& connections) { m_nodes.emplace_back(hostname, os, cpu, std::move(connections)); } -template <> -void Cluster::addNode(std::string_view hostname, OS& os, CPU& cpu, +void Cluster::addNode(std::string_view hostname, OS& os, CPU& cpu, std::list&& connections, BMC& bmc) { m_nodes.emplace_back(hostname, os, cpu, std::move(connections), bmc); } -template <> -void Cluster::addNode(Node node) { m_nodes.emplace_back(node); } +void Cluster::addNode(Node node) { m_nodes.emplace_back(node); } #ifndef NDEBUG -template <> -void Cluster::printNetworks( +void Cluster::printNetworks( const std::list>& networks) const { @@ -384,17 +338,14 @@ void Cluster::printNetworks( } } } - -template<> -void Cluster::printConnections() +void Cluster::printConnections() { for (const auto& connection : getHeadnode().getConnections()) { connection.dumpConnection(); } } -template<> -void Cluster::printData() +void Cluster::printData() { LOG_DEBUG("Dump cluster data:") LOG_DEBUG("Cluster attributes defined:") @@ -422,8 +373,8 @@ void Cluster::printData() LOG_DEBUG("Firewall: {}", (isFirewall() ? "true" : "false")) LOG_DEBUG("SELinux: {}", static_cast(getSELinux())) } -template <> -void Cluster::fillTestData() + +void Cluster::fillTestData() { setName("Cloyster"); setFirewall(true); @@ -436,7 +387,7 @@ void Cluster::fillTestData() "{0}.{1}", this->m_headnode.getHostname(), getDomainName())); setOFED(OFED::Kind::Inbox); - setQueueSystem(QueueSystem::Kind::SLURM); + setQueueSystem(QueueSystem::Kind::SLURM); m_queueSystem.value()->setDefaultQueue("execution"); addNetwork(Network::Profile::External, Network::Type::Ethernet, @@ -525,8 +476,7 @@ auto& getNetworkField(AnswerFile& answerfile, Network::Profile profile) } } -template <> -void Cluster::dumpData(const std::filesystem::path& answerfilePath) +void Cluster::dumpData(const std::filesystem::path& answerfilePath) { AnswerFile answerfile(answerfilePath); LOG_TRACE("Dump Management Network"); @@ -587,8 +537,7 @@ void Cluster::dumpData(const std::filesystem::path& answerfilePath) answerfile.dumpFile(answerfilePath); } -template <> -void Cluster::fillData(const std::filesystem::path& answerfilePath) +void Cluster::fillData(const std::filesystem::path& answerfilePath) { AnswerFile answerfile(answerfilePath); @@ -676,7 +625,7 @@ void Cluster::fillData(const std::filesystem::path& answerfilePath) "{0}.{1}", this->m_headnode.getHostname(), getDomainName())); setOFED(OFED::Kind::Inbox); - setQueueSystem(QueueSystem::Kind::SLURM); + setQueueSystem(QueueSystem::Kind::SLURM); m_queueSystem.value()->setDefaultQueue("execution"); addNetwork(std::move(managementNetwork)); @@ -953,7 +902,7 @@ void Cluster::fillData(const std::filesystem::path& answerfilePath) } if (answerfile.postfix.enabled) { - setMailSystem(answerfile.postfix.profile); + setMailSystem(answerfile.postfix.profile, cloyster::getRunner()); m_mailSystem->setHostname(this->m_headnode.getHostname()); m_mailSystem->setDomain(getDomainName()); m_mailSystem->setDestination(answerfile.postfix.destination); diff --git a/src/functions.cpp b/src/functions.cpp index c70c5024..9cfb4116 100644 --- a/src/functions.cpp +++ b/src/functions.cpp @@ -23,7 +23,8 @@ namespace cloyster { -static std::tuple> retrieveLine( +namespace { +std::tuple> retrieveLine( boost::process::ipstream& pipe_stream, const std::function& linecheck) { @@ -34,6 +35,25 @@ static std::tuple> retrieveLine( return make_tuple(pipe_stream.good(), std::nullopt); } +constexpr std::shared_ptr makeRunner(const bool dryRun) { + if (dryRun) { + return std::make_shared(); + } + + return std::make_shared(); +} +} // anonymous namespace + +std::shared_ptr getRunner() { + static std::optional> runner = std::nullopt; + if (!runner) { + runner = makeRunner(cloyster::dryRun); + } + + return runner.value(); +} + + std::optional CommandProxy::getline() { diff --git a/src/main.cpp b/src/main.cpp index 5075da34..aa1f5379 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -150,7 +150,7 @@ int main(int argc, const char** argv) return EXIT_FAILURE; } - auto model = std::make_unique>(); + auto model = std::make_unique(); if (!cloyster::answerfile.empty()) { LOG_TRACE("Answerfile: {}", cloyster::answerfile) model->fillData(cloyster::answerfile); diff --git a/src/presenter/PresenterGeneralSettings.cpp b/src/presenter/PresenterGeneralSettings.cpp index 10f80fa6..00b8036c 100644 --- a/src/presenter/PresenterGeneralSettings.cpp +++ b/src/presenter/PresenterGeneralSettings.cpp @@ -6,7 +6,7 @@ #include PresenterGeneralSettings::PresenterGeneralSettings( - std::unique_ptr>& model, std::unique_ptr& view) + std::unique_ptr& model, std::unique_ptr& view) : Presenter(model, view) { diff --git a/src/presenter/PresenterHostId.cpp b/src/presenter/PresenterHostId.cpp index c5bc21dc..d1e62dda 100644 --- a/src/presenter/PresenterHostId.cpp +++ b/src/presenter/PresenterHostId.cpp @@ -6,7 +6,7 @@ #include PresenterHostId::PresenterHostId( - std::unique_ptr>& model, std::unique_ptr& view) + std::unique_ptr& model, std::unique_ptr& view) : Presenter(model, view) { diff --git a/src/presenter/PresenterInfiniband.cpp b/src/presenter/PresenterInfiniband.cpp index 45a2a8b5..f2d47d65 100644 --- a/src/presenter/PresenterInfiniband.cpp +++ b/src/presenter/PresenterInfiniband.cpp @@ -7,7 +7,7 @@ #include -PresenterInfiniband::PresenterInfiniband(std::unique_ptr>& model, +PresenterInfiniband::PresenterInfiniband(std::unique_ptr& model, std::unique_ptr& view, NetworkCreator& nc) : Presenter(model, view) { diff --git a/src/presenter/PresenterInstall.cpp b/src/presenter/PresenterInstall.cpp index f3fbd92d..c7dcc8e9 100644 --- a/src/presenter/PresenterInstall.cpp +++ b/src/presenter/PresenterInstall.cpp @@ -19,7 +19,7 @@ #include PresenterInstall::PresenterInstall( - std::unique_ptr>& model, std::unique_ptr& view) + std::unique_ptr& model, std::unique_ptr& view) : Presenter(model, view) { diff --git a/src/presenter/PresenterInstructions.cpp b/src/presenter/PresenterInstructions.cpp index e4ab3c1e..bc20600c 100644 --- a/src/presenter/PresenterInstructions.cpp +++ b/src/presenter/PresenterInstructions.cpp @@ -6,7 +6,7 @@ #include PresenterInstructions::PresenterInstructions( - std::unique_ptr>& model, std::unique_ptr& view) + std::unique_ptr& model, std::unique_ptr& view) : Presenter(model, view) { diff --git a/src/presenter/PresenterLocale.cpp b/src/presenter/PresenterLocale.cpp index bdfbb98b..8ae8e6da 100644 --- a/src/presenter/PresenterLocale.cpp +++ b/src/presenter/PresenterLocale.cpp @@ -6,7 +6,7 @@ #include PresenterLocale::PresenterLocale( - std::unique_ptr>& model, std::unique_ptr& view) + std::unique_ptr& model, std::unique_ptr& view) : Presenter(model, view) { auto availableLocales = m_model->getLocale().getAvailableLocales(); diff --git a/src/presenter/PresenterMailSystem.cpp b/src/presenter/PresenterMailSystem.cpp index 39c1acc8..9b709496 100644 --- a/src/presenter/PresenterMailSystem.cpp +++ b/src/presenter/PresenterMailSystem.cpp @@ -3,24 +3,24 @@ * SPDX-License-Identifier: Apache-2.0 */ +#include #include PresenterMailSystem::PresenterMailSystem( - std::unique_ptr>& model, std::unique_ptr& view) + std::unique_ptr& model, std::unique_ptr& view) : Presenter(model, view) { if (m_view->yesNoQuestion( Messages::title, Messages::question, Messages::help)) { - m_model->setMailSystem(magic_enum::enum_cast( + Postfix::Profile mailSystemProfile = magic_enum::enum_cast( m_view->listMenu(Messages::title, Messages::Profile::question, - magic_enum::enum_names(), - Messages::Profile::help)) - .value()); - - auto& mailSystem = m_model->getMailSystem().value(); - const auto& mailSystemProfile = mailSystem.getProfile(); + magic_enum::enum_names(), + Messages::Profile::help) + ).value(); + m_model->setMailSystem(mailSystemProfile, cloyster::getRunner()); + auto mailSystem = m_model->getMailSystem().value(); LOG_DEBUG("Enabled Postfix with profile: {}", magic_enum::enum_name(mailSystemProfile)); diff --git a/src/presenter/PresenterNetwork.cpp b/src/presenter/PresenterNetwork.cpp index e1147bae..711e0cdd 100644 --- a/src/presenter/PresenterNetwork.cpp +++ b/src/presenter/PresenterNetwork.cpp @@ -52,7 +52,7 @@ std::size_t NetworkCreator::getSelectedInterfaces() return m_networks.size(); } -void NetworkCreator::saveNetworksToModel(Cluster& model) +void NetworkCreator::saveNetworksToModel(Cluster& model) { for (const auto& net : m_networks) { auto netptr = std::make_unique(net.profile, net.type); @@ -105,7 +105,7 @@ void NetworkCreator::saveNetworksToModel(Cluster& model) // attributes we just copy them to the right place or even better, we move it. // After the end of this class the temporary objects will be destroyed anyway. -PresenterNetwork::PresenterNetwork(std::unique_ptr>& model, +PresenterNetwork::PresenterNetwork(std::unique_ptr& model, std::unique_ptr& view, NetworkCreator& nc, Network::Profile profile, Network::Type type) : Presenter(model, view) diff --git a/src/presenter/PresenterNodes.cpp b/src/presenter/PresenterNodes.cpp index 77500dfc..351479bc 100644 --- a/src/presenter/PresenterNodes.cpp +++ b/src/presenter/PresenterNodes.cpp @@ -6,7 +6,7 @@ #include PresenterNodes::PresenterNodes( - std::unique_ptr>& model, std::unique_ptr& view) + std::unique_ptr& model, std::unique_ptr& view) : Presenter(model, view) { diff --git a/src/presenter/PresenterNodesOperationalSystem.cpp b/src/presenter/PresenterNodesOperationalSystem.cpp index a37bcbc6..a4fa95b8 100644 --- a/src/presenter/PresenterNodesOperationalSystem.cpp +++ b/src/presenter/PresenterNodesOperationalSystem.cpp @@ -114,7 +114,7 @@ PresenterNodesOperationalSystem::selectVersion(OS::Distro distro) } PresenterNodesOperationalSystem::PresenterNodesOperationalSystem( - std::unique_ptr>& model, std::unique_ptr& view) + std::unique_ptr& model, std::unique_ptr& view) : Presenter(model, view) { std::vector distroNames; diff --git a/src/presenter/PresenterQueueSystem.cpp b/src/presenter/PresenterQueueSystem.cpp index c0453149..5dbb0bad 100644 --- a/src/presenter/PresenterQueueSystem.cpp +++ b/src/presenter/PresenterQueueSystem.cpp @@ -6,13 +6,13 @@ #include PresenterQueueSystem::PresenterQueueSystem( - std::unique_ptr>& model, std::unique_ptr& view) + std::unique_ptr& model, std::unique_ptr& view) : Presenter(model, view) { - m_model->setQueueSystem(magic_enum::enum_cast::Kind>( + m_model->setQueueSystem(magic_enum::enum_cast( m_view->listMenu(Messages::title, Messages::question, - magic_enum::enum_names::Kind>(), Messages::help)) + magic_enum::enum_names(), Messages::help)) .value()); // TODO: Placeholder data @@ -20,7 +20,6 @@ PresenterQueueSystem::PresenterQueueSystem( { { Messages::SLURM::partition, "execution" } }); if (auto& queue = m_model->getQueueSystem()) { - using QueueSystem = QueueSystem; switch (queue.value()->getKind()) { case QueueSystem::Kind::None: { __builtin_unreachable(); diff --git a/src/presenter/PresenterRepository.cpp b/src/presenter/PresenterRepository.cpp index 4d1bbd29..6ad19872 100644 --- a/src/presenter/PresenterRepository.cpp +++ b/src/presenter/PresenterRepository.cpp @@ -7,7 +7,7 @@ #include PresenterRepository::PresenterRepository( - std::unique_ptr>& model, std::unique_ptr& view) + std::unique_ptr& model, std::unique_ptr& view) : Presenter(model, view) { auto manager = m_model->getRepoManager(); diff --git a/src/presenter/PresenterTime.cpp b/src/presenter/PresenterTime.cpp index 4dc81298..95b52970 100644 --- a/src/presenter/PresenterTime.cpp +++ b/src/presenter/PresenterTime.cpp @@ -7,7 +7,7 @@ #include PresenterTime::PresenterTime( - std::unique_ptr>& model, std::unique_ptr& view) + std::unique_ptr& model, std::unique_ptr& view) : Presenter(model, view) { // Timezone area selection diff --git a/src/presenter/PresenterWelcome.cpp b/src/presenter/PresenterWelcome.cpp index 73cf6d63..91433186 100644 --- a/src/presenter/PresenterWelcome.cpp +++ b/src/presenter/PresenterWelcome.cpp @@ -6,7 +6,7 @@ #include PresenterWelcome::PresenterWelcome( - std::unique_ptr>& model, std::unique_ptr& view) + std::unique_ptr& model, std::unique_ptr& view) : Presenter(model, view) { diff --git a/src/queuesystem/pbs.cpp b/src/queuesystem/pbs.cpp index 50f0a594..8fab7937 100644 --- a/src/queuesystem/pbs.cpp +++ b/src/queuesystem/pbs.cpp @@ -5,7 +5,7 @@ #include -PBS::PBS(const Cluster& cluster) +PBS::PBS(const Cluster& cluster) : QueueSystem(cluster) { setKind(QueueSystem::Kind::PBS); diff --git a/src/queuesystem/queuesystem.cpp b/src/queuesystem/queuesystem.cpp index 563cdee0..28db9aed 100644 --- a/src/queuesystem/queuesystem.cpp +++ b/src/queuesystem/queuesystem.cpp @@ -6,23 +6,18 @@ #include #include -template<> -QueueSystem::QueueSystem(const Cluster& cluster) +QueueSystem::QueueSystem(const Cluster& cluster) : m_cluster(cluster) { } -template<> -void QueueSystem::setKind(Kind kind) { m_kind = kind; } +void QueueSystem::setKind(Kind kind) { m_kind = kind; } -template<> -QueueSystem::Kind QueueSystem::getKind(void) { return m_kind; } +QueueSystem::Kind QueueSystem::getKind(void) { return m_kind; } -template<> -void QueueSystem::setDefaultQueue(std::string_view defaultQueue) +void QueueSystem::setDefaultQueue(std::string_view defaultQueue) { m_defaultQueue = defaultQueue; } -template<> -std::string_view QueueSystem::getDefaultQueue(void) { return m_defaultQueue; } +std::string_view QueueSystem::getDefaultQueue(void) { return m_defaultQueue; } diff --git a/src/queuesystem/slurm.cpp b/src/queuesystem/slurm.cpp index ef9c4a4d..fbd299f3 100644 --- a/src/queuesystem/slurm.cpp +++ b/src/queuesystem/slurm.cpp @@ -10,7 +10,7 @@ using cloyster::runCommand; -SLURM::SLURM(const Cluster& cluster) +SLURM::SLURM(const Cluster& cluster) : QueueSystem(cluster) { setKind(QueueSystem::Kind::SLURM); diff --git a/src/services/shell.cpp b/src/services/shell.cpp index 68a9d94a..e0d3b01e 100644 --- a/src/services/shell.cpp +++ b/src/services/shell.cpp @@ -23,7 +23,7 @@ using cloyster::runCommand; -Shell::Shell(const std::unique_ptr>& cluster) +Shell::Shell(const std::unique_ptr& cluster) : m_cluster(cluster) { // Initialize directory tree @@ -50,17 +50,17 @@ void Shell::configureSELinuxMode() LOG_INFO("Setting up SELinux") switch (m_cluster->getSELinux()) { - case Cluster::SELinuxMode::Permissive: + case Cluster::SELinuxMode::Permissive: runCommand("setenforce 0"); /* Permissive mode */ break; - case Cluster::SELinuxMode::Enforcing: + case Cluster::SELinuxMode::Enforcing: /* Enforcing mode */ runCommand("setenforce 1"); break; - case Cluster::SELinuxMode::Disabled: + case Cluster::SELinuxMode::Disabled: disableSELinux(); break; } @@ -298,11 +298,11 @@ void Shell::configureQueueSystem() if (const auto& queue = m_cluster->getQueueSystem()) { switch (queue.value()->getKind()) { - case QueueSystem::Kind::None: { + case QueueSystem::Kind::None: { __builtin_unreachable(); } - case QueueSystem::Kind::SLURM: { + case QueueSystem::Kind::SLURM: { const auto& slurm = dynamic_cast(queue.value().get()); slurm->installServer(); slurm->configureServer(); @@ -311,7 +311,7 @@ void Shell::configureQueueSystem() break; } - case QueueSystem::Kind::PBS: { + case QueueSystem::Kind::PBS: { const auto& pbs = dynamic_cast(queue.value().get()); runCommand("dnf -y install openpbs-server-ohpc"); @@ -444,7 +444,7 @@ void Shell::install() // std::unique_ptr provisioner; std::unique_ptr provisioner; switch (m_cluster->getProvisioner()) { - case Cluster::Provisioner::xCAT: + case Cluster::Provisioner::xCAT: provisioner = std::make_unique(m_cluster); break; } diff --git a/src/services/xcat.cpp b/src/services/xcat.cpp index db32d4c4..a89edf70 100644 --- a/src/services/xcat.cpp +++ b/src/services/xcat.cpp @@ -13,7 +13,7 @@ #include // setenv / getenv #include -XCAT::XCAT(const std::unique_ptr>& cluster) +XCAT::XCAT(const std::unique_ptr& cluster) : m_cluster(cluster) { @@ -281,7 +281,6 @@ void XCAT::configureOSImageDefinition() void XCAT::customizeImage() { - using QueueSystem = QueueSystem; // Permission fixes for munge if (m_cluster->getQueueSystem().value()->getKind() == QueueSystem::Kind::SLURM) {