From 2c54240ab44ac4c6237eed0f9669057ab0ad17be Mon Sep 17 00:00:00 2001
From: Daniele Kruse <dkruse@cern.ch>
Date: Thu, 18 Feb 2016 11:08:10 +0100
Subject: [PATCH] More work on the CLI plus added a new function
 getarchivefilebyid to the scheduler and the catalogue

---
 catalogue/Catalogue.hpp      |  3 +-
 catalogue/DummyCatalogue.cpp |  7 +++++
 catalogue/DummyCatalogue.hpp |  1 +
 catalogue/MockCatalogue.cpp  |  7 +++++
 catalogue/MockCatalogue.hpp  |  1 +
 scheduler/Scheduler.cpp      |  7 +++++
 scheduler/Scheduler.hpp      |  1 +
 xroot_plugins/XrdCtaFile.cpp | 57 ++++++++++++++++++++++++++++++++++++
 8 files changed, 83 insertions(+), 1 deletion(-)

diff --git a/catalogue/Catalogue.hpp b/catalogue/Catalogue.hpp
index 5542091332..afa3f71833 100644
--- a/catalogue/Catalogue.hpp
+++ b/catalogue/Catalogue.hpp
@@ -165,7 +165,8 @@ public:
   virtual std::list<cta::common::dataStructures::ArchiveFile> getArchiveFiles(const cta::common::dataStructures::SecurityIdentity &requester, const std::string &id, const std::string &eosid,
    const std::string &copynb, const std::string &tapepool, const std::string &vid, const std::string &owner, const std::string &group, const std::string &storageclass, const std::string &path) = 0;
   virtual cta::common::dataStructures::ArchiveFileSummary getArchiveFileSummary(const cta::common::dataStructures::SecurityIdentity &requester, const std::string &id, const std::string &eosid,
-   const std::string &copynb, const std::string &tapepool, const std::string &vid, const std::string &owner, const std::string &group, const std::string &storageclass, const std::string &path) = 0;
+   const std::string &copynb, const std::string &tapepool, const std::string &vid, const std::string &owner, const std::string &group, const std::string &storageclass, const std::string &path) = 0;  
+  virtual cta::common::dataStructures::ArchiveFile getArchiveFileById(const std::string &id) = 0;
   
   virtual void setDriveStatus(const cta::common::dataStructures::SecurityIdentity &requester, const std::string &driveName, const bool up, const bool force) = 0;
 
diff --git a/catalogue/DummyCatalogue.cpp b/catalogue/DummyCatalogue.cpp
index 7cc94f4168..ece8e431bb 100644
--- a/catalogue/DummyCatalogue.cpp
+++ b/catalogue/DummyCatalogue.cpp
@@ -405,6 +405,13 @@ cta::common::dataStructures::ArchiveFileSummary cta::catalogue::DummyCatalogue::
         const std::string &copynb, const std::string &tapepool, const std::string &vid, const std::string &owner, const std::string &group, const std::string &storageclass, const std::string &path) {
   return cta::common::dataStructures::ArchiveFileSummary(); 
 }
+
+//------------------------------------------------------------------------------
+// getArchiveFileById
+//------------------------------------------------------------------------------
+cta::common::dataStructures::ArchiveFile cta::catalogue::DummyCatalogue::getArchiveFileById(const std::string &id){
+  return cta::common::dataStructures::ArchiveFile();
+}
           
 //------------------------------------------------------------------------------
 // setDriveStatus
diff --git a/catalogue/DummyCatalogue.hpp b/catalogue/DummyCatalogue.hpp
index 242e8f47b3..2522e9d7a9 100644
--- a/catalogue/DummyCatalogue.hpp
+++ b/catalogue/DummyCatalogue.hpp
@@ -138,6 +138,7 @@ public:
    const std::string &copynb, const std::string &tapepool, const std::string &vid, const std::string &owner, const std::string &group, const std::string &storageclass, const std::string &path);
   virtual cta::common::dataStructures::ArchiveFileSummary getArchiveFileSummary(const cta::common::dataStructures::SecurityIdentity &requester, const std::string &id, const std::string &eosid,
    const std::string &copynb, const std::string &tapepool, const std::string &vid, const std::string &owner, const std::string &group, const std::string &storageclass, const std::string &path);
