From 23aa250669fd4fd64f829215fef732c730739a27 Mon Sep 17 00:00:00 2001 From: Steven Murray <steven.murray@cern.ch> Date: Wed, 3 Aug 2016 12:04:30 +0200 Subject: [PATCH] Added RdbmsCatalogue::modifyArchiveRouteTapePoolName() --- catalogue/CatalogueTest.cpp | 69 ++++++++++++++++++++++++++++++++++++ catalogue/RdbmsCatalogue.cpp | 35 ++++++++++++++++-- 2 files changed, 102 insertions(+), 2 deletions(-) diff --git a/catalogue/CatalogueTest.cpp b/catalogue/CatalogueTest.cpp index 1a2582566e..4d1d73b5ed 100644 --- a/catalogue/CatalogueTest.cpp +++ b/catalogue/CatalogueTest.cpp @@ -1372,6 +1372,75 @@ TEST_P(cta_catalogue_CatalogueTest, createArchiveRoute_deleteStorageClass) { ASSERT_THROW(m_catalogue->deleteStorageClass(storageClass.diskInstance, storageClass.name), exception::Exception); } +TEST_P(cta_catalogue_CatalogueTest, modifyArchiveRouteTapePoolName) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getStorageClasses().empty()); + ASSERT_TRUE(m_catalogue->getTapePools().empty()); + ASSERT_TRUE(m_catalogue->getArchiveRoutes().empty()); + + common::dataStructures::StorageClass storageClass; + storageClass.diskInstance = "disk_instance"; + storageClass.name = "storage_class"; + storageClass.nbCopies = 2; + storageClass.comment = "Create storage class"; + m_catalogue->createStorageClass(m_cliSI, storageClass); + + const std::string tapePoolName = "tape_pool"; + const uint64_t nbPartialTapes = 2; + const bool isEncrypted = true; + m_catalogue->createTapePool(m_cliSI, tapePoolName, nbPartialTapes, isEncrypted, "Create tape pool"); + + const uint64_t copyNb = 1; + const std::string comment = "Create archive route"; + m_catalogue->createArchiveRoute(m_cliSI, storageClass.diskInstance, storageClass.name, copyNb, tapePoolName, + comment); + + { + const std::list<common::dataStructures::ArchiveRoute> routes = m_catalogue->getArchiveRoutes(); + + ASSERT_EQ(1, routes.size()); + + const common::dataStructures::ArchiveRoute route = routes.front(); + ASSERT_EQ(storageClass.diskInstance, route.diskInstanceName); + ASSERT_EQ(storageClass.name, route.storageClassName); + ASSERT_EQ(copyNb, route.copyNb); + ASSERT_EQ(tapePoolName, route.tapePoolName); + ASSERT_EQ(comment, route.comment); + + const common::dataStructures::EntryLog creationLog = route.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = route.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); + } + + const std::string modifiedTapePoolName = "modified_tape_pool"; + m_catalogue->modifyArchiveRouteTapePoolName(m_cliSI, storageClass.diskInstance, storageClass.name, copyNb, + modifiedTapePoolName); + + { + const std::list<common::dataStructures::ArchiveRoute> routes = m_catalogue->getArchiveRoutes(); + + ASSERT_EQ(1, routes.size()); + + const common::dataStructures::ArchiveRoute route = routes.front(); + ASSERT_EQ(storageClass.diskInstance, route.diskInstanceName); + ASSERT_EQ(storageClass.name, route.storageClassName); + ASSERT_EQ(copyNb, route.copyNb); + ASSERT_EQ(modifiedTapePoolName, route.tapePoolName); + ASSERT_EQ(comment, route.comment); + + const common::dataStructures::EntryLog creationLog = route.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = route.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); + } +} + TEST_P(cta_catalogue_CatalogueTest, createLogicalLibrary) { using namespace cta; diff --git a/catalogue/RdbmsCatalogue.cpp b/catalogue/RdbmsCatalogue.cpp index 27b8655d18..363c1c99b9 100644 --- a/catalogue/RdbmsCatalogue.cpp +++ b/catalogue/RdbmsCatalogue.cpp @@ -1046,8 +1046,39 @@ std::list<common::dataStructures::ArchiveRoute> RdbmsCatalogue::getArchiveRoutes //------------------------------------------------------------------------------ // modifyArchiveRouteTapePoolName //------------------------------------------------------------------------------ -void RdbmsCatalogue::modifyArchiveRouteTapePoolName(const common::dataStructures::SecurityIdentity &cliIdentity, const std::string &instanceName, const std::string &storageClassName, const uint64_t copyNb, const std::string &tapePoolName) { - throw exception::Exception(std::string(__FUNCTION__) + " not implemented"); +void RdbmsCatalogue::modifyArchiveRouteTapePoolName(const common::dataStructures::SecurityIdentity &cliIdentity, + const std::string &instanceName, const std::string &storageClassName, const uint64_t copyNb, + const std::string &tapePoolName) { + try { + const char *const sql = + "UPDATE ARCHIVE_ROUTE SET " + "TAPE_POOL_NAME = :TAPE_POOL_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 " + "STORAGE_CLASS_NAME = :STORAGE_CLASS_NAME AND " + "COPY_NB = :COPY_NB"; + auto conn = m_connPool.getConn(); + auto stmt = conn->createStmt(sql, rdbms::Stmt::AutocommitMode::ON); + stmt->bindString(":TAPE_POOL_NAME", tapePoolName); + stmt->bindString(":DISK_INSTANCE_NAME", instanceName); + stmt->bindString(":STORAGE_CLASS_NAME", storageClassName); + stmt->bindUint64(":COPY_NB", copyNb); + stmt->executeNonQuery(); + + if(0 == stmt->getNbAffectedRows()) { + exception::UserError ue; + ue.getMessage() << "Cannot modify archive route for storage-class " << instanceName + ":" + storageClassName + + " and copy number " << copyNb << " because it does not exist"; + throw ue; + } + } catch(exception::UserError &) { + throw; + } catch (exception::Exception &ex) { + throw exception::Exception(std::string(__FUNCTION__) + " failed: " + ex.getMessage().str()); + } } //------------------------------------------------------------------------------ -- GitLab