def test_add_one_finished_task_and_query_for_other(self): self.database.register_node('node', 'address', 1111) self.database.add_scheduled_task('node', '/home', 4) ft1 = FinishedTask('/tmp/backup1', 223.43, datetime.now(), checksum="") self.database.register_finished_task('node', '/home', ft1) self.assertEqual(self.database.get_node_finished_tasks('node', '/tmp'), [])
def test_add_finished_task_errors(self): self.database.register_node('node', 'address', 1111) self.database.add_scheduled_task('node', '/home', 4) ft1 = FinishedTask('/tmp/backup1', 223.43, datetime.now(), checksum="") with self.assertRaises(UnexistentNodeError): self.database.register_finished_task('node', '/home2', ft1) with self.assertRaises(UnexistentNodeError): self.database.register_finished_task('node1', '/home', ft1)
def _dispatch_running_tasks(self): """ Handles running tasks """ now_running_tasks = {} for node_data, task in self.running_tasks.items(): if not task.is_running(): if task.backup_is_correct(): ft = FinishedTask( result_path=task.write_file_path, kb_size=os.path.getsize(task.write_file_path) / 1024, timestamp=datetime.now(), checksum=BackupFile(task.write_file_path).get_hash()) self.database.register_finished_task( node_data[0], node_data[1], ft) BackupScheduler.logger.info( "Backup for node %s and path %s finished succesfully" % node_data) self._reload_schedule() self._clean_backup_path() elif task.backup_is_same(): ft = self.database.get_node_finished_tasks( node_data[0], node_data[1])[0] ft = FinishedTask(result_path=ft.result_path, kb_size=ft.kb_size, timestamp=datetime.now(), checksum=ft.checksum) self.database.register_finished_task( node_data[0], node_data[1], ft) BackupScheduler.logger.info( "Backup for node %s and path %s finished succesfully" % node_data) self._reload_schedule() self._clean_backup_path() else: BackupScheduler.logger.error( "Backup for node %s and path %s failed" % node_data) else: now_running_tasks[node_data] = task self.running_tasks = now_running_tasks
def test_error_and_recover(self): self.database.register_node('node', 'address', 1111) self.database.add_scheduled_task('node', '/home', 4) ft1 = FinishedTask('/tmp/backup1', 223.43, datetime.now(), checksum="") with self.assertRaises(UnexistentNodeError): self.database.register_finished_task('node', '/home2', ft1) with self.assertRaises(UnexistentNodeError): self.database.get_node_address('node1') with self.assertRaises(UnexistentNodeError): self.database.add_scheduled_task('node1', '/path', 1) self.database = DiskDatabase('/tmp/disk_db_concus') self.assertEqual(('address', 1111), self.database.get_node_address('node'))
def test_recover_each_step_add_finished_tasks(self): self.database.register_node('node', 'address', 1111) self.database.add_scheduled_task('node', '/home', 4) tasks = [] for i in range(250): ft = FinishedTask('/tmp/backup1', 223.43, datetime.now(), checksum="") tasks.insert(0, ft) self.database.register_finished_task('node', '/home', ft) self.database = DiskDatabase('/tmp/disk_db_concus') self.assertEqual( self.database.get_node_finished_tasks('node', '/home'), tasks)
def register_finished_task(self, node_name: str, node_path: str, task: FinishedTask) -> NoReturn: """ Registers a finished task for the node name and path :raises: UnexistentNodeError: if the node or path do not exist :param node_name: the node name :param node_path: the node path :param task: the finished task """ self._write_operation( '_register_finished_task', [node_name, node_path, task.to_dict()], use_log=True)
def get_node_finished_tasks(self, node_name: str, node_path: str) -> List[FinishedTask]: """ List all finished tasks for a node and path :param node_name: the node name :param node_path: the node path :return: a list of finished tasks ordered from most recent to latest """ if node_name not in self.database: return [] if node_path not in self.database[node_name]['finished_tasks']: return [] return [ FinishedTask.from_dict(ft) for ft in self.database[node_name]['finished_tasks'][node_path] ]
def testToDictFromDict(self): ft = FinishedTask('/home', 0, datetime.now(), checksum="") self.assertEqual(ft, FinishedTask.from_dict(ft.to_dict()))