refactor utils.handlers.HTTPSHandler's usage of django settings

This commit is contained in:
Ryan Petrello
2017-02-08 16:10:48 -05:00
parent 29869f7093
commit 669012138e
2 changed files with 35 additions and 38 deletions

View File

@@ -1,10 +1,11 @@
import json import json
import logging import logging
from django.conf import LazySettings
import pytest import pytest
import requests import requests
from awx.main.utils.handlers import HTTPSHandler from awx.main.utils.handlers import BaseHTTPSHandler as HTTPSHandler, PARAM_NAMES
from awx.main.utils.formatters import LogstashFormatter from awx.main.utils.formatters import LogstashFormatter
@@ -25,31 +26,28 @@ def ok200_adapter():
@pytest.mark.django_db @pytest.mark.parametrize('param', PARAM_NAMES.keys())
@pytest.mark.parametrize('param, value', [ def test_https_logging_handler_defaults(param):
('host', None),
('port', None),
('message_type', None),
('username', None),
('password', None),
('enabled_loggers', ['awx', 'activity_stream', 'job_events', 'system_tracking']),
('indv_facts', None),
('enabled_flag', None)
])
def test_https_logging_handler_defaults(param, value):
handler = HTTPSHandler() handler = HTTPSHandler()
assert hasattr(handler, param) and getattr(handler, param) == value assert hasattr(handler, param) and getattr(handler, param) is None
@pytest.mark.django_db @pytest.mark.parametrize('param', PARAM_NAMES.keys())
@pytest.mark.parametrize('param', ['host', 'port', 'message_type', 'username',
'password', 'indv_facts', 'enabled_flag'])
def test_https_logging_handler_kwargs(param): def test_https_logging_handler_kwargs(param):
handler = HTTPSHandler(**{param: 'EXAMPLE'}) handler = HTTPSHandler(**{param: 'EXAMPLE'})
assert hasattr(handler, param) and getattr(handler, param) == 'EXAMPLE' assert hasattr(handler, param) and getattr(handler, param) == 'EXAMPLE'
@pytest.mark.django_db @pytest.mark.parametrize('param, django_settings_name', PARAM_NAMES.items())
def test_https_logging_handler_from_django_settings(param, django_settings_name):
settings = LazySettings()
settings.configure(**{
django_settings_name: 'EXAMPLE'
})
handler = HTTPSHandler.from_django_settings(settings)
assert hasattr(handler, param) and getattr(handler, param) == 'EXAMPLE'
def test_https_logging_handler_logstash_auth_info(): def test_https_logging_handler_logstash_auth_info():
handler = HTTPSHandler(message_type='logstash', username='bob', password='ansible') handler = HTTPSHandler(message_type='logstash', username='bob', password='ansible')
handler.add_auth_information() handler.add_auth_information()
@@ -58,7 +56,6 @@ def test_https_logging_handler_logstash_auth_info():
assert handler.session.auth.password == 'ansible' assert handler.session.auth.password == 'ansible'
@pytest.mark.django_db
def test_https_logging_handler_splunk_auth_info(): def test_https_logging_handler_splunk_auth_info():
handler = HTTPSHandler(message_type='splunk', password='ansible') handler = HTTPSHandler(message_type='splunk', password='ansible')
handler.add_auth_information() handler.add_auth_information()
@@ -66,7 +63,6 @@ def test_https_logging_handler_splunk_auth_info():
assert handler.session.headers['Content-Type'] == 'application/json' assert handler.session.headers['Content-Type'] == 'application/json'
@pytest.mark.django_db
@pytest.mark.parametrize('host, port, normalized', [ @pytest.mark.parametrize('host, port, normalized', [
('localhost', None, 'http://localhost'), ('localhost', None, 'http://localhost'),
('localhost', 80, 'http://localhost'), ('localhost', 80, 'http://localhost'),
@@ -81,7 +77,6 @@ def test_https_logging_handler_http_host_format(host, port, normalized):
assert handler.get_http_host() == normalized assert handler.get_http_host() == normalized
@pytest.mark.django_db
@pytest.mark.parametrize('params, logger_name, expected', [ @pytest.mark.parametrize('params, logger_name, expected', [
({'enabled_flag': False}, 'awx.main', True), # skip all records if enabled_flag = False ({'enabled_flag': False}, 'awx.main', True), # skip all records if enabled_flag = False
({'host': '', 'enabled_flag': True}, 'awx.main', True), # skip all records if the host is undefined ({'host': '', 'enabled_flag': True}, 'awx.main', True), # skip all records if the host is undefined
@@ -91,16 +86,14 @@ def test_https_logging_handler_http_host_format(host, port, normalized):
]) ])
def test_https_logging_handler_skip_log(params, logger_name, expected): def test_https_logging_handler_skip_log(params, logger_name, expected):
handler = HTTPSHandler(**params) handler = HTTPSHandler(**params)
# override the default loggers set by django_settings
handler.enabled_loggers = params.get('enabled_loggers')
assert handler.skip_log(logger_name) is expected assert handler.skip_log(logger_name) is expected
@pytest.mark.django_db
@pytest.mark.parametrize('message_type', ['logstash', 'splunk']) @pytest.mark.parametrize('message_type', ['logstash', 'splunk'])
def test_https_logging_handler_emit(ok200_adapter, message_type): def test_https_logging_handler_emit(ok200_adapter, message_type):
handler = HTTPSHandler(host='127.0.0.1', enabled_flag=True, handler = HTTPSHandler(host='127.0.0.1', enabled_flag=True,
message_type=message_type) message_type=message_type,
enabled_loggers=['awx', 'activity_stream', 'job_events', 'system_tracking'])
handler.setFormatter(LogstashFormatter()) handler.setFormatter(LogstashFormatter())
handler.session.mount('http://', ok200_adapter) handler.session.mount('http://', ok200_adapter)
record = logging.LogRecord( record = logging.LogRecord(
@@ -130,10 +123,10 @@ def test_https_logging_handler_emit(ok200_adapter, message_type):
assert body['message'] == 'User joe logged in' assert body['message'] == 'User joe logged in'
@pytest.mark.django_db
def test_https_logging_handler_emit_one_record_per_fact(ok200_adapter): def test_https_logging_handler_emit_one_record_per_fact(ok200_adapter):
handler = HTTPSHandler(host='127.0.0.1', enabled_flag=True, handler = HTTPSHandler(host='127.0.0.1', enabled_flag=True,
message_type='logstash', indv_facts=True) message_type='logstash', indv_facts=True,
enabled_loggers=['awx', 'activity_stream', 'job_events', 'system_tracking'])
handler.setFormatter(LogstashFormatter()) handler.setFormatter(LogstashFormatter())
handler.session.mount('http://', ok200_adapter) handler.session.mount('http://', ok200_adapter)
record = logging.LogRecord( record = logging.LogRecord(

View File

@@ -45,24 +45,22 @@ class HTTPSNullHandler(NullHandler):
return super(HTTPSNullHandler, self).__init__() return super(HTTPSNullHandler, self).__init__()
class HTTPSHandler(logging.Handler): class BaseHTTPSHandler(logging.Handler):
def __init__(self, fqdn=False, **kwargs): def __init__(self, fqdn=False, **kwargs):
super(HTTPSHandler, self).__init__() super(BaseHTTPSHandler, self).__init__()
self.fqdn = fqdn self.fqdn = fqdn
self.async = kwargs.get('async', True) self.async = kwargs.get('async', True)
for fd in PARAM_NAMES: for fd in PARAM_NAMES:
# settings values take precedence over the input params setattr(self, fd, kwargs.get(fd, None))
settings_name = PARAM_NAMES[fd]
settings_val = getattr(django_settings, settings_name, None)
if settings_val:
setattr(self, fd, settings_val)
elif fd in kwargs:
setattr(self, fd, kwargs[fd])
else:
setattr(self, fd, None)
self.session = FuturesSession() self.session = FuturesSession()
self.add_auth_information() self.add_auth_information()
@classmethod
def from_django_settings(cls, settings, *args, **kwargs):
for param, django_setting_name in PARAM_NAMES.items():
kwargs[param] = getattr(settings, django_setting_name, None)
return cls(*args, **kwargs)
def get_full_message(self, record): def get_full_message(self, record):
if record.exc_info: if record.exc_info:
return '\n'.join(traceback.format_exception(*record.exc_info)) return '\n'.join(traceback.format_exception(*record.exc_info))
@@ -155,3 +153,9 @@ class HTTPSHandler(logging.Handler):
raise raise
except: except:
self.handleError(record) self.handleError(record)
class HTTPSHandler(object):
def __new__(cls, *args, **kwargs):
return BaseHTTPSHandler.from_django_settings(django_settings, *args, **kwargs)