Exemplo n.º 1
0
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)
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
    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
Exemplo n.º 4
0
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
Exemplo n.º 5
0
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)
Exemplo n.º 6
0
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
Exemplo n.º 7
0
    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)
Exemplo n.º 8
0
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)
Exemplo n.º 9
0
    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)
Exemplo n.º 10
0
    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
Exemplo n.º 11
0
    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
Exemplo n.º 12
0
    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