def run(self): while True: try: with closing(Session()) as session: self.logger.debug("Expiring edges....") self.expire_edges(session) self.logger.debug( "Expiring nonauditor approvers in audited groups...") self.expire_nonauditors(session) self.logger.debug("Sending emails...") process_async_emails(self.settings, session, datetime.utcnow()) self.logger.debug("Pruning old traces....") prune_old_traces(session) session.commit() stats.set_gauge("successful-background-update", 1) stats.set_gauge("failed-background-update", 0) except OperationalError: Session.configure( bind=get_db_engine(get_database_url(self.settings))) self.logger.critical("Failed to connect to database.") stats.set_gauge("successful-background-update", 0) stats.set_gauge("failed-background-update", 1) self.capture_exception() except: stats.set_gauge("successful-background-update", 0) stats.set_gauge("failed-background-update", 1) self.capture_exception() raise sleep(60)
def run(self): # type: () -> None initial_url = self.settings.database while True: try: if self.settings.database != initial_url: self.crash() with closing(Session()) as session: self.logger.info("Expiring edges....") self.expire_edges(session) self.logger.info("Promoting nonauditor approvers in audited groups...") self.promote_nonauditors(session) self.logger.info("Sending emails...") process_async_emails(self.settings, session, datetime.utcnow()) self.logger.info("Pruning old traces....") prune_old_traces(session) session.commit() stats.log_gauge("successful-background-update", 1) stats.log_gauge("failed-background-update", 0) except Exception: stats.log_gauge("successful-background-update", 0) stats.log_gauge("failed-background-update", 1) self.plugins.log_exception(None, None, *sys.exc_info()) self.logger.exception("Unexpected exception occurred in background thread") self.crash() self.logger.debug("Sleeping for {} seconds...".format(self.settings.sleep_interval)) sleep(self.settings.sleep_interval)
def run(self): # type: () -> None initial_url = self.settings.database while True: try: if self.settings.database != initial_url: self.crash() with closing(Session()) as session: self.logger.info("Expiring edges....") self.expire_edges(session) self.logger.info("Promoting nonauditor approvers in audited groups...") self.promote_nonauditors(session) self.logger.info("Sending emails...") process_async_emails(self.settings, session, datetime.utcnow()) self.logger.info("Pruning old traces....") prune_old_traces(session) session.commit() stats.log_gauge("successful-background-update", 1) stats.log_gauge("failed-background-update", 0) except Exception: stats.log_gauge("successful-background-update", 0) stats.log_gauge("failed-background-update", 1) self._capture_exception() self.logger.exception("Unexpected exception occurred in background thread.") self.crash() self.logger.debug("Sleeping for {} seconds...".format(self.settings.sleep_interval)) sleep(self.settings.sleep_interval)
def run(self): while True: try: with closing(Session()) as session: self.logger.debug("Expiring edges....") self.expire_edges(session) self.logger.debug("Expiring nonauditor approvers in audited groups...") self.expire_nonauditors(session) self.logger.debug("Sending emails...") process_async_emails(self.settings, session, datetime.utcnow()) self.logger.debug("Pruning old traces....") prune_old_traces(session) session.commit() stats.set_gauge("successful-background-update", 1) stats.set_gauge("failed-background-update", 0) except OperationalError: Session.configure(bind=get_db_engine(get_database_url(self.settings))) self.logger.critical("Failed to connect to database.") stats.set_gauge("successful-background-update", 0) stats.set_gauge("failed-background-update", 1) self.capture_exception() except: stats.set_gauge("successful-background-update", 0) stats.set_gauge("failed-background-update", 1) self.capture_exception() raise sleep(60)
def run(self): while True: try: session = Session() logging.debug("Expiring edges....") self.expire_edges(session) logging.debug("Sending emails...") process_async_emails(self.settings, session, datetime.utcnow()) logging.debug("Pruning old traces....") prune_old_traces(session) session.commit() session.close() stats.set_gauge("successful-background-run", 1) except OperationalError: Session.configure(bind=get_db_engine(get_database_url(self.settings))) logging.critical("Failed to connect to database.") stats.set_gauge("successful-background-run", 0) self.capture_exception() except: stats.set_gauge("successful-background-run", 0) self.capture_exception() raise sleep(60)
def run(self): # type: () -> None while True: try: with closing(Session()) as session: self.logger.info("Expiring edges....") self.expire_edges(session) self.logger.info("Expiring nonauditor approvers in audited groups...") self.expire_nonauditors(session) self.logger.info("Sending emails...") process_async_emails(self.settings, session, datetime.utcnow()) self.logger.info("Pruning old traces....") prune_old_traces(session) session.commit() stats.log_gauge("successful-background-update", 1) stats.log_gauge("failed-background-update", 0) except OperationalError: Session.configure(bind=get_db_engine(get_database_url(self.settings))) self.logger.critical("Failed to connect to database.") stats.log_gauge("successful-background-update", 0) stats.log_gauge("failed-background-update", 1) self._capture_exception() except: stats.log_gauge("successful-background-update", 0) stats.log_gauge("failed-background-update", 1) self._capture_exception() self.logger.exception("Unexpected exception occurred in background thread.") raise self.logger.debug("Sleeping for {} seconds...".format(self.settings.sleep_interval)) sleep(self.settings.sleep_interval)
def test_expiration_notifications(expiring_graph, session, users, groups, permissions): # noqa now = datetime.utcnow() note_exp_now = now + timedelta(settings.expiration_notice_days) day = timedelta(1) week = timedelta(7) # What expirations are coming up in the next day? Next week? upcoming_expirations = _get_unsent_expirations(session, now+day) assert upcoming_expirations == [] upcoming_expirations = _get_unsent_expirations(session, now+week) assert sorted(upcoming_expirations) == [ # Group, subgroup, subgroup owners. ("serving-team", "team-sre", "*****@*****.**"), ("serving-team", "team-sre", "*****@*****.**"), # Group, user, user. ("team-sre", "*****@*****.**", "*****@*****.**"), ] # Make someone expire a week from now. edit_member(groups["team-sre"], users["*****@*****.**"], expiration=note_exp_now+week) upcoming_expirations = _get_unsent_expirations(session, now+week) assert sorted(upcoming_expirations) == [ # Group, subgroup, subgroup owners. ("serving-team", "team-sre", "*****@*****.**"), ("serving-team", "team-sre", "*****@*****.**"), # Group, user, user. ("team-sre", "*****@*****.**", "*****@*****.**"), ("team-sre", "*****@*****.**", "*****@*****.**"), ] # Now cancel that expiration. edit_member(groups["team-sre"], users["*****@*****.**"], expiration=None) upcoming_expirations = _get_unsent_expirations(session, now+week) assert sorted(upcoming_expirations) == [ # Group, subgroup, subgroup owners. ("serving-team", "team-sre", "*****@*****.**"), ("serving-team", "team-sre", "*****@*****.**"), # Group, user, user. ("team-sre", "*****@*****.**", "*****@*****.**"), ] # Make an ordinary member an owner. edit_member(groups["team-sre"], users["*****@*****.**"], role="owner") upcoming_expirations = _get_unsent_expirations(session, now+week) assert sorted(upcoming_expirations) == [ # Group, subgroup, subgroup owners. ("serving-team", "team-sre", "*****@*****.**"), ("serving-team", "team-sre", "*****@*****.**"), ("serving-team", "team-sre", "*****@*****.**"), # Group, user, user. ("team-sre", "*****@*****.**", "*****@*****.**"), ] # Make an owner an ordinary member. edit_member(groups["team-sre"], users["*****@*****.**"], role="member") upcoming_expirations = _get_unsent_expirations(session, now+week) assert sorted(upcoming_expirations) == [ # Group, subgroup, subgroup owners. ("serving-team", "team-sre", "*****@*****.**"), ("serving-team", "team-sre", "*****@*****.**"), # Group, user, user. ("team-sre", "*****@*****.**", "*****@*****.**"), ] # Send notices about expirations coming up in the next day, next week. notices_sent = process_async_emails(settings, session, now+day, dry_run=True) assert notices_sent == 0 notices_sent = process_async_emails(settings, session, now+week, dry_run=True) assert notices_sent == 3 # ("serving-team", "team-sre", "*****@*****.**") # ("serving-team", "team-sre", "*****@*****.**") # ("team-sre", "*****@*****.**", "*****@*****.**") # Notices in the upcoming week have already been sent, but there's another # two weeks from now. upcoming_expirations = _get_unsent_expirations(session, now+week) assert upcoming_expirations == [] upcoming_expirations = _get_unsent_expirations(session, now+2*week) assert upcoming_expirations == [ ("tech-ops", "*****@*****.**", "*****@*****.**"), ] # We already sent these notices. notices_sent = process_async_emails(settings, session, now+week, dry_run=True) assert notices_sent == 0 # Extend gary's membership to beyond worth mentioning expiration in two weeks. add_member(groups["tech-ops"], users["*****@*****.**"], expiration=note_exp_now+3*week) upcoming_expirations = _get_unsent_expirations(session, now+2*week) assert upcoming_expirations == [] notices_sent = process_async_emails(settings, session, now+2*week, dry_run=True) assert notices_sent == 0