diff --git a/objectstore/CreationLog.hpp b/objectstore/CreationLog.hpp index 55e80c4c5ae403ed3851d7f6c2fb2dd1744804ff..592c4cb3e626d95ac1fac67067a1dc958abf84de 100644 --- a/objectstore/CreationLog.hpp +++ b/objectstore/CreationLog.hpp @@ -30,6 +30,7 @@ namespace cta { namespace objectstore { class CreationLog: public cta::CreationLog { public: CreationLog (): cta::CreationLog() {} + CreationLog (const cta::CreationLog & cl): cta::CreationLog(cl) {} CreationLog (const cta::UserIdentity& user, const std::string & hn, uint64_t t, const std::string & c): cta::CreationLog( cta::UserIdentity(user),hn ,t, c) {} diff --git a/scheduler/FileSystemStorageClasses.cpp b/scheduler/FileSystemStorageClasses.cpp index 7c140c6aa297aad16c552665d4b93416b40af926..c52911becc6c1883110b9781b21298569e3d5c81 100644 --- a/scheduler/FileSystemStorageClasses.cpp +++ b/scheduler/FileSystemStorageClasses.cpp @@ -27,11 +27,10 @@ void cta::FileSystemStorageClasses::createStorageClass( const std::string &name, const uint16_t nbCopies, - const UserIdentity &creator, - const std::string &comment) { + const CreationLog & creationLog) { try { checkStorageClassDoesNotAlreadyExist(name); - StorageClass storageClass(name, nbCopies, creator, comment); + StorageClass storageClass(name, nbCopies, creationLog); m_storageClasses[name] = storageClass; } catch(std::exception &ex) { throw Exception(std::string("Failed to create storage class: ") + diff --git a/scheduler/FileSystemStorageClasses.hpp b/scheduler/FileSystemStorageClasses.hpp index 914e19eb9d9f68b29f865c87b8a880ad5c43fa9e..686fbc8bc654b00bfe7184dfa2a372c101cd9606 100644 --- a/scheduler/FileSystemStorageClasses.hpp +++ b/scheduler/FileSystemStorageClasses.hpp @@ -27,6 +27,8 @@ namespace cta { +class CreationLog; + /** * The storage classes used in the file system. */ @@ -45,8 +47,7 @@ public: void createStorageClass( const std::string &name, const uint16_t nbCopies, - const UserIdentity &creator, - const std::string &comment); + const CreationLog &creationLog); /** * Deletes the specified storage class. diff --git a/scheduler/MockSchedulerDatabase.cpp b/scheduler/MockSchedulerDatabase.cpp index 6b6e1b2db81b87f333dd8671a75f178c35266bce..55a4c63b90b3fd983b1cdef2831e998b1546cfd3 100644 --- a/scheduler/MockSchedulerDatabase.cpp +++ b/scheduler/MockSchedulerDatabase.cpp @@ -79,6 +79,7 @@ void cta::MockSchedulerDatabase::createSchema() { "TAPEPOOL TEXT," "UID INTEGER," "GID INTEGER," + "HOST TEXT," "CREATIONTIME INTEGER," "COMMENT TEXT," "PRIMARY KEY (STORAGECLASS_NAME, COPYNB)," @@ -90,6 +91,7 @@ void cta::MockSchedulerDatabase::createSchema() { "NBCOPIES INTEGER," "UID INTEGER," "GID INTEGER," + "HOST TEXT," "CREATIONTIME INTEGER," "COMMENT TEXT" ");" @@ -98,6 +100,7 @@ void cta::MockSchedulerDatabase::createSchema() { "NBPARTIALTAPES INTEGER," "UID INTEGER," "GID INTEGER," + "HOST TEXT," "CREATIONTIME INTEGER," "COMMENT TEXT" ");" @@ -109,6 +112,7 @@ void cta::MockSchedulerDatabase::createSchema() { "DATAONTAPE_BYTES INTEGER," "UID INTEGER," "GID INTEGER," + "HOST TEXT," "CREATIONTIME INTEGER," "COMMENT TEXT," "PRIMARY KEY (VID)," @@ -119,6 +123,7 @@ void cta::MockSchedulerDatabase::createSchema() { "NAME TEXT," "UID INTEGER," "GID INTEGER," + "HOST TEXT," "CREATIONTIME INTEGER," "COMMENT TEXT," "PRIMARY KEY (NAME)" @@ -128,6 +133,7 @@ void cta::MockSchedulerDatabase::createSchema() { "ADMIN_GID INTEGER," "UID INTEGER," "GID INTEGER," + "HOST TEXT," "CREATIONTIME INTEGER," "COMMENT TEXT," "PRIMARY KEY (ADMIN_UID,ADMIN_GID)" @@ -136,6 +142,7 @@ void cta::MockSchedulerDatabase::createSchema() { "NAME TEXT," "UID INTEGER," "GID INTEGER," + "HOST TEXT," "CREATIONTIME INTEGER," "COMMENT TEXT," "PRIMARY KEY (NAME)" @@ -149,7 +156,7 @@ void cta::MockSchedulerDatabase::createSchema() { "PRIORITY INTEGER," "UID INTEGER," "GID INTEGER," - "HOST TEXT," + "HOST TEXT," "CREATIONTIME INTEGER," "PRIMARY KEY (ARCHIVEFILE, COPYNB)," "FOREIGN KEY (TAPEPOOL) REFERENCES TAPEPOOL(NAME)" @@ -855,14 +862,15 @@ std::list<cta::AdminHost> cta::MockSchedulerDatabase::getAdminHosts() const { // createStorageClass //------------------------------------------------------------------------------ void cta::MockSchedulerDatabase::createStorageClass( - const SecurityIdentity &requester, const std::string &name, - const uint16_t nbCopies, const std::string &comment) { + const std::string &name, + const uint16_t nbCopies, const CreationLog &creationLog) { char *zErrMsg = 0; std::ostringstream query; - query << "INSERT INTO STORAGECLASS(NAME, NBCOPIES, UID, GID, CREATIONTIME," + query << "INSERT INTO STORAGECLASS(NAME, NBCOPIES, UID, GID, HOST, CREATIONTIME," " COMMENT) VALUES('" << name << "'," << (int)nbCopies << "," << - requester.getUser().uid << "," << requester.getUser().gid << "," << - (int)time(NULL) << ",'" << comment << "');"; + creationLog.user.uid << "," << creationLog.user.gid << ", '" << + creationLog.host << "', " << + creationLog.time << ",'" << creationLog.comment << "');"; if(SQLITE_OK != sqlite3_exec(m_dbHandle, query.str().c_str(), 0, 0, &zErrMsg)) { std::ostringstream msg; @@ -904,7 +912,7 @@ std::list<cta::StorageClass> cta::MockSchedulerDatabase::getStorageClasses() const { std::ostringstream query; std::list<cta::StorageClass> classes; - query << "SELECT NAME, NBCOPIES, UID, GID, CREATIONTIME, COMMENT FROM" + query << "SELECT NAME, NBCOPIES, UID, GID, HOST, CREATIONTIME, COMMENT FROM" " STORAGECLASS ORDER BY NAME;"; sqlite3_stmt *s = NULL; const int rc = sqlite3_prepare(m_dbHandle, query.str().c_str(), -1, &s, 0 ); @@ -919,10 +927,13 @@ std::list<cta::StorageClass> cta::MockSchedulerDatabase::getStorageClasses() classes.push_back(StorageClass( (char *)sqlite3_column_text(statement.get(),idx("NAME")), sqlite3_column_int(statement.get(),idx("NBCOPIES")), - UserIdentity(sqlite3_column_int(statement.get(),idx("UID")), - sqlite3_column_int(statement.get(),idx("GID"))), - (char *)sqlite3_column_text(statement.get(),idx("COMMENT")), - time_t(sqlite3_column_int(statement.get(),idx("CREATIONTIME"))) + CreationLog( + UserIdentity(sqlite3_column_int(statement.get(),idx("UID")), + sqlite3_column_int(statement.get(),idx("GID"))), + (char *)sqlite3_column_text(statement.get(),idx("HOST")), + time_t(sqlite3_column_int(statement.get(),idx("CREATIONTIME"))), + (char *)sqlite3_column_text(statement.get(),idx("COMMENT")) + ) )); } return classes; @@ -934,7 +945,7 @@ std::list<cta::StorageClass> cta::MockSchedulerDatabase::getStorageClasses() cta::StorageClass cta::MockSchedulerDatabase::getStorageClass( const std::string &name) const { std::ostringstream query; - query << "SELECT NAME, NBCOPIES, UID, GID, CREATIONTIME, COMMENT" + query << "SELECT NAME, NBCOPIES, UID, GID, HOST, CREATIONTIME, COMMENT" " FROM STORAGECLASS WHERE NAME='" << name << "';"; sqlite3_stmt *s = NULL; const int rc = sqlite3_prepare(m_dbHandle, query.str().c_str(), -1, &s, 0 ); @@ -952,11 +963,13 @@ cta::StorageClass cta::MockSchedulerDatabase::getStorageClass( storageClass = cta::StorageClass( (char *)sqlite3_column_text(statement.get(),idx("NAME")), sqlite3_column_int(statement.get(),idx("NBCOPIES")), - UserIdentity( - sqlite3_column_int(statement.get(),idx("UID")), - sqlite3_column_int(statement.get(),idx("GID"))), - (char *)sqlite3_column_text(statement.get(),idx("COMMENT")), - time_t(sqlite3_column_int(statement.get(),idx("CREATIONTIME"))) + CreationLog( + UserIdentity(sqlite3_column_int(statement.get(),idx("UID")), + sqlite3_column_int(statement.get(),idx("GID"))), + (char *)sqlite3_column_text(statement.get(),idx("HOST")), + time_t(sqlite3_column_int(statement.get(),idx("CREATIONTIME"))), + (char *)sqlite3_column_text(statement.get(),idx("COMMENT")) + ) ); } break; @@ -1059,11 +1072,10 @@ std::list<cta::TapePool> cta::MockSchedulerDatabase::getTapePools() const { // createArchivalRoute //------------------------------------------------------------------------------ void cta::MockSchedulerDatabase::createArchivalRoute( - const SecurityIdentity &requester, const std::string &storageClassName, const uint16_t copyNb, const std::string &tapePoolName, - const std::string &comment) { + const CreationLog &creationLog) { const std::list<ArchivalRoute> routes = getArchivalRoutesWithoutChecks( storageClassName); const StorageClass storageClass = getStorageClass(storageClassName); @@ -1079,10 +1091,10 @@ void cta::MockSchedulerDatabase::createArchivalRoute( char *zErrMsg = 0; std::ostringstream query; query << "INSERT INTO ARCHIVALROUTE(STORAGECLASS_NAME, COPYNB, TAPEPOOL," - " UID, GID, CREATIONTIME, COMMENT) VALUES('" << storageClassName << "'," << - (int)copyNb << ",'" << tapePoolName << "'," << requester.getUser().uid << - "," << requester.getUser().gid << "," << (int)time(NULL) << ",'" << comment - << "');"; + " UID, GID, HOST, CREATIONTIME, COMMENT) VALUES('" << storageClassName << "'," << + (int)copyNb << ",'" << tapePoolName << "'," << creationLog.user.uid << + "," << creationLog.user.gid << ",'" << creationLog.host << + "'," << (int)time(NULL) << ",'" << creationLog.comment << "');"; if(SQLITE_OK != sqlite3_exec(m_dbHandle, query.str().c_str(), 0, 0, &zErrMsg)) { std::ostringstream msg; diff --git a/scheduler/MockSchedulerDatabase.hpp b/scheduler/MockSchedulerDatabase.hpp index cb9d3878f102950902d1421c6c6e5aa59d1f5c67..3b2e3f0101e7fb6d366503a77ed792bf5533b79d 100644 --- a/scheduler/MockSchedulerDatabase.hpp +++ b/scheduler/MockSchedulerDatabase.hpp @@ -23,7 +23,7 @@ #include <sqlite3.h> namespace cta { - + /** * A mock implementation of the database of a tape resource scheduler. */ @@ -214,10 +214,9 @@ public: * @param comment The comment describing the storage class. */ void createStorageClass( - const SecurityIdentity &requester, const std::string &name, const uint16_t nbCopies, - const std::string &comment); + const CreationLog &creationLog); /** * Deletes the specified storage class. @@ -287,11 +286,10 @@ public: * @param comment The comment describing the archival route. */ void createArchivalRoute( - const SecurityIdentity &requester, const std::string &storageClassName, const uint16_t copyNb, const std::string &tapePoolName, - const std::string &comment); + const CreationLog &creationLog); /** * Deletes the specified archival route. diff --git a/scheduler/OStoreDB/OStoreDB.cpp b/scheduler/OStoreDB/OStoreDB.cpp index 4b3d79c715331d344efcd6ba7f5e6546da06c105..7d0e27c930fbfe8c3641c65df3335d5affd2eecc 100644 --- a/scheduler/OStoreDB/OStoreDB.cpp +++ b/scheduler/OStoreDB/OStoreDB.cpp @@ -128,14 +128,12 @@ void OStoreDB::assertIsAdminOnAdminHost(const SecurityIdentity& id) const { } } -void OStoreDB::createStorageClass(const SecurityIdentity& requester, - const std::string& name, const uint16_t nbCopies, const std::string& comment) { +void OStoreDB::createStorageClass(const std::string& name, + const uint16_t nbCopies, const cta::CreationLog& creationLog) { RootEntry re(m_objectStore); ScopedExclusiveLock rel(re); re.fetch(); - objectstore::CreationLog cl(requester.getUser(), requester.getHost(), - time(NULL), comment); - re.addStorageClass(name, nbCopies, cl); + re.addStorageClass(name, nbCopies, creationLog); re.commit(); } @@ -146,9 +144,7 @@ StorageClass OStoreDB::getStorageClass(const std::string& name) const { auto sc = re.dumpStorageClass(name); return cta::StorageClass(name, sc.copyCount, - cta::UserIdentity(sc.log.user.uid, sc.log.user.gid), - sc.log.comment, - sc.log.time); + sc.log); } std::list<StorageClass> OStoreDB::getStorageClasses() const { @@ -159,8 +155,7 @@ std::list<StorageClass> OStoreDB::getStorageClasses() const { decltype (getStorageClasses()) ret; for (auto sc = scl.begin(); sc != scl.end(); sc++) { ret.push_back(StorageClass(sc->storageClass, - sc->copyCount, sc->log.user, - sc->log.comment, sc->log.time)); + sc->copyCount, sc->log)); } ret.sort(); return ret; @@ -175,15 +170,14 @@ void OStoreDB::deleteStorageClass(const SecurityIdentity& requester, re.commit(); } -void OStoreDB::createArchivalRoute(const SecurityIdentity& requester, - const std::string& storageClassName, const uint16_t copyNb, - const std::string& tapePoolName, const std::string& comment) { +void OStoreDB::createArchivalRoute(const std::string& storageClassName, + const uint16_t copyNb, const std::string& tapePoolName, + const cta::CreationLog& creationLog) { RootEntry re(m_objectStore); ScopedExclusiveLock rel(re); re.fetch(); - objectstore::CreationLog cl(requester.getUser(), requester.getHost(), - time(NULL), comment); - re.setArchivalRoute(storageClassName, copyNb, tapePoolName, cl); + re.setArchivalRoute(storageClassName, copyNb, tapePoolName, + objectstore::CreationLog(creationLog)); re.commit(); } diff --git a/scheduler/OStoreDB/OStoreDB.hpp b/scheduler/OStoreDB/OStoreDB.hpp index cd47ac7a82383b894bf358a7f443d097a613d95d..4cc08ac1dac0ba0ab72741adf0e5bb7edf6bb258 100644 --- a/scheduler/OStoreDB/OStoreDB.hpp +++ b/scheduler/OStoreDB/OStoreDB.hpp @@ -58,8 +58,8 @@ public: virtual void assertIsAdminOnAdminHost(const SecurityIdentity& id) const; /* === Storage class handling ============================================ */ - virtual void createStorageClass(const SecurityIdentity& requester, - const std::string& name, const uint16_t nbCopies, const std::string& comment); + virtual void createStorageClass(const std::string& name, + const uint16_t nbCopies, const CreationLog& creationLog); virtual StorageClass getStorageClass(const std::string& name) const; @@ -72,9 +72,9 @@ public: const std::string& name); /* === Archival routes handling ========================================== */ - virtual void createArchivalRoute(const SecurityIdentity& requester, - const std::string& storageClassName, const uint16_t copyNb, - const std::string& tapePoolName, const std::string& comment); + virtual void createArchivalRoute(const std::string& storageClassName, + const uint16_t copyNb, const std::string& tapePoolName, + const CreationLog& creationLog); virtual std::list<ArchivalRoute> getArchivalRoutes(const std::string& storageClassName) const; diff --git a/scheduler/OStoreDB/OStoreDBFactory.hpp b/scheduler/OStoreDB/OStoreDBFactory.hpp index 48fb654aac610cd7dee18365effdccdbfa98ddf8..7aebdfd763f208a36af09ffe1694c605233adaf6 100644 --- a/scheduler/OStoreDB/OStoreDBFactory.hpp +++ b/scheduler/OStoreDB/OStoreDBFactory.hpp @@ -82,16 +82,16 @@ public: m_OStoreDB.createAdminUser(requester, user, comment); } - virtual void createArchivalRoute(const SecurityIdentity& requester, const std::string& storageClassName, const uint16_t copyNb, const std::string& tapePoolName, const std::string& comment) { - m_OStoreDB.createArchivalRoute(requester, storageClassName, copyNb, tapePoolName, comment); + virtual void createArchivalRoute(const std::string& storageClassName, const uint16_t copyNb, const std::string& tapePoolName, const CreationLog& creationLog) { + m_OStoreDB.createArchivalRoute(storageClassName, copyNb, tapePoolName, creationLog); } virtual void createLogicalLibrary(const SecurityIdentity& requester, const std::string& name, const std::string& comment) { m_OStoreDB.createLogicalLibrary(requester, name, comment); } - virtual void createStorageClass(const SecurityIdentity& requester, const std::string& name, const uint16_t nbCopies, const std::string& comment) { - m_OStoreDB.createStorageClass(requester, name, nbCopies, comment); + virtual void createStorageClass(const std::string& name, const uint16_t nbCopies, const CreationLog& creationLog) { + m_OStoreDB.createStorageClass(name, nbCopies, creationLog); } virtual void createTape(const SecurityIdentity& requester, const std::string& vid, const std::string& logicalLibraryName, const std::string& tapePoolName, const uint64_t capacityInBytes, const std::string& comment) { diff --git a/scheduler/Scheduler.cpp b/scheduler/Scheduler.cpp index e896e204e31d15c5640496af65c695ede6b12d0f..f2fc489cb35317b8504dfc39f474ae74ac837b18 100644 --- a/scheduler/Scheduler.cpp +++ b/scheduler/Scheduler.cpp @@ -199,7 +199,8 @@ void cta::Scheduler::createStorageClass( const uint16_t nbCopies, const std::string &comment) { m_db.assertIsAdminOnAdminHost(requester); - m_db.createStorageClass(requester, name, nbCopies, comment); + m_db.createStorageClass(name, nbCopies, CreationLog(requester.getUser(), + requester.getHost(), time(NULL), comment)); } //------------------------------------------------------------------------------ @@ -261,8 +262,9 @@ void cta::Scheduler::createArchivalRoute( const std::string &tapePoolName, const std::string &comment) { m_db.assertIsAdminOnAdminHost(requester); - m_db.createArchivalRoute(requester, storageClassName, copyNb, tapePoolName, - comment); + m_db.createArchivalRoute(storageClassName, copyNb, tapePoolName, + CreationLog(UserIdentity(requester.getUser()), requester.getHost(), + time(NULL), comment)); } //------------------------------------------------------------------------------ diff --git a/scheduler/SchedulerDatabase.hpp b/scheduler/SchedulerDatabase.hpp index 54f1ee61cc4ccdeb25828be205e95ba7e5f4e246..6233af997137b9d289f46fd3bd3332fc9ad06e75 100644 --- a/scheduler/SchedulerDatabase.hpp +++ b/scheduler/SchedulerDatabase.hpp @@ -32,6 +32,7 @@ class ArchivalRoute; class ArchiveToDirRequest; class ArchiveToFileRequest; class ArchiveToTapeCopyRequest; +class CreationLog; class DirIterator; class LogicalLibrary; class RetrieveFromTapeCopyRequest; @@ -222,17 +223,15 @@ public: /** * Creates the specified storage class. * - * @param requester The identity of the requester. * @param name The name of the storage class. * @param nbCopies The number of copies a file associated with this storage * class should have on tape. - * @param comment The comment describing the storage class. + * @param creationLog The who, where, when an why of this modification. */ virtual void createStorageClass( - const SecurityIdentity &requester, const std::string &name, const uint16_t nbCopies, - const std::string &comment) = 0; + const CreationLog &creationLog) = 0; /** * Deletes the specified storage class. @@ -294,19 +293,17 @@ public: /** * Creates the specified archival route. * - * @param requester The identity of the requester. * @param storageClassName The name of the storage class that identifies the * source disk files. * @param copyNb The tape copy number. * @param tapePoolName The name of the destination tape pool. - * @param comment The comment describing the archival route. + * @param creationLog The who, where, when an why of this modification. */ virtual void createArchivalRoute( - const SecurityIdentity &requester, const std::string &storageClassName, const uint16_t copyNb, const std::string &tapePoolName, - const std::string &comment) = 0; + const CreationLog &creationLog) = 0; /** * Deletes the specified archival route. diff --git a/scheduler/SchedulerDatabaseTest.cpp b/scheduler/SchedulerDatabaseTest.cpp index 19834ace11381541caa2288e7319fac3d894e240..5254c2ddc460f4493f3c1ab126580a0903042756 100644 --- a/scheduler/SchedulerDatabaseTest.cpp +++ b/scheduler/SchedulerDatabaseTest.cpp @@ -240,8 +240,9 @@ TEST_P(SchedulerDatabaseTest, getArchivalRoutes_incomplete) { const std::string comment = "Comment"; { const uint16_t nbCopies = 2; - ASSERT_NO_THROW(db.createStorageClass(s_adminOnAdminHost, storageClassName, - nbCopies, comment)); + ASSERT_NO_THROW(db.createStorageClass(storageClassName, + nbCopies, CreationLog(s_adminOnAdminHost.getUser(), s_adminOnAdminHost.getHost(), + time(NULL), comment))); } const std::string tapePoolName = "TestTapePool"; @@ -250,8 +251,10 @@ TEST_P(SchedulerDatabaseTest, getArchivalRoutes_incomplete) { nbPartialTapes, comment)); const uint16_t copyNb = 1; - ASSERT_NO_THROW(db.createArchivalRoute(s_adminOnAdminHost, storageClassName, - copyNb, tapePoolName, comment)); + ASSERT_NO_THROW(db.createArchivalRoute(storageClassName, + copyNb, tapePoolName, + CreationLog(s_adminOnAdminHost.getUser(), s_adminOnAdminHost.getHost(), + time(NULL), comment))); ASSERT_THROW(db.getArchivalRoutes(storageClassName), std::exception); } @@ -265,8 +268,11 @@ TEST_P(SchedulerDatabaseTest, getArchivalRoutes_complete) { const std::string comment = "Comment"; { const uint16_t nbCopies = 2; - ASSERT_NO_THROW(db.createStorageClass(s_adminOnAdminHost, storageClassName, - nbCopies, comment)); + ASSERT_NO_THROW(db.createStorageClass(storageClassName, + nbCopies, + CreationLog(s_adminOnAdminHost.getUser(), s_adminOnAdminHost.getHost(), + time(NULL), comment) + )); } const std::string tapePoolNameA = "TestTapePoolA"; @@ -285,14 +291,16 @@ TEST_P(SchedulerDatabaseTest, getArchivalRoutes_complete) { { const uint16_t copyNb = 1; - ASSERT_NO_THROW(db.createArchivalRoute(s_adminOnAdminHost, storageClassName, - copyNb, tapePoolNameA, comment)); + ASSERT_NO_THROW(db.createArchivalRoute(storageClassName, + copyNb, tapePoolNameA, CreationLog(s_adminOnAdminHost.getUser(), + s_adminOnAdminHost.getHost(), time(NULL), comment))); } { const uint16_t copyNb = 2; - ASSERT_NO_THROW(db.createArchivalRoute(s_adminOnAdminHost, storageClassName, - copyNb, tapePoolNameB, comment)); + ASSERT_NO_THROW(db.createArchivalRoute(storageClassName, + copyNb, tapePoolNameB, CreationLog(s_adminOnAdminHost.getUser(), + s_adminOnAdminHost.getHost(), time(NULL), comment))); } { @@ -311,8 +319,10 @@ TEST_P(SchedulerDatabaseTest, createArchivalRoute_same_tape_pool_name) { const std::string comment = "Comment"; { const uint16_t nbCopies = 2; - ASSERT_NO_THROW(db.createStorageClass(s_adminOnAdminHost, storageClassName, - nbCopies, comment)); + ASSERT_NO_THROW(db.createStorageClass(storageClassName, + nbCopies, + CreationLog(s_adminOnAdminHost.getUser(), s_adminOnAdminHost.getHost(), + time(NULL), comment))); } const std::string tapePoolName = "TestTapePool"; @@ -324,14 +334,16 @@ TEST_P(SchedulerDatabaseTest, createArchivalRoute_same_tape_pool_name) { { const uint16_t copyNb = 1; - ASSERT_NO_THROW(db.createArchivalRoute(s_adminOnAdminHost, storageClassName, - copyNb, tapePoolName, comment)); + ASSERT_NO_THROW(db.createArchivalRoute(storageClassName, + copyNb, tapePoolName, CreationLog(s_adminOnAdminHost.getUser(), + s_adminOnAdminHost.getHost(), time(NULL), comment))); } { const uint16_t copyNb = 2; - ASSERT_THROW(db.createArchivalRoute(s_adminOnAdminHost, storageClassName, - copyNb, tapePoolName, comment), std::exception); + ASSERT_THROW(db.createArchivalRoute(storageClassName, + copyNb, tapePoolName, CreationLog(s_adminOnAdminHost.getUser(), + s_adminOnAdminHost.getHost(), time(NULL), comment)), std::exception); } } @@ -344,8 +356,9 @@ TEST_P(SchedulerDatabaseTest, createArchivalRoute_two_many_routes) { const std::string comment = "Comment"; { const uint16_t nbCopies = 1; - ASSERT_NO_THROW(db.createStorageClass(s_adminOnAdminHost, storageClassName, - nbCopies, comment)); + ASSERT_NO_THROW(db.createStorageClass(storageClassName, + nbCopies, CreationLog(s_adminOnAdminHost.getUser(), s_adminOnAdminHost.getHost(), + time(NULL), comment))); } const std::string tapePoolNameA = "TestTapePoolA"; @@ -364,14 +377,16 @@ TEST_P(SchedulerDatabaseTest, createArchivalRoute_two_many_routes) { { const uint16_t copyNb = 1; - ASSERT_NO_THROW(db.createArchivalRoute(s_adminOnAdminHost, storageClassName, - copyNb, tapePoolNameA, comment)); + ASSERT_NO_THROW(db.createArchivalRoute(storageClassName, + copyNb, tapePoolNameA, CreationLog(s_adminOnAdminHost.getUser(), + s_adminOnAdminHost.getHost(), time(NULL), comment))); } { const uint16_t copyNb = 2; - ASSERT_THROW(db.createArchivalRoute(s_adminOnAdminHost, storageClassName, - copyNb, tapePoolNameB, comment), std::exception); + ASSERT_THROW(db.createArchivalRoute(storageClassName, + copyNb, tapePoolNameB, CreationLog(s_adminOnAdminHost.getUser(), + s_adminOnAdminHost.getHost(), time(NULL), comment)), std::exception); } } diff --git a/scheduler/SchedulerTest.cpp b/scheduler/SchedulerTest.cpp index 63bfad7da6bc7f4bc50b8a030061642c7a12c28c..0269432d7b703bd5905af4cec2dfabc968eeda11 100644 --- a/scheduler/SchedulerTest.cpp +++ b/scheduler/SchedulerTest.cpp @@ -177,6 +177,8 @@ TEST_P(SchedulerTest, createStorageClass_new_as_adminOnAdminHost) { { std::list<StorageClass> storageClasses; + scheduler.getStorageClasses( + s_adminOnAdminHost); ASSERT_NO_THROW(storageClasses = scheduler.getStorageClasses( s_adminOnAdminHost)); ASSERT_EQ(1, storageClasses.size()); diff --git a/scheduler/StorageClass.cpp b/scheduler/StorageClass.cpp index 739f8e1b6eb5ef0ea2320346e0b3872c392f9cca..5045ba4b88f01cc2f4571ffad539a4d1179be12f 100644 --- a/scheduler/StorageClass.cpp +++ b/scheduler/StorageClass.cpp @@ -17,6 +17,7 @@ */ #include "scheduler/StorageClass.hpp" +#include "scheduler/CreationLog.hpp" //------------------------------------------------------------------------------ // constructor @@ -37,12 +38,10 @@ cta::StorageClass::~StorageClass() throw() { cta::StorageClass::StorageClass( const std::string &name, const uint16_t nbCopies, - const UserIdentity &creator, - const std::string &comment, - const time_t creationTime): - ConfigurationItem(creator, comment, creationTime), + const CreationLog &creationLog): m_name(name), - m_nbCopies(nbCopies) { + m_nbCopies(nbCopies), + m_creationLog(creationLog) { } //------------------------------------------------------------------------------ diff --git a/scheduler/StorageClass.hpp b/scheduler/StorageClass.hpp index 14a2cc83f089c1a11e358d0412fb07ee316b35fa..b4f8c82ef40a3d4aae84448794c953df50eb789a 100644 --- a/scheduler/StorageClass.hpp +++ b/scheduler/StorageClass.hpp @@ -18,17 +18,19 @@ #pragma once -#include "scheduler/ConfigurationItem.hpp" +#include "scheduler/CreationLog.hpp" #include <stdint.h> #include <string> namespace cta { + +class CreationLog; /** * Class representing an archive storage-class. */ -class StorageClass: public ConfigurationItem { +class StorageClass { public: /** @@ -57,9 +59,7 @@ public: StorageClass( const std::string &name, const uint16_t nbCopies, - const UserIdentity &creator, - const std::string &comment, - const time_t creationTime = time(NULL)); + const CreationLog &creationLog); /** * Returns the name of the storage class. @@ -77,6 +77,12 @@ public: */ uint16_t getNbCopies() const throw(); + /** + * Get the creation log + * @return Reference to the creation log + */ + const CreationLog & getCreationLog() const throw(); + /** * Returns true if the specified right-hand side is greater than this object. * @@ -97,7 +103,11 @@ private: * class should have on tape. */ uint16_t m_nbCopies; - + + /** + * The record of the entry's creation + */ + CreationLog m_creationLog; }; // class StorageClass } // namespace cta diff --git a/xroot_plugins/XrdProFilesystem.cpp b/xroot_plugins/XrdProFilesystem.cpp index 863d296f07c6c379fabb284edd553f410c01150a..2cebcb23ac5ace91ca51d5306399baab701be780 100644 --- a/xroot_plugins/XrdProFilesystem.cpp +++ b/xroot_plugins/XrdProFilesystem.cpp @@ -518,8 +518,9 @@ int XrdProFilesystem::executeLsclassCommand(const ParsedRequest &req, XrdOucErrI responseSS << "[OK] Listing of the storage class names and no of copies:"; for(std::list<cta::StorageClass>::iterator it = stgList.begin(); it != stgList.end(); it++) { responseSS << "\n" << it->getName() << " " << it->getNbCopies() << " " - << it->getCreator().uid << " " << it->getCreator().gid << " " - << it->getCreationTime() << " \"" << it->getComment() << "\""; + << it->getCreationLog().user.uid << " " << it->getCreationLog().user.gid << " " + << it->getCreationLog().host << " " + << it->getCreationLog().time << " \"" << it->getCreationLog().comment << "\""; } eInfo.setErrInfo(responseSS.str().length()+1, responseSS.str().c_str()); return SFS_DATA;