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)
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'))
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"]')
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)
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'))
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)
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()
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])
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_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')
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_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])
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)
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)
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)
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)))
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)
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)
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)
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)
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)
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])
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)
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)
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)
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)
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)
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)
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')
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()
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 _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 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')
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')]
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, [])
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())
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"))
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()
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')]
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]
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 ]
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
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()
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'))
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)
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()