def test_job_priority_changes(self): user1 = data_setup.create_user() user2 = data_setup.create_user() job1 = data_setup.create_job(owner=user1) job2 = data_setup.create_job(owner=user1) job3 = data_setup.create_job(owner=user2) job4 = data_setup.create_job(owner=user2) for j in [job1, job2, job3]: for rs in j.recipesets: activity = RecipeSetActivity(j.owner, 'TEST', 'Changed', 'Priority', rs.priority.value, TaskPriority.high) activity.created = datetime.datetime(year=2012, month=10, day=10) rs.activity.append(activity) session.flush() rows = self.execute_reporting_query('job-priority-changes-by-user') all_rows = rows.fetchall() user1_rows = [row for row in all_rows if row.user_name == user1.user_name] user2_rows = [row for row in all_rows if row.user_name == user2.user_name] self.assertTrue(user1_rows[0].number_of_jobs_changed, 2) self.assertTrue(user2_rows[0].number_of_jobs_changed, 1)
def test_job_priority_changes(self): user1 = data_setup.create_user() user2 = data_setup.create_user() job1 = data_setup.create_job(owner=user1) job2 = data_setup.create_job(owner=user1) job3 = data_setup.create_job(owner=user2) job4 = data_setup.create_job(owner=user2) for j in [job1, job2, job3]: for rs in j.recipesets: activity = RecipeSetActivity(j.owner, 'TEST', 'Changed', 'Priority', rs.priority.value, TaskPriority.high) activity.created = datetime.datetime(year=2012, month=10, day=10) rs.activity.append(activity) session.flush() rows = self.execute_reporting_query('job-priority-changes-by-user') all_rows = rows.fetchall() user1_rows = [ row for row in all_rows if row.user_name == user1.user_name ] user2_rows = [ row for row in all_rows if row.user_name == user2.user_name ] self.assertTrue(user1_rows[0].number_of_jobs_changed, 2) self.assertTrue(user2_rows[0].number_of_jobs_changed, 1)
def test_jobs_group_column(self): with session.begin(): user = data_setup.create_user(password='******') group1 = data_setup.create_group(owner=user) group2 = data_setup.create_group() user.groups.append(group2) job1 = data_setup.create_job(owner=user, group=None) job2 = data_setup.create_job(owner=user, group=group1) job3 = data_setup.create_job(owner=user, group=group2) b = self.browser # jobs/mine login(b, user=user.user_name, password='******') b.find_element_by_link_text('My Jobs').click() b.find_element_by_xpath('//title[normalize-space(text())="My Jobs"]') self.check_job_row(rownum=1, job_t_id=job3.t_id, group=group2) self.check_job_row(rownum=2, job_t_id=job2.t_id, group=group1) self.check_job_row(rownum=3, job_t_id=job1.t_id, group=None) # jobs logout(b) b.get(get_server_base() + 'jobs/') self.check_job_row(rownum=1, job_t_id=job3.t_id, group=group2) self.check_job_row(rownum=2, job_t_id=job2.t_id, group=group1) self.check_job_row(rownum=3, job_t_id=job1.t_id, group=None)
def test_search_group(self): with session.begin(): group = data_setup.create_group() whiteboard = data_setup.unique_name(u'whiteboard%s') job = data_setup.create_job(group=group, whiteboard=whiteboard) job2 = data_setup.create_job(whiteboard=whiteboard) b = self.browser # Ensures that both jobs are present b.get(get_server_base() + 'jobs') b.find_element_by_link_text('Show Search Options').click() wait_for_animation(b, '#searchform') b.find_element_by_xpath("//select[@id='jobsearch_0_table'] \ /option[@value='Whiteboard']").click() b.find_element_by_xpath("//select[@id='jobsearch_0_operation'] \ /option[@value='is']").click() b.find_element_by_xpath("//input[@id='jobsearch_0_value']"). \ send_keys(whiteboard) b.find_element_by_id('searchform').submit() check_job_search_results(b, present=[job, job2]) # Now do the actual test b.find_element_by_xpath("//select[@id='jobsearch_0_table'] \ /option[@value='Group']").click() b.find_element_by_xpath("//select[@id='jobsearch_0_operation'] \ /option[@value='is']").click() b.find_element_by_xpath("//input[@id='jobsearch_0_value']").clear() b.find_element_by_xpath("//input[@id='jobsearch_0_value']"). \ send_keys(job.group.group_name) b.find_element_by_id('searchform').submit() check_job_search_results(b, present=[job], absent=[job2])
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 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.selenium = cls.get_selenium() cls.selenium.start()
def setUp(self): self.browser = self.get_browser() data_setup.create_device(device_class="IDE") #needed for device page data_setup.create_distro() # needed for distro page data_setup.create_job() # needed for job page data_setup.create_task() #create task system = data_setup.create_system(shared=True) system.activity.append(data_setup.create_system_activity())
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 setUp(self): self.verificationErrors = [] self.selenium = self.get_selenium() self.selenium.start() data_setup.create_device(device_class="IDE") #needed for device page data_setup.create_distro() # needed for distro page data_setup.create_job() # needed for job page data_setup.create_task() #create task system = data_setup.create_system() system.shared = True system.activity.append(data_setup.create_system_activity())
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 setUp(self): with session.begin(): self.password = '******' self.user = data_setup.create_user(password=self.password) self.user.use_old_job_page = True self.job = data_setup.create_job(owner=self.user) self.browser = self.get_browser()
def test_user_resource_counts_are_accurate_when_removing(self): with session.begin(): user = data_setup.create_user() job = data_setup.create_job(owner=user) data_setup.mark_job_running(job) owned_system = data_setup.create_system(owner=user) loaned_system = data_setup.create_system() loaned_system.loaned = user owned_pool = data_setup.create_system_pool(owning_user=user) group = data_setup.create_group(owner=user) s = requests.Session() requests_login(s) response = s.get(get_server_base() + 'users/%s' % user.user_name, headers={'Accept': 'application/json'}) response.raise_for_status() self.assertEquals(response.json()['job_count'], 1) self.assertEquals(response.json()['reservation_count'], 1) self.assertEquals(response.json()['loan_count'], 1) self.assertEquals(response.json()['owned_system_count'], 1) self.assertEquals(response.json()['owned_pool_count'], 1) response = patch_json(get_server_base() + 'users/%s' % user.user_name, data={'removed': 'now'}, session=s) response.raise_for_status() # The bug was that the counts in the PATCH response would still show # their old values, because the queries for producing the counts were # being run before all the removals were flushed to the database. # Note that job_count stays as 1, because the job has been cancelled # but it will still be running until the next iteration of beakerd's # update_dirty_jobs. self.assertEquals(response.json()['job_count'], 1) self.assertEquals(response.json()['reservation_count'], 0) self.assertEquals(response.json()['loan_count'], 0) self.assertEquals(response.json()['owned_system_count'], 0) self.assertEquals(response.json()['owned_pool_count'], 0)
def test_other_user_cannot_change_retention_tag(self): with session.begin(): other_user = data_setup.create_user(password=u'other_user') other_user.use_old_job_page = True job = data_setup.create_job(retention_tag=u'scratch') login(self.browser, user=other_user.user_name, password=u'other_user') self.check_cannot_change_retention_tag(job)
def test_counts(self): lc = data_setup.create_labcontroller() manual_system = data_setup.create_system(lab_controller=lc) data_setup.create_manual_reservation(manual_system, start=datetime.datetime(2012, 1, 1, 0, 0, 0)) recipe_system = data_setup.create_system(lab_controller=lc) data_setup.mark_recipe_running( data_setup.create_job().recipesets[0].recipes[0], system=recipe_system) idle_manual_system = data_setup.create_system(lab_controller=lc, status=SystemStatus.manual) idle_automated_system = data_setup.create_system(lab_controller=lc, status=SystemStatus.automated) idle_broken_system = data_setup.create_system(lab_controller=lc, status=SystemStatus.broken) idle_removed_system = data_setup.create_system(lab_controller=lc, status=SystemStatus.removed) session.flush() counts = system_utilisation_counts(System.query.filter( System.lab_controller == lc)) self.assertEqual(counts['recipe'], 1) self.assertEqual(counts['manual'], 1) self.assertEqual(counts['idle_manual'], 1) self.assertEqual(counts['idle_automated'], 1) self.assertEqual(counts['idle_broken'], 1) self.assertEqual(counts['idle_removed'], 1)
def test_reserved_openstack_instance(self): with session.begin(): owner = data_setup.create_user( email_address=u'*****@*****.**') distro_tree = data_setup.create_distro_tree( distro_name=u'MicrowaveOS', variant=u'ThreeHeats', arch=u'x86_64') job = data_setup.create_job( owner=owner, distro_tree=distro_tree, whiteboard=u'Operation Righteous Cowboy Lightning', recipe_whiteboard=u'Everything Sunny All the Time Always') recipe = job.recipesets[0].recipes[0] data_setup.mark_recipe_running( recipe, virt=True, instance_id=uuid.UUID('00000000-1111-2222-3333-444444444444'), fqdn=u'bitenuker.ge.invalid') with session.begin(): bkr.server.mail.reservesys_notify(recipe) self.assertEqual(len(self.mail_capture.captured_mails), 1) sender, rcpts, raw_msg = self.mail_capture.captured_mails[0] self.assertEqual(rcpts, [owner.email_address]) msg = email.message_from_string(raw_msg) self.assertEqual(msg['To'], owner.email_address) self.assertEqual(msg['Subject'], '[Beaker System Reserved] bitenuker.ge.invalid') self.assertEqual(msg['X-Beaker-Notification'], 'system-reservation') expected_mail_body = u"""\ ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** This System is reserved by [email protected] To return this system early, you can click on 'Release System' against this recipe from the Web UI. Ensure you have your logs off the system before returning to Beaker. %(base)srecipes/%(recipeid)s For system details, see: http://openstack.example.invalid/dashboard/project/instances/00000000-1111-2222-3333-444444444444/ For the default root password, see: %(base)sprefs Beaker Test information: HOSTNAME=bitenuker.ge.invalid JOBID=%(jobid)s RECIPEID=%(recipeid)s DISTRO=MicrowaveOS ThreeHeats x86_64 ARCHITECTURE=x86_64 Job Whiteboard: Operation Righteous Cowboy Lightning Recipe Whiteboard: Everything Sunny All the Time Always ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **""" \ % dict(base=get_server_base(), recipeid=recipe.id, jobid=job.id) actual_mail_body = msg.get_payload(decode=True) self.assertMultiLineEqual(actual_mail_body, expected_mail_body)
def test_disable_legacy_perms(self): 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(): owner = data_setup.create_user() member = data_setup.create_user(password=u'group_member') group = data_setup.create_group() data_setup.add_user_to_group(owner, group) data_setup.add_user_to_group(member, group) job = data_setup.create_job(owner=owner, group=None) data_setup.mark_job_complete(job, result=TaskResult.fail) b = self.browser login(b, user=member.user_name, password='******') b.get(get_server_base() + 'jobs/%s' % job.id) self.check_cannot_review() finally: stop_process('gunicorn') start_process('gunicorn')
def test_disable_legacy_perms(self): 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(): owner = data_setup.create_user() member = data_setup.create_user(password=u'group_member') group = data_setup.create_group() data_setup.add_user_to_group(owner, group) data_setup.add_user_to_group(member, group) job = data_setup.create_job(owner=owner, group=None) data_setup.mark_job_complete(job, result=TaskResult.fail) b = self.browser login(b, user=member.user_name, password='******') b.get(get_server_base() + 'jobs/%s' % job.id) self.check_cannot_review() finally: stop_process('gunicorn') start_process('gunicorn')
def test_page_works(self): # make sure we have at least one watchdog to see with session.begin(): data_setup.mark_job_running(data_setup.create_job()) b = self.browser b.get(get_server_base() + 'watchdogs/') self.assertEquals(b.title, 'Watchdogs')
def test_remove_user_job_cancel(self): with session.begin(): user = data_setup.create_user(user_name = data_setup.unique_name('aaaaa%s')) job = data_setup.create_job(owner=user) data_setup.mark_job_running(job) b = self.browser login(b) b.get(get_server_base() + 'users') b.find_element_by_xpath('//a[@href="remove?id=%d"]' %user.user_id).click() # XXX: not necessary, but doing it here to buy time, since sometimes the # job cancellation seems to take a while logout(b) # reflect the change in recipe task status when # update_dirty_jobs() is called session.expunge_all() beakerd.update_dirty_jobs() with session.begin(): job = Job.by_id(job.id) self.assertEquals(job.status, TaskStatus.cancelled) self.assertIn('User %s removed' % user.user_name, job.recipesets[0].recipes[0].tasks[0].results[0].log)
def test_job_owner_can_change_retention_tag(self): with session.begin(): job_owner = data_setup.create_user(password=u'owner') job = data_setup.create_job(owner=job_owner, retention_tag=u'scratch') login(self.browser, user=job_owner.user_name, password=u'owner') self.check_can_change_retention_tag(job, '60days')
def test_other_user_cannot_change_product(self): with session.begin(): other_user = data_setup.create_user(password=u'other_user') job = data_setup.create_job(retention_tag=u'active', product=data_setup.create_product()) login(self.browser, user=other_user.user_name, password=u'other_user') self.check_cannot_change_product(job)
def test_recovers_running_job_with_completed_recipes(self): # job with two recipes, both Completed, but job is Running # and systems are still assigned job = data_setup.create_job(num_recipes=2) data_setup.mark_job_running(job) systems = [r.resource.system for r in job.all_recipes] job.recipesets[0].recipes[0].tasks[-1].stop() job.recipesets[0].recipes[0]._update_status() job.recipesets[0].recipes[1].tasks[-1].stop() job.recipesets[0].recipes[1]._update_status() session.flush() self.assertEquals(job.recipesets[0].recipes[0].status, TaskStatus.completed) self.assertEquals(job.recipesets[0].recipes[1].status, TaskStatus.completed) self.assertEquals(job.recipesets[0].status, TaskStatus.running) self.assertEquals(job.status, TaskStatus.running) self.assert_(systems[0].open_reservation is not None) self.assert_(systems[1].open_reservation is not None) job._mark_dirty() # in reality, we did this by hand job.update_status() session.flush() session.expire_all() self.assertEquals(systems[0].open_reservation, None) self.assertEquals(systems[1].open_reservation, None) self.assertEquals(job.recipesets[0].status, TaskStatus.completed) self.assertEquals(job.status, TaskStatus.completed)
def test_page_works(self): # make sure we have at least one watchdog to see with session.begin(): data_setup.mark_job_running(data_setup.create_job()) b = self.browser b.get(get_server_base() + "watchdogs/") self.assertEquals(b.title, "Watchdogs")
def test_recovers_running_job_with_completed_recipes(self): # job with two recipes, both Completed, but job is Running # and systems are still assigned job = data_setup.create_job(num_recipes=2) data_setup.mark_job_running(job) systems = [r.resource.system for r in job.all_recipes] job.recipesets[0].recipes[0].tasks[-1].stop() job.recipesets[0].recipes[0]._update_status() job.recipesets[0].recipes[1].tasks[-1].stop() job.recipesets[0].recipes[1]._update_status() session.flush() self.assertEquals(job.recipesets[0].recipes[0].status, TaskStatus.completed) self.assertEquals(job.recipesets[0].recipes[1].status, TaskStatus.completed) self.assertEquals(job.recipesets[0].status, TaskStatus.running) self.assertEquals(job.status, TaskStatus.running) self.assert_(systems[0].open_reservation is not None) self.assert_(systems[1].open_reservation is not None) job.update_status() session.flush() session.expire_all() self.assertEquals(systems[0].open_reservation, None) self.assertEquals(systems[1].open_reservation, None) self.assertEquals(job.recipesets[0].status, TaskStatus.completed) self.assertEquals(job.status, TaskStatus.completed)
def test_distro_name(self): with session.begin(): job = data_setup.create_job() data_setup.mark_job_complete(job, result=TaskResult.fail) self.assertEqual(len(self.mail_capture.captured_mails), 1) sender, rcpts, raw_msg = self.mail_capture.captured_mails[0] msg = email.message_from_string(raw_msg) self.assertNotIn('Distro(', msg.get_payload(decode=True))
def test_page_header(self): with session.begin(): job = data_setup.create_job(num_recipes=2, num_guestrecipes=1) recipe = job.recipesets[0].recipes[1] b = self.browser go_to_recipe_view(b, recipe) subtitle = b.find_element_by_xpath('//div[@class="page-header"]/h1/small') self.assertEqual(subtitle.text, '2 of 3 recipes in %s' % job.t_id)
def test_record_job_cancel(self): with session.begin(): job_owner = data_setup.create_user(password=u'owner') job = data_setup.create_job(owner=job_owner) run_client(['bkr', 'job-cancel', '--username', job_owner.user_name, '--password', 'owner', job.t_id]) self.assertEquals(job.activity[0].action, u'Cancelled') self.assertEquals(job.activity[0].user, job_owner)
def test_finished_recipe_with_unstarted_guests(self): # host completes, but guest never started job = data_setup.create_job(num_recipes=1, num_guestrecipes=1) data_setup.mark_job_waiting(job) data_setup.mark_recipe_running(job.recipesets[0].recipes[0], only=True) job.recipesets[0].recipes[0].tasks[-1].stop() job.update_status() self.assertEquals(job.recipesets[0].recipes[0].status, TaskStatus.completed) self.assertEquals(job.recipesets[0].recipes[0].guests[0].status, TaskStatus.aborted) # host aborts, but guest never started job = data_setup.create_job(num_recipes=1, num_guestrecipes=1) data_setup.mark_job_waiting(job) job.recipesets[0].recipes[0].abort(msg="blorf") job.update_status() self.assertEquals(job.recipesets[0].recipes[0].status, TaskStatus.aborted) self.assertEquals(job.recipesets[0].recipes[0].guests[0].status, TaskStatus.aborted)
def test_job_completion_notification_off(self): with session.begin(): job_owner = data_setup.create_user(notify_job_completion=False) job = data_setup.create_job(owner=job_owner) session.flush() data_setup.mark_job_complete(job) self.assertEqual(len(self.mail_capture.captured_mails), 0)
def test_remove_account(self): with session.begin(): user = data_setup.create_user() job = data_setup.create_job(owner=user) data_setup.mark_job_running(job) owned_system = data_setup.create_system(owner=user) loaned_system = data_setup.create_system() loaned_system.loaned = user reserved_system = data_setup.create_system(status=SystemStatus.manual) reserved_system.reserve_manually(service=u'testdata', user=user) reserved_system.custom_access_policy.add_rule( SystemPermission.reserve, user=user) owned_pool = data_setup.create_system_pool(owning_user=user) group = data_setup.create_group(owner=user) s = requests.Session() requests_login(s) response = patch_json(get_server_base() + 'users/%s' % user.user_name, data={'removed': 'now'}, session=s) response.raise_for_status() with session.begin(): session.expire_all() self.assertIsNotNone(user.removed) # running jobs should be cancelled job.update_status() self.assertEquals(job.status, TaskStatus.cancelled) self.assertIn('User %s removed' % user.user_name, job.recipesets[0].recipes[0].tasks[0].results[0].log) # reservations should be released self.assertIsNone(reserved_system.user) # loans should be returned self.assertIsNone(loaned_system.loaned) # access policy rules should be removed self.assertEqual([], [rule for rule in reserved_system.custom_access_policy.rules if rule.user == user]) self.assertEqual(reserved_system.activity[0].field_name, u'Access Policy Rule') self.assertEqual(reserved_system.activity[0].action, u'Removed') self.assertEqual(reserved_system.activity[0].old_value, u'User:%s:reserve' % user.user_name) # systems owned by the user should be transferred to the caller self.assertEqual(owned_system.owner.user_name, data_setup.ADMIN_USER) self.assertEqual(owned_system.activity[0].field_name, u'Owner') self.assertEqual(owned_system.activity[0].action, u'Changed') self.assertEqual(owned_system.activity[0].old_value, user.user_name) self.assertEqual(owned_system.activity[0].new_value, data_setup.ADMIN_USER) # pools owned by the user should be transferred to the caller self.assertEqual(owned_pool.owner.user_name, data_setup.ADMIN_USER) self.assertEqual(owned_pool.activity[0].field_name, u'Owner') self.assertEqual(owned_pool.activity[0].action, u'Changed') self.assertEqual(owned_pool.activity[0].old_value, user.user_name) self.assertEqual(owned_pool.activity[0].new_value, data_setup.ADMIN_USER) # group membership/ownership should be removed self.assertNotIn(group, user.groups) self.assertNotIn(user, group.users) self.assertFalse(group.has_owner(user)) self.assertEqual(group.activity[-1].field_name, u'User') self.assertEqual(group.activity[-1].action, u'Removed') self.assertEqual(group.activity[-1].old_value, user.user_name)
def test_remove_account(self): with session.begin(): user = data_setup.create_user() job = data_setup.create_job(owner=user) data_setup.mark_job_running(job) owned_system = data_setup.create_system(owner=user) loaned_system = data_setup.create_system() loaned_system.loaned = user reserved_system = data_setup.create_system( status=SystemStatus.manual) reserved_system.reserve_manually(service=u'testdata', user=user) reserved_system.custom_access_policy.add_rule( SystemPermission.reserve, user=user) group = data_setup.create_group(owner=user) s = requests.Session() requests_login(s) response = patch_json(get_server_base() + 'users/%s' % user.user_name, data={'removed': 'now'}, session=s) response.raise_for_status() with session.begin(): session.expire_all() self.assertIsNotNone(user.removed) # running jobs should be cancelled job.update_status() self.assertEquals(job.status, TaskStatus.cancelled) self.assertIn('User %s removed' % user.user_name, job.recipesets[0].recipes[0].tasks[0].results[0].log) # reservations should be released self.assertIsNone(reserved_system.user) # loans should be returned self.assertIsNone(loaned_system.loaned) # access policy rules should be removed self.assertEqual([], [ rule for rule in reserved_system.custom_access_policy.rules if rule.user == user ]) self.assertEqual(reserved_system.activity[0].field_name, u'Access Policy Rule') self.assertEqual(reserved_system.activity[0].action, u'Removed') self.assertEqual(reserved_system.activity[0].old_value, u'<grant reserve to %s>' % user.user_name) # systems owned by the user should be transferred to the caller self.assertEqual(owned_system.owner.user_name, data_setup.ADMIN_USER) self.assertEqual(owned_system.activity[0].field_name, u'Owner') self.assertEqual(owned_system.activity[0].action, u'Changed') self.assertEqual(owned_system.activity[0].old_value, user.user_name) self.assertEqual(owned_system.activity[0].new_value, data_setup.ADMIN_USER) # group membership/ownership should be removed self.assertNotIn(group, user.groups) self.assertNotIn(user, group.users) self.assertFalse(group.has_owner(user)) self.assertEqual(group.activity[-1].field_name, u'User') self.assertEqual(group.activity[-1].action, u'Removed') self.assertEqual(group.activity[-1].old_value, user.user_name)
def setUp(self): with session.begin(): self.lc = data_setup.create_labcontroller() self.lc.user.password = u'logmein' job = data_setup.create_job() self.recipe = job.recipesets[0].recipes[0] session.flush() self.recipe.logs = [] self.server = self.get_server()
def test_myjobs_individual(self): with session.begin(): user = data_setup.create_user(password='******') job = data_setup.create_job(owner=user, group=None) b = self.browser login(b, user=user.user_name, password='******') b.find_element_by_link_text('My Jobs').click() b.find_element_by_xpath('//title[normalize-space(text())="My Jobs"]') self.assertTrue(is_text_present(b, job.t_id))
def test_invalid_datetimes_arent_localised(self): with session.begin(): job = data_setup.create_job() b = self.browser b.get(get_server_base() + 'jobs/%s' % job.id) self.assertEquals( b.find_element_by_xpath('//table//td' '[preceding-sibling::th[1]/text() = "Finished"]').text, '')
def test_group_job(self): with session.begin(): user = data_setup.create_user() group = data_setup.create_group() job = data_setup.create_job(group=group) b = self.browser b.get(get_server_base() + 'jobs/%s' % job.id) b.find_element_by_link_text("%s" % job.group).click() b.find_element_by_xpath('//h1[text()="%s"]' % group.display_name)
def test_job_owner_can_change_product(self): with session.begin(): job_owner = data_setup.create_user(password=u'owner') job = data_setup.create_job(owner=job_owner, retention_tag=u'active', product=data_setup.create_product()) new_product = data_setup.create_product() login(self.browser, user=job_owner.user_name, password=u'owner') self.check_can_change_product(job, new_product)
def test_invalid_datetimes_arent_localised(self): with session.begin(): job = data_setup.create_job() b = self.browser b.get(get_server_base() + 'jobs/%s' % job.id) self.assertEquals( b.find_element_by_xpath( '//table//td' '[preceding-sibling::th[1]/text() = "Finished"]').text, '')
def test_cannot_review_unfinished_recipesets(self): with session.begin(): owner = data_setup.create_user(password=u'owner') job = data_setup.create_job(owner=owner) data_setup.mark_job_running(job) b = self.browser login(b, user=owner.user_name, password='******') b.get(get_server_base() + 'jobs/%s' % job.id) self.check_cannot_review()
def test_owner_can_review(self): with session.begin(): owner = data_setup.create_user(password=u'owner') job = data_setup.create_job(owner=owner) data_setup.mark_job_complete(job, result=TaskResult.fail) b = self.browser login(b, user=owner.user_name, password='******') b.get(get_server_base() + 'jobs/%s' % job.id) self.review(job.recipesets[0])
def test_other_users_cannot_review(self): with session.begin(): user = data_setup.create_user(password=u'other_user') job = data_setup.create_job() data_setup.mark_job_complete(job, result=TaskResult.fail) b = self.browser login(b, user=user.user_name, password='******') b.get(get_server_base() + 'jobs/%s' % job.id) self.check_cannot_review()
def test_cloning_recipeset(self): with session.begin(): job = data_setup.create_job() b = self.browser login(b) b.get(get_server_base() + 'jobs/clone?job_id=%s' % job.id) cloned_from_job = b.find_element_by_xpath('//textarea[@name="textxml"]').text b.get(get_server_base() + 'jobs/clone?recipeset_id=%s' % job.recipesets[0].id) cloned_from_rs = b.find_element_by_xpath('//textarea[@name="textxml"]').text self.assertEqual(cloned_from_job, cloned_from_rs)