예제 #1
0
    def test_generate_by_whiteboard(self):
        sel = self.selenium
        sel.open('matrix')
        sel.wait_for_page_to_load('30000')
        sel.select('whiteboard', self.job_whiteboard)
        sel.click('//select[@name="whiteboard"]//option[@value="%s"]'
                % self.job_whiteboard)
        sel.click('//input[@value="Generate"]')
        sel.wait_for_page_to_load('30000')
        body = sel.get_text('//body')
        self.assert_('Pass: 1' in body)
        with session.begin():
            new_job = data_setup.create_completed_job(
                whiteboard=self.job_whiteboard, result=TaskResult.pass_,
                recipe_whiteboard=self.recipe_whiteboard)
        sel.click('//input[@value="Generate"]')
        sel.wait_for_page_to_load('30000')
        body_2 = sel.get_text('//body')
        self.assert_('Pass: 2' in body_2)

        #Try with multiple whiteboards
        with session.begin():
            another_new_job = data_setup.create_completed_job(
                whiteboard=self.job_whiteboard_2, result=TaskResult.pass_,
                recipe_whiteboard=self.recipe_whiteboard)
        sel.open('matrix')
        sel.wait_for_page_to_load('30000')
        sel.add_selection("whiteboard", "label=%s" % self.job_whiteboard)
        sel.add_selection("whiteboard", "label=%s" % self.job_whiteboard_2)
        sel.click('//input[@value="Generate"]')
        sel.wait_for_page_to_load('30000')
        body = sel.get_text('//body')
        self.assert_('Pass: 3' in body)
예제 #2
0
    def test_deleted_job_results_not_shown(self):
        with session.begin():
            data_setup.create_completed_job(
                    whiteboard=self.job_whiteboard, result=TaskResult.fail,
                    recipe_whiteboard=self.recipe_whiteboard)
            data_setup.create_completed_job(
                    whiteboard=self.job_whiteboard, result=TaskResult.warn,
                    recipe_whiteboard=self.recipe_whiteboard)
            owner = data_setup.create_user(password='******')
            self.passed_job.owner = owner
        b = self.browser
        login(b, user=owner.user_name, password='******')
        b.get(get_server_base() + 'matrix')
        b.find_element_by_xpath("//select[@name='whiteboard']/option[@value='%s']" % self.job_whiteboard).click()
        b.find_element_by_xpath('//button[@type="submit" and text()="Generate"]').click()
        report_text = b.find_element_by_xpath("//div[@id='matrix-report']").text
        self.assert_('Pass: 1' in report_text)

        # Delete Job
        with session.begin():
            self.passed_job.deleted = datetime.datetime.utcnow()

        # Assert it is no longer there
        b.get(get_server_base() + 'matrix')
        b.find_element_by_xpath("//select[@name='whiteboard']/option[@value='%s']" % self.job_whiteboard).click()
        b.find_element_by_xpath('//button[@type="submit" and text()="Generate"]').click()
        report_text = b.find_element_by_xpath("//div[@id='matrix-report']").text
        self.assert_('Pass: 1' not in report_text)
 def test_machine_hours(self):
     user = data_setup.create_user()
     # recipes/reservations straddle the boundary of the reporting period
     # to test we clamp them properly
     data_setup.create_completed_job(owner=user,
             distro_tree=data_setup.create_distro_tree(arch=u'ia64'),
             start_time=datetime.datetime(2012, 9, 30, 23, 0, 0),
             finish_time=datetime.datetime(2012, 10, 1, 1, 0, 0))
     data_setup.create_manual_reservation(user=user,
             system=data_setup.create_system(arch=u'ia64'),
             start=datetime.datetime(2012, 10, 31, 22, 30, 0),
             finish=datetime.datetime(2012, 11, 1, 1, 0, 0))
     data_setup.create_completed_job(owner=user,
             distro_tree=data_setup.create_distro_tree(arch=u'ppc64'),
             start_time=datetime.datetime(2012, 9, 30, 20, 0, 0),
             finish_time=datetime.datetime(2012, 10, 1, 2, 0, 0))
     data_setup.create_manual_reservation(user=user,
             system=data_setup.create_system(arch=u'ppc64'),
             start=datetime.datetime(2012, 10, 31, 23, 0, 0),
             finish=datetime.datetime(2012, 11, 1, 10, 0, 0))
     session.flush()
     rows = self.execute_reporting_query('machine-hours-by-user-arch')
     user_rows = [row for row in rows if row.username == user.user_name]
     self.assertEquals(len(user_rows), 2, user_rows)
     self.assertEquals(user_rows[0].arch, 'ia64')
     self.assertEquals(user_rows[0].machine_hours, Decimal('2.5'))
     self.assertEquals(user_rows[1].arch, 'ppc64')
     self.assertEquals(user_rows[1].machine_hours, Decimal('3.0'))
예제 #4
0
    def test_generate_by_whiteboard(self):
        b = self.browser
        b.get(get_server_base() + 'matrix/')
        Select(b.find_element_by_name('whiteboard'))\
            .select_by_visible_text(self.job_whiteboard)
        b.find_element_by_xpath('//button[text()="Generate"]').click()
        b.find_element_by_xpath('//table[@id="matrix_datagrid"]'
                '//td[normalize-space(string(.))="Pass: 1"]')
        with session.begin():
            new_job = data_setup.create_completed_job(
                whiteboard=self.job_whiteboard, result=TaskResult.pass_,
                recipe_whiteboard=self.recipe_whiteboard)
        b.find_element_by_xpath('//button[text()="Generate"]').click()
        b.find_element_by_xpath('//table[@id="matrix_datagrid"]'
                '//td[normalize-space(string(.))="Pass: 2"]')

        #Try with multiple whiteboards
        with session.begin():
            another_new_job = data_setup.create_completed_job(
                whiteboard=self.job_whiteboard_2, result=TaskResult.pass_,
                recipe_whiteboard=self.recipe_whiteboard)
        b.get(get_server_base() + 'matrix/')
        whiteboard = Select(b.find_element_by_name('whiteboard'))
        whiteboard.select_by_visible_text(self.job_whiteboard)
        whiteboard.select_by_visible_text(self.job_whiteboard_2)
        b.find_element_by_xpath('//button[text()="Generate"]').click()
        b.find_element_by_xpath('//table[@id="matrix_datagrid"]'
                '//td[normalize-space(string(.))="Pass: 3"]')
