-
Notifications
You must be signed in to change notification settings - Fork 815
/
Copy pathtest_dns_check.py
126 lines (106 loc) · 5 KB
/
test_dns_check.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# stdlib
import mock
# 3p
from dns.rdatatype import UnknownRdatatype
from dns.resolver import Resolver, Timeout, NXDOMAIN
# project
from tests.checks.common import AgentCheckTest
from checks import AgentCheck
METRICS = [
'dns.response_time'
]
SERVICE_CHECK_NAME = 'dns.can_resolve'
class MockDNSAnswer:
def __init__(self, address):
self.rrset = MockDNSAnswer.MockRrset(address)
class MockRrset:
def __init__(self, address):
self.items = [MockDNSAnswer.MockItem(address)]
class MockItem:
def __init__(self, address):
self._address = address
def to_text(self):
return self._address
def success_query_mock(d_name, rdtype):
if rdtype == 'A':
return MockDNSAnswer('127.0.0.1')
elif rdtype == 'CNAME':
return MockDNSAnswer('alias.example.org')
class TestDns(AgentCheckTest):
CHECK_NAME = 'dns_check'
@mock.patch.object(Resolver, 'query', side_effect=success_query_mock)
def test_success(self, mocked_query):
config = {
'instances': [{'hostname': 'www.example.org', 'nameserver': '127.0.0.1'}]
}
self.run_check(config)
self.assertMetric('dns.response_time', count=1,
tags=['nameserver:127.0.0.1', 'resolved_hostname:www.example.org'])
self.assertServiceCheck(SERVICE_CHECK_NAME, status=AgentCheck.OK,
tags=['resolved_hostname:www.example.org', 'nameserver:127.0.0.1'])
self.coverage_report()
@mock.patch.object(Resolver, 'query', side_effect=success_query_mock)
def test_success_addresses(self, mocked_query):
config = {
'instances': [{'hostname': 'www.example.org', 'nameserver': '127.0.0.1', 'addresses': ['127.0.0.1']}]
}
self.run_check(config)
self.assertMetric('dns.response_time', count=1,
tags=['nameserver:127.0.0.1', 'resolved_hostname:www.example.org'])
self.assertServiceCheck(SERVICE_CHECK_NAME, status=AgentCheck.OK,
tags=['resolved_hostname:www.example.org', 'nameserver:127.0.0.1'])
self.coverage_report()
@mock.patch.object(Resolver, 'query', side_effect=success_query_mock)
def test_failure_addresses(self, mocked_query):
config = {
'instances': [{'hostname': 'www.example.org', 'nameserver': '127.0.0.1', 'addresses': ['127.0.0.2']}]
}
self.run_check(config)
self.assertMetric('dns.response_time', count=1,
tags=['nameserver:127.0.0.1', 'resolved_hostname:www.example.org'])
self.assertServiceCheck(SERVICE_CHECK_NAME, status=AgentCheck.CRITICAL,
tags=['resolved_hostname:www.example.org', 'nameserver:127.0.0.1'])
self.coverage_report()
@mock.patch.object(Resolver, 'query', side_effect=success_query_mock)
def test_success_CNAME(self, mocked_query):
config = {
'instances': [{'hostname': 'www.example.org', 'nameserver': '127.0.0.1', 'record_type': 'CNAME'}]
}
self.run_check(config)
self.assertMetric('dns.response_time', count=1,
tags=['nameserver:127.0.0.1', 'resolved_hostname:www.example.org'])
self.assertServiceCheck(SERVICE_CHECK_NAME, status=AgentCheck.OK,
tags=['resolved_hostname:www.example.org', 'nameserver:127.0.0.1'])
self.coverage_report()
@mock.patch.object(Resolver, 'query', side_effect=Timeout())
def test_timeout(self, mocked_query):
configs = [
# short default timeout
{'init_config': {'default_timeout': 0.1},
'instances': [{'hostname': 'www.example.org', 'nameserver': '127.0.0.1'}]},
# short timeout
{'instances': [{'hostname': 'www.example.org', 'timeout': 0.1, 'nameserver': '127.0.0.1'}]},
]
for config in configs:
self.assertRaises(
Timeout,
lambda: self.run_check(config)
)
self.assertEquals(len(self.metrics), 0)
self.assertServiceCheck(SERVICE_CHECK_NAME, status=AgentCheck.CRITICAL,
tags=['resolved_hostname:www.example.org', 'nameserver:127.0.0.1'])
self.coverage_report()
def test_invalid_config(self):
configs = [
# invalid hostname
({'instances': [{'hostname': 'example'}]}, NXDOMAIN),
# invalid nameserver
({'instances': [{'hostname': 'www.example.org', 'nameserver': '0.0.0.0'}]}, Timeout),
# invalid record type
({'instances': [{'hostname': 'www.example.org', 'record_type': 'FOO'}]}, UnknownRdatatype),
]
for config, exception_class in configs:
self.assertRaises(exception_class, self.run_check, config, force_reload=True)
self.assertEquals(len(self.metrics), 0)
self.assertServiceCheck(SERVICE_CHECK_NAME, status=AgentCheck.CRITICAL)
self.coverage_report()