def test_loan_request(self): mail_capture_thread.start_capturing() b = self.browser # Test can send loan request succesfully b.get(get_server_base() + 'view/%s' % self.system.fqdn) b.find_element_by_link_text('Loan').click() b.find_element_by_xpath('//button[text()="Request Loan"]').click() b.find_element_by_name('message').send_keys('request loan') b.find_element_by_xpath('//button[text()="Request"]').click() # Wait for our success box b.find_element_by_xpath('//div[contains(@class, "alert-success")]' '/h4[text()="Request sent"]') # Check the email was sent captured_mails = mail_capture_thread.stop_capturing() self.assertEquals(len(captured_mails), 1) sender, rcpts, raw_msg = captured_mails[0] payload = 'A Beaker user has requested you loan them the system\n' \ '%s <%sview/%s>.\n' \ 'Here is a copy of their request:\n' \ 'request loan\n Requested by: %s' \ % (self.system_fqdn, get_server_base(), self.system_fqdn, self.problem_reporter.display_name) self._std_check_mail(sender, rcpts, raw_msg, 'loan-request', payload, 'Loan request for %s' % self.system.fqdn)
def test_report_problem(self): mail_capture_thread.start_capturing() b = self.browser # Test can send problem report succesfully b.get(get_server_base() + 'view/%s' % self.system.fqdn) b.find_element_by_xpath('//button[text()="Report problem"]').click() b.find_element_by_name('message').send_keys('testing problem') b.find_element_by_xpath('//button[text()="Report"]').click() # Wait for our success box b.find_element_by_xpath('//div[contains(@class, "alert-success")]' '/h4[text()="Report sent"]') # Check the email was sent captured_mails = mail_capture_thread.stop_capturing() self.assertEquals(len(captured_mails), 1) sender, rcpts, raw_msg = captured_mails[0] payload = 'A Beaker user has reported a problem with system \n' \ '%s <%sview/%s>.\n\n' \ 'Reported by: %s\n\n' \ 'Problem description:\n' \ 'testing problem' \ % (self.system_fqdn, get_server_base(), self.system_fqdn, self.problem_reporter.display_name) self._std_check_mail(sender, rcpts, raw_msg, 'system-problem', payload, 'Problem reported for %s' % self.system.fqdn)
def test_group_modify_add_member(self): with session.begin(): user = data_setup.create_user() mail_capture_thread.start_capturing() out = run_client(['bkr', 'group-modify', '--add-member', user.user_name, self.group.group_name], config = self.client_config) with session.begin(): session.refresh(self.group) group = Group.by_name(self.group.group_name) self.assert_(user.user_name in [u.user_name for u in group.users]) self.check_notification(user, group, action='Added') try: out = run_client(['bkr', 'group-modify', '--add-member', 'idontexist', self.group.group_name], config = self.client_config) self.fail('Must fail or die') except ClientError, e: self.assert_('User idontexist does not exist' in e.stderr_output, e.stderr_output)
def test_group_modify_add_member(self): with session.begin(): user = data_setup.create_user() mail_capture_thread.start_capturing() out = run_client([ 'bkr', 'group-modify', '--add-member', user.user_name, self.group.group_name ], config=self.client_config) with session.begin(): session.refresh(self.group) group = Group.by_name(self.group.group_name) self.assert_(user.user_name in [u.user_name for u in group.users]) self.check_notification(user, group, action='Added') try: out = run_client([ 'bkr', 'group-modify', '--add-member', 'idontexist', self.group.group_name ], config=self.client_config) self.fail('Must fail or die') except ClientError, e: self.assert_('User idontexist does not exist' in e.stderr_output, e.stderr_output)
def test_actions(self): with session.begin(): owner = data_setup.create_user() member = data_setup.create_user() group = data_setup.create_group(owner=owner) group.add_member(member) mail_capture_thread.start_capturing() bkr.server.mail.group_membership_notify(member, group, owner, 'Added') captured_mails = mail_capture_thread.stop_capturing() self.assertEqual(len(captured_mails), 1) with session.begin(): group.remove_member(member) mail_capture_thread.start_capturing() bkr.server.mail.group_membership_notify(member, group, owner, 'Removed') captured_mails = mail_capture_thread.stop_capturing() self.assertEqual(len(captured_mails), 1) # invalid action try: bkr.server.mail.group_membership_notify(member, group, owner, 'Unchanged') self.fail('Must fail or die') except ValueError, e: self.assert_('Unknown action' in str(e))
def test_group_modify_add_member(self): with session.begin(): user = data_setup.create_user() mail_capture_thread.start_capturing() out = run_client(['bkr', 'group-modify', '--add-member', user.user_name, self.group.group_name], config = self.client_config) with session.begin(): session.refresh(self.group) group = Group.by_name(self.group.group_name) self.assert_(user.user_name in [u.user_name for u in group.users]) self.check_notification(user, group, action='Added') try: out = run_client(['bkr', 'group-modify', '--add-member', 'idontexist', self.group.group_name], config = self.client_config) self.fail('Must fail or die') except ClientError as e: self.assert_('User idontexist does not exist' in e.stderr_output, e.stderr_output) try: out = run_client(['bkr', 'group-modify', '--add-member', user.user_name, self.group.group_name], config = self.client_config) self.fail('Must fail or die') except ClientError as e: self.assert_('User %s is already a member of group %s' % (user.user_name, self.group.group_name) in e.stderr_output, e.stderr_output) with session.begin(): session.refresh(self.group) group = Group.by_name(self.group.group_name) self.assertEquals(group.activity[-1].action, u'Added') self.assertEquals(group.activity[-1].field_name, u'User') self.assertEquals(group.activity[-1].user.user_id, self.user.user_id) self.assertEquals(group.activity[-1].new_value, user.user_name) self.assertEquals(group.activity[-1].service, u'HTTP') try: out = run_client(['bkr', 'group-modify', '--add-member', user.user_name, self.fake_ldap_group.group_name]) self.fail('Must fail or die') except ClientError as e: self.assert_('Cannot edit membership of group %s' % self.fake_ldap_group.group_name in e.stderr_output,e.stderr_output)
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-20141016.1', 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') mail_capture_thread.start_capturing() with session.begin(): bkr.server.mail.reservesys_notify(recipe) captured_mails = mail_capture_thread.stop_capturing() self.assertEqual(len(captured_mails), 1) sender, rcpts, raw_msg = 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-20141016.1 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_system_reserved_notification_on(self): with session.begin(): owner = data_setup.create_user( email_address=u'*****@*****.**') system = data_setup.create_system(fqdn=u'funcooker.ge.invalid', lab_controller=data_setup.create_labcontroller()) distro_tree = data_setup.create_distro_tree(distro_name=u'MicrowaveOS-20141016.0', variant=u'ThreeHeats', arch=u'x86_64') job = data_setup.create_running_job(owner=owner, system=system, distro_tree=distro_tree, whiteboard=u'Chain Reaction of Mental Anguish', recipe_whiteboard=u'Christmas Attack Zone') recipe = job.recipesets[0].recipes[0] mail_capture_thread.start_capturing() with session.begin(): bkr.server.mail.reservesys_notify(job.recipesets[0].recipes[0]) captured_mails = mail_capture_thread.stop_capturing() self.assertEqual(len(captured_mails), 1) sender, rcpts, raw_msg = 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] funcooker.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 ssh, kvm, serial and power control operations please look here: %(base)sview/funcooker.ge.invalid For the default root password, see: %(base)sprefs Beaker Test information: HOSTNAME=funcooker.ge.invalid JOBID=%(jobid)s RECIPEID=%(recipeid)s DISTRO=MicrowaveOS-20141016.0 ThreeHeats x86_64 ARCHITECTURE=x86_64 Job Whiteboard: Chain Reaction of Mental Anguish Recipe Whiteboard: Christmas Attack Zone ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **""" \ % dict(base=get_server_base(), recipeid=recipe.id, jobid=job.id) actual_mail_body = msg.get_payload(decode=True) self.assertEqual(actual_mail_body, expected_mail_body)
def test_distro_name(self): mail_capture_thread.start_capturing() with session.begin(): job = data_setup.create_job() data_setup.mark_job_complete(job, result=TaskResult.fail) captured_mails = mail_capture_thread.stop_capturing() self.assertEqual(len(captured_mails), 1) sender, rcpts, raw_msg = captured_mails[0] msg = email.message_from_string(raw_msg) self.assertNotIn('Distro(', msg.get_payload(decode=True))
def test_job_completion_notification_off(self): mail_capture_thread.start_capturing() 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) captured_mails = mail_capture_thread.stop_capturing(wait=False) self.assertEqual(len(captured_mails), 0)
def test_headers_for_avoiding_autoreplies(self): mail_capture_thread.start_capturing() with session.begin(): job = data_setup.create_job() data_setup.mark_job_complete(job) captured_mails = mail_capture_thread.stop_capturing() self.assertEqual(len(captured_mails), 1) sender, rcpts, raw_msg = captured_mails[0] msg = email.message_from_string(raw_msg) self.assertEquals(msg['Auto-Submitted'], 'auto-generated') self.assertEquals(msg['Precedence'], 'bulk')
def test_group_membership_notification_off(self): with session.begin(): owner = data_setup.create_user(notify_group_membership=False) member = data_setup.create_user(notify_group_membership=False) # group data_setup has not been changed, mail may sneak thru group = data_setup.create_group(owner=owner) group.add_member(member) mail_capture_thread.start_capturing() bkr.server.mail.group_membership_notify(member, group, owner, 'Added') captured_mails = mail_capture_thread.stop_capturing(wait=False) self.assertEqual(len(captured_mails), 0)
def test_subject_format(self): mail_capture_thread.start_capturing() with session.begin(): job_owner = data_setup.create_user() job = data_setup.create_job(owner=job_owner) session.flush() data_setup.mark_job_complete(job) captured_mails = mail_capture_thread.stop_capturing() self.assertEqual(len(captured_mails), 1) sender, rcpts, raw_msg = captured_mails[0] msg = email.message_from_string(raw_msg) self.assert_('[Beaker Job Completion] [Completed/Pass]' in msg['Subject'])
def test_report_problem_via_recipe(self): with session.begin(): owner = data_setup.create_user() job = data_setup.create_completed_job(owner=owner) mail_capture_thread.start_capturing() b = self.browser b.get(get_server_base() + 'recipes/%s' % job.recipesets[0].recipes[0].id) b.find_element_by_link_text('Report Problem with System').click() b.find_element_by_id('problem_description').send_keys('I broke it') b.find_element_by_xpath('//input[@value=\'Report\']').click() b.find_element_by_xpath('//div/span[text()=\'Success\']') captured_mails = mail_capture_thread.stop_capturing() self.assertEqual(len(captured_mails), 1)
def test_contains_recipe_hyperlink(self): mail_capture_thread.start_capturing() with session.begin(): recipe = data_setup.create_recipe() job = data_setup.create_job_for_recipes([recipe]) data_setup.mark_job_complete(job, result=TaskResult.fail) captured_mails = mail_capture_thread.stop_capturing() self.assertEqual(len(captured_mails), 1) sender, rcpts, raw_msg = captured_mails[0] msg = email.message_from_string(raw_msg) recipe_link = u'<%srecipes/%d' % (get_server_base(), recipe.id) recipe_line = msg.get_payload(decode=True).splitlines()[2] self.assertIn(recipe_link, recipe_line)
def test_subject_contains_whiteboard(self): mail_capture_thread.start_capturing() with session.begin(): whiteboard = u'final space shuttle launch' job = data_setup.create_job(whiteboard=whiteboard) session.flush() data_setup.mark_job_complete(job) captured_mails = mail_capture_thread.stop_capturing() self.assertEqual(len(captured_mails), 1) sender, rcpts, raw_msg = captured_mails[0] msg = email.message_from_string(raw_msg) # Subject header might be split across multiple lines subject = re.sub(r'\s+', ' ', msg['Subject']) self.assert_(whiteboard in subject, subject)
def test_contains_job_hyperlink(self): mail_capture_thread.start_capturing() with session.begin(): job = data_setup.create_job() session.flush() data_setup.mark_job_complete(job) captured_mails = mail_capture_thread.stop_capturing() self.assertEqual(len(captured_mails), 1) sender, rcpts, raw_msg = captured_mails[0] msg = email.message_from_string(raw_msg) job_link = u'<%sjobs/%d>' % (get_server_base(), job.id) first_line = msg.get_payload(decode=True).splitlines()[0] self.assert_(job_link in first_line, 'Job link %r should appear in first line %r' % (job_link, first_line))
def test_send_usage_reminder(self): with session.begin(): email_content = self._create_expiring_reservation() email_content += self._create_open_reservation() email_content += self._create_delayed_job() beaker_usage = BeakerUsage(self.user, self.reservation_expiry, self.reservation_length, self.waiting_recipe_age, self.delayed_job_age) current_date = datetime.utcnow().strftime("%Y-%m-%d") data = { 'user_name': self.user.user_name, 'current_date': current_date, 'beaker_fqdn': absolute_url('/'), 'reservation_expiry': self.reservation_expiry, 'reservation_length': self.reservation_length, 'waiting_recipe_age': self.waiting_recipe_age, 'delayed_job_age': self.delayed_job_age, 'expiring_reservations': beaker_usage.expiring_reservations(), 'open_reservations': beaker_usage.open_in_demand_systems(), 'delayed_jobs': beaker_usage.delayed_jobs() } mail_capture_thread.start_capturing() with session.begin(): bkr.server.mail.send_usage_reminder(self.user, data) captured_mails = mail_capture_thread.stop_capturing() self.assertEqual(len(captured_mails), 1) sender, rcpts, raw_msg = captured_mails[0] self.assertEqual(rcpts, [self.user.email_address]) msg = email.message_from_string(raw_msg) self.assertEqual(msg['To'], self.user.email_address) self.assertTrue( msg['Subject'], '[Beaker] Usage report for %s (%s)' % (self.user.user_name, current_date)) expected_mail_body = u"""========= [Beaker] Usage report for %s (%s) ========= Hi %s, %s =========""" % (self.user.user_name, current_date, self.user.user_name, email_content) actual_mail_body = msg.get_payload(decode=True) self.assertEqual(actual_mail_body, expected_mail_body) self.assertEqual(msg['X-Beaker-Notification'], 'usage-report')
def test_broken_system_notification_on(self): with session.begin(): owner = data_setup.create_user( email_address=u'*****@*****.**') lc = data_setup.create_labcontroller() system = data_setup.create_system(fqdn=u'home-one', owner=owner, lender=u"Uncle Bob's Dodgy Shop", location=u'shed out the back', lab_controller=lc, vendor=u'Acorn', arch=u'i386') system.arch.append(Arch.by_name(u'x86_64')) data_setup.configure_system_power(system, power_type=u'drac', address=u'pdu2.home-one', power_id=u'42') mail_capture_thread.start_capturing() with session.begin(): bkr.server.mail.broken_system_notify(system, reason="It's a tarp!") captured_mails = mail_capture_thread.stop_capturing() self.assertEqual(len(captured_mails), 1) sender, rcpts, raw_msg = captured_mails[0] self.assertEqual(rcpts, ['*****@*****.**']) msg = email.message_from_string(raw_msg) self.assertEqual(msg['To'], '*****@*****.**') self.assertEqual(msg['Subject'], 'System home-one automatically marked broken') self.assertEqual(msg['X-Beaker-Notification'], 'system-broken') self.assertEqual(msg['X-Beaker-System'], 'home-one') self.assertEqual(msg['X-Lender'], "Uncle Bob's Dodgy Shop") self.assertEqual(msg['X-Location'], 'shed out the back') self.assertEqual(msg['X-Lab-Controller'], lc.fqdn) self.assertEqual(msg['X-Vendor'], 'Acorn') self.assertEqual(msg['X-Type'], 'Machine') self.assertEqual(msg.get_all('X-Arch'), ['i386', 'x86_64']) self.assertEqual( msg.get_payload(decode=True), 'Beaker has automatically marked system \n' 'home-one <%sview/home-one> \n' 'as broken, due to:\n\n' 'It\'s a tarp!\n\n' 'Please investigate this error and take appropriate action.\n\n' 'Power type: drac\n' 'Power address: pdu2.home-one\n' 'Power id: 42' % get_server_base())
def test_system_reserved_notification_off(self): with session.begin(): owner = data_setup.create_user(email_address=u'*****@*****.**', notify_reservesys=False) system = data_setup.create_system(fqdn=u'funcooker.ge.valid', lab_controller=data_setup.create_labcontroller()) distro_tree = data_setup.create_distro_tree(arch=u'x86_64') job = data_setup.create_running_job(owner=owner, system=system, distro_tree=distro_tree, whiteboard=u'This is a whiteboard', recipe_whiteboard=u'This is another whiteboard') mail_capture_thread.start_capturing() with session.begin(): bkr.server.mail.reservesys_notify(job.recipesets[0].recipes[0]) captured_mails = mail_capture_thread.stop_capturing(wait=False) self.assertEqual(len(captured_mails), 0)
def test_send_usage_reminder(self): with session.begin(): email_content = self._create_expiring_reservation() email_content += self._create_open_reservation() email_content += self._create_delayed_job() beaker_usage = BeakerUsage(self.user, self.reservation_expiry, self.reservation_length, self.waiting_recipe_age, self.delayed_job_age) current_date = datetime.utcnow().strftime("%Y-%m-%d") data = { 'user_name': self.user.user_name, 'current_date': current_date, 'beaker_fqdn': absolute_url('/'), 'reservation_expiry': self.reservation_expiry, 'reservation_length': self.reservation_length, 'waiting_recipe_age': self.waiting_recipe_age, 'delayed_job_age': self.delayed_job_age, 'expiring_reservations': beaker_usage.expiring_reservations(), 'open_reservations': beaker_usage.open_in_demand_systems(), 'delayed_jobs': beaker_usage.delayed_jobs() } mail_capture_thread.start_capturing() with session.begin(): bkr.server.mail.send_usage_reminder(self.user, data) captured_mails = mail_capture_thread.stop_capturing() self.assertEqual(len(captured_mails),1) sender, rcpts, raw_msg = captured_mails[0] self.assertEqual(rcpts, [self.user.email_address]) msg = email.message_from_string(raw_msg) self.assertEqual(msg['To'], self.user.email_address) self.assertTrue(msg['Subject'], '[Beaker] Usage report for %s (%s)' % (self.user.user_name, current_date)) expected_mail_body = u"""========= [Beaker] Usage report for %s (%s) ========= Hi %s, %s =========""" % (self.user.user_name, current_date, self.user.user_name, email_content) actual_mail_body = msg.get_payload(decode=True) self.assertEqual(actual_mail_body, expected_mail_body) self.assertEqual(msg['X-Beaker-Notification'], 'usage-report')
def test_job_cc_list_is_notified(self): mail_capture_thread.start_capturing() with session.begin(): job_owner = data_setup.create_user() job = data_setup.create_job(owner=job_owner, cc=[u'*****@*****.**', u'*****@*****.**']) session.flush() data_setup.mark_job_complete(job) captured_mails = mail_capture_thread.stop_capturing() self.assertEqual(len(captured_mails), 1) sender, rcpts, raw_msg = captured_mails[0] msg = email.message_from_string(raw_msg) self.assertEqual([job_owner.email_address, '*****@*****.**', '*****@*****.**'], rcpts) self.assertEqual(job_owner.email_address, msg['To']) self.assertEqual('[email protected], [email protected]', msg['Cc']) self.assert_('[Beaker Job Completion]' in msg['Subject'])
def test_broken_system_notification_off(self): with session.begin(): owner = data_setup.create_user(email_address=u'*****@*****.**', notify_broken_system=False) lc = data_setup.create_labcontroller() system = data_setup.create_system(fqdn=u'home-two', owner=owner, lender=u"Aunty Jane's Dodgy Shop", location=u'shed out the front', lab_controller=lc, vendor=u'Acorn', arch=u'i386') system.arch.append(Arch.by_name(u'x86_64')) data_setup.configure_system_power(system, power_type=u'drac', address=u'pdu3.home-one', power_id=u'42') mail_capture_thread.start_capturing() with session.begin(): bkr.server.mail.broken_system_notify(system, reason="It's not a tarp!") captured_mails = mail_capture_thread.stop_capturing(wait=False) self.assertEqual(len(captured_mails), 0)
def test_group_modify_remove_member(self): with session.begin(): user = data_setup.create_user() self.group.add_member(user) session.flush() self.assert_(user in self.group.users) mail_capture_thread.start_capturing() out = run_client([ 'bkr', 'group-modify', '--remove-member', user.user_name, self.group.group_name ], config=self.client_config) with session.begin(): session.refresh(self.group) group = Group.by_name(self.group.group_name) self.assert_( user.user_name not in [u.user_name for u in group.users]) self.check_notification(user, group, action='Removed') with session.begin(): session.refresh(self.group) group = Group.by_name(self.group.group_name) self.assertEquals(group.activity[-1].action, u'Removed') self.assertEquals(group.activity[-1].field_name, u'User') self.assertEquals(group.activity[-1].user.user_id, self.user.user_id) self.assertEquals(group.activity[-1].old_value, user.user_name) self.assertEquals(group.activity[-1].new_value, None) self.assertEquals(group.activity[-1].service, u'HTTP') try: out = run_client([ 'bkr', 'group-modify', '--remove-member', 'idontexist', self.group.group_name ], config=self.client_config) self.fail('Must fail or die') except ClientError, e: self.assert_('User idontexist does not exist' in e.stderr_output, e.stderr_output)
def test_group_modify_remove_member(self): with session.begin(): user = data_setup.create_user() self.group.add_member(user) session.flush() self.assert_(user in self.group.users) mail_capture_thread.start_capturing() out = run_client(['bkr', 'group-modify', '--remove-member', user.user_name, self.group.group_name], config = self.client_config) with session.begin(): session.refresh(self.group) group = Group.by_name(self.group.group_name) self.assert_(user.user_name not in [u.user_name for u in group.users]) self.check_notification(user, group, action='Removed') with session.begin(): session.refresh(self.group) group = Group.by_name(self.group.group_name) self.assertEquals(group.activity[-1].action, u'Removed') self.assertEquals(group.activity[-1].field_name, u'User') self.assertEquals(group.activity[-1].user.user_id, self.user.user_id) self.assertEquals(group.activity[-1].old_value, user.user_name) self.assertEquals(group.activity[-1].new_value, None) self.assertEquals(group.activity[-1].service, u'HTTP') try: out = run_client(['bkr', 'group-modify', '--remove-member', 'idontexist', self.group.group_name], config = self.client_config) self.fail('Must fail or die') except ClientError, e: self.assert_('User idontexist does not exist' in e.stderr_output, e.stderr_output)
def test_reporter_and_system_cc_list_are_cced(self): with session.begin(): interested_party_email = data_setup.unique_name(u'*****@*****.**') system = data_setup.create_system() system.cc = [interested_party_email] mail_capture_thread.start_capturing() b = self.browser b.get(get_server_base() + 'view/%s' % system.fqdn) b.find_element_by_xpath('//button[text()="Report problem"]').click() b.find_element_by_name('message').send_keys('I broke it') b.find_element_by_xpath('//button[text()="Report"]').click() b.find_element_by_xpath('//div[contains(@class, "alert-success")]' '/h4[text()="Report sent"]') captured_mails = mail_capture_thread.stop_capturing() self.assertEqual(len(captured_mails), 1) sender, rcpts, raw_msg = captured_mails[0] self.assertEqual(rcpts, [system.owner.email_address, self.problem_reporter.email_address, interested_party_email]) msg = email.message_from_string(raw_msg) self.assertEqual(msg['Cc'], '%s, %s' % (self.problem_reporter.email_address, interested_party_email))
def test_broken_system_notification_on(self): with session.begin(): owner = data_setup.create_user(email_address=u'*****@*****.**') lc = data_setup.create_labcontroller() system = data_setup.create_system(fqdn=u'home-one', owner=owner, lender=u"Uncle Bob's Dodgy Shop", location=u'shed out the back', lab_controller=lc, vendor=u'Acorn', arch=u'i386') system.arch.append(Arch.by_name(u'x86_64')) data_setup.configure_system_power(system, power_type=u'drac', address=u'pdu2.home-one', power_id=u'42') mail_capture_thread.start_capturing() with session.begin(): bkr.server.mail.broken_system_notify(system, reason="It's a tarp!") captured_mails = mail_capture_thread.stop_capturing() self.assertEqual(len(captured_mails), 1) sender, rcpts, raw_msg = captured_mails[0] self.assertEqual(rcpts, ['*****@*****.**']) msg = email.message_from_string(raw_msg) self.assertEqual(msg['To'], '*****@*****.**') self.assertEqual(msg['Subject'], 'System home-one automatically marked broken') self.assertEqual(msg['X-Beaker-Notification'], 'system-broken') self.assertEqual(msg['X-Beaker-System'], 'home-one') self.assertEqual(msg['X-Lender'], "Uncle Bob's Dodgy Shop") self.assertEqual(msg['X-Location'], 'shed out the back') self.assertEqual(msg['X-Lab-Controller'], lc.fqdn) self.assertEqual(msg['X-Vendor'], 'Acorn') self.assertEqual(msg['X-Type'], 'Machine') self.assertEqual(msg.get_all('X-Arch'), ['i386', 'x86_64']) self.assertEqual(msg.get_payload(decode=True), 'Beaker has automatically marked system \n' 'home-one <%sview/home-one> \n' 'as broken, due to:\n\n' 'It\'s a tarp!\n\n' 'Please investigate this error and take appropriate action.\n\n' 'Power type: drac\n' 'Power address: pdu2.home-one\n' 'Power id: 42' % get_server_base())
def test_sends_mail_notification_for_loan(self): with session.begin(): owner = data_setup.create_user(user_name='mturnbull', email_address='*****@*****.**') system = data_setup.create_system(fqdn='lya3.aemo.com.au', owner=owner) loanee = data_setup.create_user(user_name='bshorten') s = requests.Session() requests_login(s) mail_capture_thread.start_capturing() response = post_json(get_server_base() + 'systems/%s/loans/' % system.fqdn, session=s, data={'recipient': {'user_name': 'bshorten'}}) self.assertEquals(response.status_code, 200) captured_mails = mail_capture_thread.stop_capturing() self.assertEquals(len(captured_mails), 1) sender, rcpts, raw_msg = captured_mails[0] msg = email.message_from_string(raw_msg) self.assertEquals(['*****@*****.**'], rcpts) self.assertEquals('*****@*****.**', msg['To']) self.assertEquals('System lya3.aemo.com.au loaned to bshorten', msg['Subject']) self.assertEquals( 'Beaker system lya3.aemo.com.au <%sview/lya3.aemo.com.au>\n' 'has been loaned to bshorten by admin.' % get_server_base(), msg.get_payload(decode=True))
def test_group_modify_remove_member(self): with session.begin(): user = data_setup.create_user() self.group.add_member(user) session.flush() self.assert_(user in self.group.users) mail_capture_thread.start_capturing() out = run_client(['bkr', 'group-modify', '--remove-member', user.user_name, self.group.group_name], config = self.client_config) with session.begin(): session.refresh(self.group) group = Group.by_name(self.group.group_name) self.assert_(user.user_name not in [u.user_name for u in group.users]) self.check_notification(user, group, action='Removed') with session.begin(): session.refresh(self.group) group = Group.by_name(self.group.group_name) self.assertEquals(group.activity[-1].action, u'Removed') self.assertEquals(group.activity[-1].field_name, u'User') self.assertEquals(group.activity[-1].user.user_id, self.user.user_id) self.assertEquals(group.activity[-1].old_value, user.user_name) self.assertEquals(group.activity[-1].new_value, None) self.assertEquals(group.activity[-1].service, u'HTTP') try: out = run_client(['bkr', 'group-modify', '--remove-member', 'idontexist', self.group.group_name], config = self.client_config) self.fail('Must fail or die') except ClientError as e: self.assert_('User idontexist does not exist' in e.stderr_output, e.stderr_output) try: out = run_client(['bkr', 'group-modify', '--remove-member', user.user_name, self.group.group_name], config = self.client_config) self.fail('Must fail or die') except ClientError as e: self.assert_('User %s is not a member of group %s' % (user.user_name, self.group.group_name) in e.stderr_output, e.stderr_output) try: out = run_client(['bkr', 'group-modify', '--remove-member', self.user.user_name, self.group.group_name], config = self.client_config) self.fail('Must fail or die') except ClientError as e: self.assert_('Cannot remove user' in e.stderr_output, e.stderr_output) # remove the last group member/owner as 'admin' mail_capture_thread.start_capturing() out = run_client(['bkr', 'group-modify', '--remove-member', self.user.user_name, self.group.group_name], config=self.admin_client_config) self.check_notification(self.user, self.group, action='Removed') # try to remove self from admin group # first remove all other users except 'admin' group = Group.by_name(u'admin') group_users = group.users # remove all other users from 'admin' for usr in group_users: if usr.user_id != 1: out = run_client(['bkr', 'group-modify', '--remove-member', usr.user_name, 'admin'], config=self.admin_client_config) try: out = run_client(['bkr', 'group-modify', '--remove-member', 'admin', 'admin']) self.fail('Must fail or die') except ClientError as e: self.assert_('Cannot remove user' in e.stderr_output, e.stderr_output) try: out = run_client(['bkr', 'group-modify', '--remove-member', user.user_name, self.fake_ldap_group.group_name]) self.fail('Must fail or die') except ClientError as e: self.assert_('Cannot edit membership of group %s' % self.fake_ldap_group.group_name in e.stderr_output, e.stderr_output)
(user.user_name, self.group.group_name) in e.stderr_output, e.stderr_output) try: out = run_client([ 'bkr', 'group-modify', '--remove-member', self.user.user_name, self.group.group_name ], config=self.client_config) self.fail('Must fail or die') except ClientError, e: self.assert_('Cannot remove user' in e.stderr_output, e.stderr_output) # remove the last group member/owner as 'admin' mail_capture_thread.start_capturing() out = run_client([ 'bkr', 'group-modify', '--remove-member', self.user.user_name, self.group.group_name ], config=self.admin_client_config) self.check_notification(self.user, self.group, action='Removed') # try to remove self from admin group # first remove all other users except 'admin' group = Group.by_name(u'admin') group_users = group.users # remove all other users from 'admin' for usr in group_users: if usr.user_id != 1: out = run_client([
self.assert_('User %s is not a member of group %s' % (user.user_name, self.group.group_name) in e.stderr_output, e.stderr_output) try: out = run_client(['bkr', 'group-modify', '--remove-member', self.user.user_name, self.group.group_name], config = self.client_config) self.fail('Must fail or die') except ClientError, e: self.assert_('Cannot remove user' in e.stderr_output, e.stderr_output) # remove the last group member/owner as 'admin' mail_capture_thread.start_capturing() out = run_client(['bkr', 'group-modify', '--remove-member', self.user.user_name, self.group.group_name], config=self.admin_client_config) self.check_notification(self.user, self.group, action='Removed') # try to remove self from admin group # first remove all other users except 'admin' group = Group.by_name(u'admin') group_users = group.users # remove all other users from 'admin' for usr in group_users: if usr.user_id != 1: out = run_client(['bkr', 'group-modify', '--remove-member', usr.user_name, 'admin'], config=self.admin_client_config)