def test_log_not_delete(self): # Job that is not within it's expiry time with session.begin(): job_not_delete = data_setup.create_completed_job( start_time=datetime.datetime.utcnow() - datetime.timedelta(days=60), finish_time=datetime.datetime.utcnow() - datetime.timedelta(days=29)) job_not_delete.recipesets[0].recipes[0].logs.append( LogRecipe(filename=u'test.log')) r_not_delete = job_not_delete.recipesets[0].recipes[0] dir_not_delete = os.path.join(r_not_delete.logspath, r_not_delete.filepath) self.make_dir(dir_not_delete) ft = open(os.path.join(dir_not_delete, 'test.log'), 'w') ft.close() session.flush() log_delete.log_delete() self.assertRaises(AssertionError, self._assert_logs_not_in_db, self.job_to_delete) try: self.check_dir_not_there(dir_not_delete) raise Exception('%s was deleted when it shold not have been' % dir_not_delete) except AssertionError: pass
def test_limit(self): limit = 10 def _create_jobs(): with session.begin(): for i in range(limit + 1): job_to_delete = data_setup.create_completed_job( start_time=datetime.datetime.utcnow() - datetime.timedelta(days=60), finish_time=datetime.datetime.utcnow() - datetime.timedelta(days=31)) job_to_delete.recipesets[0].recipes[0].logs.append(LogRecipe(filename=u'test.log')) def _get_output(f): tmp_file = tempfile.TemporaryFile() sys_std_out = sys.stdout sys.stdout = tmp_file f() tmp_file.seek(0) log_delete_output = tmp_file.read() tmp_file.close() sys.stdout = sys_std_out return log_delete_output # Test with limit _create_jobs() with_limit = _get_output(lambda: log_delete.log_delete(dry=True, print_logs=True, limit=10)) self.assert_(len(with_limit.splitlines()) == limit) # Test no limit set _create_jobs() no_limit = _get_output(lambda: log_delete.log_delete(dry=True, print_logs=True)) self.assert_(len(no_limit.splitlines()) > limit)
def test_limit(self): limit = 10 def _create_jobs(): with session.begin(): for i in range(limit + 1): job_to_delete = data_setup.create_completed_job( start_time=datetime.datetime.utcnow() - datetime.timedelta(days=60), finish_time=datetime.datetime.utcnow() - datetime.timedelta(days=31)) job_to_delete.recipesets[0].recipes[0].logs.append(LogRecipe(filename=u'test.log')) def _get_output(f): tmp_file = tempfile.TemporaryFile() sys_std_out = sys.stdout sys.stdout = tmp_file f() tmp_file.seek(0) log_delete_output = tmp_file.read() tmp_file.close() sys.stdout = sys_std_out return log_delete_output # Test with limit _create_jobs() with_limit = _get_output(lambda: log_delete.log_delete(dry=True, print_logs=True, limit=10)) self.assert_(len(with_limit.splitlines()) == limit) # Test no limit set _create_jobs() no_limit = _get_output(lambda: log_delete.log_delete(dry=True, print_logs=True)) self.assert_(len(no_limit.splitlines()) > limit)
def test_recipe_task_result_rows_are_deleted(self): with session.begin(): self.job_to_delete.to_delete = datetime.datetime.utcnow() recipe = self.job_to_delete.recipesets[0].recipes[0] recipetask = recipe.tasks[0] self.assertEqual(len(recipetask.results), 1) log_delete.log_delete() with session.begin(): recipetask = RecipeTask.by_id(recipetask.id) self.assertEqual(len(recipetask.results), 0)
def test_rendered_kickstart_is_deleted(self): with session.begin(): self.job_to_delete.to_delete = datetime.datetime.utcnow() recipe = self.job_to_delete.recipesets[0].recipes[0] ks = RenderedKickstart(kickstart=u'This is not a real kickstart.') recipe.rendered_kickstart = ks log_delete.log_delete() with session.begin(): self.assertEqual(Recipe.by_id(recipe.id).rendered_kickstart, None) self.assertRaises(NoResultFound, RenderedKickstart.by_id, ks.id)
def test_rendered_kickstart_is_deleted(self): with session.begin(): self.job_to_delete.to_delete = datetime.datetime.utcnow() recipe = self.job_to_delete.recipesets[0].recipes[0] ks = RenderedKickstart(kickstart=u'This is not a real kickstart.') recipe.rendered_kickstart = ks log_delete.log_delete() with session.begin(): self.assertEqual(Recipe.by_id(recipe.id).rendered_kickstart, None) self.assertRaises(NoResultFound, RenderedKickstart.by_id, ks.id)
def test_log_delete_to_delete(self): with session.begin(): self.job_to_delete.to_delete = datetime.datetime.utcnow() self.job_to_delete.recipesets[0].recipes[0].logs.append(LogRecipe(filename=u'test.log')) r_ = self.job_to_delete.recipesets[0].recipes[0] dir = os.path.join(r_.logspath ,r_.filepath) self.make_dir(dir) f = open(os.path.join(dir,'test.log'), 'w') f.close() log_delete.log_delete() self._assert_logs_not_in_db(Job.by_id(self.job_to_delete.id)) self.check_dir_not_there(dir)
def test_log_delete_to_delete(self): with session.begin(): self.job_to_delete.to_delete = datetime.datetime.utcnow() self.job_to_delete.recipesets[0].recipes[0].logs.append(LogRecipe(filename=u'test.log')) r_ = self.job_to_delete.recipesets[0].recipes[0] dir = os.path.join(r_.logspath ,r_.filepath) self.make_dir(dir) f = open(os.path.join(dir,'test.log'), 'w') f.close() log_delete.log_delete() self._assert_logs_not_in_db(Job.by_id(self.job_to_delete.id)) self.check_dir_not_there(dir)
def test_log_delete_expired(self): with session.begin(): job_to_delete = data_setup.create_completed_job( start_time=datetime.datetime.utcnow() - datetime.timedelta(days=60), finish_time=datetime.datetime.utcnow() - datetime.timedelta(days=31)) self.job_to_delete.owner = self.user job_to_delete.recipesets[0].recipes[0].logs.append(LogRecipe(filename=u'test.log')) r_delete = job_to_delete.recipesets[0].recipes[0] dir_delete = os.path.join(r_delete.logspath ,r_delete.filepath) self.make_dir(dir_delete) fd = open(os.path.join(dir_delete,'test.log'), 'w') fd.close() log_delete.log_delete() self._assert_logs_not_in_db(Job.by_id(job_to_delete.id)) self.check_dir_not_there(dir_delete)
def test_log_delete_expired(self): with session.begin(): job_to_delete = data_setup.create_completed_job( start_time=datetime.datetime.utcnow() - datetime.timedelta(days=60), finish_time=datetime.datetime.utcnow() - datetime.timedelta(days=31)) self.job_to_delete.owner = self.user job_to_delete.recipesets[0].recipes[0].logs.append(LogRecipe(filename=u'test.log')) r_delete = job_to_delete.recipesets[0].recipes[0] dir_delete = os.path.join(r_delete.logspath ,r_delete.filepath) self.make_dir(dir_delete) fd = open(os.path.join(dir_delete,'test.log'), 'w') fd.close() log_delete.log_delete() self._assert_logs_not_in_db(Job.by_id(job_to_delete.id)) self.check_dir_not_there(dir_delete)
def test_does_not_load_RecipeTaskResults(self): # In large jobs with many RecipeTasks and RecipeTaskResults, # beaker-log-delete would previously take a long time and a lot of # memory, because it was traversing the entire object graph down to # RecipeTaskResult and loading them all into memory. # This test is asserting that no RecipeTask or RecipeTaskResult # instances are loaded when beaker-log-delete runs. with session.begin(): job = data_setup.create_completed_job() job.deleted = datetime.datetime.utcnow() recipe = job.recipesets[0].recipes[0] server = self.log_server_url + '/recipe/' open(os.path.join(self.recipe_logs_dir, 'recipe.log'), 'w').write('dummy') recipe.logs[:] = [LogRecipe(server=server, filename=u'recipe.log')] open(os.path.join(self.recipe_logs_dir, 'task.log'), 'w').write('dummy') recipe.tasks[0].logs[:] = [LogRecipeTask(server=server, filename=u'task.log')] open(os.path.join(self.recipe_logs_dir, 'result.log'), 'w').write('dummy') recipe.tasks[0].results[0].logs[:] = \ [LogRecipeTaskResult(server=server, filename=u'result.log')] # RecipeTasks/RecipeTaskResults are already loaded from the data_setup # calls above, expunge the session so that log_delete starts from # a clean slate. session.expunge_all() with mock.patch.object(RecipeTask, '__new__', side_effect=AssertionError): with mock.patch.object(RecipeTaskResult, '__new__', side_effect=AssertionError): self.assertEquals(log_delete.log_delete(), 0) # exit status # Check that we really deleted something, if not the test setup was faulty. with session.begin(): job = Job.by_id(job.id) self.assertIsNotNone(job.purged)
def test_deletion(self): os.mkdir(os.path.join(self.logs_dir, 'recipe')) open(os.path.join(self.logs_dir, 'recipe', 'dummy.txt'), 'w').write('dummy') os.mkdir(os.path.join(self.logs_dir, 'dont_tase_me_bro')) self.create_deleted_job_with_log(u'recipe/', u'dummy.txt') self.assertEquals(log_delete.log_delete(), 0) # exit status self.assert_(not os.path.exists(os.path.join(self.logs_dir, 'recipe'))) self.assert_(os.path.exists(os.path.join(self.logs_dir, 'dont_tase_me_bro')))
def test_deletes_old_jobs_which_never_started(self): with session.begin(): the_past = datetime.datetime.utcnow() - datetime.timedelta(days=31) cancelled_job = data_setup.create_job(queue_time=the_past) cancelled_job.cancel() cancelled_job.update_status() aborted_job = data_setup.create_job(queue_time=the_past) aborted_job.abort() aborted_job.update_status() self.assertEqual(cancelled_job.status, TaskStatus.cancelled) self.assertEqual(aborted_job.status, TaskStatus.aborted) self.assertIsNone(cancelled_job.recipesets[0].recipes[0].finish_time) self.assertIsNone(aborted_job.recipesets[0].recipes[0].finish_time) self.assertIsNone(cancelled_job.deleted) self.assertIsNone(aborted_job.deleted) log_delete.log_delete() with session.begin(): self.assertIsNotNone(Job.by_id(cancelled_job.id).deleted) self.assertIsNotNone(Job.by_id(aborted_job.id).deleted)
def test_log_not_delete(self): # Job that is not within it's expiry time with session.begin(): job_not_delete = data_setup.create_completed_job( start_time=datetime.datetime.utcnow() - datetime.timedelta(days=60), finish_time=datetime.datetime.utcnow() - datetime.timedelta(days=29)) job_not_delete.recipesets[0].recipes[0].logs.append(LogRecipe(filename=u'test.log')) r_not_delete = job_not_delete.recipesets[0].recipes[0] dir_not_delete = os.path.join(r_not_delete.logspath ,r_not_delete.filepath) self.make_dir(dir_not_delete) ft = open(os.path.join(dir_not_delete,'test.log'), 'w') ft.close() session.flush() log_delete.log_delete() self.assertRaises(AssertionError, self._assert_logs_not_in_db, self.job_to_delete) try: self.check_dir_not_there(dir_not_delete) raise Exception('%s was deleted when it shold not have been' % dir_not_delete) except AssertionError: pass
def test_does_not_load_RecipeTaskResults(self): # In large jobs with many RecipeTasks and RecipeTaskResults, # beaker-log-delete would previously take a long time and a lot of # memory, because it was traversing the entire object graph down to # RecipeTaskResult and loading them all into memory. # This test is asserting that no RecipeTask or RecipeTaskResult # instances are loaded when beaker-log-delete runs. with session.begin(): job = data_setup.create_completed_job() job.to_delete = datetime.datetime.utcnow() self.assertTrue(job.is_expired) recipe = job.recipesets[0].recipes[0] server = self.log_server_url + '/recipe/' open(os.path.join(self.recipe_logs_dir, 'recipe.log'), 'w').write('dummy') recipe.logs[:] = [LogRecipe(server=server, filename=u'recipe.log')] open(os.path.join(self.recipe_logs_dir, 'task.log'), 'w').write('dummy') recipe.tasks[0].logs[:] = [LogRecipeTask(server=server, filename=u'task.log')] open(os.path.join(self.recipe_logs_dir, 'result.log'), 'w').write('dummy') recipe.tasks[0].results[0].logs[:] = \ [LogRecipeTaskResult(server=server, filename=u'result.log')] # RecipeTasks/RecipeTaskResults are already loaded from the data_setup # calls above, expunge the session so that log_delete starts from # a clean slate. session.expunge_all() with mock.patch.object(RecipeTask, '__new__', side_effect=AssertionError): with mock.patch.object(RecipeTaskResult, '__new__', side_effect=AssertionError): self.assertEquals(log_delete.log_delete(), 0) # exit status # Check that we really deleted something, if not the test setup was faulty. with session.begin(): job = Job.by_id(job.id) self.assertIsNotNone(job.deleted)
def test_404(self): self.create_deleted_job_with_log(u'notexist/', u'dummy.txt') self.assertEquals(log_delete.log_delete(), 0) # exit status
def test_302_redirect(self): os.mkdir(os.path.join(self.logs_dir, 'recipe')) open(os.path.join(self.logs_dir, 'recipe', 'dummy.txt'), 'w').write('dummy') self.create_deleted_job_with_log(u'redirect/302/recipe/', u'dummy.txt') self.assertEquals(log_delete.log_delete(), 0) # exit status self.assert_(not os.path.exists(os.path.join(self.logs_dir, 'recipe')))
def test_404(self): self.create_deleted_job_with_log(u'notexist/', u'dummy.txt') self.assertEquals(log_delete.log_delete(), 0) # exit status
def test_302_redirect(self): open(os.path.join(self.recipe_logs_dir, 'dummy.txt'), 'w').write('dummy') self.create_deleted_job_with_log(u'redirect/302/recipe/', u'dummy.txt') self.assertEquals(log_delete.log_delete(), 0) # exit status self.assert_(not os.path.exists(os.path.join(self.logs_dir, 'recipe')))