예제 #5
0
    def test_deleted_job_results_not_shown(self):
        with session.begin():
            data_setup.create_completed_job(
                    whiteboard=self.job_whiteboard, result=TaskResult.fail,
                    recipe_whiteboard=self.recipe_whiteboard)
            data_setup.create_completed_job(
                    whiteboard=self.job_whiteboard, result=TaskResult.warn,
                    recipe_whiteboard=self.recipe_whiteboard)
            owner = data_setup.create_user(password='******')
            self.passed_job.owner = owner
        b = self.browser
        login(b, user=owner.user_name, password='******')
        b.get(get_server_base() + 'matrix')
        b.find_element_by_xpath("//select[@name='whiteboard']/option[@value='%s']" % self.job_whiteboard).click()
        b.find_element_by_xpath('//button[@type="submit" and text()="Generate"]').click()
        report_text = b.find_element_by_xpath("//div[@id='matrix-report']").text
        self.assert_('Pass: 1' in report_text)

        # Delete Job
        with session.begin():
            self.passed_job.soft_delete()

        # Assert it is no longer there
        b.get(get_server_base() + 'matrix')
        b.find_element_by_xpath("//select[@name='whiteboard']/option[@value='%s']" % self.job_whiteboard).click()
        b.find_element_by_xpath('//button[@type="submit" and text()="Generate"]').click()
        report_text = b.find_element_by_xpath("//div[@id='matrix-report']").text
        self.assert_('Pass: 1' not in report_text)
예제 #6
0
    def test_generate_by_whiteboard(self):
        b = self.browser
        b.get(get_server_base() + 'matrix/')
        Select(b.find_element_by_name('whiteboard'))\
            .select_by_visible_text(self.job_whiteboard)
        b.find_element_by_xpath('//button[text()="Generate"]').click()
        b.find_element_by_xpath('//table[@id="matrix_datagrid"]'
                                '//td[normalize-space(string(.))="Pass: 1"]')
        with session.begin():
            new_job = data_setup.create_completed_job(
                whiteboard=self.job_whiteboard,
                result=TaskResult.pass_,
                recipe_whiteboard=self.recipe_whiteboard)
        b.find_element_by_xpath('//button[text()="Generate"]').click()
        b.find_element_by_xpath('//table[@id="matrix_datagrid"]'
                                '//td[normalize-space(string(.))="Pass: 2"]')

        #Try with multiple whiteboards
        with session.begin():
            another_new_job = data_setup.create_completed_job(
                whiteboard=self.job_whiteboard_2,
                result=TaskResult.pass_,
                recipe_whiteboard=self.recipe_whiteboard)
        b.get(get_server_base() + 'matrix/')
        whiteboard = Select(b.find_element_by_name('whiteboard'))
        whiteboard.select_by_visible_text(self.job_whiteboard)
        whiteboard.select_by_visible_text(self.job_whiteboard_2)
        b.find_element_by_xpath('//button[text()="Generate"]').click()
        b.find_element_by_xpath('//table[@id="matrix_datagrid"]'
                                '//td[normalize-space(string(.))="Pass: 3"]')
예제 #7
0
    def test_search_api_directly(self):
        with session.begin():
            self.arch_one = u'i386'
            self.osmajor_one = u'testosmajor'
            self.task_one = data_setup.create_task(name=u'/a/b/a', exclude_arches=[self.arch_one])
            self.task_two = data_setup.create_task(name=u'/a/b/b', exclude_arches=[self.arch_one])
            self.task_three = data_setup.create_task(name=u'/a/b/c', exclude_osmajors=[self.osmajor_one])
            data_setup.create_completed_job(task_list=[self.task_one, self.task_two, self.task_three])
            self.recipe_tasks = []
            for id in [t.id for t in [self.task_one, self.task_two, self.task_three]]:
                self.recipe_tasks.extend(self.get_task_query({'task_id': id}, False).all())

        all_tasks = self.recipe_tasks
        self.assertEqual(3, len(all_tasks))

        self.assert_result_counts_match('distro_tree_id', [t.recipe.distro_tree.id for t in all_tasks])
        self.assert_result_counts_match('distro_id', [t.recipe.distro_tree.distro.id for t in all_tasks])
        self.assert_result_counts_match('distro', [t.recipe.distro_tree.distro.name for t in all_tasks])
        self.assert_result_counts_match('arch_id', [t.recipe.distro_tree.arch_id for t in all_tasks])
        self.assert_result_counts_match('task_id', [t.task_id for t in all_tasks])
        self.assert_result_counts_match('task', [t.name for t in all_tasks])
        self.assert_result_counts_match('status', [t.status for t in all_tasks])
        self.assert_result_counts_match('result', [t.result for t in all_tasks])
        self.assert_result_counts_match('osmajor_id', [t.recipe.distro_tree.distro.osversion.osmajor_id for t in all_tasks])

        self.assertEqual(0, self.get_task_query({'is_failed': True}).count())

        self.assertEqual(0, self.get_task_query({'whiteboard': 'foo'}).count())
        self.assertEqual(3, self.get_task_query({'whiteboard': None}).count())

        system = all_tasks[0].recipe.resource.system
        self.assertEqual(3, self.get_task_query({'system': system.fqdn}).count())
        self.assertEqual(3, self.get_task_query({'system_id': system.id}).count())
 def test_machine_hours(self):
     user = data_setup.create_user()
     # recipes/reservations straddle the boundary of the reporting period
     # to test we clamp them properly
     data_setup.create_completed_job(
         owner=user,
         distro_tree=data_setup.create_distro_tree(arch=u'ia64'),
         start_time=datetime.datetime(2012, 9, 30, 23, 0, 0),
         finish_time=datetime.datetime(2012, 10, 1, 1, 0, 0))
     data_setup.create_manual_reservation(
         user=user,
         system=data_setup.create_system(arch=u'ia64'),
         start=datetime.datetime(2012, 10, 31, 22, 30, 0),
         finish=datetime.datetime(2012, 11, 1, 1, 0, 0))
     data_setup.create_completed_job(
         owner=user,
         distro_tree=data_setup.create_distro_tree(arch=u'ppc64'),
         start_time=datetime.datetime(2012, 9, 30, 20, 0, 0),
         finish_time=datetime.datetime(2012, 10, 1, 2, 0, 0))
     data_setup.create_manual_reservation(
         user=user,
         system=data_setup.create_system(arch=u'ppc64'),
         start=datetime.datetime(2012, 10, 31, 23, 0, 0),
         finish=datetime.datetime(2012, 11, 1, 10, 0, 0))
     session.flush()
     rows = self.execute_reporting_query('machine-hours-by-user-arch')
     user_rows = [row for row in rows if row.username == user.user_name]
     self.assertEquals(len(user_rows), 2, user_rows)
     self.assertEquals(user_rows[0].arch, 'ia64')
     self.assertEquals(user_rows[0].machine_hours, Decimal('2.5'))
     self.assertEquals(user_rows[1].arch, 'ppc64')
     self.assertEquals(user_rows[1].machine_hours, Decimal('3.0'))
