diff --git a/catalogue/CatalogueTest.cpp b/catalogue/CatalogueTest.cpp index ee4d2a6fb0955f37e0bfbd0dd8f832f86b47957d..22bc3c292444ab6d6f617918136ffdad7d640b5a 100644 --- a/catalogue/CatalogueTest.cpp +++ b/catalogue/CatalogueTest.cpp @@ -3359,6 +3359,105 @@ TEST_P(cta_catalogue_CatalogueTest, deleteRequesterMountRule_non_existant) { exception::UserError); } +TEST_P(cta_catalogue_CatalogueTest, modifyRequesterMountPolicy) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getRequesterMountRules().empty()); + + const std::string mountPolicyName = "mount_policy"; + const uint64_t archivePriority = 1; + const uint64_t minArchiveRequestAge = 4; + const uint64_t retrievePriority = 5; + const uint64_t minRetrieveRequestAge = 8; + const uint64_t maxDrivesAllowed = 9; + + m_catalogue->createMountPolicy( + m_cliSI, + mountPolicyName, + archivePriority, + minArchiveRequestAge, + retrievePriority, + minRetrieveRequestAge, + maxDrivesAllowed, + "Create mount policy"); + + const std::string anotherMountPolicyName = "another_mount_policy"; + + m_catalogue->createMountPolicy( + m_cliSI, + anotherMountPolicyName, + archivePriority, + minArchiveRequestAge, + retrievePriority, + minRetrieveRequestAge, + maxDrivesAllowed, + "Create another mount policy"); + + const std::string comment = "Create mount rule for requester"; + const std::string diskInstanceName = "disk_instance"; + const std::string requesterName = "requester_name"; + m_catalogue->createRequesterMountRule(m_cliSI, mountPolicyName, diskInstanceName, requesterName, comment); + + { + const std::list<common::dataStructures::RequesterMountRule> rules = m_catalogue->getRequesterMountRules(); + ASSERT_EQ(1, rules.size()); + + const common::dataStructures::RequesterMountRule rule = rules.front(); + + ASSERT_EQ(requesterName, rule.name); + ASSERT_EQ(mountPolicyName, rule.mountPolicy); + ASSERT_EQ(comment, rule.comment); + ASSERT_EQ(m_cliSI.username, rule.creationLog.username); + ASSERT_EQ(m_cliSI.host, rule.creationLog.host); + ASSERT_EQ(rule.creationLog, rule.lastModificationLog); + } + + m_catalogue->modifyRequesterMountPolicy(m_cliSI, diskInstanceName, requesterName, anotherMountPolicyName); + + { + const std::list<common::dataStructures::RequesterMountRule> rules = m_catalogue->getRequesterMountRules(); + ASSERT_EQ(1, rules.size()); + + const common::dataStructures::RequesterMountRule rule = rules.front(); + + ASSERT_EQ(requesterName, rule.name); + ASSERT_EQ(anotherMountPolicyName, rule.mountPolicy); + ASSERT_EQ(comment, rule.comment); + ASSERT_EQ(m_cliSI.username, rule.creationLog.username); + ASSERT_EQ(m_cliSI.host, rule.creationLog.host); + ASSERT_EQ(rule.creationLog, rule.lastModificationLog); + } +} + +TEST_P(cta_catalogue_CatalogueTest, modifyRequesterMountPolicy_nonExistentRequester) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getRequesterMountRules().empty()); + + const std::string mountPolicyName = "mount_policy"; + const uint64_t archivePriority = 1; + const uint64_t minArchiveRequestAge = 4; + const uint64_t retrievePriority = 5; + const uint64_t minRetrieveRequestAge = 8; + const uint64_t maxDrivesAllowed = 9; + + m_catalogue->createMountPolicy( + m_cliSI, + mountPolicyName, + archivePriority, + minArchiveRequestAge, + retrievePriority, + minRetrieveRequestAge, + maxDrivesAllowed, + "Create mount policy"); + + const std::string diskInstanceName = "disk_instance"; + const std::string requesterName = "requester_name"; + + ASSERT_THROW(m_catalogue->modifyRequesterMountPolicy(m_cliSI, diskInstanceName, requesterName, mountPolicyName), + exception::UserError); +} + TEST_P(cta_catalogue_CatalogueTest, createRequesterGroupMountRule) { using namespace cta; diff --git a/catalogue/RdbmsCatalogue.cpp b/catalogue/RdbmsCatalogue.cpp index 0cde6508ce9b67568777e9e19b8e7bfb0334bc52..c6c9ed92e9d91079020042027853033566e8f0a1 100644 --- a/catalogue/RdbmsCatalogue.cpp +++ b/catalogue/RdbmsCatalogue.cpp @@ -2091,8 +2091,38 @@ void RdbmsCatalogue::modifyTapeComment(const common::dataStructures::SecurityIde //------------------------------------------------------------------------------ // modifyRequesterMountPolicy //------------------------------------------------------------------------------ -void RdbmsCatalogue::modifyRequesterMountPolicy(const common::dataStructures::SecurityIdentity &cliIdentity, const std::string &instanceName, const std::string &requesterName, const std::string &mountPolicy) { - throw exception::Exception(std::string(__FUNCTION__) + " not implemented"); +void RdbmsCatalogue::modifyRequesterMountPolicy(const common::dataStructures::SecurityIdentity &cliIdentity, + const std::string &instanceName, const std::string &requesterName, const std::string &mountPolicy) { + try { + const time_t now = time(nullptr); + const char *const sql = + "UPDATE REQUESTER_MOUNT_RULE SET " + "MOUNT_POLICY_NAME = :MOUNT_POLICY_NAME," + "LAST_UPDATE_USER_NAME = :LAST_UPDATE_USER_NAME," + "LAST_UPDATE_HOST_NAME = :LAST_UPDATE_HOST_NAME," + "LAST_UPDATE_TIME = :LAST_UPDATE_TIME " + "WHERE " + "DISK_INSTANCE_NAME = :DISK_INSTANCE_NAME AND " + "REQUESTER_NAME = :REQUESTER_NAME"; + auto conn = m_connPool.getConn(); + auto stmt = conn->createStmt(sql, rdbms::Stmt::AutocommitMode::ON); + stmt->bindString(":MOUNT_POLICY_NAME", mountPolicy); + stmt->bindString(":LAST_UPDATE_USER_NAME", cliIdentity.username); + stmt->bindString(":LAST_UPDATE_HOST_NAME", cliIdentity.host); + stmt->bindUint64(":LAST_UPDATE_TIME", now); + stmt->bindString(":DISK_INSTANCE_NAME", instanceName); + stmt->bindString(":REQUESTER_NAME", requesterName); + stmt->executeNonQuery(); + + if(0 == stmt->getNbAffectedRows()) { + throw exception::UserError(std::string("Cannot modify requester mount rule ") + instanceName + ":" + + requesterName + " because it does not exist"); + } + } catch(exception::UserError &) { + throw; + } catch (exception::Exception &ex) { + throw exception::Exception(std::string(__FUNCTION__) + " failed: " + ex.getMessage().str()); + } } //------------------------------------------------------------------------------