From 256f8be442576c1b50cd246878454ef6651a5e6c Mon Sep 17 00:00:00 2001 From: Daan Bakker Date: Fri, 13 Mar 2020 15:04:56 +0100 Subject: [PATCH] Adding an integration test for the GELFRabbitHandler --- tests/config/docker-compose-rmq.yml | 9 ++++++ tests/config/docker-compose.yml | 2 +- tests/config/inputs.json | 26 +++++++++++++++++ tests/config/setup_rabbitmq.sh | 5 ++++ tests/config/start_local_graylog_server.sh | 15 +++++++++- tests/config/stop_local_graylog_server.sh | 1 + tests/integration/test_rmq_logging.py | 33 ++++++++++++++++++++++ 7 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 tests/config/docker-compose-rmq.yml create mode 100755 tests/config/setup_rabbitmq.sh create mode 100644 tests/integration/test_rmq_logging.py diff --git a/tests/config/docker-compose-rmq.yml b/tests/config/docker-compose-rmq.yml new file mode 100644 index 000000000..a56940fd7 --- /dev/null +++ b/tests/config/docker-compose-rmq.yml @@ -0,0 +1,9 @@ +version: '2' +services: + rabbitmq: + image: "rabbitmq:3.8-management-alpine" + volumes: + - ./setup_rabbitmq.sh:/usr/local/bin/setup_rabbitmq.sh + ports: + - "5672:5672" + - "15672:15672" \ No newline at end of file diff --git a/tests/config/docker-compose.yml b/tests/config/docker-compose.yml index 854dbdcca..ab2d1a720 100644 --- a/tests/config/docker-compose.yml +++ b/tests/config/docker-compose.yml @@ -28,4 +28,4 @@ services: - "12201:12201/tcp" - "12202:12202/udp" - "12203:12203" - - "12204:12204/tcp" + - "12204:12204/tcp" \ No newline at end of file diff --git a/tests/config/inputs.json b/tests/config/inputs.json index d1d7b5e4e..4e58d5826 100644 --- a/tests/config/inputs.json +++ b/tests/config/inputs.json @@ -39,6 +39,32 @@ }, "type": "org.graylog2.inputs.gelf.tcp.GELFTCPInput", "global": true + }, + { + "title":"rmq", + "configuration": { + "heartbeat":60, + "prefetch":100, + "exchange_bind":true, + "broker_vhost":"/", + "broker_username":"graylog", + "decompress_size_limit":8388608, + "broker_port":5672, + "parallel_queues":1, + "broker_password":"graylog", + "throttling_allowed":false, + "exchange":"log-messages", + "tls":false, + "override_source":null, + "routing_key":"#", + "requeue_invalid_messages":true, + "broker_hostname":"rabbitmq", + "queue":"log-messages" + }, + "static_fields":{}, + "type":"org.graylog2.inputs.gelf.amqp.GELFAMQPInput", + "global":true, + "extractors":[] } ], "streams": [], diff --git a/tests/config/setup_rabbitmq.sh b/tests/config/setup_rabbitmq.sh new file mode 100755 index 000000000..60b378c11 --- /dev/null +++ b/tests/config/setup_rabbitmq.sh @@ -0,0 +1,5 @@ +rabbitmqctl add_user graylog graylog +rabbitmqctl set_user_tags graylog administrator +rabbitmqctl set_permissions -p / graylog ".*" ".*" ".*" + +rabbitmqadmin declare exchange name=log-messages type=direct -u graylog -p graylog \ No newline at end of file diff --git a/tests/config/start_local_graylog_server.sh b/tests/config/start_local_graylog_server.sh index cf140a3ce..ece59e9f9 100644 --- a/tests/config/start_local_graylog_server.sh +++ b/tests/config/start_local_graylog_server.sh @@ -6,12 +6,25 @@ DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" cd ${DIR} +# remove a potential previous setup +docker-compose -f docker-compose-rmq.yml down +docker-compose -f docker-compose.yml down + +# first setup RabbitMQ, as it requires extra setup before Graylog can connect to it. +docker-compose -f docker-compose-rmq.yml up -d + +# wait for RabbitMQ to start +sleep 30 + +# Configure a user and exchange for graylog to use +RMQ_CONTAINER_ID="$(docker ps -qf "name=rabbit")" +docker exec -ti ${RMQ_CONTAINER_ID} sh /usr/local/bin/setup_rabbitmq.sh + # create ssl certs for enabling the graylog server to use a # TLS connection for GELF input bash create_ssl_certs.sh -h localhost -i 127.0.0.1 # start the graylog server docker container -docker-compose -f docker-compose.yml down docker-compose -f docker-compose.yml up -d # wait for the graylog server docker container to start diff --git a/tests/config/stop_local_graylog_server.sh b/tests/config/stop_local_graylog_server.sh index 1305e1b0a..0cac7f1d6 100644 --- a/tests/config/stop_local_graylog_server.sh +++ b/tests/config/stop_local_graylog_server.sh @@ -6,4 +6,5 @@ DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" cd ${DIR} +docker-compose -f docker-compose-rmq.yml down docker-compose -f docker-compose.yml down diff --git a/tests/integration/test_rmq_logging.py b/tests/integration/test_rmq_logging.py new file mode 100644 index 000000000..4fee28ac8 --- /dev/null +++ b/tests/integration/test_rmq_logging.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +"""pytests sending logs to Graylog through RabbitMQ""" + +import logging + +import pytest + +from graypy.rabbitmq import GELFRabbitHandler +from graypy.handler import SYSLOG_LEVELS + +from tests.integration import LOCAL_GRAYLOG_UP +from tests.integration.helper import get_unique_message, get_graylog_response + + +@pytest.mark.skipif(not LOCAL_GRAYLOG_UP, + reason="local Graylog instance not up") +def test_rmq_logging(): + """Test that verifies the log message was received by Graylog""" + logger = logging.getLogger("test_rmq_logging") + handler = GELFRabbitHandler(url="amqp://graylog:graylog@127.0.0.1", + exchange="log-messages", + exchange_type="direct", + routing_key="#") + logger.addHandler(handler) + message = get_unique_message() + logger.error(message) + graylog_response = get_graylog_response(message) + assert message == graylog_response["message"] + assert "long_message" not in graylog_response + assert "timestamp" in graylog_response + assert SYSLOG_LEVELS[logging.ERROR] == graylog_response["level"]