diff --git a/objectstore/RootEntry.cpp b/objectstore/RootEntry.cpp index 629e98bbce46b476e639f1b3dfa3a3d2c890d27c..c0fed7d220ca17eb52552e013b1275a0072c2a0b 100644 --- a/objectstore/RootEntry.cpp +++ b/objectstore/RootEntry.cpp @@ -239,7 +239,7 @@ namespace { } } -void cta::objectstore::RootEntry::setArchiveRoute(const std::string& storageClass, +void cta::objectstore::RootEntry::setArchivalRoute(const std::string& storageClass, uint16_t copyNb, const std::string& tapePool, const CreationLog& cl) { checkPayloadWritable(); // Find the storageClass entry @@ -276,7 +276,7 @@ void cta::objectstore::RootEntry::setArchiveRoute(const std::string& storageClas } } -std::vector<std::string> cta::objectstore::RootEntry::getArchiveRoutes(const std::string storageClass) { +std::vector<std::string> cta::objectstore::RootEntry::getArchivalRoutes(const std::string storageClass) { checkPayloadReadable(); auto & sc = serializers::findElement(m_payload.storageclasses(), storageClass); std::vector<std::string> ret; @@ -306,7 +306,7 @@ auto cta::objectstore::RootEntry::dumpStorageClasses() -> std::list<StorageClass ret.back().log.deserialize(i->log()); auto & arl = i->routes(); for (auto j=arl.begin(); j!= arl.end(); j++) { - ret.back().routes.push_back(StorageClassDump::ArchiveRouteDump()); + ret.back().routes.push_back(StorageClassDump::ArchivalRouteDump()); auto &r = ret.back().routes.back(); r.copyNumber = j->copynb(); r.tapePool = j->tapepool(); @@ -327,7 +327,7 @@ auto cta::objectstore::RootEntry::dumpStorageClass(const std::string& name) ret.storageClass = i->name(); auto & arl = i->routes(); for (auto j=arl.begin(); j!= arl.end(); j++) { - ret.routes.push_back(StorageClassDump::ArchiveRouteDump()); + ret.routes.push_back(StorageClassDump::ArchivalRouteDump()); auto &r = ret.routes.back(); r.copyNumber = j->copynb(); r.tapePool = j->tapepool(); diff --git a/objectstore/RootEntry.hpp b/objectstore/RootEntry.hpp index 81e81064abdbebc281e32420053a761106fe05b4..18a19246fc7f97887a6101daf84adef39cdecb71 100644 --- a/objectstore/RootEntry.hpp +++ b/objectstore/RootEntry.hpp @@ -88,14 +88,15 @@ public: void setStorageClassCopyCount(const std::string & storageClass, uint16_t copyCount, const CreationLog & cl); uint16_t getStorageClassCopyCount(const std::string & storageClass); - void setArchiveRoute(const std::string & storageClass, uint16_t copyNb, + void setArchivalRoute(const std::string & storageClass, uint16_t copyNb, const std::string & tapePool, const CreationLog & cl); + void removeArchivalRoute(const std::string & storageClass, uint16_t copyNb); /** Ordered vector of archive routes */ - std::vector<std::string> getArchiveRoutes (const std::string storageClass); + std::vector<std::string> getArchivalRoutes (const std::string storageClass); class StorageClassDump { public: - class ArchiveRouteDump { + class ArchivalRouteDump { public: uint16_t copyNumber; std::string tapePool; @@ -103,7 +104,7 @@ public: }; std::string storageClass; uint16_t copyCount; - std::list<ArchiveRouteDump> routes; + std::list<ArchivalRouteDump> routes; CreationLog log; }; std::list<StorageClassDump> dumpStorageClasses(); diff --git a/objectstore/RootEntryTest.cpp b/objectstore/RootEntryTest.cpp index dc9c0de009c3a5511e9a6f6d4b5a95dc632ea04d..d311611da00acb42997bdd97df64686f668549a9 100644 --- a/objectstore/RootEntryTest.cpp +++ b/objectstore/RootEntryTest.cpp @@ -285,8 +285,8 @@ TEST(RootEntry, StorageClassesAndArchivalRoutes) { cta::objectstore::RootEntry re(be); cta::objectstore::ScopedExclusiveLock lock(re); re.fetch(); - re.setArchiveRoute("class1", 0, "pool1_0", cl); - re.setArchiveRoute("class3", 2, "pool3_2", cl); + re.setArchivalRoute("class1", 0, "pool1_0", cl); + re.setArchivalRoute("class3", 2, "pool3_2", cl); re.commit(); } { @@ -297,8 +297,8 @@ TEST(RootEntry, StorageClassesAndArchivalRoutes) { cta::objectstore::RootEntry re(be); cta::objectstore::ScopedSharedLock lock(re); re.fetch(); - ASSERT_NO_THROW(re.getArchiveRoutes("class1")); - ASSERT_THROW(re.getArchiveRoutes("class3"), + ASSERT_NO_THROW(re.getArchivalRoutes("class1")); + ASSERT_THROW(re.getArchivalRoutes("class3"), cta::objectstore::RootEntry::IncompleteEntry); } { @@ -306,12 +306,12 @@ TEST(RootEntry, StorageClassesAndArchivalRoutes) { cta::objectstore::RootEntry re(be); cta::objectstore::ScopedExclusiveLock lock(re); re.fetch(); - re.setArchiveRoute("class3", 0, "pool3_0", cl); - re.setArchiveRoute("class3", 1, "pool3_1", cl); - re.setArchiveRoute("class3", 2, "pool3_2b", cl); + re.setArchivalRoute("class3", 0, "pool3_0", cl); + re.setArchivalRoute("class3", 1, "pool3_1", cl); + re.setArchivalRoute("class3", 2, "pool3_2b", cl); re.commit(); re.fetch(); - ASSERT_NO_THROW(re.getArchiveRoutes("class3")); + ASSERT_NO_THROW(re.getArchivalRoutes("class3")); } { // Check that resizing storage classes down and up work as expected @@ -323,10 +323,10 @@ TEST(RootEntry, StorageClassesAndArchivalRoutes) { ASSERT_NO_THROW(re.setStorageClassCopyCount("class3", 2, cl)); re.commit(); re.fetch(); - ASSERT_THROW(re.getArchiveRoutes("class1"), + ASSERT_THROW(re.getArchivalRoutes("class1"), cta::objectstore::RootEntry::IncompleteEntry); - ASSERT_NO_THROW(re.getArchiveRoutes("class3")); - ASSERT_EQ(2,re.getArchiveRoutes("class3").size()); + ASSERT_NO_THROW(re.getArchivalRoutes("class3")); + ASSERT_EQ(2,re.getArchivalRoutes("class3").size()); } { // Check that dump works in all circumstances diff --git a/scheduler/OStoreDB/OStoreDB.cpp b/scheduler/OStoreDB/OStoreDB.cpp index 85eb0bc02dfb6a2930addf49728e9035a8bf0aa9..79fa490fbe7ebedeba3bf744c76f45ff8a2497d4 100644 --- a/scheduler/OStoreDB/OStoreDB.cpp +++ b/scheduler/OStoreDB/OStoreDB.cpp @@ -157,18 +157,39 @@ StorageClass OStoreDB::getStorageClass(const std::string& name) const { } std::list<StorageClass> OStoreDB::getStorageClasses() const { - throw exception::Exception("Not Implemented"); + RootEntry re(m_objectStore); + ScopedSharedLock rel(re); + re.fetch(); + auto scl = re.dumpStorageClasses(); + decltype (getStorageClasses()) ret; + for (auto sc = scl.begin(); sc != scl.end(); sc++) { + ret.push_back(StorageClass(sc->storageClass, + sc->copyCount, cta::UserIdentity(sc->log.uid, sc->log.gid), + sc->log.comment, sc->log.time)); + } + return ret; } void OStoreDB::deleteStorageClass(const SecurityIdentity& requester, const std::string& name) { - throw exception::Exception("Not Implemented"); + RootEntry re(m_objectStore); + ScopedExclusiveLock rel(re); + re.fetch(); + re.removeStorageClass(name); + re.commit(); } void OStoreDB::createArchivalRoute(const SecurityIdentity& requester, const std::string& storageClassName, const uint16_t copyNb, const std::string& tapePoolName, const std::string& comment) { - throw exception::Exception("Not Implemented"); + RootEntry re(m_objectStore); + ScopedExclusiveLock rel(re); + re.fetch(); + objectstore::CreationLog cl(requester.getUser().getUid(), + requester.getUser().getUid(), requester.getHost(), + time(NULL), comment); + re.setArchivalRoute(storageClassName, copyNb, tapePoolName, cl); + re.commit(); } std::list<ArchivalRoute> diff --git a/scheduler/OStoreDB/OStoreDBFactory.hpp b/scheduler/OStoreDB/OStoreDBFactory.hpp index 84d99e147d3b050f0c0b4dc96be109eb786d9ddb..4e52267c069fad7c81f7efe582ff027a8354d201 100644 --- a/scheduler/OStoreDB/OStoreDBFactory.hpp +++ b/scheduler/OStoreDB/OStoreDBFactory.hpp @@ -28,6 +28,7 @@ #include "scheduler/RetrieveFromTapeCopyRequest.hpp" #include "objectstore/RootEntry.hpp" #include "objectstore/Agent.hpp" +#include "objectstore/BackendVFS.hpp" namespace cta { diff --git a/scheduler/SchedulerDatabaseTest.cpp b/scheduler/SchedulerDatabaseTest.cpp index 6c4042957adda9f2f9600e68258636bf60af3f81..19834ace11381541caa2288e7319fac3d894e240 100644 --- a/scheduler/SchedulerDatabaseTest.cpp +++ b/scheduler/SchedulerDatabaseTest.cpp @@ -25,8 +25,6 @@ #include "scheduler/SchedulerDatabaseFactory.hpp" #include "scheduler/SecurityIdentity.hpp" #include "scheduler/UserIdentity.hpp" - -#include "objectstore/BackendVFS.hpp" #include "OStoreDB/OStoreDBFactory.hpp" #include <exception> diff --git a/scheduler/SchedulerTest.cpp b/scheduler/SchedulerTest.cpp index 06dfa5424c67b1432715cf9972e6a4a30c015fa0..63bfad7da6bc7f4bc50b8a030061642c7a12c28c 100644 --- a/scheduler/SchedulerTest.cpp +++ b/scheduler/SchedulerTest.cpp @@ -21,6 +21,8 @@ #include "remotestorage/MockRemoteStorageFactory.hpp" #include "remotestorage/RemoteStorage.hpp" #include "remotestorage/RemoteStorageFactory.hpp" +#include "scheduler/AdminUser.hpp" +#include "scheduler/AdminHost.hpp" #include "scheduler/ArchivalRoute.hpp" #include "scheduler/ArchiveToFileRequest.hpp" #include "scheduler/ArchiveToTapeCopyRequest.hpp" @@ -32,6 +34,7 @@ #include "scheduler/StorageClass.hpp" #include "scheduler/Tape.hpp" #include "scheduler/TapePool.hpp" +#include "OStoreDB/OStoreDBFactory.hpp" #include <exception> #include <gtest/gtest.h> @@ -2125,4 +2128,9 @@ static cta::MockRemoteStorageFactory mockRemoteStorageFactory; INSTANTIATE_TEST_CASE_P(MockSchedulerTest, SchedulerTest, ::testing::Values(SchedulerTestParam(mockNsFactory, mockDbFactory, mockRemoteStorageFactory))); + +static cta::OStoreDBFactory<cta::objectstore::BackendVFS> OStoreDBFactory; + +INSTANTIATE_TEST_CASE_P(OStoreDBPlusMockSchedulerTest, SchedulerTest, + ::testing::Values(SchedulerTestParam(mockNsFactory, OStoreDBFactory, mockRemoteStorageFactory))); } // namespace unitTests