def test_fetches_history_since_timestamp(self): with session.begin(): owner = data_setup.create_user() system = data_setup.create_system(owner=owner) # a recent one, which will be fetched system.activity.append( SystemActivity(user=owner, service=u'WEBUI', action=u'Changed', field_name=u'fqdn', old_value=u'oldname.example.com', new_value=system.fqdn)) # an old one, which will not be fetched system.activity.append( SystemActivity(user=owner, service=u'WEBUI', action=u'Changed', field_name=u'fqdn', old_value=u'evenoldername.example.com', new_value=u'oldname.example.com')) system.activity[-1].created = datetime.datetime( 2005, 8, 16, 12, 23, 34) result = self.server.systems.history( system.fqdn, xmlrpclib.DateTime('20060101T00:00:00')) self.assertEquals(len(result), 1) self.assertEquals(result[0]['old_value'], u'oldname.example.com')
def unreserve_manual(system, finish=None): if finish is None: finish = datetime.datetime.utcnow() user = system.open_reservation.user activity = SystemActivity(user=user, service=u'WEBUI', action=u'Returned', field_name=u'User', old_value=user.user_name, new_value=u'') activity.created = finish system.activity.append(activity) system.open_reservation.finish_time = finish
def create_system_activity(user=None, **kw): if not user: user = create_user() activity = SystemActivity(user, u'WEBUI', u'Changed', u'Loaned To', unique_name(u'random_%s'), user.user_name) session.add(activity) return activity
def create_manual_reservation(system, start, finish=None, user=None): if user is None: user = create_user() system.reservations.append(Reservation(start_time=start, finish_time=finish, type=u'manual', user=user)) activity = SystemActivity(user=user, service=u'WEBUI', action=u'Reserved', field_name=u'User', old_value=u'', new_value=user.user_name) activity.created = start system.activity.append(activity) if finish: activity = SystemActivity(user=user, service=u'WEBUI', action=u'Returned', field_name=u'User', old_value=user.user_name, new_value=u'') activity.created = finish system.activity.append(activity)
def system(self, **kw): activities = SystemActivity.all() activity_search = search_utility.SystemActivity.search search_bar = SearchBar(activity_search.create_complete_search_table(), name='activitysearch',) return self._activities_grid(activities, search_bar, 'system', search_utility.SystemActivity, title='System Activity', **kw)
def create_manual_reservation(system, start, finish=None, user=None): if user is None: user = create_user() system.reservations.append( Reservation(start_time=start, finish_time=finish, type=u'manual', user=user)) activity = SystemActivity(user=user, service=u'WEBUI', action=u'Reserved', field_name=u'User', old_value=u'', new_value=user.user_name) activity.created = start system.activity.append(activity) if finish: activity = SystemActivity(user=user, service=u'WEBUI', action=u'Returned', field_name=u'User', old_value=user.user_name, new_value=u'') activity.created = finish system.activity.append(activity)
def setUp(self): self.distro = data_setup.create_distro() self.distro_tree1 = data_setup.create_distro_tree(distro=self.distro, arch='x86_64') self.distro_tree2 = data_setup.create_distro_tree(distro=self.distro, arch='i386') self.distro_tree1.activity.append( DistroTreeActivity(user=User.by_user_name(data_setup.ADMIN_USER), service=u'testdata', field_name=u'Nonesente', old_value=u'sdfas', new_value=u'sdfa', action='Added')) self.distro_tree2.activity.append( DistroTreeActivity(user=User.by_user_name(data_setup.ADMIN_USER), service=u'testdata', field_name=u'Noneseonce', old_value=u'bsdf', new_value=u'sdfas', action='Added')) self.distro.activity.append( DistroActivity(user=User.by_user_name(data_setup.ADMIN_USER), service=u'testdata', action=u'Nothing', field_name=u'Nonsense', old_value=u'asdf', new_value=u'omgwtfbbq')) self.system = data_setup.create_system() self.system.activity.append( SystemActivity(user=User.by_user_name(data_setup.ADMIN_USER), service=u'testdata', action=u'Nothing', field_name=u'Nonsense', old_value=u'asdf', new_value=u'omgwtfbbq')) self.group2 = data_setup.create_group() self.group = data_setup.create_group() self.group.activity.append( GroupActivity(user=User.by_user_name(data_setup.ADMIN_USER), service=u'testdata', action=u'Nothing', field_name=u'Nonsense', old_value=u'asdf', new_value=u'omgwtfbbq')) self.browser = self.get_browser()
def test_can_fetch_history(self): with session.begin(): owner = data_setup.create_user() system = data_setup.create_system(owner=owner) system.activity.append(SystemActivity(user=owner, service=u'WEBUI', action=u'Changed', field_name=u'fqdn', old_value=u'oldname.example.com', new_value=system.fqdn)) result = self.server.systems.history(system.fqdn) self.assertEquals(len(result), 1) assert_datetime_within(result[0]['created'], datetime.timedelta(seconds=5), reference=datetime.datetime.utcnow()) self.assertEquals(result[0]['user'], owner.user_name) self.assertEquals(result[0]['service'], u'WEBUI') self.assertEquals(result[0]['action'], u'Changed') self.assertEquals(result[0]['field_name'], u'fqdn') self.assertEquals(result[0]['old_value'], u'oldname.example.com') self.assertEquals(result[0]['new_value'], system.fqdn)
def remove(self, **kw): try: group = Group.by_id(kw['group_id']) except DatabaseLookupError: flash(unicode('Invalid group or already removed')) redirect('../groups/mine') if not group.can_edit(identity.current.user): flash(_(u'You are not an owner of group %s' % group)) redirect('../groups/mine') if group.is_protected_group(): flash( _(u'This group %s is predefined and cannot be deleted' % group)) redirect('../groups/mine') if group.jobs: flash(_(u'Cannot delete a group which has associated jobs')) redirect('../groups/mine') # Record the access policy rules that will be removed # before deleting the group for rule in group.system_access_policy_rules: rule.record_deletion() session.delete(group) activity = Activity(identity.current.user, u'WEBUI', u'Removed', u'Group', group.display_name, u"") session.add(activity) for system in group.systems: session.add( SystemActivity(identity.current.user, u'WEBUI', u'Removed', u'Group', group.display_name, u"", object=system)) flash(_(u"%s deleted") % group.display_name) raise redirect(".")
def populate_status_durations(system): assert not system.status_durations # We don't know what the original status was, so let's set it to None for # now and see if we can figure it out next start_time = system.date_added status = None for activity in SystemActivity.query().filter(and_( SystemActivity.object == system, SystemActivity.field_name.in_([u'Status', u'status_id']), SystemActivity.action == u'Changed'))\ .order_by(SystemActivity.created): # Some old records have activity before date_added, probably because # the former is not in UTC changed_at = max(system.date_added, activity.created) # If this is the first status change, old_value might tell us what it # was before if status is None: if activity.old_value: status = get_status(activity.old_value) else: # As a fallback, assume systems always started out broken status = get_status(u'Broken') new_status = get_status(activity.new_value) # If the duration was non-zero, let's record it if changed_at > start_time and status != new_status: system.status_durations.append( SystemStatusDuration(status=status, start_time=start_time, finish_time=changed_at)) status = new_status start_time = changed_at if status is None: status = get_status(u'Broken') system.status_durations.append( SystemStatusDuration(status=status, start_time=start_time, finish_time=None)) assert_durations_not_overlapping(system.status_durations) assert_durations_contiguous(system.status_durations) assert system.date_added == system.status_durations[0].start_time
def test_system_breakages(self): system = data_setup.create_system() data_setup.create_system_status_history(system, [ (SystemStatus.automated, datetime.datetime(2012, 10, 1, 0, 0)), (SystemStatus.broken, datetime.datetime(2012, 10, 5, 0, 0)), (SystemStatus.automated, datetime.datetime(2012, 10, 5, 8, 0)), (SystemStatus.broken, datetime.datetime(2012, 10, 10, 0, 0)), ]) for _ in range(3): system.activity.append( SystemActivity(user=data_setup.create_user(), created=datetime.datetime(2012, 10, 15, 0, 0), service=u'testdata', action=u'Reported problem', field_name=u'Status', old_value=None, new_value=u'Why does it always b0rk?')) session.flush() row, = [ row for row in self.execute_reporting_query('system-breakages') if row.fqdn == system.fqdn ] self.assertEquals(row.breakage_count, 2) self.assertEquals(row.problem_report_count, 3)
def populate_status_durations(system): assert not system.status_durations # We don't know what the original status was, so let's set it to None for # now and see if we can figure it out next start_time = system.date_added status = None for activity in SystemActivity.query().filter(and_( SystemActivity.object == system, SystemActivity.field_name.in_([u'Status', u'status_id']), SystemActivity.action == u'Changed'))\ .order_by(SystemActivity.created): # Some old records have activity before date_added, probably because # the former is not in UTC changed_at = max(system.date_added, activity.created) # If this is the first status change, old_value might tell us what it # was before if status is None: if activity.old_value: status = get_status(activity.old_value) else: # As a fallback, assume systems always started out broken status = get_status(u'Broken') new_status = get_status(activity.new_value) # If the duration was non-zero, let's record it if changed_at > start_time and status != new_status: system.status_durations.append(SystemStatusDuration( status=status, start_time=start_time, finish_time=changed_at)) status = new_status start_time = changed_at if status is None: status = get_status(u'Broken') system.status_durations.append(SystemStatusDuration( status=status, start_time=start_time, finish_time=None)) assert_durations_not_overlapping(system.status_durations) assert_durations_contiguous(system.status_durations) assert system.date_added == system.status_durations[0].start_time