diff --git a/integration-tests/templates/test_multi_data_set_archiving/core-plugins/openbis/1/as/maintenance-tasks/archiving-requested-task/groups.json b/integration-tests/templates/test_multi_data_set_archiving/core-plugins/openbis/1/as/maintenance-tasks/archiving-requested-task/groups.json new file mode 100644 index 0000000000000000000000000000000000000000..cca80d13714e2a2d7ef7d6179aa18900ab71fbae --- /dev/null +++ b/integration-tests/templates/test_multi_data_set_archiving/core-plugins/openbis/1/as/maintenance-tasks/archiving-requested-task/groups.json @@ -0,0 +1,11 @@ +{ + "groups": + [ + { + "name":"SIS", + "key":"SIS", + "ldapGroupKeys": ["id-sis-source"], + "admins": ["blub"] + } + ] +} \ No newline at end of file diff --git a/integration-tests/templates/test_multi_data_set_archiving/core-plugins/openbis/1/as/maintenance-tasks/archiving-requested-task/plugin.properties b/integration-tests/templates/test_multi_data_set_archiving/core-plugins/openbis/1/as/maintenance-tasks/archiving-requested-task/plugin.properties new file mode 100644 index 0000000000000000000000000000000000000000..b8bb6d25db4cee29a5848b2991690c566bb0ed1f --- /dev/null +++ b/integration-tests/templates/test_multi_data_set_archiving/core-plugins/openbis/1/as/maintenance-tasks/archiving-requested-task/plugin.properties @@ -0,0 +1,5 @@ +class = ch.systemsx.cisd.openbis.generic.server.task.ArchivingByRequestTask +interval = 20 +minimum-container-size-in-bytes = 500000 +maximum-container-size-in-bytes = 2500000 +configuration-file-path = groups.json diff --git a/integration-tests/templates/test_multi_data_set_archiving/core-plugins/openbis/1/dss/drop-boxes/archiving/archiving.py b/integration-tests/templates/test_multi_data_set_archiving/core-plugins/openbis/1/dss/drop-boxes/archiving/archiving.py index 33a755cd0a393ffe665f16b3bab3caa1e74529c7..3930dae6f7459b65590abbd5bd506df7f274313d 100644 --- a/integration-tests/templates/test_multi_data_set_archiving/core-plugins/openbis/1/dss/drop-boxes/archiving/archiving.py +++ b/integration-tests/templates/test_multi_data_set_archiving/core-plugins/openbis/1/dss/drop-boxes/archiving/archiving.py @@ -1,23 +1,13 @@ from ch.systemsx.cisd.openbis.dss.generic.shared import ServiceProvider +from ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.id import DataSetPermId +from ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.update import DataSetUpdate +from ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.update import PhysicalDataUpdate + def process(transaction): incoming_path = transaction.getIncoming() executeOperation(incoming_path.name) - expid = "/DEFAULT/DEFAULT/ARCHIVING" - exp = transaction.getExperiment(expid) - - if None == exp: - exp = transaction.createNewExperiment(expid, "UNKNOWN") - exp.setPropertyValue("DESCRIPTION", 'Archiving') - - dataSet = transaction.createNewDataSet() - - dataSet.setDataSetType("UNKNOWN") - dataSet.setExperiment(exp) - - transaction.moveFile(incoming_path.getAbsolutePath(), dataSet) - def executeOperation(file_name): parts = file_name.split() data_set_codes = parts[1:] @@ -29,3 +19,11 @@ def executeOperation(file_name): service.archiveDataSets(data_set_codes, False) elif parts[0] == 'unarchive': service.unarchiveDataSets(data_set_codes) + elif parts[0] == 'requestToArchive': + v3 = ServiceProvider.getV3ApplicationService() + update = DataSetUpdate() + update.setDataSetId(DataSetPermId(data_set_codes[0])) + physicalData = PhysicalDataUpdate() + physicalData.setArchivingRequested(True) + update.setPhysicalData(physicalData) + v3.updateDataSets(service.getSessionToken(), [update]) diff --git a/integration-tests/templates/test_multi_data_set_archiving/core-plugins/openbis/1/dss/miscellaneous/multi-data-set-archiver/plugin.properties b/integration-tests/templates/test_multi_data_set_archiving/core-plugins/openbis/1/dss/miscellaneous/multi-data-set-archiver/plugin.properties index c6f215aae7524576088d03a25f9872943609b1ea..11b35b61e3df5f00255fc7587f92f194a024c788 100644 --- a/integration-tests/templates/test_multi_data_set_archiving/core-plugins/openbis/1/dss/miscellaneous/multi-data-set-archiver/plugin.properties +++ b/integration-tests/templates/test_multi_data_set_archiving/core-plugins/openbis/1/dss/miscellaneous/multi-data-set-archiver/plugin.properties @@ -2,7 +2,7 @@ archiver.class = ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.ar #archiver.with-sharding = true archive = ${root-dir}/archive archiver.temp-folder = ${archive}/tmp -archiver.minimum-container-size-in-bytes = 1500000 +archiver.minimum-container-size-in-bytes = 500000 archiver.maximum-container-size-in-bytes = 2500000 archiver.staging-destination = ${archive}/stage archiver.final-destination = ${archive}/final diff --git a/integration-tests/templates/test_multi_data_set_archiving/openbis_test_multi_data_set_archiving_openbis.sql b/integration-tests/templates/test_multi_data_set_archiving/openbis_test_multi_data_set_archiving_openbis.sql index b32d1f649a01cd5bceaf5b9b3b229b341d1a5f63..77eb2746f3398a7c2c5d02ada262c5235bede8c1 100644 --- a/integration-tests/templates/test_multi_data_set_archiving/openbis_test_multi_data_set_archiving_openbis.sql +++ b/integration-tests/templates/test_multi_data_set_archiving/openbis_test_multi_data_set_archiving_openbis.sql @@ -2172,6 +2172,7 @@ COPY experiments (id, perm_id, code, exty_id, mate_id_study_object, pers_id_regi 4 20100623121102843-4 E121 1 \N 2 2010-06-23 12:11:02.735245+02 2010-06-24 11:37:59.657+02 3 \N f 5 20100623121102843-5 E122 1 \N 2 2010-06-23 12:11:02.735245+02 2010-06-24 11:37:59.657+02 3 \N f 6 20100623121102843-6 E222 1 \N 2 2010-06-23 12:11:02.735245+02 2010-06-24 11:37:59.657+02 5 \N f +7 20180623121102843-7 E1 1 \N 2 2010-06-23 12:11:02.735245+02 2010-06-24 11:37:59.657+02 6 \N f \. @@ -2227,6 +2228,7 @@ COPY groups (id, code, dbin_id, description, registration_timestamp, pers_id_reg 1 DEFAULT 1 \N 2010-06-23 12:10:24.020009+02 2 2 S1 1 \N 2010-06-23 12:10:24.020009+02 2 3 S2 1 \N 2010-06-23 12:10:24.020009+02 2 +4 SIS_ALL 1 \N 2018-06-23 12:10:24.020009+02 2 \. @@ -2319,6 +2321,7 @@ COPY projects (id, code, grou_id, pers_id_leader, description, pers_id_registere 3 P2-1 2 \N \N 2 2010-06-23 12:10:36.760919+02 2010-06-23 12:11:02.883+02 4 P1-2 3 \N \N 2 2010-06-23 12:10:36.760919+02 2010-06-23 12:11:02.883+02 5 P2-2 3 \N \N 2 2010-06-23 12:10:36.760919+02 2010-06-23 12:11:02.883+02 +6 P1 4 \N \N 2 2018-06-23 12:10:36.760919+02 2018-06-23 12:11:02.883+02 \. diff --git a/integration-tests/test_multi_data_set_archiving.py b/integration-tests/test_multi_data_set_archiving.py index c1f45331236ada382921b5bc785a3ca820793949..04be40303099bcdf08c0e45e895620eb011538f9 100755 --- a/integration-tests/test_multi_data_set_archiving.py +++ b/integration-tests/test_multi_data_set_archiving.py @@ -22,12 +22,15 @@ class TestCase(systemtest.testcase.TestCase): self.registerSecondDataSetAndWaitForArchiving(openbisController) self.registerThreeDataSetsAndCheckArchivingWithExperimentPolicyOnProjectLevel(openbisController) self.unarchiveOneDataSetFromAContainerWithTwoDataSets(openbisController) + self.registerOneDataSetAndRequestArchiving(openbisController) self.checkFolders(openbisController) def executeInDevMode(self): # openbisController = self.createOpenbisController() openbisController = self.createOpenbisController(dropDatabases=False) - self.checkFolders(openbisController) +# openbisController.allUp() + self.registerOneDataSetAndRequestArchiving(openbisController) +# self.checkFolders(openbisController) def setUpAndStartOpenbis(self): util.printWhoAmI() @@ -47,12 +50,23 @@ class TestCase(systemtest.testcase.TestCase): openbisController.allUp() return openbisController + def registerOneDataSetAndRequestArchiving(self, openbisController): + util.printWhoAmI() + self.dropExampleAndWait(openbisController, 'T1', '/SIS_ALL/P1/E1') + self.waitForAutoArchiverToDoNothing(openbisController) + data_set_codes = self.getDataSetCodesByExperiments(openbisController, ['E1']) + self.requestToArchive(openbisController, data_set_codes) + self.checkStatusAndGetLocation(openbisController, data_set_codes[0], 'AVAILABLE', 'f', 't', '1') + self.waitForArchiving(openbisController, data_set_codes, 't') + self.checkStatusAndDatabase(openbisController, data_set_codes, 'ARCHIVED', 't', 'f', '1') + self.assertDataSetsAreArchivedInSameContainer(openbisController, data_set_codes) + def registerOneDataSetAndWaitOnNothingArchived(self, openbisController): util.printWhoAmI() self.dropExampleAndWait(openbisController, 'T1', '/S1/P1-1/E111') self.waitForAutoArchiverToDoNothing(openbisController) data_set_codes = self.getDataSetCodes(openbisController) - self.checkStatusAndDatabase(openbisController, data_set_codes, 'AVAILABLE', 'f', '1') + self.checkStatusAndDatabase(openbisController, data_set_codes, 'AVAILABLE', 'f', 'f', '1') self.triggerArchiving(openbisController, data_set_codes) self.waitForAutoArchiverToDoNothing(openbisController) @@ -62,8 +76,8 @@ class TestCase(systemtest.testcase.TestCase): data_set_codes = self.getDataSetCodes(openbisController) self.waitForAutoArchiverToDoNothing(openbisController) self.triggerArchiving(openbisController, self.getDataSetCodes(openbisController)) - self.waitForArchiving(openbisController, data_set_codes) - self.checkStatusAndDatabase(openbisController, data_set_codes, 'ARCHIVED', 't', '1') + self.waitForArchiving(openbisController, data_set_codes, 'f') + self.checkStatusAndDatabase(openbisController, data_set_codes, 'ARCHIVED', 't', 'f', '1') self.assertDataSetsAreArchivedInSameContainer(openbisController, data_set_codes) def registerThreeDataSetsAndCheckArchivingWithExperimentPolicyOnProjectLevel(self, openbisController): @@ -75,17 +89,17 @@ class TestCase(systemtest.testcase.TestCase): data_set_codes = self.getDataSetCodesByExperiments(openbisController, ['E121', 'E122']) self.waitForAutoArchiverToDoNothing(openbisController) self.triggerArchiving(openbisController, self.getDataSetCodes(openbisController)) - self.waitForArchiving(openbisController, data_set_codes) - self.checkStatusAndDatabase(openbisController, data_set_codes, 'ARCHIVED', 't', '1') + self.waitForArchiving(openbisController, data_set_codes, 'f') + self.checkStatusAndDatabase(openbisController, data_set_codes, 'ARCHIVED', 't', 'f', '1') self.assertDataSetsAreArchivedInSameContainer(openbisController, data_set_codes) data_set_codes = self.getDataSetCodesByExperiments(openbisController, ['E112']) - self.checkStatusAndDatabase(openbisController, data_set_codes, 'AVAILABLE', 'f', '1') + self.checkStatusAndDatabase(openbisController, data_set_codes, 'AVAILABLE', 'f', 'f', '1') def unarchiveOneDataSetFromAContainerWithTwoDataSets(self, openbisController): util.printWhoAmI() data_set_codes = self.getDataSetCodesByExperiments(openbisController, ['E121', 'E122']) self.unarchive(openbisController, data_set_codes[1:]) - self.checkStatusAndDatabase(openbisController, data_set_codes, 'AVAILABLE', 't', '9') + self.checkStatusAndDatabase(openbisController, data_set_codes, 'AVAILABLE', 't', 'f', '9') def triggerArchiving(self, openbisController, data_set_codes): @@ -103,15 +117,26 @@ class TestCase(systemtest.testcase.TestCase): identifier.replace('/', ':')) openbisController.dropIntoDestination('data-example', destination) - def archive(self, openbisController, data_set_codes): - self.performArchivingOperation(openbisController, 'archive', data_set_codes); - - def addToArchive(self, openbisController, data_set_codes): - self.performArchivingOperation(openbisController, 'addToArchive', data_set_codes); - + def requestToArchive(self, openbisController, data_set_codes): + self.performArchivingOperation(openbisController, 'requestToArchive', data_set_codes) + operation = 'requestToArchive' + util.printAndFlush("Waiting for archiving operation '%s' is finshed." % operation) + monitor = util.LogMonitor("%s.DSS" % openbisController.instanceName, + "%s/servers/datastore_server/log/datastore_server_log.txt" % openbisController.installPath) + monitor.addNotificationCondition(util.RegexCondition('\[archiving - ')) + monitor.waitUntilEvent(util.RegexCondition('Successfully committed transaction')) + def unarchive(self, openbisController, data_set_codes): - self.performArchivingOperation(openbisController, 'unarchive', data_set_codes); - + self.performArchivingOperationAndWait(openbisController, 'unarchive', data_set_codes) + + def performArchivingOperationAndWait(self, openbisController, operation, data_set_codes): + self.performArchivingOperation(openbisController, operation, data_set_codes) + util.printAndFlush("Waiting for archiving operation '%s' is finshed." % operation) + monitor = util.LogMonitor("%s.DSS" % openbisController.instanceName, + "%s/servers/datastore_server/log/datastore_server_log.txt" % openbisController.installPath) + monitor.addNotificationCondition(util.RegexCondition('OPERATION.MultiDataSet')) + monitor.waitUntilEvent(util.RegexCondition('changed status to')) + def performArchivingOperation(self, openbisController, operation, data_set_codes): destination = "%s/data/%s" % (openbisController.installPath, 'incoming-archiving') name = operation @@ -119,11 +144,6 @@ class TestCase(systemtest.testcase.TestCase): name = "%s %s" % (name, data_set_code) util.printAndFlush(name) open("%s/%s" % (destination, name), 'a').close() - util.printAndFlush("Waiting for archiving operation '%s' is finshed." % operation) - monitor = util.LogMonitor("%s.DSS" % openbisController.instanceName, - "%s/servers/datastore_server/log/datastore_server_log.txt" % openbisController.installPath) - monitor.addNotificationCondition(util.RegexCondition('OPERATION.MultiDataSet')) - monitor.waitUntilEvent(util.RegexCondition('changed status to')) def assertDataSetsAreArchivedInSameContainer(self, openbisController, data_set_codes): resultSet = openbisController.queryDatabase(DATASET_MAPPING_DB, @@ -135,18 +155,18 @@ class TestCase(systemtest.testcase.TestCase): self.assertEquals("Stage folder", [], self._listFiles(openbisController, 'stage')) self.assertEquals("Deletion request folder", [], self._listFiles(openbisController, 'deletion-requests')) archivesInFinal = self._listFiles(openbisController, 'final') - self.assertEquals("Number of archives in final", 2, len(archivesInFinal)) + self.assertEquals("Number of archives in final", 3, len(archivesInFinal)) self.assertEquals("Archives in backup", archivesInFinal, self._listFiles(openbisController, 'backup')) def checkStatusAndDatabase(self, openbisController, data_set_codes, expected_status, - expected_in_archive_flag, expected_share_id): + expected_in_archive_flag, expected_archiving_requested, expected_share_id): example_file = 'data-example/R_inferno.pdf' example_file_path = openbisController.dataFile(example_file) expected_file_size = str(os.path.getsize(example_file_path)) expected_md5 = self.calculateMD5(example_file_path) for data_set_code in data_set_codes: location = self.checkStatusAndGetLocation(openbisController, data_set_code, expected_status, - expected_in_archive_flag, expected_share_id) + expected_in_archive_flag, expected_archiving_requested, expected_share_id) path_in_store = "%s/data/store/%s/%s" % (openbisController.installPath, expected_share_id, location) if expected_status in ['AVAILABLE', 'ARCHIVE_PENDING']: if os.path.exists(path_in_store): @@ -176,9 +196,9 @@ class TestCase(systemtest.testcase.TestCase): expected_md5, self.calculateMD5(extracted_file)) def checkStatusAndGetLocation(self, openbisController, data_set_code, expected_status, - expected_in_archive_flag, expected_share_id): + expected_in_archive_flag, expected_archiving_requested, expected_share_id): resultSet = openbisController.queryDatabase('openbis', - "select share_id, location, status, present_in_archive from data" + + "select share_id, location, status, present_in_archive, archiving_requested from data" + " left join external_data as ed on ed.id = data.id" + " where code = '%s'" % data_set_code) self.assertEquals("Number of data sets with code %s found in openbis database" % data_set_code, "1", str(len(resultSet))) @@ -186,8 +206,10 @@ class TestCase(systemtest.testcase.TestCase): location = resultSet[0][1] status = resultSet[0][2] present_in_archive = resultSet[0][3] + archiving_requested = resultSet[0][4] self.assertEquals("Share id", expected_share_id, share_id) self.assertEquals("Status", expected_status, status) + self.assertEquals("Archiving-requested flag", expected_archiving_requested, archiving_requested) self.assertEquals("Present-in-archive flag", expected_in_archive_flag, present_in_archive) return location @@ -216,13 +238,13 @@ class TestCase(systemtest.testcase.TestCase): monitor.addNotificationCondition(util.RegexCondition('OPERATION.AutoArchiverTask')) monitor.waitUntilEvent(util.RegexCondition("OPERATION.AutoArchiverTask - nothing to archive")) - def waitForArchiving(self, openbisController, data_set_codes): + def waitForArchiving(self, openbisController, data_set_codes, expected_archiving_requested): util.printAndFlush("Waiting for finish first archiving step") monitor = self._createArchivingMonitor(openbisController) monitor.waitUntilEvent(util.RegexCondition("Finished executing 'Archiving'")) monitoringStartTime = time.time() - self.checkStatusAndDatabase(openbisController, data_set_codes, 'ARCHIVE_PENDING', 'f', '1') + self.checkStatusAndDatabase(openbisController, data_set_codes, 'ARCHIVE_PENDING', 'f', expected_archiving_requested, '1') util.printAndFlush("Waiting for replication of archive failed") monitor = self._createArchivingMonitor(openbisController) @@ -233,9 +255,13 @@ class TestCase(systemtest.testcase.TestCase): archiveInFinal, = monitor.waitUntilEvent(util.RegexCondition("Waiting for replication of archive '(.*)'")) monitoringStartTime = time.time() - util.printAndFlush("Archive file: %s" % archiveInFinal) - shutil.copy(archiveInFinal, "%s/data/archive/backup" % openbisController.installPath) - + archiveInBackup = archiveInFinal.replace("final", "backup") + dir, _ = os.path.split(archiveInBackup) + if not os.path.isdir(dir): + os.mkdir(dir) + util.printAndFlush("Copy %s to %s" % (archiveInFinal, dir)) + shutil.copy(archiveInFinal, dir) + util.printAndFlush("Waiting for archiving finished") monitor = self._createArchivingMonitor(openbisController) monitor.waitUntilEvent(util.RegexCondition("Finished executing 'Archiving Finalizer'"), startTime = monitoringStartTime) @@ -250,7 +276,10 @@ class TestCase(systemtest.testcase.TestCase): return monitor def _listFiles(self, openbisController, subfolder): - return os.listdir("%s/data/archive/%s" % (openbisController.installPath, subfolder)) + list = [] + for _, _, files in os.walk("%s/data/archive/%s" % (openbisController.installPath, subfolder)): + list = list + files + return sorted(list) def getDataSetCodesByExperiments(self, openbisController, experiment_codes): codes = set(experiment_codes)