From 934fe95671906428f953dd4305cf0a91139117de Mon Sep 17 00:00:00 2001
From: Michael Davis <michael.davis@cern.ch>
Date: Wed, 27 Sep 2017 17:19:21 +0200
Subject: [PATCH] [cta_frontend] Implements cta drive rm on server side

---
 xroot_plugins/XrdSsiCtaRequestMessage.cpp | 45 +++++++++++++++++++++++
 xroot_plugins/XrdSsiCtaRequestMessage.hpp |  1 +
 2 files changed, 46 insertions(+)

diff --git a/xroot_plugins/XrdSsiCtaRequestMessage.cpp b/xroot_plugins/XrdSsiCtaRequestMessage.cpp
index 72e1465e8e..7a611e0138 100644
--- a/xroot_plugins/XrdSsiCtaRequestMessage.cpp
+++ b/xroot_plugins/XrdSsiCtaRequestMessage.cpp
@@ -129,6 +129,9 @@ void RequestMessage::process(const cta::xrd::Request &request, cta::xrd::Respons
             case cmd_pair(AdminCmd::CMD_DRIVE, AdminCmd::SUBCMD_LS):
                processDrive_Ls(request.admincmd(), response);
                break;
+            case cmd_pair(AdminCmd::CMD_DRIVE, AdminCmd::SUBCMD_RM):
+               processDrive_Rm(request.admincmd(), response);
+               break;
             case cmd_pair(AdminCmd::CMD_GROUPMOUNTRULE, AdminCmd::SUBCMD_ADD):
                processGroupMountRule_Add(request.admincmd(), response);
                break;
@@ -842,6 +845,48 @@ void RequestMessage::processDrive_Ls(const cta::admin::AdminCmd &admincmd, cta::
 
 
 
+void RequestMessage::processDrive_Rm(const cta::admin::AdminCmd &admincmd, cta::xrd::Response &response)
+{
+   using namespace cta::admin;
+
+   std::stringstream cmdlineOutput;
+
+   auto regex = getRequired(OptionString::DRIVE);
+   cta::utils::Regex driveNameRegex(regex.c_str());
+   auto driveStates = m_scheduler.getDriveStates(m_cliIdentity, m_lc);
+   bool drivesFound = false;
+   for(auto driveState: driveStates)
+   {
+      const auto regexResult = driveNameRegex.exec(driveState.driveName);
+      if(!regexResult.empty())
+      {
+         if(driveState.driveStatus == cta::common::dataStructures::DriveStatus::Down     ||
+            driveState.driveStatus == cta::common::dataStructures::DriveStatus::Shutdown ||
+            driveState.driveStatus == cta::common::dataStructures::DriveStatus::Unknown  ||
+            has_flag(OptionBoolean::FORCE))
+         {
+            m_scheduler.removeDrive(m_cliIdentity, driveState.driveName, m_lc);
+            cmdlineOutput << "Drive " << driveState.driveName << " removed"
+                          << (has_flag(OptionBoolean::FORCE) ? " (forced)." : ".") << std::endl;            
+         } else {
+            cmdlineOutput << "Drive " << driveState.driveName << " in state "
+                          << cta::common::dataStructures::toString(driveState.driveStatus)
+                          << " and force is not set (skipped)." << std::endl;
+         }
+         drivesFound = true;
+      }
+   }
+
+   if(!drivesFound) {
+      cmdlineOutput << "Drives not found by regex: " << regex << std::endl;
+   }
+
+   response.set_message_txt(cmdlineOutput.str());
+   response.set_type(cta::xrd::Response::RSP_SUCCESS);
+}
+
+
+
 void RequestMessage::processGroupMountRule_Add(const cta::admin::AdminCmd &admincmd, cta::xrd::Response &response)
 {
    using namespace cta::admin;
diff --git a/xroot_plugins/XrdSsiCtaRequestMessage.hpp b/xroot_plugins/XrdSsiCtaRequestMessage.hpp
index 6e4fb622d5..bf4473aa4e 100644
--- a/xroot_plugins/XrdSsiCtaRequestMessage.hpp
+++ b/xroot_plugins/XrdSsiCtaRequestMessage.hpp
@@ -86,6 +86,7 @@ private:
    admincmd_t processDrive_Up;
    admincmd_t processDrive_Down;
    admincmd_t processDrive_Ls;
+   admincmd_t processDrive_Rm;
    admincmd_t processGroupMountRule_Add;
    admincmd_t processGroupMountRule_Ch;
    admincmd_t processGroupMountRule_Rm;
-- 
GitLab