From f333cb0eca55dcbb58d55d9345cd16b94cbee0fe Mon Sep 17 00:00:00 2001 From: Steven Murray <steven.murray@cern.ch> Date: Wed, 3 Aug 2016 15:12:35 +0200 Subject: [PATCH] Implemented RdbmsCatalogue::modifyTapeTapePoolName() --- catalogue/CatalogueTest.cpp | 92 +++++++++++++++++++++++++++++++++++- catalogue/RdbmsCatalogue.cpp | 31 +++++++++++- 2 files changed, 120 insertions(+), 3 deletions(-) diff --git a/catalogue/CatalogueTest.cpp b/catalogue/CatalogueTest.cpp index 07754f753a..4aadd825f3 100644 --- a/catalogue/CatalogueTest.cpp +++ b/catalogue/CatalogueTest.cpp @@ -2240,7 +2240,7 @@ TEST_P(cta_catalogue_CatalogueTest, modifyTapeLogicalLibraryName) { } } -TEST_P(cta_catalogue_CatalogueTest, modifyTapeLogicalLibraryName_nonExistenTape) { +TEST_P(cta_catalogue_CatalogueTest, modifyTapeLogicalLibraryName_nonExistentTape) { using namespace cta; ASSERT_TRUE(m_catalogue->getTapes().empty()); @@ -2253,6 +2253,96 @@ TEST_P(cta_catalogue_CatalogueTest, modifyTapeLogicalLibraryName_nonExistenTape) ASSERT_THROW(m_catalogue->modifyTapeLogicalLibraryName(m_cliSI, vid, logicalLibraryName), exception::UserError); } +TEST_P(cta_catalogue_CatalogueTest, modifyTapeTapePoolName) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getTapes().empty()); + + const std::string vid = "vid"; + const std::string logicalLibraryName = "logical_library_name"; + const std::string tapePoolName = "tape_pool_name"; + const std::string anotherTapePoolName = "another_tape_pool_name"; + const std::string encryptionKey = "encryption_key"; + const uint64_t capacityInBytes = (uint64_t)10 * 1000 * 1000 * 1000 * 1000; + const bool disabledValue = true; + const bool fullValue = false; + const std::string comment = "Create tape"; + + m_catalogue->createLogicalLibrary(m_cliSI, logicalLibraryName, "Create logical library"); + + m_catalogue->createTapePool(m_cliSI, tapePoolName, 2, true, "Create tape pool"); + m_catalogue->createTapePool(m_cliSI, anotherTapePoolName, 2, true, "Create another tape pool"); + + m_catalogue->createTape(m_cliSI, vid, logicalLibraryName, tapePoolName, encryptionKey, capacityInBytes, disabledValue, + fullValue, comment); + + { + const std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(); + + ASSERT_EQ(1, tapes.size()); + + const common::dataStructures::Tape tape = tapes.front(); + ASSERT_EQ(vid, tape.vid); + ASSERT_EQ(logicalLibraryName, tape.logicalLibraryName); + ASSERT_EQ(tapePoolName, tape.tapePoolName); + ASSERT_EQ(encryptionKey, tape.encryptionKey); + ASSERT_EQ(capacityInBytes, tape.capacityInBytes); + ASSERT_TRUE(disabledValue == tape.disabled); + ASSERT_TRUE(fullValue == tape.full); + ASSERT_EQ(comment, tape.comment); + ASSERT_FALSE(tape.labelLog); + ASSERT_FALSE(tape.lastReadLog); + ASSERT_FALSE(tape.lastWriteLog); + + const common::dataStructures::EntryLog creationLog = tape.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = tape.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); + } + + m_catalogue->modifyTapeTapePoolName(m_cliSI, vid, anotherTapePoolName); + + { + const std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(); + + ASSERT_EQ(1, tapes.size()); + + const common::dataStructures::Tape tape = tapes.front(); + ASSERT_EQ(vid, tape.vid); + ASSERT_EQ(logicalLibraryName, tape.logicalLibraryName); + ASSERT_EQ(anotherTapePoolName, tape.tapePoolName); + ASSERT_EQ(encryptionKey, tape.encryptionKey); + ASSERT_EQ(capacityInBytes, tape.capacityInBytes); + ASSERT_TRUE(disabledValue == tape.disabled); + ASSERT_TRUE(fullValue == tape.full); + ASSERT_EQ(comment, tape.comment); + ASSERT_FALSE(tape.labelLog); + ASSERT_FALSE(tape.lastReadLog); + ASSERT_FALSE(tape.lastWriteLog); + + const common::dataStructures::EntryLog creationLog = tape.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + } +} + +TEST_P(cta_catalogue_CatalogueTest, modifyTapeTapePoolName_nonExistentTape) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getTapes().empty()); + + const std::string vid = "vid"; + const std::string logicalLibraryName = "logical_library_name"; + const std::string tapePoolName = "tape_pool_name"; + + m_catalogue->createLogicalLibrary(m_cliSI, logicalLibraryName, "Create logical library"); + m_catalogue->createTapePool(m_cliSI, tapePoolName, 2, true, "Create tape pool"); + + ASSERT_THROW(m_catalogue->modifyTapeTapePoolName(m_cliSI, vid, tapePoolName), exception::UserError); +} + TEST_P(cta_catalogue_CatalogueTest, getTapesForWriting) { using namespace cta; diff --git a/catalogue/RdbmsCatalogue.cpp b/catalogue/RdbmsCatalogue.cpp index 6d16f1fc32..9205b34416 100644 --- a/catalogue/RdbmsCatalogue.cpp +++ b/catalogue/RdbmsCatalogue.cpp @@ -1809,8 +1809,35 @@ void RdbmsCatalogue::modifyTapeLogicalLibraryName(const common::dataStructures:: //------------------------------------------------------------------------------ // modifyTapeTapePoolName //------------------------------------------------------------------------------ -void RdbmsCatalogue::modifyTapeTapePoolName(const common::dataStructures::SecurityIdentity &cliIdentity, const std::string &vid, const std::string &tapePoolName) { - throw exception::Exception(std::string(__FUNCTION__) + " not implemented"); +void RdbmsCatalogue::modifyTapeTapePoolName(const common::dataStructures::SecurityIdentity &cliIdentity, + const std::string &vid, const std::string &tapePoolName) { + try { + const time_t now = time(nullptr); + const char *const sql = + "UPDATE TAPE 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 " + "VID = :VID"; + auto conn = m_connPool.getConn(); + auto stmt = conn->createStmt(sql, rdbms::Stmt::AutocommitMode::ON); + stmt->bindString(":TAPE_POOL_NAME", tapePoolName); + stmt->bindString(":LAST_UPDATE_USER_NAME", cliIdentity.username); + stmt->bindString(":LAST_UPDATE_HOST_NAME", cliIdentity.host); + stmt->bindUint64(":LAST_UPDATE_TIME", now); + stmt->bindString(":VID", vid); + stmt->executeNonQuery(); + + if(0 == stmt->getNbAffectedRows()) { + throw exception::UserError(std::string("Cannot modify tape ") + vid + " because it does not exist"); + } + } catch(exception::UserError &) { + throw; + } catch (exception::Exception &ex) { + throw exception::Exception(std::string(__FUNCTION__) + " failed: " + ex.getMessage().str()); + } } //------------------------------------------------------------------------------ -- GitLab