예제 #9
0
    def test_nacked_recipe_results_not_shown(self):
        with session.begin():
            data_setup.create_completed_job(
                    whiteboard=self.job_whiteboard, result=TaskResult.fail,
                    recipe_whiteboard=self.recipe_whiteboard)
            data_setup.create_completed_job(
                    whiteboard=self.job_whiteboard, result=TaskResult.warn,
                    recipe_whiteboard=self.recipe_whiteboard)
            owner = data_setup.create_user(password='******')
            self.passed_job.owner = owner
        b = self.browser
        login(b, user=owner.user_name, password='******')
        b.get(get_server_base() + 'matrix')
        b.find_element_by_xpath("//select[@name='whiteboard']/option[@value='%s']" % self.job_whiteboard).click()
        b.find_element_by_xpath("//input[@name='toggle_nacks_on']").click()
        b.find_element_by_xpath('//input[@value="Generate"]').click()
        report_text = b.find_element_by_xpath("//div[@id='matrix-report']").text
        self.assert_('Pass: 1' in report_text)

        # Nack Recipe
        with session.begin():
            response = Response.by_response('nak')
            self.passed_job.recipesets[0].nacked = RecipeSetResponse(response_id=response.id)

        # Assert it is no longer there
        b.get(get_server_base() + 'matrix')
        b.find_element_by_xpath("//select[@name='whiteboard']/option[@value='%s']" % self.job_whiteboard).click()
        b.find_element_by_xpath("//input[@name='toggle_nacks_on']").click()
        b.find_element_by_xpath('//input[@value="Generate"]').click()
        report_text = b.find_element_by_xpath("//div[@id='matrix-report']").text
        self.assert_('Pass: 1' not in report_text)
예제 #10
0
 def setUp(self):
     self.password = '******'
     self.user = data_setup.create_user(password=self.password)
     self.job_to_delete = data_setup.create_completed_job(owner=self.user)
     self.job_to_delete_2 = data_setup.create_completed_job(owner=self.user)
     self.recipe_to_delete = self.job_to_delete.recipesets[0].recipes[0]
     self.selenium = self.get_selenium()
     self.selenium.start()
예제 #11
0
 def test_can_filter_by_whiteboard(self):
     with session.begin():
         excluded_job = data_setup.create_completed_job(
             whiteboard=u'whiteboard')
         included_job = data_setup.create_completed_job(
             whiteboard=u'blackboard')
     result = self.server.jobs.filter(dict(whiteboard=u'blackboard'))
     self.assertItemsEqual(result, [included_job.t_id])
예제 #12
0
    def test_search_api_directly(self):
        with session.begin():
            self.arch_one = u'i386'
            self.osmajor_one = u'testosmajor'
            self.task_one = data_setup.create_task(
                name=u'/a/b/a', exclude_arches=[self.arch_one])
            self.task_two = data_setup.create_task(
                name=u'/a/b/b', exclude_arches=[self.arch_one])
            self.task_three = data_setup.create_task(
                name=u'/a/b/c', exclude_osmajors=[self.osmajor_one])
            data_setup.create_completed_job(
                task_list=[self.task_one, self.task_two, self.task_three])
            self.recipe_tasks = []
            for id in [
                    t.id
                    for t in [self.task_one, self.task_two, self.task_three]
            ]:
                self.recipe_tasks.extend(
                    self.get_task_query({
                        'task_id': id
                    }, False).all())

        all_tasks = self.recipe_tasks
        self.assertEqual(3, len(all_tasks))

        self.assert_result_counts_match(
            'distro_tree_id', [t.recipe.distro_tree.id for t in all_tasks])
        self.assert_result_counts_match(
            'distro_id', [t.recipe.distro_tree.distro.id for t in all_tasks])
        self.assert_result_counts_match(
            'distro', [t.recipe.distro_tree.distro.name for t in all_tasks])
        self.assert_result_counts_match(
            'arch_id', [t.recipe.distro_tree.arch_id for t in all_tasks])
        self.assert_result_counts_match('task_id',
                                        [t.task_id for t in all_tasks])
        self.assert_result_counts_match('task', [t.name for t in all_tasks])
        self.assert_result_counts_match('status',
                                        [t.status for t in all_tasks])
        self.assert_result_counts_match('result',
                                        [t.result for t in all_tasks])
        self.assert_result_counts_match('osmajor_id', [
            t.recipe.distro_tree.distro.osversion.osmajor_id for t in all_tasks
        ])

        self.assertEqual(0, self.get_task_query({'is_failed': True}).count())

        self.assertEqual(0, self.get_task_query({'whiteboard': 'foo'}).count())
        self.assertEqual(3, self.get_task_query({'whiteboard': None}).count())

        system = all_tasks[0].recipe.resource.system
        self.assertEqual(3,
                         self.get_task_query({
                             'system': system.fqdn
                         }).count())
        self.assertEqual(3,
                         self.get_task_query({
                             'system_id': system.id
                         }).count())
예제 #13
0
 def test_whiteboard_filtering_handles_whiteboards_with_embedded_newlines(self):
     whiteboard = u' Colonel Tear\n\tWon'
     with session.begin():
         data_setup.create_completed_job(whiteboard=whiteboard)
     b = self.browser
     b.get(get_server_base() + 'matrix')
     b.find_element_by_xpath("//select[@name='whiteboard']/option[@value='%s']" % whiteboard).click()
     b.find_element_by_xpath('//button[@type="submit" and text()="Generate"]').click()
     b.find_element_by_link_text('Pass: 1')
예제 #14
0
 def test_can_filter_by_whiteboard_in_combination_with_other_filters(self):
     with session.begin():
         job_owner = data_setup.create_user()
         excluded_job = data_setup.create_completed_job(whiteboard=u'blackboard')
         included_job = data_setup.create_completed_job(whiteboard=u'blackboard',
                 owner=job_owner)
     result = self.server.jobs.filter(
             dict(whiteboard=u'blackboard', owner=job_owner.user_name))
     self.assertItemsEqual(result, [included_job.t_id])
예제 #15
0
 def test_whiteboard_filtering_handles_whiteboards_with_embedded_newlines(self):
     whiteboard = u' Colonel Tear\n\tWon'
     with session.begin():
         data_setup.create_completed_job(whiteboard=whiteboard)
     b = self.browser
     b.get(get_server_base() + 'matrix')
     b.find_element_by_xpath("//select[@name='whiteboard']/option[@value='%s']" % whiteboard).click()
     b.find_element_by_xpath('//button[@type="submit" and text()="Generate"]').click()
     b.find_element_by_link_text('Pass: 1')
예제 #16
0
 def test_by_log_server_skips_recently_completed_recipes(self):
     with session.begin():
         recently_completed = data_setup.create_completed_job(
                 lab_controller=self.lc, finish_time=datetime.datetime.utcnow())
         completed_yesterday = data_setup.create_completed_job(
                 lab_controller=self.lc, finish_time=datetime.datetime.utcnow()
                 - datetime.timedelta(days=1))
     result = self.server.recipes.by_log_server(self.lc.fqdn)
     self.assertEqual(result, [completed_yesterday.recipesets[0].recipes[0].id])
예제 #17
0
 def test_can_filter_by_whiteboard_in_combination_with_other_filters(self):
     with session.begin():
         job_owner = data_setup.create_user()
         excluded_job = data_setup.create_completed_job(whiteboard=u'blackboard')
         included_job = data_setup.create_completed_job(whiteboard=u'blackboard',
                 owner=job_owner)
     result = self.server.jobs.filter(
             dict(whiteboard=u'blackboard', owner=job_owner.user_name))
     self.assertItemsEqual(result, [included_job.t_id])
 def test_system_age(self):
     system = data_setup.create_system(date_added=
             datetime.datetime.utcnow() - datetime.timedelta(days=100),
             lab_controller=data_setup.create_labcontroller())
     for _ in range(5):
         data_setup.create_completed_job(system=system)
     session.flush()
     row, = [row for row in self.execute_reporting_query('system-age')
             if row.fqdn == system.fqdn]
     self.assertEquals(row.age_days, 100)
     self.assertEquals(row.recipe_count, 5)
