diff --git a/Doxyfile b/Doxyfile index 6988ed4a69b50c2474618eb69a07a1f91f9fd64d..d6e5c14d4cbc57335e0dbd3f7383c2f2abe813f8 100644 --- a/Doxyfile +++ b/Doxyfile @@ -568,7 +568,7 @@ WARN_LOGFILE = # directories like "/usr/src/myproject". Separate the files or directories # with spaces. -INPUT = cmdline common nameserver objectstore remotens scheduler tapeserver xroot_plugins +INPUT = catalogue cmdline common nameserver objectstore remotens scheduler tapeserver xroot_plugins # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is diff --git a/catalogue/CMakeLists.txt b/catalogue/CMakeLists.txt index 6549f1b1865dad0f7865d8e3a32fe1e3af3fcd47..f8c321d6b64ec3bf4d844c84e03f177145e57b3e 100644 --- a/catalogue/CMakeLists.txt +++ b/catalogue/CMakeLists.txt @@ -17,7 +17,8 @@ cmake_minimum_required (VERSION 2.6) set (CATALOGUE_LIB_SRC_FILES Catalogue.cpp - MockCatalogue.cpp) + MockCatalogue.cpp + SQLiteDatabase.cpp) add_library (ctacatalogue ${CATALOGUE_LIB_SRC_FILES}) diff --git a/catalogue/Catalogue.cpp b/catalogue/Catalogue.cpp index 673a4f73d961f8b6a7dfb2ec338d39e4f8e2214a..6f88379318c7faa1ac6a73428a8c3aef7eb791f5 100644 --- a/catalogue/Catalogue.cpp +++ b/catalogue/Catalogue.cpp @@ -21,5 +21,5 @@ //------------------------------------------------------------------------------ // destructor //------------------------------------------------------------------------------ -cta::Catalogue::~Catalogue() { +cta::catalogue::Catalogue::~Catalogue() { } diff --git a/catalogue/Catalogue.hpp b/catalogue/Catalogue.hpp index 5b8f169576f1d8120869f1a5b46f26a388f77563..e839783b2d1c093e35fb2f2ca643b6390899fafa 100644 --- a/catalogue/Catalogue.hpp +++ b/catalogue/Catalogue.hpp @@ -20,11 +20,27 @@ #include "common/ArchiveRequest.hpp" +#include <list> #include <stdint.h> #include <string> namespace cta { +class AdminHost {}; +class AdminUser {}; +class ArchiveRoute {}; +class Dedication {}; +class LogicalLibrary {}; +class RetrieveGroup {}; +class RetrieveUser {}; +class SecurityIdentity {}; +class StorageClass {}; +class Tape {}; +class TapePool {}; +class UserIdentity {}; + +namespace catalogue { + /** * Abstract class defining the interface to the CTA catalogue responsible for * storing crticial information about archive files, tapes and tape files. @@ -37,6 +53,89 @@ public: */ virtual ~Catalogue() = 0; + virtual void createBootstrapAdminAndHostNoAuth(const SecurityIdentity &requester, const UserIdentity &user, const std::string &hostName, const std::string &comment) = 0; + + virtual void createAdminUser(const SecurityIdentity &requester, const UserIdentity &user, const std::string &comment) = 0; + virtual void deleteAdminUser(const SecurityIdentity &requester, const UserIdentity &user) = 0; + virtual std::list<AdminUser> getAdminUsers(const SecurityIdentity &requester) const = 0; + virtual void modifyAdminUserComment(const SecurityIdentity &requester, const UserIdentity &user, const std::string &comment) = 0; + + virtual void createAdminHost(const SecurityIdentity &requester, const std::string &hostName, const std::string &comment) = 0; + virtual void deleteAdminHost(const SecurityIdentity &requester, const std::string &hostName) = 0; + virtual std::list<AdminHost> getAdminHosts(const SecurityIdentity &requester) const = 0; + virtual void modifyAdminHostComment(const SecurityIdentity &requester, const std::string &hostName, const std::string &comment) = 0; + + virtual void createStorageClass(const SecurityIdentity &requester, const std::string &name, const uint16_t nbCopies, const std::string &comment) = 0; + virtual void deleteStorageClass(const SecurityIdentity &requester, const std::string &name) = 0; + virtual std::list<StorageClass> getStorageClasses(const SecurityIdentity &requester) const = 0; + virtual void modifyStorageClassNbCopies(const SecurityIdentity &requester, const std::string &name, const uint16_t nbCopies) = 0; + virtual void modifyStorageClassComment(const SecurityIdentity &requester, const std::string &name, const std::string &comment) = 0; + + virtual void createTapePool(const SecurityIdentity &requester, const std::string &name, const uint32_t nbPartialTapes, const uint64_t minFilesQueued, const uint64_t minBytesQueued, const uint64_t minRequestAge, const uint16_t maxDrivesAllowed, const std::string &comment) = 0; + virtual void deleteTapePool(const SecurityIdentity &requester, const std::string &name) = 0; + virtual std::list<TapePool> getTapePools(const SecurityIdentity &requester) const = 0; + virtual void modifyTapePoolNbPartialTapes(const SecurityIdentity &requester, const std::string &name, const uint32_t nbPartialTapes) = 0; + virtual void modifyTapePoolMinFilesQueued(const SecurityIdentity &requester, const std::string &name, const uint64_t minFilesQueued) = 0; + virtual void modifyTapePoolMinBytesQueued(const SecurityIdentity &requester, const std::string &name, const uint64_t minBytesQueued) = 0; + virtual void modifyTapePoolMinRequestAge(const SecurityIdentity &requester, const std::string &name, const uint64_t minRequestAge) = 0; + virtual void modifyTapePoolMaxDrivesAllowed(const SecurityIdentity &requester, const std::string &name, const uint16_t maxDrivesAllowed) = 0; + virtual void modifyTapePoolComment(const SecurityIdentity &requester, const std::string &name, const std::string &comment) = 0; + + virtual void createArchiveRoute(const SecurityIdentity &requester, const std::string &storageClassName, const uint16_t copyNb, const std::string &tapePoolName, + const std::string &comment) = 0; + virtual void deleteArchiveRoute(const SecurityIdentity &requester, const std::string &storageClassName, const uint16_t copyNb) = 0; + virtual std::list<ArchiveRoute> getArchiveRoutes(const SecurityIdentity &requester) const = 0; + virtual void modifyArchiveRouteTapePoolName(const SecurityIdentity &requester, const std::string &storageClassName, const uint16_t copyNb, const std::string &tapePoolName) = 0; + virtual void modifyArchiveRouteComment(const SecurityIdentity &requester, const std::string &storageClassName, const uint16_t copyNb, const std::string &comment) = 0; + + virtual void createLogicalLibrary(const SecurityIdentity &requester, const std::string &name, const std::string &comment) = 0; + virtual void deleteLogicalLibrary(const SecurityIdentity &requester, const std::string &name) = 0; + virtual std::list<LogicalLibrary> getLogicalLibraries(const SecurityIdentity &requester) const = 0; + virtual void modifyLogicalLibraryComment(const SecurityIdentity &requester, const std::string &name, const std::string &comment) = 0; + + 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) = 0; + virtual void deleteTape(const SecurityIdentity &requester, const std::string &vid) = 0; + virtual Tape getTape(const SecurityIdentity &requester, const std::string &vid) const = 0; + virtual std::list<Tape> getTapesByLogicalLibrary(const SecurityIdentity &requester, const std::string &logicalLibraryName) const = 0; + virtual std::list<Tape> getTapesByPool(const SecurityIdentity &requester, const std::string &tapePoolName) const = 0; + virtual std::list<Tape> getTapesByCapacity(const SecurityIdentity &requester, const uint64_t capacityInBytes) const = 0; + virtual std::list<Tape> getAllTapes(const SecurityIdentity &requester) const = 0; + virtual void reclaimTape(const SecurityIdentity &requester, const std::string &vid) = 0; + virtual void modifyTapeLogicalLibraryName(const SecurityIdentity &requester, const std::string &vid, const std::string &logicalLibraryName) = 0; + virtual void modifyTapeTapePoolName(const SecurityIdentity &requester, const std::string &vid, const std::string &tapePoolName) = 0; + virtual void modifyTapeCapacityInBytes(const SecurityIdentity &requester, const std::string &vid, const uint64_t capacityInBytes) = 0; + virtual void modifyTapeComment(const SecurityIdentity &requester, const std::string &vid, const std::string &comment) = 0; + + virtual void createRetrieveUser(const SecurityIdentity &requester, const std::string &username, const std::string &usergroup, const std::string &retrieveGroup, + const std::string &comment) = 0; + virtual void deleteRetrieveUser(const SecurityIdentity &requester, const std::string &username, const std::string &usergroup) = 0; + virtual std::list<RetrieveUser> getRetrieveUsers(const SecurityIdentity &requester) const = 0; + virtual void modifyRetrieveUserRetrieveGroup(const SecurityIdentity &requester, const std::string &username, const std::string &usergroup, const std::string &retrieveGroup) = 0; + virtual void modifyRetrieveUserComment(const SecurityIdentity &requester, const std::string &username, const std::string &usergroup, const std::string &comment) = 0; + + virtual void createRetrieveGroup(const SecurityIdentity &requester, const std::string &name, const uint64_t minFilesQueued, const uint64_t minBytesQueued, const uint64_t minRequestAge, const uint16_t maxDrivesAllowed, const std::string &comment) = 0; + virtual void deleteRetrieveGroup(const SecurityIdentity &requester, const std::string &name) = 0; + virtual std::list<RetrieveGroup> getRetrieveGroups(const SecurityIdentity &requester) const = 0; + virtual void modifyRetrieveGroupMinFilesQueued(const SecurityIdentity &requester, const std::string &name, const uint64_t minFilesQueued) = 0; + virtual void modifyRetrieveGroupMinBytesQueued(const SecurityIdentity &requester, const std::string &name, const uint64_t minBytesQueued) = 0; + virtual void modifyRetrieveGroupMinRequestAge(const SecurityIdentity &requester, const std::string &name, const uint64_t minRequestAge) = 0; + virtual void modifyRetrieveGroupMaxDrivesAllowed(const SecurityIdentity &requester, const std::string &name, const uint16_t maxDrivesAllowed) = 0; + virtual void modifyRetrieveGroupComment(const SecurityIdentity &requester, const std::string &name, const std::string &comment) = 0; + + virtual void createDedication(const SecurityIdentity &requester, const std::string &drivename, const bool self, const bool readonly, const bool writeonly, const std::string &VO, const std::string &instanceName, const std::string &vid, const uint64_t fromTimestamp, const uint64_t untilTimestamp,const std::string &comment) = 0; + virtual void deleteDedication(const SecurityIdentity &requester, const std::string &drivename) = 0; + virtual std::list<Dedication> getDedications(const SecurityIdentity &requester) const = 0; + virtual void modifyDedicationSelf(const SecurityIdentity &requester, const std::string &drivename, const bool self) = 0; + virtual void modifyDedicationReadonly(const SecurityIdentity &requester, const std::string &drivename, const bool readonly) = 0; + virtual void modifyDedicationWriteonly(const SecurityIdentity &requester, const std::string &drivename, const bool writeonly) = 0; + virtual void modifyDedicationVO(const SecurityIdentity &requester, const std::string &drivename, const std::string &VO) = 0; + virtual void modifyDedicationInstance(const SecurityIdentity &requester, const std::string &drivename, const std::string &instanceName) = 0; + virtual void modifyDedicationVid(const SecurityIdentity &requester, const std::string &drivename, const std::string &vid) = 0; + virtual void modifyDedicationFrom(const SecurityIdentity &requester, const std::string &drivename, const uint64_t fromTimestamp) = 0; + virtual void modifyDedicationUntil(const SecurityIdentity &requester, const std::string &drivename, const uint64_t untilTimestamp) = 0; + virtual void modifyDedicationComment(const SecurityIdentity &requester, const std::string &drivename, const std::string &comment) = 0; + /** * Returns the next identifier to be used for a new archive file. * @@ -58,4 +157,5 @@ public: }; // class Catalogue +} // namespace catalogue } // namespace cta diff --git a/catalogue/MockCatalogue.cpp b/catalogue/MockCatalogue.cpp index 0f928f26284e8ca59390569fc60a582db6049d71..99f8cf876e54ea22f78fa87e0f001e9f70de4fb0 100644 --- a/catalogue/MockCatalogue.cpp +++ b/catalogue/MockCatalogue.cpp @@ -17,30 +17,688 @@ */ #include "catalogue/MockCatalogue.hpp" +#include "common/exception/Exception.hpp" //------------------------------------------------------------------------------ // constructor //------------------------------------------------------------------------------ -cta::MockCatalogue::MockCatalogue(): m_nextArchiveFileId(0) { +cta::catalogue::MockCatalogue::MockCatalogue(): + m_db(":memory:"), + m_nextArchiveFileId(0) { + + char *zErrMsg = 0; + if(SQLITE_OK != sqlite3_exec(m_db.getHandle(), "PRAGMA foreign_keys = ON;", + 0, 0, &zErrMsg)) { + exception::Exception ex; + ex.getMessage() << "Failed to turn on foreign key support in SQLite: " << + zErrMsg; + sqlite3_free(zErrMsg); + throw(ex); + } } //------------------------------------------------------------------------------ // destructor //------------------------------------------------------------------------------ -cta::MockCatalogue::~MockCatalogue() { +cta::catalogue::MockCatalogue::~MockCatalogue() { +} + +//------------------------------------------------------------------------------ +// createBootstrapAdminAndHostNoAuth +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::createBootstrapAdminAndHostNoAuth( + const SecurityIdentity &requester, + const UserIdentity &user, + const std::string &hostName, + const std::string &comment) { +} + +//------------------------------------------------------------------------------ +// createAdminUser +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::createAdminUser( + const SecurityIdentity &requester, + const UserIdentity &user, + const std::string &comment) { +} + +//------------------------------------------------------------------------------ +// deleteAdminUser +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::deleteAdminUser( + const SecurityIdentity &requester, + const UserIdentity &user) { +} + +//------------------------------------------------------------------------------ +// getAdminUsers +//------------------------------------------------------------------------------ +std::list<cta::AdminUser> + cta::catalogue::MockCatalogue::getAdminUsers( + const SecurityIdentity &requester) const { + + return std::list<cta::AdminUser>(); +} + +//------------------------------------------------------------------------------ +// modifyAdminUserComment +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::modifyAdminUserComment( + const SecurityIdentity &requester, + const UserIdentity &user, + const std::string &comment) { +} + +//------------------------------------------------------------------------------ +// createAdminHost +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::createAdminHost( + const SecurityIdentity &requester, + const std::string &hostName, + const std::string &comment) { +} + +//------------------------------------------------------------------------------ +// deleteAdminHost +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::deleteAdminHost( + const SecurityIdentity &requester, + const std::string &hostName) { +} + +//------------------------------------------------------------------------------ +// getAdminHosts +//------------------------------------------------------------------------------ +std::list<cta::AdminHost> + cta::catalogue::MockCatalogue::getAdminHosts( + const SecurityIdentity &requester) const { + return std::list<cta::AdminHost>(); +} + +//------------------------------------------------------------------------------ +// modifyAdminHostComment +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::modifyAdminHostComment( + const SecurityIdentity &requester, + const std::string &hostName, + const std::string &comment) { +} + + +//------------------------------------------------------------------------------ +// createStorageClass +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::createStorageClass( + const SecurityIdentity &requester, + const std::string &name, + const uint16_t nbCopies, + const std::string &comment) { +} + +//------------------------------------------------------------------------------ +// deleteStorageClass +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::deleteStorageClass( + const SecurityIdentity &requester, + const std::string &name) { +} + +//------------------------------------------------------------------------------ +// getStorageClasses +//------------------------------------------------------------------------------ +std::list<cta::StorageClass> + cta::catalogue::MockCatalogue::getStorageClasses( + const SecurityIdentity &requester) const { + return std::list<cta::StorageClass>(); +} + +//------------------------------------------------------------------------------ +// modifyStorageClassNbCopies +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::modifyStorageClassNbCopies( + const SecurityIdentity &requester, + const std::string &name, + const uint16_t nbCopies) { +} + +//------------------------------------------------------------------------------ +// modifyStorageClassComment +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::modifyStorageClassComment( + const SecurityIdentity &requester, + const std::string &name, + const std::string &comment) { +} + + +//------------------------------------------------------------------------------ +// createTapePool +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::createTapePool( + const SecurityIdentity &requester, + const std::string &name, + const uint32_t nbPartialTapes, + const uint64_t minFilesQueued, + const uint64_t minBytesQueued, + const uint64_t minRequestAge, + const uint16_t maxDrivesAllowed, + const std::string &comment) { +} + +//------------------------------------------------------------------------------ +// deleteTapePool +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::deleteTapePool( + const SecurityIdentity &requester, + const std::string &name) { +} + +//------------------------------------------------------------------------------ +// getTapePools +//------------------------------------------------------------------------------ +std::list<cta::TapePool> cta::catalogue::MockCatalogue::getTapePools( + const SecurityIdentity &requester) const { + return std::list<cta::TapePool>(); +} + +//------------------------------------------------------------------------------ +// modifyTapePoolNbPartialTapes +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::modifyTapePoolNbPartialTapes( + const SecurityIdentity &requester, + const std::string &name, + const uint32_t nbPartialTapes) { +} + +//------------------------------------------------------------------------------ +// modifyTapePoolMinFilesQueued +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::modifyTapePoolMinFilesQueued( + const SecurityIdentity &requester, + const std::string &name, + const uint64_t minFilesQueued) { +} + +//------------------------------------------------------------------------------ +// modifyTapePoolMinBytesQueued +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::modifyTapePoolMinBytesQueued( + const SecurityIdentity &requester, + const std::string &name, + const uint64_t minBytesQueued) { +} + +//------------------------------------------------------------------------------ +// modifyTapePoolMinRequestAge +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::modifyTapePoolMinRequestAge( + const SecurityIdentity &requester, + const std::string &name, + const uint64_t minRequestAge) { +} + +//------------------------------------------------------------------------------ +// modifyTapePoolMaxDrivesAllowed +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::modifyTapePoolMaxDrivesAllowed( + const SecurityIdentity &requester, + const std::string &name, + const uint16_t maxDrivesAllowed) { +} + +//------------------------------------------------------------------------------ +// modifyTapePoolComment +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::modifyTapePoolComment( + const SecurityIdentity &requester, + const std::string &name, + const std::string &comment) { +} + + +//------------------------------------------------------------------------------ +// createArchiveRoute +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::createArchiveRoute( + const SecurityIdentity &requester, + const std::string &storageClassName, + const uint16_t copyNb, + const std::string &tapePoolName, + const std::string &comment) { +} + +//------------------------------------------------------------------------------ +// deleteArchiveRoute +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::deleteArchiveRoute( + const SecurityIdentity &requester, + const std::string &storageClassName, + const uint16_t copyNb) { +} + +//------------------------------------------------------------------------------ +// getArchiveRoutes +//------------------------------------------------------------------------------ +std::list<cta::ArchiveRoute> cta::catalogue::MockCatalogue:: + getArchiveRoutes(const SecurityIdentity &requester) const { + return std::list<cta::ArchiveRoute>(); +} + +//------------------------------------------------------------------------------ +// modifyArchiveRouteTapePoolName +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::modifyArchiveRouteTapePoolName( + const SecurityIdentity &requester, + const std::string &storageClassName, + const uint16_t copyNb, + const std::string &tapePoolName) { +} + +//------------------------------------------------------------------------------ +// modifyArchiveRouteComment +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::modifyArchiveRouteComment( + const SecurityIdentity &requester, + const std::string &storageClassName, + const uint16_t copyNb, + const std::string &comment) { +} + +//------------------------------------------------------------------------------ +// createLogicalLibrary +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::createLogicalLibrary( + const SecurityIdentity &requester, + const std::string &name, + const std::string &comment) { +} + +//------------------------------------------------------------------------------ +// deleteLogicalLibrary +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::deleteLogicalLibrary( + const SecurityIdentity &requester, + const std::string &name) { +} + +//------------------------------------------------------------------------------ +// getLogicalLibraries +//------------------------------------------------------------------------------ +std::list<cta::LogicalLibrary> + cta::catalogue::MockCatalogue::getLogicalLibraries( + const SecurityIdentity &requester) const { + return std::list<cta::LogicalLibrary>(); +} + +//------------------------------------------------------------------------------ +// modifyLogicalLibraryComment +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::modifyLogicalLibraryComment( + const SecurityIdentity &requester, + const std::string &name, + const std::string &comment) { +} + +//------------------------------------------------------------------------------ +// createTape +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::createTape( + const SecurityIdentity &requester, + const std::string &vid, + const std::string &logicalLibraryName, + const std::string &tapePoolName, + const uint64_t capacityInBytes, + const std::string &comment) { +} + +//------------------------------------------------------------------------------ +// deleteTape +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::deleteTape( + const SecurityIdentity &requester, + const std::string &vid) { +} + +//------------------------------------------------------------------------------ +// getTape +//------------------------------------------------------------------------------ +cta::Tape cta::catalogue::MockCatalogue::getTape( + const SecurityIdentity &requester, + const std::string &vid) const { + return cta::Tape(); +} + +//------------------------------------------------------------------------------ +// getTapesByLogicalLibrary +//------------------------------------------------------------------------------ +std::list<cta::Tape> + cta::catalogue::MockCatalogue::getTapesByLogicalLibrary( + const SecurityIdentity &requester, + const std::string &logicalLibraryName) const { + return std::list<cta::Tape>(); +} + +//------------------------------------------------------------------------------ +// getTapesByPool +//------------------------------------------------------------------------------ +std::list<cta::Tape> cta::catalogue::MockCatalogue::getTapesByPool( + const SecurityIdentity &requester, + const std::string &tapePoolName) const { + return std::list<cta::Tape>(); +} + +//------------------------------------------------------------------------------ +// getTapesByCapacity +//------------------------------------------------------------------------------ +std::list<cta::Tape> + cta::catalogue::MockCatalogue::getTapesByCapacity( + const SecurityIdentity &requester, + const uint64_t capacityInBytes) const { + return std::list<cta::Tape>(); +} + +//------------------------------------------------------------------------------ +// getAllTapes +//------------------------------------------------------------------------------ +std::list<cta::Tape> cta::catalogue::MockCatalogue::getAllTapes( + const SecurityIdentity &requester) const { + return std::list<cta::Tape>(); +} + +//------------------------------------------------------------------------------ +// reclaimTape +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::reclaimTape( + const SecurityIdentity &requester, + const std::string &vid) { +} + +//------------------------------------------------------------------------------ +// modifyTapeLogicalLibraryName +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::modifyTapeLogicalLibraryName( + const SecurityIdentity &requester, + const std::string &vid, + const std::string &logicalLibraryName) { +} + +//------------------------------------------------------------------------------ +// modifyTapeTapePoolName +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::modifyTapeTapePoolName( + const SecurityIdentity &requester, + const std::string &vid, + const std::string &tapePoolName) { +} + +//------------------------------------------------------------------------------ +// modifyTapeCapacityInBytes +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::modifyTapeCapacityInBytes( + const SecurityIdentity &requester, + const std::string &vid, + const uint64_t capacityInBytes) { +} + +//------------------------------------------------------------------------------ +// modifyTapeComment +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::modifyTapeComment( + const SecurityIdentity &requester, + const std::string &vid, + const std::string &comment) { +} + +//------------------------------------------------------------------------------ +// createRetrieveUser +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::createRetrieveUser( + const SecurityIdentity &requester, + const std::string &username, + const std::string &usergroup, + const std::string &retrieveGroup, + const std::string &comment) { +} + +//------------------------------------------------------------------------------ +// deleteRetrieveUser +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::deleteRetrieveUser( + const SecurityIdentity &requester, + const std::string &username, + const std::string &usergroup) { +} + +//------------------------------------------------------------------------------ +// getRetrieveUsers +//------------------------------------------------------------------------------ +std::list<cta::RetrieveUser> + cta::catalogue::MockCatalogue::getRetrieveUsers( + const SecurityIdentity &requester) const { + return std::list<cta::RetrieveUser>(); +} + +//------------------------------------------------------------------------------ +// modifyRetrieveUserRetrieveGroup +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::modifyRetrieveUserRetrieveGroup( + const SecurityIdentity &requester, + const std::string &username, + const std::string &usergroup, + const std::string &retrieveGroup) { +} + +//------------------------------------------------------------------------------ +// modifyRetrieveUserComment +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::modifyRetrieveUserComment( + const SecurityIdentity &requester, + const std::string &username, + const std::string &usergroup, + const std::string &comment) { +} + +//------------------------------------------------------------------------------ +// createRetrieveGroup +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::createRetrieveGroup( + const SecurityIdentity &requester, + const std::string &name, + const uint64_t minFilesQueued, + const uint64_t minBytesQueued, + const uint64_t minRequestAge, + const uint16_t maxDrivesAllowed, + const std::string &comment) { +} + +//------------------------------------------------------------------------------ +// deleteRetrieveGroup +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::deleteRetrieveGroup( + const SecurityIdentity &requester, + const std::string &name) { +} + +//------------------------------------------------------------------------------ +// getRetrieveGroups +//------------------------------------------------------------------------------ +std::list<cta::RetrieveGroup> + cta::catalogue::MockCatalogue::getRetrieveGroups( + const SecurityIdentity &requester) const { + return std::list<cta::RetrieveGroup>(); +} + +//------------------------------------------------------------------------------ +// modifyRetrieveGroupMinFilesQueued +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::modifyRetrieveGroupMinFilesQueued( + const SecurityIdentity &requester, + const std::string &name, + const uint64_t minFilesQueued) { +} + +//------------------------------------------------------------------------------ +// modifyRetrieveGroupMinBytesQueued +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::modifyRetrieveGroupMinBytesQueued( + const SecurityIdentity &requester, + const std::string &name, + const uint64_t minBytesQueued) { +} + +//------------------------------------------------------------------------------ +// modifyRetrieveGroupMinRequestAge +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::modifyRetrieveGroupMinRequestAge( + const SecurityIdentity &requester, + const std::string &name, + const uint64_t minRequestAge) { +} + +//------------------------------------------------------------------------------ +// modifyRetrieveGroupMaxDrivesAllowed +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::modifyRetrieveGroupMaxDrivesAllowed( + const SecurityIdentity &requester, + const std::string &name, + const uint16_t maxDrivesAllowed) { +} + +//------------------------------------------------------------------------------ +// modifyRetrieveGroupComment +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::modifyRetrieveGroupComment( + const SecurityIdentity &requester, + const std::string &name, + const std::string &comment) { +} + +//------------------------------------------------------------------------------ +// createDedication +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::createDedication( + const SecurityIdentity &requester, + const std::string &drivename, + const bool self, + const bool readonly, + const bool writeonly, + const std::string &VO, + const std::string &instanceName, + const std::string &vid, + const uint64_t fromTimestamp, + const uint64_t untilTimestamp, + const std::string &comment) { +} + +//------------------------------------------------------------------------------ +// deleteDedication +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::deleteDedication( + const SecurityIdentity &requester, + const std::string &drivename) { +} + +//------------------------------------------------------------------------------ +// getDedications +//------------------------------------------------------------------------------ +std::list<cta::Dedication> + cta::catalogue::MockCatalogue::getDedications( + const SecurityIdentity &requester) const { + return std::list<cta::Dedication>(); +} + +//------------------------------------------------------------------------------ +// modifyDedicationSelf +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::modifyDedicationSelf( + const SecurityIdentity &requester, + const std::string &drivename, + const bool self) { +} + +//------------------------------------------------------------------------------ +// modifyDedicationReadonly +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::modifyDedicationReadonly( + const SecurityIdentity &requester, + const std::string &drivename, + const bool readonly) { +} + +//------------------------------------------------------------------------------ +// modifyDedicationWriteonly +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::modifyDedicationWriteonly( + const SecurityIdentity &requester, + const std::string &drivename, + const bool writeonly) { +} + +//------------------------------------------------------------------------------ +// modifyDedicationVO +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::modifyDedicationVO( + const SecurityIdentity &requester, + const std::string &drivename, + const std::string &VO) { +} + +//------------------------------------------------------------------------------ +// modifyDedicationInstance +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::modifyDedicationInstance( + const SecurityIdentity &requester, + const std::string &drivename, + const std::string &instanceName) { +} + +//------------------------------------------------------------------------------ +// modifyDedicationVid +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::modifyDedicationVid( + const SecurityIdentity &requester, + const std::string &drivename, + const std::string &vid) { +} + +//------------------------------------------------------------------------------ +// modifyDedicationFrom +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::modifyDedicationFrom( + const SecurityIdentity &requester, + const std::string &drivename, + const uint64_t fromTimestamp) { +} + +//------------------------------------------------------------------------------ +// modifyDedicationUntil +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::modifyDedicationUntil( + const SecurityIdentity &requester, + const std::string &drivename, + const uint64_t untilTimestamp) { +} + +//------------------------------------------------------------------------------ +// modifyDedicationComment +//------------------------------------------------------------------------------ +void cta::catalogue::MockCatalogue::modifyDedicationComment( + const SecurityIdentity &requester, + const std::string &drivename, + const std::string &comment) { } //------------------------------------------------------------------------------ // getNextArchiveFileId //------------------------------------------------------------------------------ -uint64_t cta::MockCatalogue::getNextArchiveFileId() { +uint64_t cta::catalogue::MockCatalogue::getNextArchiveFileId() { return m_nextArchiveFileId++; } //------------------------------------------------------------------------------ // fileWrittenToTape //------------------------------------------------------------------------------ -void cta::MockCatalogue::fileWrittenToTape( +void cta::catalogue::MockCatalogue::fileWrittenToTape( const ArchiveRequest &archiveRequest, const std::string vid, const uint64_t fSeq, diff --git a/catalogue/MockCatalogue.hpp b/catalogue/MockCatalogue.hpp index e5744012cbe4a262304a2b4db0e5bf0bedfb6e90..e27246579c84e9b70757acc9cbad01ce683d67fa 100644 --- a/catalogue/MockCatalogue.hpp +++ b/catalogue/MockCatalogue.hpp @@ -19,6 +19,7 @@ #pragma once #include "catalogue/Catalogue.hpp" +#include "catalogue/SQLiteDatabase.hpp" // The header file for atomic was is actually called cstdatomic in gcc 4.4 #if __GNUC__ == 4 && (__GNUC_MINOR__ == 4) @@ -30,6 +31,7 @@ #include <string> namespace cta { +namespace catalogue { /** * Mock CTA catalogue to facilitate unit testing. @@ -47,6 +49,89 @@ public: */ virtual ~MockCatalogue(); + virtual void createBootstrapAdminAndHostNoAuth(const SecurityIdentity &requester, const UserIdentity &user, const std::string &hostName, const std::string &comment); + + virtual void createAdminUser(const SecurityIdentity &requester, const UserIdentity &user, const std::string &comment); + virtual void deleteAdminUser(const SecurityIdentity &requester, const UserIdentity &user); + virtual std::list<AdminUser> getAdminUsers(const SecurityIdentity &requester) const; + virtual void modifyAdminUserComment(const SecurityIdentity &requester, const UserIdentity &user, const std::string &comment); + + virtual void createAdminHost(const SecurityIdentity &requester, const std::string &hostName, const std::string &comment); + virtual void deleteAdminHost(const SecurityIdentity &requester, const std::string &hostName); + virtual std::list<AdminHost> getAdminHosts(const SecurityIdentity &requester) const; + virtual void modifyAdminHostComment(const SecurityIdentity &requester, const std::string &hostName, const std::string &comment); + + virtual void createStorageClass(const SecurityIdentity &requester, const std::string &name, const uint16_t nbCopies, const std::string &comment); + virtual void deleteStorageClass(const SecurityIdentity &requester, const std::string &name); + virtual std::list<StorageClass> getStorageClasses(const SecurityIdentity &requester) const; + virtual void modifyStorageClassNbCopies(const SecurityIdentity &requester, const std::string &name, const uint16_t nbCopies); + virtual void modifyStorageClassComment(const SecurityIdentity &requester, const std::string &name, const std::string &comment); + + virtual void createTapePool(const SecurityIdentity &requester, const std::string &name, const uint32_t nbPartialTapes, const uint64_t minFilesQueued, const uint64_t minBytesQueued, const uint64_t minRequestAge, const uint16_t maxDrivesAllowed, const std::string &comment); + virtual void deleteTapePool(const SecurityIdentity &requester, const std::string &name); + virtual std::list<TapePool> getTapePools(const SecurityIdentity &requester) const; + virtual void modifyTapePoolNbPartialTapes(const SecurityIdentity &requester, const std::string &name, const uint32_t nbPartialTapes); + virtual void modifyTapePoolMinFilesQueued(const SecurityIdentity &requester, const std::string &name, const uint64_t minFilesQueued); + virtual void modifyTapePoolMinBytesQueued(const SecurityIdentity &requester, const std::string &name, const uint64_t minBytesQueued); + virtual void modifyTapePoolMinRequestAge(const SecurityIdentity &requester, const std::string &name, const uint64_t minRequestAge); + virtual void modifyTapePoolMaxDrivesAllowed(const SecurityIdentity &requester, const std::string &name, const uint16_t maxDrivesAllowed); + virtual void modifyTapePoolComment(const SecurityIdentity &requester, const std::string &name, const std::string &comment); + + virtual void createArchiveRoute(const SecurityIdentity &requester, const std::string &storageClassName, const uint16_t copyNb, const std::string &tapePoolName, + const std::string &comment); + virtual void deleteArchiveRoute(const SecurityIdentity &requester, const std::string &storageClassName, const uint16_t copyNb); + virtual std::list<ArchiveRoute> getArchiveRoutes(const SecurityIdentity &requester) const; + virtual void modifyArchiveRouteTapePoolName(const SecurityIdentity &requester, const std::string &storageClassName, const uint16_t copyNb, const std::string &tapePoolName); + virtual void modifyArchiveRouteComment(const SecurityIdentity &requester, const std::string &storageClassName, const uint16_t copyNb, const std::string &comment); + + virtual void createLogicalLibrary(const SecurityIdentity &requester, const std::string &name, const std::string &comment); + virtual void deleteLogicalLibrary(const SecurityIdentity &requester, const std::string &name); + virtual std::list<LogicalLibrary> getLogicalLibraries(const SecurityIdentity &requester) const; + virtual void modifyLogicalLibraryComment(const SecurityIdentity &requester, const std::string &name, const std::string &comment); + + 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); + virtual void deleteTape(const SecurityIdentity &requester, const std::string &vid); + virtual Tape getTape(const SecurityIdentity &requester, const std::string &vid) const; + virtual std::list<Tape> getTapesByLogicalLibrary(const SecurityIdentity &requester, const std::string &logicalLibraryName) const; + virtual std::list<Tape> getTapesByPool(const SecurityIdentity &requester, const std::string &tapePoolName) const; + virtual std::list<Tape> getTapesByCapacity(const SecurityIdentity &requester, const uint64_t capacityInBytes) const; + virtual std::list<Tape> getAllTapes(const SecurityIdentity &requester) const; + virtual void reclaimTape(const SecurityIdentity &requester, const std::string &vid); + virtual void modifyTapeLogicalLibraryName(const SecurityIdentity &requester, const std::string &vid, const std::string &logicalLibraryName); + virtual void modifyTapeTapePoolName(const SecurityIdentity &requester, const std::string &vid, const std::string &tapePoolName); + virtual void modifyTapeCapacityInBytes(const SecurityIdentity &requester, const std::string &vid, const uint64_t capacityInBytes); + virtual void modifyTapeComment(const SecurityIdentity &requester, const std::string &vid, const std::string &comment); + + virtual void createRetrieveUser(const SecurityIdentity &requester, const std::string &username, const std::string &usergroup, const std::string &retrieveGroup, + const std::string &comment); + virtual void deleteRetrieveUser(const SecurityIdentity &requester, const std::string &username, const std::string &usergroup); + virtual std::list<RetrieveUser> getRetrieveUsers(const SecurityIdentity &requester) const; + virtual void modifyRetrieveUserRetrieveGroup(const SecurityIdentity &requester, const std::string &username, const std::string &usergroup, const std::string &retrieveGroup); + virtual void modifyRetrieveUserComment(const SecurityIdentity &requester, const std::string &username, const std::string &usergroup, const std::string &comment); + + virtual void createRetrieveGroup(const SecurityIdentity &requester, const std::string &name, const uint64_t minFilesQueued, const uint64_t minBytesQueued, const uint64_t minRequestAge, const uint16_t maxDrivesAllowed, const std::string &comment); + virtual void deleteRetrieveGroup(const SecurityIdentity &requester, const std::string &name); + virtual std::list<RetrieveGroup> getRetrieveGroups(const SecurityIdentity &requester) const; + virtual void modifyRetrieveGroupMinFilesQueued(const SecurityIdentity &requester, const std::string &name, const uint64_t minFilesQueued); + virtual void modifyRetrieveGroupMinBytesQueued(const SecurityIdentity &requester, const std::string &name, const uint64_t minBytesQueued); + virtual void modifyRetrieveGroupMinRequestAge(const SecurityIdentity &requester, const std::string &name, const uint64_t minRequestAge); + virtual void modifyRetrieveGroupMaxDrivesAllowed(const SecurityIdentity &requester, const std::string &name, const uint16_t maxDrivesAllowed); + virtual void modifyRetrieveGroupComment(const SecurityIdentity &requester, const std::string &name, const std::string &comment); + + virtual void createDedication(const SecurityIdentity &requester, const std::string &drivename, const bool self, const bool readonly, const bool writeonly, const std::string &VO, const std::string &instanceName, const std::string &vid, const uint64_t fromTimestamp, const uint64_t untilTimestamp,const std::string &comment); + virtual void deleteDedication(const SecurityIdentity &requester, const std::string &drivename); + virtual std::list<Dedication> getDedications(const SecurityIdentity &requester) const; + virtual void modifyDedicationSelf(const SecurityIdentity &requester, const std::string &drivename, const bool self); + virtual void modifyDedicationReadonly(const SecurityIdentity &requester, const std::string &drivename, const bool readonly); + virtual void modifyDedicationWriteonly(const SecurityIdentity &requester, const std::string &drivename, const bool writeonly); + virtual void modifyDedicationVO(const SecurityIdentity &requester, const std::string &drivename, const std::string &VO); + virtual void modifyDedicationInstance(const SecurityIdentity &requester, const std::string &drivename, const std::string &instanceName); + virtual void modifyDedicationVid(const SecurityIdentity &requester, const std::string &drivename, const std::string &vid); + virtual void modifyDedicationFrom(const SecurityIdentity &requester, const std::string &drivename, const uint64_t fromTimestamp); + virtual void modifyDedicationUntil(const SecurityIdentity &requester, const std::string &drivename, const uint64_t untilTimestamp); + virtual void modifyDedicationComment(const SecurityIdentity &requester, const std::string &drivename, const std::string &comment); + /** * Returns the next identifier to be used for a new archive file. * @@ -68,6 +153,11 @@ public: private: + /** + * SQLite database handle. + */ + SQLiteDatabase m_db; + /** * The next identifier to be used for a new archive file. */ @@ -75,4 +165,5 @@ private: }; // class MockCatalogue +} // namespace catalogue } // namespace cta diff --git a/catalogue/MockCatalogueTest.cpp b/catalogue/MockCatalogueTest.cpp index 6e827692d3e3ea0b8953e2d7c75f792ba42d0ef7..6890f7e04d14deb3756c41efc981e15911026458 100644 --- a/catalogue/MockCatalogueTest.cpp +++ b/catalogue/MockCatalogueTest.cpp @@ -35,10 +35,10 @@ protected: TEST_F(cta_MockCatalogueTest, getNextArchiveFileId) { using namespace cta; - MockCatalogue catalogue; + catalogue::MockCatalogue c; - const uint64_t archiveFileId1 = catalogue.getNextArchiveFileId(); - const uint64_t archiveFileId2 = catalogue.getNextArchiveFileId(); + const uint64_t archiveFileId1 = c.getNextArchiveFileId(); + const uint64_t archiveFileId2 = c.getNextArchiveFileId(); ASSERT_GT(archiveFileId2, archiveFileId1); } diff --git a/catalogue/SQLiteDatabase.cpp b/catalogue/SQLiteDatabase.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ad85c60202829f759ab00dd6167bc8e277bddc41 --- /dev/null +++ b/catalogue/SQLiteDatabase.cpp @@ -0,0 +1,48 @@ +/* + * The CERN Tape Archive (CTA) project + * Copyright (C) 2015 CERN + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "catalogue/SQLiteDatabase.hpp" +#include "common/exception/Exception.hpp" + +//------------------------------------------------------------------------------ +// constructor +//------------------------------------------------------------------------------ +cta::catalogue::SQLiteDatabase::SQLiteDatabase(const std::string &filename) { + m_dbHandle = NULL; + if(sqlite3_open(filename.c_str(), &m_dbHandle)) { + sqlite3_close(m_dbHandle); + exception::Exception ex; + ex.getMessage() << "Failed to construct SQLiteDatabase: sqlite3_open failed" + ": " << sqlite3_errmsg(m_dbHandle); + throw(ex); + } +} + +//------------------------------------------------------------------------------ +// destructor +//------------------------------------------------------------------------------ +cta::catalogue::SQLiteDatabase::~SQLiteDatabase() { + sqlite3_close(m_dbHandle); +} + +//------------------------------------------------------------------------------ +// getHandle +//------------------------------------------------------------------------------ +sqlite3 *cta::catalogue::SQLiteDatabase::getHandle() { + return m_dbHandle; +} diff --git a/catalogue/SQLiteDatabase.hpp b/catalogue/SQLiteDatabase.hpp new file mode 100644 index 0000000000000000000000000000000000000000..a72676626febfa8c16af293ca20668e6ac094bcd --- /dev/null +++ b/catalogue/SQLiteDatabase.hpp @@ -0,0 +1,62 @@ +/* + * The CERN Tape Archive (CTA) project + * Copyright (C) 2015 CERN + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#pragma once + +#include <sqlite3.h> +#include <string> + +namespace cta { +namespace catalogue { + +/** + * A C++ wrapper around an SQLite database handle. + */ +class SQLiteDatabase { +public: + + /** + * Constructor. + * + * @param filename The filename to be passed to the sqlit3_open() function. + */ + SQLiteDatabase(const std::string &filename); + + /** + * Destructor. + */ + ~SQLiteDatabase(); + + /** + * Returns the underlying database handle. + * + * @return the underlying database handle. + */ + sqlite3 *getHandle(); + +private: + + /** + * SQLite database handle. + */ + sqlite3 *m_dbHandle; + +}; // class SqlLiteDatabase + +} // namespace catalogue +} // namespace cta