|
1 | 1 | import pytest |
2 | 2 |
|
| 3 | +from django.test import RequestFactory |
3 | 4 | from prometheus_client.parser import text_string_to_metric_families |
| 5 | +from rest_framework.request import Request |
4 | 6 | from awx.main import models |
5 | 7 | from awx.main.analytics.metrics import metrics |
| 8 | +from awx.main.analytics.dispatcherd_metrics import get_dispatcherd_metrics |
6 | 9 | from awx.api.versioning import reverse |
7 | 10 |
|
8 | 11 | EXPECTED_VALUES = { |
@@ -77,3 +80,55 @@ def test_metrics_http_methods(get, post, patch, put, options, admin): |
77 | 80 | assert patch(get_metrics_view_db_only(), user=admin).status_code == 405 |
78 | 81 | assert post(get_metrics_view_db_only(), user=admin).status_code == 405 |
79 | 82 | assert options(get_metrics_view_db_only(), user=admin).status_code == 200 |
| 83 | + |
| 84 | + |
| 85 | +class DummyMetricsResponse: |
| 86 | + def __init__(self, payload): |
| 87 | + self._payload = payload |
| 88 | + |
| 89 | + def read(self): |
| 90 | + return self._payload |
| 91 | + |
| 92 | + def __enter__(self): |
| 93 | + return self |
| 94 | + |
| 95 | + def __exit__(self, exc_type, exc, tb): |
| 96 | + return False |
| 97 | + |
| 98 | + |
| 99 | +def test_dispatcherd_metrics_node_filter_match(mocker, settings): |
| 100 | + settings.CLUSTER_HOST_ID = "awx-1" |
| 101 | + payload = b'# HELP test_metric A test metric\n# TYPE test_metric gauge\ntest_metric 1\n' |
| 102 | + |
| 103 | + def fake_urlopen(url, timeout=1.0): |
| 104 | + return DummyMetricsResponse(payload) |
| 105 | + |
| 106 | + mocker.patch('urllib.request.urlopen', fake_urlopen) |
| 107 | + |
| 108 | + request = Request(RequestFactory().get('/api/v2/metrics/', {'node': 'awx-1'})) |
| 109 | + |
| 110 | + assert get_dispatcherd_metrics(request) == payload.decode('utf-8') |
| 111 | + |
| 112 | + |
| 113 | +def test_dispatcherd_metrics_node_filter_excludes_local(mocker, settings): |
| 114 | + settings.CLUSTER_HOST_ID = "awx-1" |
| 115 | + |
| 116 | + def fake_urlopen(*args, **kwargs): |
| 117 | + raise AssertionError("urlopen should not be called when node filter excludes local node") |
| 118 | + |
| 119 | + mocker.patch('urllib.request.urlopen', fake_urlopen) |
| 120 | + |
| 121 | + request = Request(RequestFactory().get('/api/v2/metrics/', {'node': 'awx-2'})) |
| 122 | + |
| 123 | + assert get_dispatcherd_metrics(request) == '' |
| 124 | + |
| 125 | + |
| 126 | +def test_dispatcherd_metrics_metric_filter_excludes_unrelated(mocker): |
| 127 | + def fake_urlopen(*args, **kwargs): |
| 128 | + raise AssertionError("urlopen should not be called when metric filter excludes dispatcherd metrics") |
| 129 | + |
| 130 | + mocker.patch('urllib.request.urlopen', fake_urlopen) |
| 131 | + |
| 132 | + request = Request(RequestFactory().get('/api/v2/metrics/', {'metric': 'awx_system_info'})) |
| 133 | + |
| 134 | + assert get_dispatcherd_metrics(request) == '' |
0 commit comments