예제 #19
0
 def test_filter_finished_jobs(self):
     with session.begin():
         completed_job = data_setup.create_completed_job(task_status=TaskStatus.completed)
         cancelled_job = data_setup.create_completed_job(task_status=TaskStatus.cancelled)
         aborted_job = data_setup.create_completed_job(task_status=TaskStatus.aborted)
         running_job = data_setup.create_running_job()
     out = run_client(['bkr', 'job-list', '--finished'])
     self.assertIn(completed_job.t_id, out)
     self.assertIn(cancelled_job.t_id, out)
     self.assertIn(aborted_job.t_id, out)
     self.assertNotIn(running_job.t_id, out)
예제 #20
0
 def setUpClass(cls):
     # create a bunch of jobs
     with session.begin():
         cls.user = user = data_setup.create_user(password='******')
         arches = [u'i386', u'x86_64', u'ia64']
         distros = [data_setup.create_distro(name=name) for name in
                 [u'DAN5-Server-U5', u'DAN5-Client-U5', u'DAN6-U1', u'DAN6-RC3']]
         for arch in arches:
             for distro in distros:
                 distro_tree = data_setup.create_distro_tree(distro=distro, arch=arch)
                 data_setup.create_job(owner=user, distro_tree=distro_tree)
                 data_setup.create_completed_job(owner=user, distro_tree=distro_tree)
예제 #21
0
 def setUpClass(cls):
     # create a bunch of jobs
     with session.begin():
         cls.user = user = data_setup.create_user(password='******')
         arches = [u'i386', u'x86_64', u'ia64']
         distros = [data_setup.create_distro(name=name) for name in
                 [u'DAN5-Server-U5', u'DAN5-Client-U5', u'DAN6-U1', u'DAN6-RC3']]
         for arch in arches:
             for distro in distros:
                 distro_tree = data_setup.create_distro_tree(distro=distro, arch=arch)
                 data_setup.create_job(owner=user, distro_tree=distro_tree)
                 data_setup.create_completed_job(owner=user, distro_tree=distro_tree)
예제 #22
0
 def test_max_whiteboard(self):
     max = Job.max_by_whiteboard
     c = 0
     whiteboard =u'whiteboard'
     with session.begin():
         while c <= max:
             data_setup.create_completed_job(whiteboard=whiteboard)
             c += 1
     b = self.browser
     b.get(get_server_base() + 'matrix')
     b.find_element_by_xpath("//select[@name='whiteboard']/option[@value='%s']" % whiteboard).click()
     b.find_element_by_xpath('//button[@type="submit" and text()="Generate"]').click()
     self.failUnless(is_text_present(b, "Your whiteboard contains %d jobs, only %s will be used" % (c, Job.max_by_whiteboard)))
예제 #23
0
 def test_max_whiteboard(self):
     max = Job.max_by_whiteboard
     c = 0
     whiteboard =u'whiteboard'
     with session.begin():
         while c <= max:
             data_setup.create_completed_job(whiteboard=whiteboard)
             c += 1
     b = self.browser
     b.get(get_server_base() + 'matrix')
     b.find_element_by_xpath("//select[@name='whiteboard']/option[@value='%s']" % whiteboard).click()
     b.find_element_by_xpath('//button[@type="submit" and text()="Generate"]').click()
     self.failUnless(is_text_present(b, "Your whiteboard contains %d jobs, only %s will be used" % (c, Job.max_by_whiteboard)))
예제 #24
0
 def test_filter_finished_jobs(self):
     with session.begin():
         completed_job = data_setup.create_completed_job(
             task_status=TaskStatus.completed)
         cancelled_job = data_setup.create_completed_job(
             task_status=TaskStatus.cancelled)
         aborted_job = data_setup.create_completed_job(
             task_status=TaskStatus.aborted)
         running_job = data_setup.create_running_job()
     out = run_client(['bkr', 'job-list', '--finished'])
     self.assertIn(completed_job.t_id, out)
     self.assertIn(cancelled_job.t_id, out)
     self.assertIn(aborted_job.t_id, out)
     self.assertNotIn(running_job.t_id, out)
예제 #25
0
 def test_list_jobs_by_retention_tag(self):
     with session.begin():
         job_tagged_scratch = data_setup.create_completed_job(
                 retention_tag=u'scratch')
         job_tagged_audit = data_setup.create_completed_job(
                 retention_tag=u'audit', product=data_setup.create_product())
     out = run_client(['bkr', 'job-list', '--format=json', '--tag=audit'])
     joblist = json.loads(out)
     self.assertIn(job_tagged_audit.t_id, joblist)
     self.assertNotIn(job_tagged_scratch.t_id, joblist)
     out = run_client(['bkr', 'job-list', '--format=json', '--tag=scratch'])
     joblist = json.loads(out)
     self.assertIn(job_tagged_scratch.t_id, joblist)
     self.assertNotIn(job_tagged_audit.t_id, joblist)
예제 #26
0
 def test_system_age(self):
     system = data_setup.create_system(
         date_added=datetime.datetime.utcnow() -
         datetime.timedelta(days=100),
         lab_controller=data_setup.create_labcontroller())
     for _ in range(5):
         data_setup.create_completed_job(system=system)
     session.flush()
     row, = [
         row for row in self.execute_reporting_query('system-age')
         if row.fqdn == system.fqdn
     ]
     self.assertEquals(row.age_days, 100)
     self.assertEquals(row.recipe_count, 5)
예제 #27
0
 def test_list_jobs_by_retention_tag(self):
     with session.begin():
         job_tagged_scratch = data_setup.create_completed_job(
                 retention_tag=u'scratch')
         job_tagged_audit = data_setup.create_completed_job(
                 retention_tag=u'audit', product=data_setup.create_product())
     out = run_client(['bkr', 'job-list', '--format=json', '--tag=audit'])
     joblist = json.loads(out)
     self.assertIn(job_tagged_audit.t_id, joblist)
     self.assertNotIn(job_tagged_scratch.t_id, joblist)
     out = run_client(['bkr', 'job-list', '--format=json', '--tag=scratch'])
     joblist = json.loads(out)
     self.assertIn(job_tagged_scratch.t_id, joblist)
     self.assertNotIn(job_tagged_audit.t_id, joblist)
