#!/usr/bin/env python3 import requests import yaml import logging from config import Config from sentry_project import SentryProject from sentry_project_rule import SentryProjectRule def apply(): logger.info('read configuration from file...') with open(r'config.yaml') as file: configuration = yaml.full_load(file) projects = configuration['projects'] projects = [SentryProject(projects[p], logger) for p in projects] logger.info('get rules info for projects from Sentry') for project in projects: logger.debug(f'read rules for project {project.name}') r = requests.get(f"{project.url}/rules/", headers=Config.auth_header) rules_remote = [] for remote_rule in r.json(): logger.debug(f'project {project.name} has a rule: {remote_rule["name"]} on environment {remote_rule["environment"]}') rules_remote.append(SentryProjectRule(remote_rule, project.url, logger)) # remove manually created rules logger.info(f'Start rules removal from project: {project.name}') for remote_rule in rules_remote: if remote_rule.id not in project.rules_id: logger.debug(f'delete rule {remote_rule.id}') remote_rule.delete_rule() else: logger.debug(f'rule {remote_rule.id} exists in config, skip') logger.info(f'End rules removal from project: {project.name}') # create or update a rule logger.info(f'Start rules creation and updating for project: {project.name}') for rule in project.get_rules(): if hasattr(rule, 'id'): logger.debug(f'update rule {rule.name} for project {project.name}') rule.update_rule() else: logger.debug(f'create rule {rule.name} for project {project.name}') rule.create_rule() logger.info('End rules creation and updating for project: {project.name}') if __name__ == '__main__': # logging configuration logger = logging.getLogger('sentry_project_rules') logger.setLevel(logging.DEBUG) ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') ch.setFormatter(formatter) logger.addHandler(ch) logger.info('Start...') apply() logger.info('Finish...')