]> git.ipfire.org Git - thirdparty/pdns.git/blame - regression-tests.dnsdist/test_API.py
Merge pull request #4485 from mind04/cache-soa
[thirdparty/pdns.git] / regression-tests.dnsdist / test_API.py
CommitLineData
02bbf9eb
RG
1#!/usr/bin/env python
2
3import requests
4from dnsdisttests import DNSDistTest
5
6class TestBasics(DNSDistTest):
7
8 _webTimeout = 2.0
9 _webServerPort = 8083
10 _webServerBasicAuthPassword = 'secret'
11 _webServerAPIKey = 'apisecret'
12 # paths accessible using the API key
13 _apiPaths = ['/api/v1/servers/localhost', '/api/v1/servers/localhost/config', '/api/v1/servers/localhost/statistics', '/jsonstat?command=stats', '/jsonstat?command=dynblocklist']
14 # paths accessible using basic auth only (list not exhaustive)
15 _basicOnlyPaths = ['/', '/index.html']
16 _config_params = ['_testServerPort', '_webServerPort', '_webServerBasicAuthPassword', '_webServerAPIKey']
17 _config_template = """
18 newServer{address="127.0.0.1:%s"}
19 webserver("127.0.0.1:%s", "%s", "%s")
20 """
21
22 def testBasicAuth(self):
23 """
24 API: Basic Authentication
25 """
26 for path in self._basicOnlyPaths + self._apiPaths:
27 url = 'http://127.0.0.1:' + str(self._webServerPort) + path
28 r = requests.get(url, auth=('whatever', self._webServerBasicAuthPassword), timeout=self._webTimeout)
29 self.assertTrue(r)
30 self.assertEquals(r.status_code, 200)
31
32 def testXAPIKey(self):
33 """
34 API: X-Api-Key
35 """
36 headers = {'x-api-key': self._webServerAPIKey}
37 for path in self._apiPaths:
38 url = 'http://127.0.0.1:' + str(self._webServerPort) + path
39 r = requests.get(url, headers=headers, timeout=self._webTimeout)
40 self.assertTrue(r)
41 self.assertEquals(r.status_code, 200)
42
43 def testBasicAuthOnly(self):
44 """
45 API: Basic Authentication Only
46 """
47 headers = {'x-api-key': self._webServerAPIKey}
48 for path in self._basicOnlyPaths:
49 url = 'http://127.0.0.1:' + str(self._webServerPort) + path
50 r = requests.get(url, headers=headers, timeout=self._webTimeout)
51 self.assertEquals(r.status_code, 401)
52
53 def testServersLocalhost(self):
54 """
55 API: /api/v1/servers/localhost
56 """
57 headers = {'x-api-key': self._webServerAPIKey}
58 url = 'http://127.0.0.1:' + str(self._webServerPort) + '/api/v1/servers/localhost'
59 r = requests.get(url, headers=headers, timeout=self._webTimeout)
60 self.assertTrue(r)
61 self.assertEquals(r.status_code, 200)
62 self.assertTrue(r.json())
63 content = r.json()
64
65 self.assertEquals(content['daemon_type'], 'dnsdist')
66
46e8b49e 67 for key in ['version', 'acl', 'local', 'rules', 'response-rules', 'servers', 'frontends']:
02bbf9eb
RG
68 self.assertIn(key, content)
69
70 for rule in content['rules']:
71 for key in ['id', 'matches', 'rule', 'action']:
72 self.assertIn(key, rule)
73 for key in ['id', 'matches']:
74 self.assertTrue(rule[key] >= 0)
46e8b49e
RG
75
76 for rule in content['response-rules']:
77 for key in ['id', 'matches', 'rule', 'action']:
78 self.assertIn(key, rule)
79 for key in ['id', 'matches']:
80 self.assertTrue(rule[key] >= 0)
02bbf9eb
RG
81
82 for server in content['servers']:
83 for key in ['id', 'latency', 'name', 'weight', 'outstanding', 'qpsLimit',
84 'reuseds', 'state', 'address', 'pools', 'qps', 'queries', 'order']:
85 self.assertIn(key, server)
86
87 for key in ['id', 'latency', 'weight', 'outstanding', 'qpsLimit', 'reuseds',
88 'qps', 'queries', 'order']:
89 self.assertTrue(server[key] >= 0)
90
91 self.assertTrue(server['state'] in ['up', 'down', 'UP', 'DOWN'])
92
93 for frontend in content['frontends']:
94 for key in ['id', 'address', 'udp', 'tcp', 'queries']:
95 self.assertIn(key, frontend)
96
97 for key in ['id', 'queries']:
98 self.assertTrue(frontend[key] >= 0)
99
100 def testServersLocalhostConfig(self):
101 """
102 API: /api/v1/servers/localhost/config
103 """
104 headers = {'x-api-key': self._webServerAPIKey}
105 url = 'http://127.0.0.1:' + str(self._webServerPort) + '/api/v1/servers/localhost/config'
106 r = requests.get(url, headers=headers, timeout=self._webTimeout)
107 self.assertTrue(r)
108 self.assertEquals(r.status_code, 200)
109 self.assertTrue(r.json())
110 content = r.json()
111 values = {}
112 for entry in content:
113 for key in ['type', 'name', 'value']:
114 self.assertIn(key, entry)
115
116 self.assertEquals(entry['type'], 'ConfigSetting')
117 values[entry['name']] = entry['value']
118
119 for key in ['acl', 'control-socket', 'ecs-override', 'ecs-source-prefix-v4',
120 'ecs-source-prefix-v6', 'fixup-case', 'max-outstanding', 'server-policy',
121 'stale-cache-entries-ttl', 'tcp-recv-timeout', 'tcp-send-timeout',
122 'truncate-tc', 'verbose', 'verbose-health-checks']:
123 self.assertIn(key, values)
124
125 for key in ['max-outstanding', 'stale-cache-entries-ttl', 'tcp-recv-timeout',
126 'tcp-send-timeout']:
127 self.assertTrue(values[key] >= 0)
128
129 self.assertTrue(values['ecs-source-prefix-v4'] >= 0 and values['ecs-source-prefix-v4'] <= 32)
130 self.assertTrue(values['ecs-source-prefix-v6'] >= 0 and values['ecs-source-prefix-v6'] <= 128)
131
132 def testServersLocalhostStatistics(self):
133 """
134 API: /api/v1/servers/localhost/statistics
135 """
136 headers = {'x-api-key': self._webServerAPIKey}
137 url = 'http://127.0.0.1:' + str(self._webServerPort) + '/api/v1/servers/localhost/statistics'
138 r = requests.get(url, headers=headers, timeout=self._webTimeout)
139 self.assertTrue(r)
140 self.assertEquals(r.status_code, 200)
141 self.assertTrue(r.json())
142 content = r.json()
143 values = {}
144 for entry in content:
145 self.assertIn('type', entry)
146 self.assertIn('name', entry)
147 self.assertIn('value', entry)
148 self.assertEquals(entry['type'], 'StatisticItem')
149 values[entry['name']] = entry['value']
150
151 expected = ['responses', 'servfail-responses', 'queries', 'acl-drops', 'block-filter',
152 'rule-drop', 'rule-nxdomain', 'self-answered', 'downstream-timeouts',
153 'downstream-send-errors', 'trunc-failures', 'no-policy', 'latency0-1',
154 'latency1-10', 'latency10-50', 'latency50-100', 'latency100-1000',
155 'latency-slow', 'latency-avg100', 'latency-avg1000', 'latency-avg10000',
156 'latency-avg1000000', 'uptime', 'real-memory-usage', 'noncompliant-queries',
157 'noncompliant-responses', 'rdqueries', 'empty-queries', 'cache-hits',
158 'cache-misses', 'cpu-user-msec', 'cpu-sys-msec', 'fd-usage', 'dyn-blocked',
159 'dyn-block-nmg-size']
160
161 for key in expected:
162 self.assertIn(key, values)
163 self.assertTrue(values[key] >= 0)
164
165 def testJsonstatStats(self):
166 """
167 API: /jsonstat?command=stats
168 """
169 headers = {'x-api-key': self._webServerAPIKey}
170 url = 'http://127.0.0.1:' + str(self._webServerPort) + '/jsonstat?command=stats'
171 r = requests.get(url, headers=headers, timeout=self._webTimeout)
172 self.assertTrue(r)
173 self.assertEquals(r.status_code, 200)
174 self.assertTrue(r.json())
175 content = r.json()
176
177 for key in ['packetcache-hits', 'packetcache-misses', 'over-capacity-drops', 'too-old-drops']:
178 self.assertIn(key, content)
179 self.assertTrue(content[key] >= 0)
180
181 expected = ['responses', 'servfail-responses', 'queries', 'acl-drops', 'block-filter',
182 'rule-drop', 'rule-nxdomain', 'self-answered', 'downstream-timeouts',
183 'downstream-send-errors', 'trunc-failures', 'no-policy', 'latency0-1',
184 'latency1-10', 'latency10-50', 'latency50-100', 'latency100-1000',
185 'latency-slow', 'latency-avg100', 'latency-avg1000', 'latency-avg10000',
186 'latency-avg1000000', 'uptime', 'real-memory-usage', 'noncompliant-queries',
187 'noncompliant-responses', 'rdqueries', 'empty-queries', 'cache-hits',
188 'cache-misses', 'cpu-user-msec', 'cpu-sys-msec', 'fd-usage', 'dyn-blocked',
189 'dyn-block-nmg-size']
190
191 for key in expected:
192 self.assertIn(key, content)
193 self.assertTrue(content[key] >= 0)
194
195 def testJsonstatDynblocklist(self):
196 """
197 API: /jsonstat?command=dynblocklist
198 """
199 headers = {'x-api-key': self._webServerAPIKey}
200 url = 'http://127.0.0.1:' + str(self._webServerPort) + '/jsonstat?command=dynblocklist'
201 r = requests.get(url, headers=headers, timeout=self._webTimeout)
202 self.assertTrue(r)
203 self.assertEquals(r.status_code, 200)
204
205 content = r.json()
206
207 if content:
208 for key in ['reason', 'seconds', 'blocks']:
209 self.assertIn(key, content)
210
211 for key in ['blocks']:
212 self.assertTrue(content[key] >= 0)