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)
Example #3
0
    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)
Example #4
0
    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])
Example #5
0
    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])
Example #6
0
 def setUpClass(cls):
     cls.running_job = data_setup.create_job()
     cls.queued_job = data_setup.create_job()
     cls.completed_job = data_setup.create_completed_job()
     data_setup.mark_job_queued(cls.queued_job)
     data_setup.mark_job_running(cls.running_job)
     cls.browser = cls.get_browser()
Example #7
0
    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)
Example #8
0
 def setUpClass(cls):
     cls.running_job = data_setup.create_job()
     cls.queued_job = data_setup.create_job()
     cls.completed_job = data_setup.create_completed_job()
     data_setup.mark_job_queued(cls.queued_job)
     data_setup.mark_job_running(cls.running_job)
     cls.selenium = cls.get_selenium()
     cls.selenium.start()
Example #9
0
 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())
Example #10
0
 def setUp(self):
     with session.begin():
         self.running_job = data_setup.create_job()
         self.queued_job = data_setup.create_job()
         self.completed_job = data_setup.create_completed_job()
         data_setup.mark_job_queued(self.queued_job)
         data_setup.mark_job_running(self.running_job)
     self.browser = self.get_browser()
Example #11
0
 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())
Example #12
0
 def setUp(self):
     with session.begin():
         self.running_job = data_setup.create_job()
         self.queued_job = data_setup.create_job()
         self.completed_job = data_setup.create_completed_job()
         data_setup.mark_job_queued(self.queued_job)
         data_setup.mark_job_running(self.running_job)
     self.browser = self.get_browser()
Example #13
0
 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())
Example #14
0
 def setUpClass(cls):
     # create a bunch of jobs
     with session.begin():
         cls.user = user = data_setup.create_user(password='******')
         arches = [u'i386', u'x86_64', u'ia64']
         distros = [data_setup.create_distro(name=name) for name in
                 [u'DAN5-Server-U5', u'DAN5-Client-U5', u'DAN6-U1', u'DAN6-RC3']]
         for arch in arches:
             for distro in distros:
                 distro_tree = data_setup.create_distro_tree(distro=distro, arch=arch)
                 data_setup.create_job(owner=user, distro_tree=distro_tree)
                 data_setup.create_completed_job(owner=user, distro_tree=distro_tree)
Example #15
0
 def setUpClass(cls):
     # create a bunch of jobs
     with session.begin():
         cls.user = user = data_setup.create_user(password='******')
         arches = [u'i386', u'x86_64', u'ia64']
         distros = [data_setup.create_distro(name=name) for name in
                 [u'DAN5-Server-U5', u'DAN5-Client-U5', u'DAN6-U1', u'DAN6-RC3']]
         for arch in arches:
             for distro in distros:
                 distro_tree = data_setup.create_distro_tree(distro=distro, arch=arch)
                 data_setup.create_job(owner=user, distro_tree=distro_tree)
                 data_setup.create_completed_job(owner=user, distro_tree=distro_tree)
Example #16
0
 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()
Example #17
0
 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)
Example #18
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)
Example #19
0
    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)
Example #20
0
 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()
Example #21
0
    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)
Example #22
0
    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')
Example #23
0
    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')
Example #24
0
 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')
Example #25
0
    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)
Example #26
0
 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')
Example #27
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)
Example #28
0
 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)
Example #29
0
 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)
Example #30
0
    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)
Example #31
0
 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')
Example #32
0
 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")
Example #33
0
    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)
Example #34
0
    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)
Example #35
0
 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))
Example #36
0
 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)
Example #37
0
    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)
Example #38
0
    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)
Example #39
0
 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)
Example #40
0
 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_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)
Example #42
0
    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)
Example #43
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)
Example #44
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)
         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)
Example #45
0
 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()
Example #46
0
 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))
Example #47
0
 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,
             '')
Example #48
0
 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)
Example #49
0
 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)
Example #50
0
 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)
Example #51
0
 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, '')
Example #52
0
 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()
Example #53
0
 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))
Example #54
0
 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])
Example #55
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()
Example #56
0
 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)
Example #57
0
 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()
Example #58
0
 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])
Example #59
0
 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)