/* * @project The CERN Tape Archive (CTA) * @copyright Copyright © 2021-2022 CERN * @license This program is free software, distributed under the terms of the GNU General Public * Licence version 3 (GPL Version 3), copied verbatim in the file "COPYING". You can * redistribute it and/or modify it under the terms of the GPL Version 3, 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. * * In applying this licence, CERN does not waive the privileges and immunities * granted to it by virtue of its status as an Intergovernmental Organization or * submit itself to any jurisdiction. */ #include #include "catalogue/Catalogue.hpp" #include "catalogue/InMemoryCatalogue.hpp" #include "common/dataStructures/SecurityIdentity.hpp" #include "common/log/DummyLogger.hpp" #include "common/utils/Regex.hpp" #include "disk/DiskSystem.hpp" namespace unitTests { class DiskSystemTest: public ::testing::Test { public: DiskSystemTest(): m_dummyLog("dummy", "dummy") {} virtual ~DiskSystemTest() {} class FailedToGetCatalogue: public std::exception { public: const char *what() const noexcept { return "Failed to get catalogue"; } }; virtual void SetUp() { const uint64_t nbConns = 1; const uint64_t nbArchiveFileListingConns = 1; //m_catalogue = std::make_unique(m_tempSqliteFile.path(), nbConns); m_catalogue = std::make_unique(m_dummyLog, nbConns, nbArchiveFileListingConns); m_cliId.host = "host"; m_cliId.username = "userName"; insertDiskSystemSpinner(); insertDiskSystemDefault(); } virtual void TearDown() { m_catalogue.reset(); } cta::catalogue::Catalogue &getCatalogue() { cta::catalogue::Catalogue *const ptr = m_catalogue.get(); if(nullptr == ptr) { throw FailedToGetCatalogue(); } return *ptr; } protected: cta::log::DummyLogger m_dummyLog; std::unique_ptr m_catalogue; cta::common::dataStructures::SecurityIdentity m_cliId; cta::disk::DiskSystem m_diskSystemSpinner; cta::disk::DiskSystem m_diskSystemDefault; private: void insertDiskSystemSpinner(){ auto & catalogue = getCatalogue(); // create disk instance std::string diskInstanceName = "DiskInstanceNameSpinner"; std::string diskInstanceComment = "Comment"; catalogue.DiskInstance()->createDiskInstance(m_cliId, diskInstanceName, diskInstanceComment); // create disk instance space std::string diskInstanceSpaceName = "DiskInstanceSpaceSpinner"; std::string freeSpaceQueryURL = "eos:ctaeos:spinners"; uint64_t refrestInterval = 1; std::string diskInstanceSpaceComment = "Comment"; catalogue.DiskInstanceSpace()->createDiskInstanceSpace(m_cliId, diskInstanceSpaceName, diskInstanceName, freeSpaceQueryURL, refrestInterval, diskInstanceSpaceComment); m_diskSystemSpinner.name = "DiskSystemNameSpinner"; m_diskSystemSpinner.fileRegexp = "root://ctaeos.archiveretrieve-1215709git0e38ccd0-xi98.svc.cluster.local//eos/ctaeos/cta(.*)eos.space=spinners"; m_diskSystemSpinner.targetedFreeSpace = 1; m_diskSystemSpinner.sleepTime = 1; m_diskSystemSpinner.comment = "Comment"; catalogue.DiskSystem()->createDiskSystem(m_cliId,m_diskSystemSpinner.name, diskInstanceName, diskInstanceSpaceName, m_diskSystemSpinner.fileRegexp, m_diskSystemSpinner.targetedFreeSpace, m_diskSystemSpinner.sleepTime,m_diskSystemSpinner.comment); } void insertDiskSystemDefault() { auto & catalogue = getCatalogue(); // create disk instance std::string diskInstanceName = "ctaeos"; std::string diskInstanceComment = "Comment"; catalogue.DiskInstance()->createDiskInstance(m_cliId, diskInstanceName, diskInstanceComment); // create disk instance space std::string diskInstanceSpaceName = "DiskInstanceSpaceDefault"; std::string freeSpaceQueryURL = "eosSpace:default"; uint64_t refrestInterval = 1; std::string diskInstanceSpaceComment = "Comment"; catalogue.DiskInstanceSpace()->createDiskInstanceSpace(m_cliId, diskInstanceSpaceName, diskInstanceName, freeSpaceQueryURL, refrestInterval, diskInstanceSpaceComment); // create disk system m_diskSystemDefault.name = "DiskSystemNameDefault"; m_diskSystemDefault.fileRegexp = "root://ctaeos.archiveretrieve-1215709git0e38ccd0-xi98.svc.cluster.local//eos/ctaeos/cta(.*)eos.space=default"; m_diskSystemDefault.targetedFreeSpace = 1; m_diskSystemDefault.sleepTime = 1; m_diskSystemDefault.comment = "Comment"; catalogue.DiskSystem()->createDiskSystem(m_cliId,m_diskSystemDefault.name, diskInstanceName, diskInstanceSpaceName, m_diskSystemDefault.fileRegexp, m_diskSystemDefault.targetedFreeSpace, m_diskSystemDefault.sleepTime,m_diskSystemDefault.comment); } }; TEST_F(DiskSystemTest, getDSNameWithFileDstURLFromEOS){ auto & catalogue = getCatalogue(); auto allDiskSystem = catalogue.DiskSystem()->getAllDiskSystems(); std::string dstURL = "root://ctaeos.archiveretrieve-1215709git0e38ccd0-xi98.svc.cluster.local//eos/ctaeos/cta/54065a67-a3ea-4a44-b213-6f6a6f4e2cf4?eos.lfn=fxid:7&eos.ruid=0&eos.rgid=0&eos.injection=1&eos.workflow=retrieve_written&eos.space=spinners&toto=5"; ASSERT_EQ(m_diskSystemSpinner.name,allDiskSystem.getDSName(dstURL)); dstURL = "root://ctaeos.archiveretrieve-1215709git0e38ccd0-xi98.svc.cluster.local//eos/ctaeos/cta/54065a67-a3ea-4a44-b213-6f6a6f4e2cf4?eos.lfn=fxid:7&eos.ruid=0&eos.rgid=0&eos.injection=1&eos.workflow=retrieve_written&eos.space=default"; ASSERT_EQ(m_diskSystemDefault.name,allDiskSystem.getDSName(dstURL)); dstURL = "root://ctaeos.archiveretrieve-1215709git0e38ccd0-xi98.svc.cluster.local//eos/ctaeos/cta/54065a67-a3ea-4a44-b213-6f6a6f4e2cf4?eos.lfn=fxid:7&eos.ruid=0&eos.rgid=0&eos.injection=1&eos.workflow=retrieve_written"; ASSERT_THROW(allDiskSystem.getDSName(dstURL),std::out_of_range); } TEST_F(DiskSystemTest, fetchDiskSystemFreeSpace) { cta::log::LogContext lc(m_dummyLog); auto & catalogue = getCatalogue(); // create disk instance std::string diskInstanceName = "DiskInstanceNameConstantFreeSpace"; std::string diskInstanceComment = "Comment"; catalogue.DiskInstance()->createDiskInstance(m_cliId, diskInstanceName, diskInstanceComment); // create disk instance space std::string diskInstanceSpaceName = "DiskInstanceSpaceConstantFreeSpace"; std::string freeSpaceQueryURL = "constantFreeSpace:200"; uint64_t refrestInterval = 1; std::string diskInstanceSpaceComment = "Comment"; catalogue.DiskInstanceSpace()->createDiskInstanceSpace(m_cliId, diskInstanceSpaceName, diskInstanceName, freeSpaceQueryURL, refrestInterval, diskInstanceSpaceComment); // create disk system cta::disk::DiskSystem constantFreeSpaceDiskSystem; constantFreeSpaceDiskSystem.name = "ConstantFreeSpaceDiskSystem"; constantFreeSpaceDiskSystem.fileRegexp = "/home/test/buffer"; constantFreeSpaceDiskSystem.targetedFreeSpace = 1; constantFreeSpaceDiskSystem.sleepTime = 1; constantFreeSpaceDiskSystem.comment = "Comment"; catalogue.DiskSystem()->createDiskSystem(m_cliId,constantFreeSpaceDiskSystem.name, diskInstanceName, diskInstanceSpaceName, constantFreeSpaceDiskSystem.fileRegexp, constantFreeSpaceDiskSystem.targetedFreeSpace, constantFreeSpaceDiskSystem.sleepTime,constantFreeSpaceDiskSystem.comment); auto allDiskSystem = catalogue.DiskSystem()->getAllDiskSystems(); cta::disk::DiskSystemFreeSpaceList diskSystemFreeSpaceList (allDiskSystem); std::set diskSystemsToFetch {"DiskSystemNotExists"}; ASSERT_THROW(diskSystemFreeSpaceList.fetchDiskSystemFreeSpace(diskSystemsToFetch,catalogue, lc),std::exception); diskSystemsToFetch.clear(); diskSystemsToFetch.insert(m_diskSystemSpinner.name); diskSystemsToFetch.insert(m_diskSystemDefault.name); try { diskSystemFreeSpaceList.fetchDiskSystemFreeSpace(diskSystemsToFetch, catalogue, lc); ASSERT_TRUE(false); } catch (const cta::disk::DiskSystemFreeSpaceListException& ex) { ASSERT_EQ(2,ex.m_failedDiskSystems.size()); } diskSystemsToFetch.insert(constantFreeSpaceDiskSystem.name); try { diskSystemFreeSpaceList.fetchDiskSystemFreeSpace(diskSystemsToFetch, catalogue, lc); ASSERT_TRUE(false); } catch (const cta::disk::DiskSystemFreeSpaceListException& ex) { ASSERT_EQ(2,ex.m_failedDiskSystems.size()); } ASSERT_EQ(200,diskSystemFreeSpaceList.at(constantFreeSpaceDiskSystem.name).freeSpace); } }