Commit bcb29b97 authored by Eric Cano's avatar Eric Cano
Browse files

Added support for cta drive operations (ls/up/down).

parent fc0de7b6
......@@ -24,6 +24,7 @@
#include "catalogue/TapeFileSearchCriteria.hpp"
#include "common/Configuration.hpp"
#include "common/utils/utils.hpp"
#include "common/utils/GetOptThreadSafe.hpp"
#include "common/exception/UserError.hpp"
#include "common/exception/NonRetryableError.hpp"
#include "common/exception/RetryableError.hpp"
......@@ -1783,57 +1784,57 @@ void XrdCtaFile::xCom_drive() {
if (m_requestTokens.size() != 4)
throw cta::exception::UserError(help.str());
m_scheduler->setDesiredDriveState(m_cliIdentity, m_requestTokens.at(3), true, false);
cmdlineOutput << "Drive " << m_requestTokens.at(3) << " set UP." << std::endl;
} else if ("down" == m_requestTokens.at(2)) {
// Here the drive name is required in addition
bool force;
if (m_requestTokens.size() == 4) {
force = false;
} else if (m_requestTokens.size() == 5) {
if (m_requestTokens.at(4) == "-f" || m_requestTokens.at(4) == "--force") {
force = true;
} else {
throw cta::exception::UserError(help.str());
}
// Parse the command line for option and drive name.
cta::utils::GetOpThreadSafe::Request req;
for (size_t i=2; i<m_requestTokens.size(); i++)
req.argv.push_back(m_requestTokens.at(i));
req.optstring = { "f" };
struct ::option longOptions[] = { { "force", no_argument, 0 , 'f' }, { 0, 0, 0, 0 } };
req.longopts = longOptions;
auto reply = cta::utils::GetOpThreadSafe::getOpt(req);
// We should have one and only one no-option argument, the drive name.
if (reply.remainder.size() != 1) {
throw cta::exception::UserError(help.str());
}
// Check if the force option was present.
bool force=reply.options.size() && (reply.options.at(0).option == "f");
m_scheduler->setDesiredDriveState(m_cliIdentity, reply.remainder.at(0), false, force);
cmdlineOutput << "Drive " << reply.remainder.at(0) << " set DOWN";
if (force) {
cmdlineOutput << " (forced down)";
}
m_scheduler->setDesiredDriveState(m_cliIdentity, m_requestTokens.at(3), false, force);
cmdlineOutput << "." << std::endl;
} else if ("ls" == m_requestTokens.at(2)) {
if (m_requestTokens.size() == 3) {
// We will dump all the drives.
if ((m_requestTokens.size() == 3) || (m_requestTokens.size() == 4)) {
// We will dump all the drives, and select the one asked for if needed.
bool singleDrive = (m_requestTokens.size() == 4);
auto driveStates = m_scheduler->getDriveStates(m_cliIdentity);
if (driveStates.size()) {
std::vector<std::vector<std::string>> responseTable;
std::vector<std::string> header = {"drive", "library"};
// TODO
throw cta::exception::Exception("TODO");
std::vector<std::string> headers = {"drive", "host", "library", "mountType", "status", "desiredUp", "forceDown"};
responseTable.push_back(headers);
for (auto ds: driveStates) {
if (singleDrive && m_requestTokens.at(3) != ds.driveName) continue;
std::vector<std::string> currentRow;
currentRow.push_back(ds.driveName);
currentRow.push_back(ds.host);
currentRow.push_back(ds.logicalLibrary);
currentRow.push_back(cta::common::dataStructures::toString(ds.mountType));
currentRow.push_back(cta::common::dataStructures::toString(ds.driveStatus));
currentRow.push_back(ds.desiredDriveState.up?"UP":"DOWN");
currentRow.push_back(ds.desiredDriveState.forceDown?"FORCE":"");
responseTable.push_back(currentRow);
}
cmdlineOutput<< formatResponse(responseTable, true);
}
} else if (m_requestTokens.size() == 4) {
// We will list a single drive.
// TODO
throw cta::exception::Exception("TODO");
} else {
throw cta::exception::UserError(help.str());
}
} else {
throw cta::exception::UserError(help.str());
}
if(m_requestTokens.size() < 3) {
throw cta::exception::UserError(help.str());
}
optional<std::string> drive = getOptionStringValue("-d", "--drive", true, false);
checkOptions(help.str());
if("up" == m_requestTokens.at(2)) {
m_scheduler->setDesiredDriveState(m_cliIdentity, drive.value(), true, false);
}
else if("down" == m_requestTokens.at(2)) {
m_scheduler->setDesiredDriveState(m_cliIdentity, drive.value(), false, hasOption("-f", "--force"));
}
else {
throw cta::exception::UserError(help.str());
}
logRequestAndSetCmdlineResult(cta::common::dataStructures::FrontendReturnCode::ok, cmdlineOutput.str());
}
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment