Skip to content

Commit

Permalink
Make ISO download available instead of using only a local image (#13)
Browse files Browse the repository at this point in the history
* Integrate ISO remote download to PresenterNodesOperationalSystem, fix distro typo in xcat.cpp

Signed-off-by: lbgracioso <[email protected]>

* Add Rocky download URL

Signed-off-by: lbgracioso <[email protected]>

---------

Signed-off-by: lbgracioso <[email protected]>
  • Loading branch information
lbgracioso committed Jun 2, 2023
1 parent 13cc70d commit 59363ec
Show file tree
Hide file tree
Showing 3 changed files with 144 additions and 24 deletions.
143 changes: 120 additions & 23 deletions src/presenter/PresenterNodesOperationalSystem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,37 +10,134 @@ PresenterNodesOperationalSystem::PresenterNodesOperationalSystem(
std::unique_ptr<Cluster>& model, std::unique_ptr<Newt>& view)
: Presenter(model, view)
{
// Operational system directory path selection
std::list<std::string> distroNames;
distroNames.emplace_back("Red Hat Enterprise Linux");
distroNames.emplace_back("AlmaLinux");
distroNames.emplace_back("Rocky Linux");
distroNames.emplace_back("Oracle Linux");

auto isoDirectoryPath = std::to_array<std::pair<std::string, std::string>>(
{ { Messages::OperationalSystemDirectoryPath::field, "/mnt/iso" } });
std::map<std::string, OS::Distro> distros;
distros["Red Hat Enterprise Linux"] = OS::Distro::RHEL;
distros["AlmaLinux"] = OS::Distro::AlmaLinux;
distros["Rocky Linux"] = OS::Distro::Rocky;
distros["Oracle Linux"] = OS::Distro::OL;

isoDirectoryPath = m_view->fieldMenu(Messages::title,
Messages::OperationalSystemDirectoryPath::question, isoDirectoryPath,
// Download remote ISO image or use local image

auto downloadIso = false;

downloadIso = m_view->yesNoQuestion(Messages::title,
Messages::OperationalSystemDownloadIso::FirstStage::question,
Messages::OperationalSystemDirectoryPath::help);

LOG_DEBUG("ISO directory path set to {}", isoDirectoryPath.data()->second);
if (downloadIso) {

// Download remote ISO
auto distroToDownload = m_view->listMenu(Messages::title,
Messages::OperationalSystemDownloadIso::SecondStage::question,
distroNames,
Messages::OperationalSystemDownloadIso::SecondStage::help);

// Operational system iso selection
auto selectedDistro = distros.find(distroToDownload);

std::list<std::string> isos;
std::string distroDownloadURL = "https://mirror.versatushpc.com.br/";
std::string isoName = "OracleLinux-R8-U7-x86_64-dvd.iso";

for (const auto& entry :
fs::directory_iterator(isoDirectoryPath.data()->second)) {
if (entry.path().string().ends_with("iso")) {
auto formattedIsoName = entry.path().string().erase(
entry.path().string().find(isoDirectoryPath.data()->second),
isoDirectoryPath.data()->second.length() + 1);
isos.emplace_back(formattedIsoName);
switch (selectedDistro->second) {
case OS::Distro::RHEL:
// @TODO
distroDownloadURL += "";
isoName = "";
break;
case OS::Distro::OL:
// Waiting for mirror.versatushpc.com.br fix
distroDownloadURL
+= "oracle/iso/OracleLinux-R8-U8-x86_64-dvd.iso";
isoName = "OracleLinux-R8-U8-x86_64-dvd.iso";
break;
case OS::Distro::Rocky:
distroDownloadURL
+= "rocky/linux/8.8/isos/x86_64/Rocky-8.8-x86_64-dvd1.iso";
isoName = "Rocky-8.8-x86_64-dvd1.iso";
break;
case OS::Distro::AlmaLinux:
distroDownloadURL += "almalinux/almalinux/8.8/isos/x86_64/"
"AlmaLinux-8.8-x86_64-dvd.iso";
isoName = "AlmaLinux-8.8-x86_64-dvd.iso";
break;
}
}

auto selectedIso = m_view->listMenu(Messages::title,
Messages::OperationalSystem::question, isos,
Messages::OperationalSystem::help);
//@TODO Implement newt GUI progress bar
cloyster::runCommand(
fmt::format("wget -NP /root {}", distroDownloadURL));

m_model->setDiskImage(fmt::format("/root/{}", isoName));
LOG_DEBUG("Selected ISO: {}", fmt::format("/root/{}", isoName));

} else {
// Operational system directory path selection

auto isoDirectoryPath
= std::to_array<std::pair<std::string, std::string>>(
{ { Messages::OperationalSystemDirectoryPath::field,
"/mnt/iso" } });

isoDirectoryPath = m_view->fieldMenu(Messages::title,
Messages::OperationalSystemDirectoryPath::question,
isoDirectoryPath, Messages::OperationalSystemDirectoryPath::help);

LOG_DEBUG(
"ISO directory path set to {}", isoDirectoryPath.data()->second);

// Operational system distro selection

m_model->setDiskImage(
fmt::format("{}/{}", isoDirectoryPath.data()->second, selectedIso));
LOG_DEBUG("Selected ISO: {}",
fmt::format("{}/{}", isoDirectoryPath.data()->second, selectedIso));
auto selectedDistroName = m_view->listMenu(Messages::title,
Messages::OperationalSystemDistro::question, distroNames,
Messages::OperationalSystemDistro::help);

auto selectedDistro = distros.find(selectedDistroName);

// Operational system iso selection

std::list<std::string> isos;

for (const auto& entry :
fs::directory_iterator(isoDirectoryPath.data()->second)) {
if (entry.path().string().ends_with("iso")) {
auto formattedIsoName = entry.path().string().erase(
entry.path().string().find(isoDirectoryPath.data()->second),
isoDirectoryPath.data()->second.length() + 1);

switch (selectedDistro->second) {
case OS::Distro::RHEL:
if (formattedIsoName.find("rhel") != std::string::npos)
isos.emplace_back(formattedIsoName);
break;
case OS::Distro::OL:
if (formattedIsoName.find("OracleLinux")
!= std::string::npos)
isos.emplace_back(formattedIsoName);
break;
case OS::Distro::Rocky:
if (formattedIsoName.find("Rocky") != std::string::npos)
isos.emplace_back(formattedIsoName);
break;
case OS::Distro::AlmaLinux:
if (formattedIsoName.find("AlmaLinux")
!= std::string::npos)
isos.emplace_back(formattedIsoName);
break;
}
}
}

auto selectedIso = m_view->listMenu(Messages::title,
Messages::OperationalSystem::question, isos,
Messages::OperationalSystem::help);

m_model->setDiskImage(
fmt::format("{}/{}", isoDirectoryPath.data()->second, selectedIso));
LOG_DEBUG("Selected ISO: {}",
fmt::format("{}/{}", isoDirectoryPath.data()->second, selectedIso));
}
}
23 changes: 23 additions & 0 deletions src/presenter/PresenterNodesOperationalSystem.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,22 @@ class PresenterNodesOperationalSystem : public Presenter {
static constexpr const char* title
= "Nodes operational system settings";

struct OperationalSystemDownloadIso {
struct FirstStage {
static constexpr const char* question
= "You want to download a ISO for your node?";
static constexpr const char* help
= "Choose 'YES' if you want to download a new one or 'NO' "
"if you already have an ISO.";
};
struct SecondStage {
static constexpr const char* question
= "Choose an ISO to download";
static constexpr const char* help
= Presenter::Messages::Placeholder::help;
};
};

struct OperationalSystemDirectoryPath {
static constexpr const char* question
= "Inform the directory where your operational system images "
Expand All @@ -22,6 +38,13 @@ class PresenterNodesOperationalSystem : public Presenter {
static constexpr const char* field = "Path to ISOs directory:";
};

struct OperationalSystemDistro {
static constexpr const char* question
= "Choose your operational system distro";
static constexpr const char* help
= Presenter::Messages::Placeholder::help;
};

struct OperationalSystem {
static constexpr const char* question
= "Choose your operational system ISO";
Expand Down
2 changes: 1 addition & 1 deletion src/services/xcat.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -498,7 +498,7 @@ void XCAT::generateOSImagePath(ImageType imageType, NodeType nodeType)
chroot += "rocky";
chroot += m_cluster->getNodes()[0].getOS().getVersion();
break;
case OS::Distro::Almalinux:
case OS::Distro::AlmaLinux:
chroot += "alma";
chroot += m_cluster->getNodes()[0].getOS().getVersion();
break;
Expand Down

0 comments on commit 59363ec

Please sign in to comment.