예제 #28
0
 def test_list_jobs_by_retention_tag(self):
     with session.begin():
         job_tagged_scratch = data_setup.create_completed_job(retention_tag=u"scratch")
         job_tagged_audit = data_setup.create_completed_job(
             retention_tag=u"audit", product=data_setup.create_product()
         )
     out = run_client(["bkr", "job-list", "--format=json", "--tag=audit"])
     joblist = json.loads(out)
     self.assertIn(job_tagged_audit.t_id, joblist)
     self.assertNotIn(job_tagged_scratch.t_id, joblist)
     out = run_client(["bkr", "job-list", "--format=json", "--tag=scratch"])
     joblist = json.loads(out)
     self.assertIn(job_tagged_scratch.t_id, joblist)
     self.assertNotIn(job_tagged_audit.t_id, joblist)
예제 #29
0
    def test_single_job(self):
        with session.begin():
            unique_whiteboard = data_setup.unique_name('whiteboard%s')
            non_unique_whiteboard = data_setup.unique_name('whiteboard%s')
            non_unique_rwhiteboard = data_setup.unique_name('rwhiteboard%s')
            distro_tree = data_setup.create_distro_tree(arch=u'i386')
            for i in range(0,9):
                data_setup.create_completed_job(
                        whiteboard=non_unique_whiteboard, result=TaskResult.pass_,
                        recipe_whiteboard=non_unique_rwhiteboard,
                        distro_tree=distro_tree)

            single_job = data_setup.create_completed_job(
                    whiteboard=unique_whiteboard, result=TaskResult.pass_,
                    recipe_whiteboard=data_setup.unique_name('rwhiteboard%s'),
                    distro_tree=distro_tree)

        b = self.browser
        b.get(get_server_base() + 'matrix')
        # No need to filter the whiteboard, we just created the jobs so they 
        # will be at the top of the list of whiteboards.
        b.find_element_by_xpath("//select/option[@value='%s']" % unique_whiteboard).click()
        b.find_element_by_xpath('//input[@value="Generate"]').click()
        b.find_element_by_link_text('Pass: 1').click()
        task_id = b.find_element_by_xpath('//table[position()=2]//tr[position()=2]/td').text
        self.assertEqual(task_id,
            single_job.recipesets[0].recipes[0].tasks[0].t_id)

        # Test by job id
        # See https://bugzilla.redhat.com/show_bug.cgi?id=803713
        with session.begin():
            single_job_2 = data_setup.create_completed_job(
                    whiteboard=non_unique_whiteboard, result=TaskResult.pass_,
                    recipe_whiteboard=non_unique_rwhiteboard,
                    distro_tree=distro_tree)
        b = self.browser
        b.get(get_server_base() + 'matrix')
        b.find_element_by_id('remote_form_job_ids').send_keys(str(single_job_2.id))
        b.find_element_by_xpath('//input[@value="Generate"]').click()
        b.find_element_by_link_text('Pass: 1').click()

        # This tests that we are indeed only looking at one recipe task.
        task_spec_columns = b.find_elements_by_xpath('//table[2]//tr/td[1]')
        failed = True
        for col in task_spec_columns:
            if col and col.text.strip():
                self.assertEqual(col.text, single_job_2.recipesets[0].recipes[0].tasks[0].t_id)
                failed=False
        self.assert_(not failed)
예제 #30
0
    def test_single_job(self):
        with session.begin():
            unique_whiteboard = data_setup.unique_name('whiteboard%s')
            non_unique_whiteboard = data_setup.unique_name('whiteboard%s')
            non_unique_rwhiteboard = data_setup.unique_name('rwhiteboard%s')
            distro_tree = data_setup.create_distro_tree(arch=u'i386')
            for i in range(0,9):
                data_setup.create_completed_job(
                        whiteboard=non_unique_whiteboard, result=TaskResult.pass_,
                        recipe_whiteboard=non_unique_rwhiteboard,
                        distro_tree=distro_tree)

            single_job = data_setup.create_completed_job(
                    whiteboard=unique_whiteboard, result=TaskResult.pass_,
                    recipe_whiteboard=data_setup.unique_name('rwhiteboard%s'),
                    distro_tree=distro_tree)

        b = self.browser
        b.get(get_server_base() + 'matrix')
        # No need to filter the whiteboard, we just created the jobs so they 
        # will be at the top of the list of whiteboards.
        b.find_element_by_xpath("//select/option[@value='%s']" % unique_whiteboard).click()
        b.find_element_by_xpath('//button[@type="submit" and text()="Generate"]').click()
        b.find_element_by_link_text('Pass: 1').click()
        # Should take us to Executed Tasks filtered by whiteboard.
        # There should only be one task in the results.
        tasks_table = b.find_element_by_css_selector('table.tasks')
        task_ids = [e.text for e in tasks_table.find_elements_by_xpath(
                'tbody/tr/td[1][@class="task"]')]
        self.assertEquals(task_ids, [single_job.recipesets[0].recipes[0].tasks[0].t_id])

        # Test by job id
        # See https://bugzilla.redhat.com/show_bug.cgi?id=803713
        with session.begin():
            single_job_2 = data_setup.create_completed_job(
                    whiteboard=non_unique_whiteboard, result=TaskResult.pass_,
                    recipe_whiteboard=non_unique_rwhiteboard,
                    distro_tree=distro_tree)
        b = self.browser
        b.get(get_server_base() + 'matrix')
        b.find_element_by_id('remote_form_job_ids').send_keys(str(single_job_2.id))
        b.find_element_by_xpath('//button[@type="submit" and text()="Generate"]').click()
        b.find_element_by_link_text('Pass: 1').click()
        # Should take us to Executed Tasks filtered by whiteboard and job ID.
        # There should only be one task in the results.
        tasks_table = b.find_element_by_css_selector('table.tasks')
        task_ids = [e.text for e in tasks_table.find_elements_by_xpath(
                'tbody/tr/td[1][@class="task"]')]
        self.assertEquals(task_ids, [single_job_2.recipesets[0].recipes[0].tasks[0].t_id])