+  virtual cta::common::dataStructures::ArchiveFile getArchiveFileById(const std::string &id);
   
   virtual void setDriveStatus(const cta::common::dataStructures::SecurityIdentity &requester, const std::string &driveName, const bool up, const bool force);
   /**
diff --git a/catalogue/MockCatalogue.cpp b/catalogue/MockCatalogue.cpp
index 4134a292cc..f6bb5da571 100644
--- a/catalogue/MockCatalogue.cpp
+++ b/catalogue/MockCatalogue.cpp
@@ -405,6 +405,13 @@ cta::common::dataStructures::ArchiveFileSummary cta::catalogue::MockCatalogue::g
         const std::string &copynb, const std::string &tapepool, const std::string &vid, const std::string &owner, const std::string &group, const std::string &storageclass, const std::string &path) {
   return cta::common::dataStructures::ArchiveFileSummary(); 
 }
+
+//------------------------------------------------------------------------------
+// getArchiveFileById
+//------------------------------------------------------------------------------
+cta::common::dataStructures::ArchiveFile cta::catalogue::MockCatalogue::getArchiveFileById(const std::string &id){
+  return cta::common::dataStructures::ArchiveFile();
+}
           
 //------------------------------------------------------------------------------
 // setDriveStatus
diff --git a/catalogue/MockCatalogue.hpp b/catalogue/MockCatalogue.hpp
index 7958136b8a..528a7862ae 100644
--- a/catalogue/MockCatalogue.hpp
+++ b/catalogue/MockCatalogue.hpp
@@ -138,6 +138,7 @@ public:
    const std::string &copynb, const std::string &tapepool, const std::string &vid, const std::string &owner, const std::string &group, const std::string &storageclass, const std::string &path);
   virtual cta::common::dataStructures::ArchiveFileSummary getArchiveFileSummary(const cta::common::dataStructures::SecurityIdentity &requester, const std::string &id, const std::string &eosid,
    const std::string &copynb, const std::string &tapepool, const std::string &vid, const std::string &owner, const std::string &group, const std::string &storageclass, const std::string &path);
+  virtual cta::common::dataStructures::ArchiveFile getArchiveFileById(const std::string &id);
   
   virtual void setDriveStatus(const cta::common::dataStructures::SecurityIdentity &requester, const std::string &driveName, const bool up, const bool force);
   /**
diff --git a/scheduler/Scheduler.cpp b/scheduler/Scheduler.cpp
index ea18e726e5..8230d4ae55 100644
--- a/scheduler/Scheduler.cpp
+++ b/scheduler/Scheduler.cpp
@@ -658,6 +658,13 @@ cta::common::dataStructures::ArchiveFileSummary cta::Scheduler::getArchiveFileSu
   return cta::common::dataStructures::ArchiveFileSummary(); 
 }
 
+//------------------------------------------------------------------------------
+// getArchiveFileById
+//------------------------------------------------------------------------------
+cta::common::dataStructures::ArchiveFile cta::Scheduler::getArchiveFileById(const std::string &id){
+  return cta::common::dataStructures::ArchiveFile();
+}
+
 //------------------------------------------------------------------------------
 // readTest
 //------------------------------------------------------------------------------
diff --git a/scheduler/Scheduler.hpp b/scheduler/Scheduler.hpp
index df2f6569a2..543b0f3243 100644
--- a/scheduler/Scheduler.hpp
+++ b/scheduler/Scheduler.hpp
@@ -210,6 +210,7 @@ public:
    const std::string &copynb, const std::string &tapepool, const std::string &vid, const std::string &owner, const std::string &group, const std::string &storageclass, const std::string &path);
   virtual cta::common::dataStructures::ArchiveFileSummary getArchiveFileSummary(const cta::common::dataStructures::SecurityIdentity &requester, const std::string &id, const std::string &eosid,
    const std::string &copynb, const std::string &tapepool, const std::string &vid, const std::string &owner, const std::string &group, const std::string &storageclass, const std::string &path);
+  virtual cta::common::dataStructures::ArchiveFile getArchiveFileById(const std::string &id);
 
   virtual cta::common::dataStructures::ReadTestResult readTest(const cta::common::dataStructures::SecurityIdentity &requester, const std::string &driveName, const std::string &vid, const uint64_t firstFSeq, const uint64_t lastFSeq, 
    const bool checkChecksum, const std::string &output, const std::string &tag) const; //when output=="null" discard the data read
diff --git a/xroot_plugins/XrdCtaFile.cpp b/xroot_plugins/XrdCtaFile.cpp
index 6f8e94a3f7..7447ec8c6e 100644
--- a/xroot_plugins/XrdCtaFile.cpp
+++ b/xroot_plugins/XrdCtaFile.cpp
@@ -1810,6 +1810,63 @@ void XrdProFile::xCom_listpendingarchives(const std::vector<std::string> &tokens
 void XrdProFile::xCom_listpendingretrieves(const std::vector<std::string> &tokens, const cta::common::dataStructures::SecurityIdentity &requester) {
   std::stringstream help;
   help << tokens[0] << " lpr/listpendingretrieves [--vid/-v <vid>] [--extended/-x]" << std::endl;
+  std::string vid = getOptionValue(tokens, "-v", "--vid");
+  bool extended = hasOption(tokens, "-x", "--extended");
+  std::map<std::string, std::list<cta::common::dataStructures::RetrieveJob> > result;
+  if(vid.empty()) {
+    result = m_scheduler->getPendingRetrieveJobs(requester);
+  }
+  else {
+    std::list<cta::common::dataStructures::RetrieveJob> list = m_scheduler->getPendingRetrieveJobs(requester, vid);
+    if(list.size()>0) {
+      result[vid] = list;
+    }
+  }
+  if(result.size()>0) {
+    if(extended) {
+      std::vector<std::vector<std::string>> responseTable;
+      std::vector<std::string> header = {"vid","id","copy no.","fseq","block id","size","user","group","instance","path","diskpool","diskpool throughput"};
+      responseTable.push_back(header);    
+      for(auto it = result.cbegin(); it != result.cend(); it++) {
+        for(auto jt = it->second.cbegin(); jt != it->second.cend(); jt++) {
+          std::vector<std::string> currentRow;
+          currentRow.push_back(it->first);
+          currentRow.push_back(jt->getRequest().getArchiveFileID());
+          cta::common::dataStructures::ArchiveFile file = m_scheduler->getArchiveFileById(jt->getRequest().getArchiveFileID());
+          currentRow.push_back(std::to_string((unsigned long long)jt->getTapeCopies()[it->first].first));
+          currentRow.push_back(std::to_string((unsigned long long)jt->getTapeCopies()[it->first].second.getFSeq()));
+          currentRow.push_back(std::to_string((unsigned long long)jt->getTapeCopies()[it->first].second.getBlockId()));
+          currentRow.push_back(std::to_string((unsigned long long)file.getFileSize()));
+          currentRow.push_back(jt->getRequest().getRequester().getUserName());
+          currentRow.push_back(jt->getRequest().getRequester().getGroupName());
+          currentRow.push_back(jt->getRequest().getDrData().getDrInstance());
+          currentRow.push_back(jt->getRequest().getDrData().getDrPath());
+          currentRow.push_back(jt->getRequest().getDiskpoolName());
+          currentRow.push_back(std::to_string((unsigned long long)jt->getRequest().getDiskpoolThroughput()));
+          responseTable.push_back(currentRow);
+        }
+      }
+      m_data = formatResponse(responseTable);
+    }
+    else {
+      std::vector<std::vector<std::string>> responseTable;
+      std::vector<std::string> header = {"vid","total files","total size"};
+      responseTable.push_back(header);    
+      for(auto it = result.cbegin(); it != result.cend(); it++) {
+        std::vector<std::string> currentRow;
+        currentRow.push_back(it->first);
+        currentRow.push_back(std::to_string((unsigned long long)it->second.size()));
+        uint64_t size=0;
+        for(auto jt = it->second.cbegin(); jt != it->second.cend(); jt++) {
+          cta::common::dataStructures::ArchiveFile file = m_scheduler->getArchiveFileById(jt->getRequest().getArchiveFileID());
+          size += file.getFileSize();
+        }
+        currentRow.push_back(std::to_string((unsigned long long)size));
+        responseTable.push_back(currentRow);
+      }
+      m_data = formatResponse(responseTable);
+    }
+  }
 }
 
 //------------------------------------------------------------------------------
-- 
GitLab