예제 #1
0
def setup_events():
    if FILE_PATH is not None:
        logger.info("Event Definitions configuration file: %s" %
                    FILE_PATH.split('/')[-1])

        with open(FILE_PATH) as cf:
            config = cf.read()
        try:
            events_config = yaml.safe_load(config)
        except yaml.YAMLError as err:
            if hasattr(err, 'problem_mark'):
                mark = err.problem_mark
                errmsg = ("Invalid YAML syntax in Event Definitions file "
                          "%(file)s at line: %(line)s, column: %(column)s." %
                          dict(file=FILE_PATH.split('/')[-1],
                               line=mark.line + 1,
                               column=mark.column + 1))
            else:
                errmsg = ("YAML error reading Event Definitions file: %s" %
                          FILE_PATH.split('/')[-1])
            logger.error(errmsg)
            raise
        else:
            return EventConverter(events_config)
    else:
        logger.error("No Event Definitions configuration file found!")
예제 #2
0
 def to_event(self, notification_body):
     event_type = notification_body['event_type']
     edef = None
     for d in self.definitions:
         if d.match_type(event_type):
             edef = d
             break
     if edef is None:
         logger.info("Dropping Notification %s" % event_type)
         return None
     logger.info("Event Notification is about to convert : %s from"
                 " Module EventConverter." % event_type)
     return edef.to_event(notification_body)
예제 #3
0
    def to_event(self, notification_body):
        event_type = notification_body['event_type']
        logger.info("Event_type from notification_body %s from"
                    " Module EventDefnition." % event_type)
        traits = (self.traits[t].to_trait(notification_body)
                  for t in self.traits)
        trait_dict = {}
        try:
            for trait in traits:
                trait_dict[trait.name] = trait.value or None
        except Exception as err:
            logger.error("The trait error is: %s" % err)

        trait_dict['Action'] = self.cfg['Action']
        return trait_dict
예제 #4
0
    def __init__(self, definition_cfg):
        self.traits = dict()
        self.include_types = []
        self.cfg = definition_cfg
        self.invalid_keys = {"event_type", "Action"}

        event_type = definition_cfg['event_type']
        self.include_types.append(event_type)
        for t in self.include_types:
            logger.info("Monitored resources from "
                        "event definition yaml file: %s" % t.split('.')[0])

        for trait_name in self.exclude_keys(self.cfg, self.invalid_keys):
            self.traits[trait_name] = TraitDefinition(
                trait_name, definition_cfg[trait_name])
예제 #5
0
    def __init__(self, name, trait_cfg):
        self.cfg = trait_cfg
        self.name = name

        if 'fields' not in trait_cfg:
            logger.error(
                "Required fields in trait definition not "
                "specified:'%s'" % 'fields', self.cfg)
            return None

        fields = trait_cfg['fields']
        try:
            self.fields = jsonpath_rw.parse(fields)
            logger.info("Jsonpath_rw's fields: %s" % self.fields)
        except Exception as e:
            logger.error("Parse error in JSONPath specification "
                         "'%(jsonpath)s' for %(trait)s: %(err)s" %
                         dict(jsonpath=fields, trait=name, err=e))
예제 #6
0
    def process_notification(self, notification):
        event = self.event_converter.to_event(notification)

        if event is not None:
            logger.info("Time to emit event to cloud api: %s" % event)
            try:
                response = ApiHandler.call_api(event)
            except requests.ConnectionError as e:
                logger.error("The error from api: %s" % e)
                return False
            except Exception as err:
                logger.error("The error from api: %s" % err)
                return False
            try:
                data = response.json()
                if data['status'] == '000000':
                    logger.info("Success to emit event: %s to cloud api.The "
                                "response code and msg are: %s, %s." %
                                (event, data['status'], data['message']))
                    return True
                else:
                    logger.error("Failed to emit event: %s to cloud api. The "
                                 "response code and msg are: %s, %s." %
                                 (event, data['status'], data['message']))
                    return False
            except Exception as err:
                logger.info("The response error is: %s" % err)
                return False
        return True
 def start(self):
     super(NotificationService, self).start()
     endpoints = [endpoint.NotificationHandler()]
     targets = [oslo.messaging.Target(topic=TOPIC)]
     self.listeners = []
     logger.info("The rabbit broker hosts are : %s" % HOSTS)
     for url in HOSTS.split(','):
         TRANSPORT_URL = 'rabbit://%s:%s@%s/' % (RABBIT_USER,
                                                 RABBIT_PASSWD, url)
         transport = messaging.get_transport(url=TRANSPORT_URL)
         listener = messaging.get_notification_listener(
             transport, targets, endpoints)
         logger.info("The listener is: %s" % listener)
         logger.info('Starting up server')
         listener.start()
         self.listeners.append(listener)
         logger.info('Waiting for something')
     self.tg.add_timer(604800, lambda: None)