예제 #31
0
    def test_single_job(self):
        with session.begin():
            unique_whiteboard = data_setup.unique_name('whiteboard%s')
            non_unique_whiteboard = data_setup.unique_name('whiteboard%s')
            non_unique_rwhiteboard = data_setup.unique_name('rwhiteboard%s')
            distro_tree = data_setup.create_distro_tree(arch=u'i386')
            for i in range(0,9):
                data_setup.create_completed_job(
                        whiteboard=non_unique_whiteboard, result=TaskResult.pass_,
                        recipe_whiteboard=non_unique_rwhiteboard,
                        distro_tree=distro_tree)

            single_job = data_setup.create_completed_job(
                    whiteboard=unique_whiteboard, result=TaskResult.pass_,
                    recipe_whiteboard=data_setup.unique_name('rwhiteboard%s'),
                    distro_tree=distro_tree)

        b = self.browser
        b.get(get_server_base() + 'matrix')
        # No need to filter the whiteboard, we just created the jobs so they 
        # will be at the top of the list of whiteboards.
        b.find_element_by_xpath("//select/option[@value='%s']" % unique_whiteboard).click()
        b.find_element_by_xpath('//button[@type="submit" and text()="Generate"]').click()
        b.find_element_by_link_text('Pass: 1').click()
        # Should take us to Executed Tasks filtered by whiteboard.
        # There should only be one task in the results.
        tasks_table = b.find_element_by_css_selector('table.tasks')
        task_ids = [e.text for e in tasks_table.find_elements_by_xpath(
                'tbody/tr/td[1][@class="task"]')]
        self.assertEquals(task_ids, [single_job.recipesets[0].recipes[0].tasks[0].t_id])

        # Test by job id
        # See https://bugzilla.redhat.com/show_bug.cgi?id=803713
        with session.begin():
            single_job_2 = data_setup.create_completed_job(
                    whiteboard=non_unique_whiteboard, result=TaskResult.pass_,
                    recipe_whiteboard=non_unique_rwhiteboard,
                    distro_tree=distro_tree)
        b = self.browser
        b.get(get_server_base() + 'matrix')
        b.find_element_by_id('remote_form_job_ids').send_keys(str(single_job_2.id))
        b.find_element_by_xpath('//button[@type="submit" and text()="Generate"]').click()
        b.find_element_by_link_text('Pass: 1').click()
        # Should take us to Executed Tasks filtered by whiteboard and job ID.
        # There should only be one task in the results.
        tasks_table = b.find_element_by_css_selector('table.tasks')
        task_ids = [e.text for e in tasks_table.find_elements_by_xpath(
                'tbody/tr/td[1][@class="task"]')]
        self.assertEquals(task_ids, [single_job_2.recipesets[0].recipes[0].tasks[0].t_id])
예제 #32
0
 def setupClass(cls):
     with session.begin():
         cls.product_one = data_setup.create_product()
         cls.product_two = data_setup.create_product()
         cls.distro_tree = data_setup.create_distro_tree(osmajor=u'customosmajor')
         cls.password = u'password'
         cls.user = data_setup.create_user(password=cls.password)
         cls.scratch_job = data_setup.create_completed_job(
                 retention_tag=u'scratch', owner=cls.user,
                 product=cls.product_one, distro_tree=cls.distro_tree)
         cls.sixty_days_job = data_setup.create_completed_job(
                 retention_tag=u'60Days', product=cls.product_two,
                 owner=cls.user)
     cls.server = cls.get_server()
     cls.server.auth.login_password(cls.user.user_name, cls.password)
예제 #33
0
 def test_executed_tasks_family_sorting(self):
     with session.begin():
         task = data_setup.create_task()
         data_setup.create_completed_job(task_name=task.name,
                 distro_tree=data_setup.create_distro_tree(osmajor=u'BlueShoe10'))
         data_setup.create_completed_job(task_name=task.name,
                 distro_tree=data_setup.create_distro_tree(osmajor=u'BlueShoe9'))
         # plus one that is never used
         OSMajor.lazy_create(osmajor=u'neverused666')
     b = self.browser
     b.get(get_server_base() + 'tasks/%d' % task.id)
     options = [element.text for element in
             b.find_elements_by_xpath("//select[@name='osmajor_id']/option")]
     self.assert_(options.index('BlueShoe9') < options.index('BlueShoe10'), options)
     self.assert_('neverused666' not in options, options)
예제 #34
0
 def test_list_jobs_by_whiteboard_substring(self):
     with session.begin():
         included_job = data_setup.create_completed_job(whiteboard=u"Prince of Penzance")
         excluded_job = data_setup.create_completed_job(whiteboard=u"Princess of Persia")
     out = run_client(["bkr", "job-list", "--format=list", "--whiteboard=penzance"])
     listed_job_ids = out.splitlines()
     self.assertIn(included_job.t_id, listed_job_ids)
     self.assertNotIn(excluded_job.t_id, listed_job_ids)
     # This was accidental undocumented functionality supported by the
     # original implementation of jobs.filter. Some people are probably
     # relying on it.
     out = run_client(["bkr", "job-list", "--format=list", "--whiteboard=p%z_nce"])
     listed_job_ids = out.splitlines()
     self.assertIn(included_job.t_id, listed_job_ids)
     self.assertNotIn(excluded_job.t_id, listed_job_ids)
예제 #35
0
 def test_list_jobs_by_whiteboard_substring(self):
     with session.begin():
         included_job = data_setup.create_completed_job(whiteboard=u'Prince of Penzance')
         excluded_job = data_setup.create_completed_job(whiteboard=u'Princess of Persia')
     out = run_client(['bkr', 'job-list', '--format=list', '--whiteboard=penzance'])
     listed_job_ids = out.splitlines()
     self.assertIn(included_job.t_id, listed_job_ids)
     self.assertNotIn(excluded_job.t_id, listed_job_ids)
     # This was accidental undocumented functionality supported by the 
     # original implementation of jobs.filter. Some people are probably 
     # relying on it.
     out = run_client(['bkr', 'job-list', '--format=list', '--whiteboard=p%z_nce'])
     listed_job_ids = out.splitlines()
     self.assertIn(included_job.t_id, listed_job_ids)
     self.assertNotIn(excluded_job.t_id, listed_job_ids)
예제 #36
0
 def test_change_files(self):
     with session.begin():
         job = data_setup.create_completed_job()
         recipe = job.recipesets[0].recipes[0]
     self.server.auth.login_password(self.lc.user.user_name, u'logmein')
     # beaker-transfer calls something like this, after it finishes copying
     # the logs from the LC cache to the archive server
     self.server.recipes.change_files(
         recipe.id, 'http://archive.example.com/beaker-logs',
         '/var/www/html/beaker-logs')
     with session.begin():
         session.expire_all()
         # The actual value of .server and .basepath will depend on the date
         # and database IDs, so let's just check that it starts with the new
         # expected location.
         for log in [
                 recipe.logs[0], recipe.tasks[0].logs[0],
                 recipe.tasks[0].results[0].logs[0]
         ]:
             self.assert_(
                 log.server.startswith(
                     'http://archive.example.com/beaker-logs/'), log.server)
             self.assert_(
                 log.basepath.startswith('/var/www/html/beaker-logs/'),
                 log.basepath)
예제 #37
0
    def test_executed_tasks(self):
        with session.begin():
            task_two = data_setup.create_task(
                name=data_setup.unique_name(u'/a/a/a%s'))
            task_one = data_setup.create_task(
                name=data_setup.unique_name(u'/a/a/a%s'))
            job = data_setup.create_completed_job(
                task_list=[task_one, task_two])
        b = self.browser
        r = job.recipesets[0].recipes[0]
        rtask = r.tasks[0]
        b.get(get_server_base() + 'tasks/%d' % rtask.task.id)
        b.find_element_by_xpath(
            "//select[@name='osmajor_id']/"
            "option[normalize-space(text())='%s']" %
            r.distro_tree.distro.osversion.osmajor).click()
        b.find_element_by_xpath("//form[@id='form']").submit()
        self.check_recipetask_present_in_results(rtask)

        # Search by single recipe task id
        b.get(get_server_base() +
              'tasks/executed?recipe_task_id=%s' % rtask.id)
        self.check_recipetask_present_in_results(rtask)

        # Search by multiple recipe task id
        rtask2 = r.tasks[1]
        b.get(get_server_base() +
              'tasks/executed?recipe_task_id=%s&recipe_task_id=%s' %
              (rtask2.id, rtask.id))
        self.check_recipetask_present_in_results(rtask)
        self.check_recipetask_present_in_results(rtask2)
