diff options
| author | Scott Moser <smoser@ubuntu.com> | 2015-08-07 14:45:01 -0500 | 
|---|---|---|
| committer | Scott Moser <smoser@ubuntu.com> | 2015-08-07 14:45:01 -0500 | 
| commit | 9975e06338bb646dbefe0749f7a8f88974d44d24 (patch) | |
| tree | 17b072271f8faa303bbfdde1ff33496cc320ecec /cloudinit/reporting/handlers.py | |
| parent | 328cc7fbaf4d60b51193fb8c14e52d8c6f3273f2 (diff) | |
| parent | 95bfe5d5150e2bf0a26dd1b97578c4fd04152365 (diff) | |
| download | vyos-cloud-init-9975e06338bb646dbefe0749f7a8f88974d44d24.tar.gz vyos-cloud-init-9975e06338bb646dbefe0749f7a8f88974d44d24.zip | |
Add initial reporting module and events
Diffstat (limited to 'cloudinit/reporting/handlers.py')
| -rw-r--r-- | cloudinit/reporting/handlers.py | 90 | 
1 files changed, 90 insertions, 0 deletions
| diff --git a/cloudinit/reporting/handlers.py b/cloudinit/reporting/handlers.py new file mode 100644 index 00000000..1343311f --- /dev/null +++ b/cloudinit/reporting/handlers.py @@ -0,0 +1,90 @@ +# vi: ts=4 expandtab + +import abc +import oauthlib.oauth1 as oauth1 +import six + +from ..registry import DictRegistry +from .. import (url_helper, util) +from .. import log as logging + + +LOG = logging.getLogger(__name__) + + +@six.add_metaclass(abc.ABCMeta) +class ReportingHandler(object): +    """Base class for report handlers. + +    Implement :meth:`~publish_event` for controlling what +    the handler does with an event. +    """ + +    @abc.abstractmethod +    def publish_event(self, event): +        """Publish an event to the ``INFO`` log level.""" + + +class LogHandler(ReportingHandler): +    """Publishes events to the cloud-init log at the ``INFO`` log level.""" + +    def __init__(self, level="DEBUG"): +        super(LogHandler, self).__init__() +        if isinstance(level, int): +            pass +        else: +            input_level = level +            try: +                level = gettattr(logging, level.upper()) +            except: +                LOG.warn("invalid level '%s', using WARN", input_level) +                level = logging.WARN +        self.level = level + +    def publish_event(self, event): +        """Publish an event to the ``INFO`` log level.""" +        logger = logging.getLogger( +            '.'.join(['cloudinit', 'reporting', event.event_type, event.name])) +        logger.log(self.level, event.as_string()) + + +class PrintHandler(ReportingHandler): +    def publish_event(self, event): +        """Publish an event to the ``INFO`` log level.""" + + +class WebHookHandler(ReportingHandler): +    def __init__(self, endpoint, consumer_key=None, token_key=None, +                 token_secret=None, consumer_secret=None, timeout=None, +                 retries=None): +        super(WebHookHandler, self).__init__() + +        if any([consumer_key, token_key, token_secret, consumer_secret]): +            self.oauth_helper = url_helper.OauthUrlHelper( +                consumer_key=consumer_key, token_key=token_key, +                token_secret=token_secret, consumer_secret=consumer_secret) +        else: +            self.oauth_helper = None +        self.endpoint = endpoint +        self.timeout = timeout +        self.retries = retries +        self.ssl_details = util.fetch_ssl_details() + +    def publish_event(self, event): +        if self.oauth_helper: +            readurl = self.oauth_helper.readurl +        else: +            readurl = url_helper.readurl +        try: +            return readurl( +                self.endpoint, data=event.as_dict(), +                timeout=self.timeout, +                retries=self.retries, ssl_details=self.ssl_details) +        except: +            LOG.warn("failed posting event: %s" % event.as_string()) + + +available_handlers = DictRegistry() +available_handlers.register_item('log', LogHandler) +available_handlers.register_item('print', PrintHandler) +available_handlers.register_item('webhook', WebHookHandler) | 
