From 92b389c06b815e91d02e27d85dbbf44eb2ee50da Mon Sep 17 00:00:00 2001 From: Daniele Kruse <dkruse@cern.ch> Date: Wed, 18 Feb 2015 16:54:41 +0100 Subject: [PATCH] Added logical library commands and the get archive jobs command --- xroot_clients/CTACmd.cpp | 8 +- xroot_plugins/XrdProFilesystem.cpp | 161 +++++++++++++++++++++++++++++ xroot_plugins/XrdProFilesystem.hpp | 40 +++++++ 3 files changed, 207 insertions(+), 2 deletions(-) diff --git a/xroot_clients/CTACmd.cpp b/xroot_clients/CTACmd.cpp index 903531801d..178f5b56ed 100644 --- a/xroot_clients/CTACmd.cpp +++ b/xroot_clients/CTACmd.cpp @@ -20,10 +20,11 @@ void CTACmd::usage(std::ostream &os) const throw() { os << "Usage:\n" "\t" << m_programName << " archive <source_file1> [<source_file2> [<source_file3> [...]]] <destination_path>\n" - "\t" << m_programName << " mkclass <storage_class_name> <number_of_tape_copies> <\"comment\">\n" + "\t" << m_programName << " getarchivejobs <tape_pool>\n" "\t" << m_programName << " chdirclass <directory_name> <storage_class_name>\n" "\t" << m_programName << " cldirclass <directory_name>\n" "\t" << m_programName << " getdirclass <directory_name>\n" + "\t" << m_programName << " mkclass <storage_class_name> <number_of_tape_copies> <\"comment\">\n" "\t" << m_programName << " rmclass <storage_class_name>\n" "\t" << m_programName << " lsclass\n" "\t" << m_programName << " mkdir <directory_name>\n" @@ -34,7 +35,10 @@ void CTACmd::usage(std::ostream &os) const throw() { "\t" << m_programName << " lspool\n" "\t" << m_programName << " mkroute <storage_class_name> <copy_number> <tapepool_name> <\"comment\">\n" "\t" << m_programName << " rmroute <storage_class_name> <copy_number>\n" - "\t" << m_programName << " lsroute\n" + "\t" << m_programName << " lsroute\n" + "\t" << m_programName << " mkllib <logical_library_name> <\"comment\">\n" + "\t" << m_programName << " rmllib <logical_library_name>\n" + "\t" << m_programName << " lsllib\n" "\t" << m_programName << " mkadminuser <uid> <gid>\n" "\t" << m_programName << " rmadminuser <uid> <gid>\n" "\t" << m_programName << " lsadminuser\n" diff --git a/xroot_plugins/XrdProFilesystem.cpp b/xroot_plugins/XrdProFilesystem.cpp index 94a045b255..c327bb20e8 100644 --- a/xroot_plugins/XrdProFilesystem.cpp +++ b/xroot_plugins/XrdProFilesystem.cpp @@ -138,6 +138,48 @@ int XrdProFilesystem::executeArchiveCommand(const ParsedRequest &req, XrdOucErrI } } +//------------------------------------------------------------------------------ +// executeGetArchiveJobsCommand +//------------------------------------------------------------------------------ +int XrdProFilesystem::executeGetArchiveJobsCommand(const ParsedRequest &req, XrdOucErrInfo &eInfo, const cta::SecurityIdentity &requester) { + if(req.args.size() != 1) { + std::string response = "[ERROR] Wrong number of arguments provided"; + eInfo.setErrInfo(response.length()+1, response.c_str()); + return SFS_DATA; + } + try { + std::list<cta::ArchiveJob> jobs = m_userApi.getArchiveJobs(requester, req.args.at(0)); + std::ostringstream responseSS; + responseSS << "[OK] List of archive jobs for tape pool " << req.args.at(0) << ":\n"; + for(std::list<cta::ArchiveJob>::iterator it = jobs.begin(); it != jobs.end(); it++) { + responseSS << "[OK]\t" << it->getId() + << " " << it->getCreator().getUid() + << " " << it->getCreator().getGid() + << " " << it->getCreationTime() + << " " << it->getState() + << " " << it->getNbFailedFileTransfers() + << " " << it->getTotalNbFileTransfers() + << " " << it->getComment()<< "\n"; + } + eInfo.setErrInfo(responseSS.str().length()+1, responseSS.str().c_str()); + return SFS_DATA; + } catch (cta::Exception &ex) { + std::string response = "[ERROR] CTA exception caught: "; + response += ex.what(); + eInfo.setErrInfo(response.length()+1, response.c_str()); + return SFS_DATA; + } catch (std::exception &ex) { + std::string response = "[ERROR] Exception caught: "; + response += ex.what(); + eInfo.setErrInfo(response.length()+1, response.c_str()); + return SFS_DATA; + } catch (...) { + std::string response = "[ERROR] Unknown exception caught!"; + eInfo.setErrInfo(response.length()+1, response.c_str()); + return SFS_DATA; + } +} + //------------------------------------------------------------------------------ // executeMkclassCommand //------------------------------------------------------------------------------ @@ -670,6 +712,109 @@ int XrdProFilesystem::executeLsrouteCommand(const ParsedRequest &req, XrdOucErrI } } +//------------------------------------------------------------------------------ +// executeMkllibCommand +//------------------------------------------------------------------------------ +int XrdProFilesystem::executeMkllibCommand(const ParsedRequest &req, XrdOucErrInfo &eInfo, const cta::SecurityIdentity &requester) { + if(req.args.size() != 2) { + std::string response = "[ERROR] Wrong number of arguments provided"; + eInfo.setErrInfo(response.length()+1, response.c_str()); + return SFS_DATA; + } + try { + m_adminApi.createLogicalLibrary(requester, req.args.at(0), req.args.at(1)); + std::ostringstream responseSS; + responseSS << "[OK] Logical library " << req.args.at(0) << " created with comment \"" << req.args.at(1) << "\""; + eInfo.setErrInfo(responseSS.str().length()+1, responseSS.str().c_str()); + return SFS_DATA; + } catch (cta::Exception &ex) { + std::string response = "[ERROR] CTA exception caught: "; + response += ex.what(); + eInfo.setErrInfo(response.length()+1, response.c_str()); + return SFS_DATA; + } catch (std::exception &ex) { + std::string response = "[ERROR] Exception caught: "; + response += ex.what(); + eInfo.setErrInfo(response.length()+1, response.c_str()); + return SFS_DATA; + } catch (...) { + std::string response = "[ERROR] Unknown exception caught!"; + eInfo.setErrInfo(response.length()+1, response.c_str()); + return SFS_DATA; + } +} + +//------------------------------------------------------------------------------ +// executeRmllibCommand +//------------------------------------------------------------------------------ +int XrdProFilesystem::executeRmllibCommand(const ParsedRequest &req, XrdOucErrInfo &eInfo, const cta::SecurityIdentity &requester) { + if(req.args.size() != 1) { + std::string response = "[ERROR] Wrong number of arguments provided"; + eInfo.setErrInfo(response.length()+1, response.c_str()); + return SFS_DATA; + } + try { + m_adminApi.deleteLogicalLibrary(requester, req.args.at(0)); + std::ostringstream responseSS; + responseSS << "[OK] Logical library " << req.args.at(0) << " removed"; + eInfo.setErrInfo(responseSS.str().length()+1, responseSS.str().c_str()); + return SFS_DATA; + } catch (cta::Exception &ex) { + std::string response = "[ERROR] CTA exception caught: "; + response += ex.what(); + eInfo.setErrInfo(response.length()+1, response.c_str()); + return SFS_DATA; + } catch (std::exception &ex) { + std::string response = "[ERROR] Exception caught: "; + response += ex.what(); + eInfo.setErrInfo(response.length()+1, response.c_str()); + return SFS_DATA; + } catch (...) { + std::string response = "[ERROR] Unknown exception caught!"; + eInfo.setErrInfo(response.length()+1, response.c_str()); + return SFS_DATA; + } +} + +//------------------------------------------------------------------------------ +// executeLsllibCommand +//------------------------------------------------------------------------------ +int XrdProFilesystem::executeLsllibCommand(const ParsedRequest &req, XrdOucErrInfo &eInfo, const cta::SecurityIdentity &requester) const { + if(req.args.size() != 0) { + std::string response = "[ERROR] Wrong number of arguments provided"; + eInfo.setErrInfo(response.length()+1, response.c_str()); + return SFS_DATA; + } + try { + std::list<cta::LogicalLibrary> llibs = m_adminApi.getLogicalLibraries(requester); + std::ostringstream responseSS; + responseSS << "[OK] Listing of the migration routes:"; + for(std::list<cta::LogicalLibrary>::iterator it = llibs.begin(); it != llibs.end(); it++) { + responseSS << "\n" << it->getName() + << " " << it->getCreator().getUid() + << " " << it->getCreator().getGid() + << " " << it->getCreationTime() + << " \"" << it->getComment() << "\""; + } + eInfo.setErrInfo(responseSS.str().length()+1, responseSS.str().c_str()); + return SFS_DATA; + } catch (cta::Exception &ex) { + std::string response = "[ERROR] CTA exception caught: "; + response += ex.what(); + eInfo.setErrInfo(response.length()+1, response.c_str()); + return SFS_DATA; + } catch (std::exception &ex) { + std::string response = "[ERROR] Exception caught: "; + response += ex.what(); + eInfo.setErrInfo(response.length()+1, response.c_str()); + return SFS_DATA; + } catch (...) { + std::string response = "[ERROR] Unknown exception caught!"; + eInfo.setErrInfo(response.length()+1, response.c_str()); + return SFS_DATA; + } +} + //------------------------------------------------------------------------------ // executeMkadminuserCommand //------------------------------------------------------------------------------ @@ -901,6 +1046,10 @@ int XrdProFilesystem::dispatchRequest(const XrdSfsFSctl &args, XrdOucErrInfo &eI { return executeArchiveCommand(req, eInfo, requester); } + else if(strcmp(req.cmd.c_str(), "/getarchivejobs") == 0) + { + return executeGetArchiveJobsCommand(req, eInfo, requester); + } else if(strcmp(req.cmd.c_str(), "/mkclass") == 0) { return executeMkclassCommand(req, eInfo, requester); @@ -960,6 +1109,18 @@ int XrdProFilesystem::dispatchRequest(const XrdSfsFSctl &args, XrdOucErrInfo &eI else if(strcmp(req.cmd.c_str(), "/lsroute") == 0) { return executeLsrouteCommand(req, eInfo, requester); + } + else if(strcmp(req.cmd.c_str(), "/mkllib") == 0) + { + return executeMkllibCommand(req, eInfo, requester); + } + else if(strcmp(req.cmd.c_str(), "/rmllib") == 0) + { + return executeRmllibCommand(req, eInfo, requester); + } + else if(strcmp(req.cmd.c_str(), "/lsllib") == 0) + { + return executeLsllibCommand(req, eInfo, requester); } else if(strcmp(req.cmd.c_str(), "/mkadminuser") == 0) { diff --git a/xroot_plugins/XrdProFilesystem.hpp b/xroot_plugins/XrdProFilesystem.hpp index 7c78f9229e..b972c89a63 100644 --- a/xroot_plugins/XrdProFilesystem.hpp +++ b/xroot_plugins/XrdProFilesystem.hpp @@ -77,6 +77,16 @@ protected: */ int executeArchiveCommand(const ParsedRequest &req, XrdOucErrInfo &eInfo, const cta::SecurityIdentity &requester); + /** + * Executes the command contained within the request structure + * + * @param req parsed request + * @param eInfo Error information + * @param requester The UserIdentity structure of the requester + * @return SFS_DATA + */ + int executeGetArchiveJobsCommand(const ParsedRequest &req, XrdOucErrInfo &eInfo, const cta::SecurityIdentity &requester); + /** * Executes the command contained within the request structure * @@ -227,6 +237,36 @@ protected: */ int executeLsrouteCommand(const ParsedRequest &req, XrdOucErrInfo &eInfo, const cta::SecurityIdentity &requester) const; + /** + * Executes the command contained within the request structure + * + * @param req parsed request + * @param eInfo Error information + * @param requester The UserIdentity structure of the requester + * @return SFS_DATA + */ + int executeMkllibCommand(const ParsedRequest &req, XrdOucErrInfo &eInfo, const cta::SecurityIdentity &requester); + + /** + * Executes the command contained within the request structure + * + * @param req parsed request + * @param eInfo Error information + * @param requester The UserIdentity structure of the requester + * @return SFS_DATA + */ + int executeRmllibCommand(const ParsedRequest &req, XrdOucErrInfo &eInfo, const cta::SecurityIdentity &requester); + + /** + * Executes the command contained within the request structure + * + * @param req parsed request + * @param eInfo Error information + * @param requester The UserIdentity structure of the requester + * @return SFS_DATA + */ + int executeLsllibCommand(const ParsedRequest &req, XrdOucErrInfo &eInfo, const cta::SecurityIdentity &requester) const; + /** * Executes the command contained within the request structure * -- GitLab