예제 #38
0
 def test_cant_delete_group_mates_job(self):
     # XXX This whole test can go away with BZ#1000861
     try:
         stop_process('gunicorn')
     except ValueError:
         # It seems gunicorn is not a running process
         raise SkipTest('Can only run this test against gunicorn')
     try:
         tmp_config = edit_file(
             CONFIG_FILE,
             'beaker.deprecated_job_group_permissions.on = True',
             'beaker.deprecated_job_group_permissions.on = False')
         start_process('gunicorn',
                       env={'BEAKER_CONFIG_FILE': tmp_config.name})
         with session.begin():
             group = data_setup.create_group()
             mate = data_setup.create_user(password=u'asdf')
             test_job = data_setup.create_completed_job(owner=mate)
             data_setup.add_user_to_group(self.user, group)
             data_setup.add_user_to_group(mate, group)
         try:
             run_client(['bkr', 'job-delete', test_job.t_id],
                        config=self.client_config)
             self.fail('We should not have permission to delete %s' % \
                 test_job.t_id)
         except ClientError, e:
             self.assertIn(
                 "You don't have permission to delete job %s" %
                 test_job.t_id, e.stderr_output)
     finally:
         stop_process('gunicorn')
         start_process('gunicorn')
예제 #39
0
 def _create_jobs():
     with session.begin():
         for i in range(limit + 1):
             job_to_purge = data_setup.create_completed_job()
             job_to_purge.recipesets[0].recipes[0].logs.append(
                 LogRecipe(filename=u'test.log'))
             job_to_purge.deleted = datetime.datetime.utcnow()
예제 #40
0
    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)
예제 #41
0
 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'))
예제 #42
0
 def test_cant_delete_group_mates_job(self):
     # XXX This whole test can go away with BZ#1000861
     try:
         stop_process('gunicorn')
     except ValueError:
         # It seems gunicorn is not a running process
         raise SkipTest('Can only run this test against gunicorn')
     try:
         tmp_config = edit_file(CONFIG_FILE, 'beaker.deprecated_job_group_permissions.on = True',
             'beaker.deprecated_job_group_permissions.on = False')
         start_process('gunicorn', env={'BEAKER_CONFIG_FILE': tmp_config.name})
         with session.begin():
             group = data_setup.create_group()
             mate = data_setup.create_user(password=u'asdf')
             test_job = data_setup.create_completed_job(owner=mate)
             data_setup.add_user_to_group(self.user, group)
             data_setup.add_user_to_group(mate, group)
         try:
             run_client(['bkr', 'job-delete', test_job.t_id],
                 config=self.client_config)
             self.fail('We should not have permission to delete %s' % \
                 test_job.t_id)
         except ClientError, e:
             self.assertIn("You don't have permission to delete job %s" %
             test_job.t_id, e.stderr_output)
     finally:
         stop_process('gunicorn')
         start_process('gunicorn')
예제 #43
0
 def setUp(self):
     # set up a directory for our dummy job logs, with an HTTP server
     self.logs_dir = tempfile.mkdtemp(prefix='beaker-client-test-job-logs')
     self.addCleanup(shutil.rmtree, self.logs_dir, ignore_errors=True)
     self.archive_server = Process('http_server.py', args=[sys.executable,
             pkg_resources.resource_filename('bkr.inttest', 'http_server.py'),
             '--base', self.logs_dir], listen_port=19998)
     self.archive_server.start()
     self.addCleanup(self.archive_server.stop)
     self.log_server_url = u'http://localhost:19998/'
     # job for testing
     with session.begin():
         self.job = data_setup.create_completed_job()
         recipe = self.job.recipesets[0].recipes[0]
         os.mkdir(os.path.join(self.logs_dir, 'R'))
         open(os.path.join(self.logs_dir, 'R', 'dummy.txt'), 'w').write('recipe\n')
         recipe.logs[:] = [LogRecipe(server=self.log_server_url,
                 path=u'R', filename=u'dummy.txt')]
         os.mkdir(os.path.join(self.logs_dir, 'T'))
         open(os.path.join(self.logs_dir, 'T', 'dummy.txt'), 'w').write('task\n')
         recipe.tasks[0].logs[:] = [LogRecipeTask(server=self.log_server_url,
                 path=u'T', filename=u'dummy.txt')]
         os.mkdir(os.path.join(self.logs_dir, 'TR'))
         open(os.path.join(self.logs_dir, 'TR', 'dummy.txt'), 'w').write('result\n')
         recipe.tasks[0].results[0].logs[:] = [LogRecipeTaskResult(
                 server=self.log_server_url,
                 path=u'TR', filename=u'dummy.txt')]
예제 #44
0
 def test_by_log_server_skips_deleted_recipes(self):
     with session.begin():
         job = data_setup.create_completed_job(lab_controller=self.lc,
                 finish_time=datetime.datetime.utcnow() - datetime.timedelta(minutes=2))
         job.deleted = datetime.datetime.utcnow()
     result = self.server.recipes.by_log_server(self.lc.fqdn)
     self.assertEqual(result, [])
예제 #45
0
    def test_can_print_prettyxml(self):
        with session.begin():
            distro_tree = data_setup.create_distro_tree(distro_name=u'DansAwesomeLinux6.5-20160418.1')
            job = data_setup.create_completed_job(whiteboard=u'foo', distro_tree=distro_tree)
        expected_xml = """
<?xml version='1.0' encoding='utf8'?>
<job retention_tag="scratch">
  <whiteboard>foo</whiteboard>
  <recipeSet priority="Normal">
    <recipe whiteboard="" role="STANDALONE" ks_meta="" kernel_options="" kernel_options_post="">
      <autopick random="false"/>
      <watchdog/>
      <packages/>
      <ks_appends/>
      <repos/>
      <distroRequires>
        <and>
          <distro_family op="=" value="DansAwesomeLinux6"/>
          <distro_variant op="=" value="Server"/>
          <distro_name op="=" value="DansAwesomeLinux6.5-20160418.1"/>
          <distro_arch op="=" value="i386"/>
        </and>
      </distroRequires>
      <hostRequires>
        <system_type value="Machine"/>
      </hostRequires>
      <partitions/>
      <task name="/distribution/reservesys" role="STANDALONE"/>
    </recipe>
  </recipeSet>
</job>"""
        out = run_client(['bkr', 'job-clone','--prettyxml', job.t_id])
        self.assert_('Submitted:' in out)
        actual_xml = out[:out.find('Submitted')]
        self.assertMultiLineEqual(expected_xml.strip(), actual_xml.strip())
예제 #46
0
 def test_nonascii_chars_in_job_xml(self):
     with session.begin():
         job = data_setup.create_completed_job(whiteboard=u"Фёдор Михайлович Достоевский")
     out = run_client(["bkr", "job-results", job.t_id])
     self.assertIn(job.whiteboard, out.decode("utf8"))
     out = run_client(["bkr", "job-results", "--prettyxml", job.t_id])
     self.assertIn(job.whiteboard, out.decode("utf8"))
