def mark_recipe_tasks_finished(recipe, result=TaskResult.pass_, task_status=TaskStatus.completed, finish_time=None, only=False, server_log=False, num_tasks=None, **kwargs): # we accept result=None to mean: don't add any results to recipetasks assert result is None or result in TaskResult finish_time = finish_time or datetime.datetime.utcnow() if not only: mark_recipe_running(recipe, **kwargs) mark_recipe_installation_finished(recipe) # Need to make sure recipe.watchdog has been persisted, since we delete it # below when the recipe completes and sqlalchemy will barf on deleting an # instance that hasn't been persisted. session.flush() if not server_log: recipe.log_server = recipe.recipeset.lab_controller.fqdn recipe.logs = [LogRecipe(path=u'recipe_path', filename=u'dummy.txt')] else: recipe.log_server = u'dummy-archive-server' recipe.logs = [ LogRecipe(server=u'http://dummy-archive-server/beaker/', path=u'recipe_path', filename=u'dummy.txt') ] if not server_log: rt_log = lambda: LogRecipeTask(path=u'tasks', filename=u'dummy.txt') else: rt_log = lambda: LogRecipeTask(server= u'http://dummy-archive-server/beaker/', path=u'tasks', filename=u'dummy.txt') if not server_log: rtr_log = lambda: LogRecipeTaskResult(path=u'/', filename=u'result.txt') else: rtr_log = lambda: LogRecipeTaskResult( server=u'http://dummy-archive-server/beaker/', path=u'/', filename=u'result.txt') for recipe_task in recipe.tasks[:num_tasks]: if result is not None: rtr = RecipeTaskResult(recipetask=recipe_task, result=result) rtr.logs = [rtr_log()] recipe_task.results.append(rtr) recipe_task.logs = [rt_log()] recipe_task.finish_time = finish_time recipe_task._change_status(task_status) log.debug('Marked %s tasks in %s as %s with result %s', num_tasks or 'all', recipe.t_id, task_status, result)
def mark_recipe_tasks_finished(recipe, result=TaskResult.pass_, task_status=TaskStatus.completed, start_time=None, finish_time=None, only=False, server_log=False, num_tasks=None, **kwargs): # we accept result=None to mean: don't add any results to recipetasks assert result is None or result in TaskResult start_time = start_time or datetime.datetime.utcnow() finish_time = finish_time or datetime.datetime.utcnow() if not only: mark_recipe_running(recipe, start_time=start_time, task_start_time=start_time, **kwargs) # Need to make sure recipe.watchdog has been persisted, since we delete it # below when the recipe completes and sqlalchemy will barf on deleting an # instance that hasn't been persisted. session.flush() if not server_log: recipe.log_server = recipe.recipeset.lab_controller.fqdn recipe.logs = [LogRecipe(path=u'recipe_path',filename=u'dummy.txt')] else: recipe.log_server = u'dummy-archive-server' recipe.logs = [LogRecipe(server=u'http://dummy-archive-server/beaker/', path=u'recipe_path', filename=u'dummy.txt' )] if not server_log: rt_log = lambda: LogRecipeTask(path=u'tasks', filename=u'dummy.txt') else: rt_log = lambda: LogRecipeTask(server=u'http://dummy-archive-server/beaker/', path=u'tasks', filename=u'dummy.txt') if not server_log: rtr_log = lambda: LogRecipeTaskResult(path=u'/', filename=u'result.txt') else: rtr_log = lambda: LogRecipeTaskResult(server=u'http://dummy-archive-server/beaker/', path=u'/', filename=u'result.txt') for recipe_task in recipe.tasks[:num_tasks]: if recipe_task.start_time is None: recipe_task.start_time = start_time if result is not None: rtr = RecipeTaskResult(path=recipe_task.name, result=result, log=u'(%s)' % result, score=0) rtr.start_time = start_time rtr.logs = [rtr_log()] recipe_task.results.append(rtr) recipe_task.logs = [rt_log()] recipe_task.finish_time = finish_time recipe_task._change_status(task_status) recipe.recipeset.job._mark_dirty() log.debug('Marked %s tasks in %s as %s with result %s', num_tasks or 'all', recipe.t_id, task_status, result)
def register_result_file(self, server, result_id, path, filename, basepath): """ register file and return path to store """ try: result = RecipeTaskResult.by_id(result_id, lockmode='update') except NoResultFound: raise BX(_('Invalid result ID: %s' % result_id)) RecipeTask.by_id(result.recipe_task_id, lockmode='update') Recipe.by_id(result.recipetask.recipe_id, lockmode='update') if result.recipetask.is_finished(): raise BX('Cannot register file for finished task %s' % result.recipetask.t_id) self._check_log_limit(result.recipetask) log_recipe = LogRecipeTaskResult.lazy_create( recipe_task_result_id=result.id, path=path, filename=filename, ) log_recipe.server = server log_recipe.basepath = basepath result.recipetask.recipe.log_server = urlparse.urlparse(server)[1] return '%s' % result.filepath
def _get_recipe_task_result_by_id(recipeid, taskid, resultid): try: result = RecipeTaskResult.by_id(resultid) except NoResultFound: raise NotFound404('Recipe task result not found') if result.recipetask.id != taskid or result.recipetask.recipe.id != recipeid: raise NotFound404('Recipe task result not found') return result
def mark_recipe_tasks_finished(recipe, result=TaskResult.pass_, task_status=TaskStatus.completed, finish_time=None, only=False, server_log=False, **kwargs): # we accept result=None to mean: don't add any results to recipetasks assert result is None or result in TaskResult finish_time = finish_time or datetime.datetime.utcnow() if not only: mark_recipe_running(recipe, **kwargs) mark_recipe_installation_finished(recipe) # Need to make sure recipe.watchdog has been persisted, since we delete it # below when the recipe completes and sqlalchemy will barf on deleting an # instance that hasn't been persisted. session.flush() if not server_log: recipe.log_server = recipe.recipeset.lab_controller.fqdn recipe.logs = [LogRecipe(path=u'recipe_path',filename=u'dummy.txt')] else: recipe.log_server = u'dummy-archive-server' recipe.logs = [LogRecipe(server=u'http://dummy-archive-server/beaker/', path=u'recipe_path', filename=u'dummy.txt' )] if not server_log: rt_log = lambda: LogRecipeTask(path=u'tasks', filename=u'dummy.txt') else: rt_log = lambda: LogRecipeTask(server=u'http://dummy-archive-server/beaker/', path=u'tasks', filename=u'dummy.txt') if not server_log: rtr_log = lambda: LogRecipeTaskResult(path=u'/', filename=u'result.txt') else: rtr_log = lambda: LogRecipeTaskResult(server=u'http://dummy-archive-server/beaker/', path=u'/', filename=u'result.txt') for recipe_task in recipe.tasks: if result is not None: rtr = RecipeTaskResult(recipetask=recipe_task, result=result) rtr.logs = [rtr_log()] recipe_task.results.append(rtr) recipe_task.logs = [rt_log()] recipe_task.finish_time = finish_time recipe_task._change_status(task_status)
def _get_recipe_task_result_by_id(recipeid, taskid, resultid): try: result = RecipeTaskResult.by_id(resultid) except NoResultFound: raise NotFound404('Recipe task result not found') if recipeid != '_' and str(result.recipetask.recipe.id) != recipeid: raise NotFound404('Recipe task result not found') if taskid != '_' and str(result.recipetask.id) != taskid: raise NotFound404('Recipe task result not found') return result
def test_show_failed_results(self): # To check correct display of failed results # - create 3 recipes with 2 tasks each # - for each recipe, mark the first task as failed in some way # (Fail, Warn, Panic) # - check clicking "Show Failed Results" tab shows only the first # - check clicking "Hide" hides the loaded task status_result_pairs = [] for result in (TaskResult.fail, TaskResult.warn, TaskResult.panic): for status in (TaskStatus.completed, TaskStatus.cancelled, TaskStatus.aborted): status_result_pairs.append((status, result)) with session.begin(): recipes = [] for __ in status_result_pairs: tasks = [data_setup.create_task() for i in range(2)] recipe = data_setup.create_recipe(task_list=tasks) recipes.append(recipe) job = data_setup.create_job_for_recipes(recipes, owner=self.user) data_setup.mark_job_queued(job) data_setup.mark_job_running(job) for recipe, (status, result) in zip(recipes, status_result_pairs): task_result = RecipeTaskResult(path=u'failure_result', result=result) recipe.tasks[0].results = [task_result] recipe.tasks[0].status = status recipe.tasks[1].start() job.update_status() b = self.browser for recipe in recipes: failed, incomplete = recipe.tasks expected_result = failed.results[0].result # These assertions ensure the task setup code above is correct self.assertEqual(recipe.status, TaskStatus.running) self.assertEqual(recipe.result, expected_result) self.assertEqual(failed.result, expected_result) self.assertEqual(incomplete.result, TaskResult.new) self.go_to_recipe_view(recipe) # Tasks should only be loaded on demand for t in recipe.tasks: self.check_task_not_loaded(recipe, t) # Failed result tab should only load the first task b.find_element_by_xpath( '//div[@id="recipe%s"]//a[text()="Show Failed Results"]' % recipe.id).click() self.check_task_visible(recipe, failed) self.check_task_not_loaded(recipe, incomplete) # Clicking "Hide" should hide the loaded task b.find_element_by_xpath( '//div[@id="recipe%s"]//a[text()="Hide"]' % recipe.id).click() self.check_task_hidden(recipe, failed) self.check_task_not_loaded(recipe, incomplete)
def mark_recipe_complete(recipe, result=TaskResult.pass_, finish_time=None, only=False, server_log=False, **kwargs): assert result in TaskResult finish_time = finish_time or datetime.datetime.utcnow() if not only: mark_recipe_running(recipe, **kwargs) # Need to make sure recipe.watchdog has been persisted, since we delete it # below when the recipe completes and sqlalchemy will barf on deleting an # instance that hasn't been persisted. session.flush() if not server_log: recipe.log_server = recipe.recipeset.lab_controller.fqdn recipe.logs = [LogRecipe(path=u'recipe_path',filename=u'dummy.txt')] else: recipe.log_server = u'dummy-archive-server' recipe.logs = [LogRecipe(server=u'http://dummy-archive-server/beaker/', path=u'recipe_path', filename=u'dummy.txt' )] if not server_log: rt_log = lambda: LogRecipeTask(path=u'tasks', filename=u'dummy.txt') else: rt_log = lambda: LogRecipeTask(server=u'http://dummy-archive-server/beaker/', path=u'tasks', filename=u'dummy.txt') if not server_log: rtr_log = lambda: LogRecipeTaskResult(path=u'/', filename=u'result.txt') else: rtr_log = lambda: LogRecipeTaskResult(server=u'http://dummy-archive-server/beaker/', path=u'/', filename=u'result.txt') for recipe_task in recipe.tasks: rtr = RecipeTaskResult(recipetask=recipe_task, result=result) rtr.logs = [rtr_log()] recipe_task.logs = [rt_log()] recipe_task.finish_time = finish_time recipe_task._change_status(TaskStatus.completed) recipe_task.results.append(rtr) recipe.resource.install_done = finish_time recipe.resource.postinstall_done = finish_time recipe.recipeset.job.update_status() log.debug('Marked %s as complete with result %s', recipe.t_id, result)
def test_fetching_large_results_is_not_too_slow(self): raise SkipTest('"slowness" is too subjective') with session.begin(): tasks = [data_setup.create_task() for _ in range(700)] recipe = data_setup.create_recipe(task_list=tasks) for rt in recipe.tasks: rt.results = [RecipeTaskResult(path=u'result_%d' % i, result=TaskResult.pass_, score=i) for i in range(10)] job = data_setup.create_job_for_recipes([recipe], owner=self.user) b = self.browser self.go_to_recipe_view(recipe) b.find_element_by_xpath('//div[@id="recipe%s"]//a[text()="Show Results"]' % recipe.id).click() # Let's set a wait time of 30 seconds and try to find the results table. # If the server is taking too long to return our results, # we will get a NoSuchElementException below. b.implicitly_wait(30) b.find_element_by_xpath('//div[@id="task_items_%s"]//table' % recipe.id)
def register_result_file(self, server, result_id, path, filename, basepath): """ register file and return path to store """ try: result = RecipeTaskResult.by_id(result_id) except InvalidRequestError: raise BX(_('Invalid result ID: %s' % result_id)) if result.recipetask.is_finished(): raise BX('Cannot register file for finished task %s' % result.recipetask.t_id) log_recipe = LogRecipeTaskResult.lazy_create(recipe_task_result_id=result.id, path=path, filename=filename, ) log_recipe.server = server log_recipe.basepath = basepath result.recipetask.recipe.log_server = urlparse.urlparse(server)[1] return '%s' % result.filepath
def register_result_file(self, server, result_id, path, filename, basepath): """ register file and return path to store """ try: result = RecipeTaskResult.by_id(result_id) except InvalidRequestError: raise BX(_('Invalid result ID: %s' % result_id)) if result.recipetask.is_finished(): raise BX('Cannot register file for finished task %s' % result.recipetask.t_id) log_recipe = LogRecipeTaskResult.lazy_create( recipe_task_result_id=result.id, path=path, filename=filename, ) log_recipe.server = server log_recipe.basepath = basepath result.recipetask.recipe.log_server = urlparse.urlparse(server)[1] return '%s' % result.filepath
def register_result_file(self, server, result_id, path, filename, basepath): """ register file and return path to store """ try: result = RecipeTaskResult.by_id(result_id, lockmode='update') except NoResultFound: raise BX(_('Invalid result ID: %s' % result_id)) RecipeTask.by_id(result.recipe_task_id, lockmode='update') Recipe.by_id(result.recipetask.recipe_id, lockmode='update') if result.recipetask.is_finished(): raise BX('Cannot register file for finished task %s' % result.recipetask.t_id) self._check_log_limit(result.recipetask) log_recipe = LogRecipeTaskResult.lazy_create(recipe_task_result_id=result.id, path=path, filename=filename, ) log_recipe.server = server log_recipe.basepath = basepath result.recipetask.recipe.log_server = urlparse.urlparse(server)[1] return '%s' % result.filepath