예제 #47
0
 def setUpClass(cls):
     cls.running_job = data_setup.create_job()
     cls.queued_job = data_setup.create_job()
     cls.completed_job = data_setup.create_completed_job()
     data_setup.mark_job_queued(cls.queued_job)
     data_setup.mark_job_running(cls.running_job)
     cls.browser = cls.get_browser()
예제 #48
0
 def setUp(self):
     # set up a directory for our dummy job logs, with an HTTP server
     self.logs_dir = tempfile.mkdtemp(prefix='beaker-client-test-job-logs')
     self.addCleanup(shutil.rmtree, self.logs_dir, ignore_errors=True)
     self.archive_server = Process('http_server.py', args=[sys.executable,
             pkg_resources.resource_filename('bkr.inttest', 'http_server.py'),
             '--base', self.logs_dir], listen_port=19998)
     self.archive_server.start()
     self.addCleanup(self.archive_server.stop)
     self.log_server_url = u'http://localhost:19998/'
     # job for testing
     with session.begin():
         self.job = data_setup.create_completed_job()
         self.recipe = self.job.recipesets[0].recipes[0]
         os.mkdir(os.path.join(self.logs_dir, 'R'))
         open(os.path.join(self.logs_dir, 'R', 'dummy.txt'), 'w').write('recipe\n')
         self.recipe.logs[:] = [LogRecipe(server=self.log_server_url,
                 path=u'R', filename=u'dummy.txt')]
         os.mkdir(os.path.join(self.logs_dir, 'T'))
         open(os.path.join(self.logs_dir, 'T', 'dummy.txt'), 'w').write('task\n')
         self.recipe.tasks[0].logs[:] = [LogRecipeTask(server=self.log_server_url,
                 path=u'T', filename=u'dummy.txt')]
         os.mkdir(os.path.join(self.logs_dir, 'TR'))
         open(os.path.join(self.logs_dir, 'TR', 'dummy.txt'), 'w').write('result\n')
         self.recipe.tasks[0].results[0].logs[:] = [LogRecipeTaskResult(
                 server=self.log_server_url,
                 path=u'TR', filename=u'dummy.txt')]
예제 #49
0
 def setUp(self):
     with session.begin():
         self.owner = data_setup.create_user(password='******')
         self.job = data_setup.create_completed_job(owner=self.owner)
         self.recipe = self.job.recipesets[0].recipes[0]
         self.recipetask = self.recipe.tasks[0]
         self.result = self.recipetask.results[0]
예제 #50
0
 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'))
예제 #51
0
    def setUp(self):
        jobs_to_generate = 2
        self.products = [
            data_setup.create_product() for _ in range(jobs_to_generate)
        ]
        self.users = [
            data_setup.create_user(password='******')
            for _ in range(jobs_to_generate)
        ]
        self.groups = [
            data_setup.create_group() for _ in range(jobs_to_generate)
        ]
        _ = [
            group.add_member(self.users[i])
            for i, group in enumerate(self.groups)
        ]

        self.jobs = [
            data_setup.create_completed_job(product=self.products[x],
                                            owner=self.users[x],
                                            group=self.groups[x])
            for x in range(jobs_to_generate)
        ]
        self.client_configs = [
            create_client_config(username=user.user_name, password='******')
            for user in self.users
        ]
예제 #52
0
 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()
     run_command('log_delete.py', 'beaker-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
예제 #53
0
 def setUp(self):
     with session.begin():
         self.owner = data_setup.create_user(password='******')
         self.job = data_setup.create_completed_job(owner=self.owner)
         self.recipe = self.job.recipesets[0].recipes[0]
         self.recipetask = self.recipe.tasks[0]
         self.result = self.recipetask.results[0]
예제 #54
0
 def setUp(self):
     with session.begin():
         self.running_job = data_setup.create_job()
         self.queued_job = data_setup.create_job()
         self.completed_job = data_setup.create_completed_job()
         data_setup.mark_job_queued(self.queued_job)
         data_setup.mark_job_running(self.running_job)
     self.browser = self.get_browser()
예제 #55
0
 def test_nonascii_chars_in_job_xml(self):
     with session.begin():
         job = data_setup.create_completed_job(
             whiteboard=u'Фёдор Михайлович Достоевский')
     out = run_client(['bkr', 'job-results', job.t_id])
     self.assertIn(job.whiteboard, out.decode('utf8'))
     out = run_client(['bkr', 'job-results', '--prettyxml', job.t_id])
     self.assertIn(job.whiteboard, out.decode('utf8'))
예제 #56
0
 def test_whiteboard_filtering(self):
     whiteboard = u'Colonel Tear Won'
     with session.begin():
         data_setup.create_completed_job(whiteboard=whiteboard)
     b = self.browser
     b.get(get_server_base() + 'matrix')
     b.find_element_by_id('remote_form_whiteboard_filter')\
         .send_keys('this will not find anything')
     b.find_element_by_id('remote_form_do_filter').click()
     # Wait for our empty list of whiteboards to come back
     b.find_element_by_xpath('//select[@name="whiteboard" and not(./option)]')
     # Now filter for a real whiteboard
     b.find_element_by_id('remote_form_whiteboard_filter').clear()
     b.find_element_by_id('remote_form_whiteboard_filter')\
         .send_keys(whiteboard[:len(whiteboard) // 2])
     b.find_element_by_id('remote_form_do_filter').click()
     b.find_element_by_xpath("//select[@name='whiteboard']/option[@value='%s']" % whiteboard)
예제 #57
0
    def setUp(self):
        self.job_whiteboard = data_setup.unique_name(u'foobarhi %s')
        self.recipe_whiteboard = data_setup.unique_name(u'sdfjkljk%s')
        self.passed_job = data_setup.create_completed_job(
                whiteboard=self.job_whiteboard, result=TaskResult.pass_,
                recipe_whiteboard=self.recipe_whiteboard)

        self.browser = self.get_browser()
예제 #58
0
 def test_whiteboard_filtering(self):
     whiteboard = u'Colonel Tear Won'
     with session.begin():
         data_setup.create_completed_job(whiteboard=whiteboard)
     b = self.browser
     b.get(get_server_base() + 'matrix')
     b.find_element_by_id('remote_form_whiteboard_filter')\
         .send_keys('this will not find anything')
     b.find_element_by_id('remote_form_do_filter').click()
     # Wait for our empty list of whiteboards to come back
     b.find_element_by_xpath('//select[@name="whiteboard" and not(./option)]')
     # Now filter for a real whiteboard
     b.find_element_by_id('remote_form_whiteboard_filter').clear()
     b.find_element_by_id('remote_form_whiteboard_filter')\
         .send_keys(whiteboard[:len(whiteboard) // 2])
     b.find_element_by_id('remote_form_do_filter').click()
     b.find_element_by_xpath("//select[@name='whiteboard']/option[@value='%s']" % whiteboard)