]>
Commit | Line | Data |
---|---|---|
8c87daac RG |
1 | #!/usr/bin/env python |
2 | import base64 | |
3 | import socket | |
4 | import time | |
5 | import dns | |
6 | from dnsdisttests import DNSDistTest | |
7 | from dnsdistDynBlockTests import DynBlocksTest, waitForMaintenanceToRun, _maintenanceWaitTime | |
8 | ||
9 | class TestDynBlockServFails(DynBlocksTest): | |
10 | ||
11 | _config_template = """ | |
12 | function maintenance() | |
13 | addDynBlocks(exceedServFails(%d, %d), "Exceeded servfail rate", %d) | |
14 | end | |
15 | newServer{address="127.0.0.1:%s"} | |
16 | """ | |
17 | ||
18 | def testDynBlocksServFailRate(self): | |
19 | """ | |
20 | Dyn Blocks: Server Failure Rate | |
21 | """ | |
22 | name = 'servfailrate.dynblocks.tests.powerdns.com.' | |
23 | self.doTestRCodeRate(name, dns.rcode.SERVFAIL) | |
24 | ||
25 | class TestDynBlockServFailsCached(DynBlocksTest): | |
26 | ||
27 | _config_template = """ | |
28 | pc = newPacketCache(10000, {maxTTL=86400, minTTL=0, temporaryFailureTTL=60, staleTTL=60, dontAge=false}) | |
29 | getPool(""):setCache(pc) | |
30 | function maintenance() | |
31 | addDynBlocks(exceedServFails(%d, %d), "Exceeded servfail rate", %d) | |
32 | end | |
33 | newServer{address="127.0.0.1:%s"} | |
34 | """ | |
35 | ||
36 | def testDynBlocksServFailRateCached(self): | |
37 | """ | |
38 | Dyn Blocks: Make sure cache hit responses also gets inserted into rings | |
39 | """ | |
40 | name = 'servfailrate.dynblocks.tests.powerdns.com.' | |
41 | rcode = dns.rcode.SERVFAIL | |
42 | query = dns.message.make_query(name, 'A', 'IN') | |
43 | response = dns.message.make_response(query) | |
44 | rrset = dns.rrset.from_text(name, | |
45 | 60, | |
46 | dns.rdataclass.IN, | |
47 | dns.rdatatype.A, | |
48 | '192.0.2.1') | |
49 | response.answer.append(rrset) | |
50 | expectedResponse = dns.message.make_response(query) | |
51 | expectedResponse.set_rcode(rcode) | |
52 | ||
53 | ||
54 | for method in ("sendUDPQuery", "sendTCPQuery"): | |
55 | print(method, "()") | |
56 | sender = getattr(self, method) | |
57 | ||
58 | # fill the cache | |
59 | (receivedQuery, receivedResponse) = sender(query, expectedResponse) | |
60 | receivedQuery.id = query.id | |
61 | self.assertEqual(query, receivedQuery) | |
62 | self.assertEqual(expectedResponse, receivedResponse) | |
63 | ||
64 | waitForMaintenanceToRun() | |
65 | ||
66 | # we should NOT be dropped! | |
67 | (_, receivedResponse) = sender(query, response=None) | |
68 | self.assertEqual(receivedResponse, expectedResponse) | |
69 | ||
70 | # now with rcode! | |
71 | sent = 0 | |
72 | allowed = 0 | |
73 | for _ in range((self._dynBlockQPS * self._dynBlockPeriod) + 1): | |
74 | (_, receivedResponse) = sender(query, expectedResponse) | |
75 | sent = sent + 1 | |
76 | self.assertEqual(expectedResponse, receivedResponse) | |
77 | allowed = allowed + 1 | |
78 | # we might be already blocked, but we should have been able to send | |
79 | # at least self._dynBlockQPS queries | |
80 | self.assertGreaterEqual(allowed, self._dynBlockQPS) | |
81 | ||
82 | if allowed == sent: | |
83 | waitForMaintenanceToRun() | |
84 | ||
85 | # we should now be dropped for up to self._dynBlockDuration + self._dynBlockPeriod | |
86 | (_, receivedResponse) = sender(query, response=None, useQueue=False) | |
87 | self.assertEqual(receivedResponse, None) | |
88 | ||
89 | # wait until we are not blocked anymore | |
90 | time.sleep(self._dynBlockDuration + self._dynBlockPeriod) | |
91 | ||
92 | # this one should succeed | |
93 | (receivedQuery, receivedResponse) = sender(query, response=None) | |
94 | self.assertEqual(expectedResponse, receivedResponse) | |
95 | ||
96 | class TestDynBlockGroupServFails(DynBlocksTest): | |
97 | ||
98 | _config_template = """ | |
99 | local dbr = dynBlockRulesGroup() | |
100 | dbr:setRCodeRate(DNSRCode.SERVFAIL, %d, %d, "Exceeded query rate", %d) | |
101 | ||
102 | function maintenance() | |
103 | dbr:apply() | |
104 | end | |
105 | ||
106 | newServer{address="127.0.0.1:%s"} | |
107 | """ | |
108 | ||
109 | def testDynBlocksServFailRate(self): | |
110 | """ | |
111 | Dyn Blocks (group): Server Failure Rate | |
112 | """ | |
113 | name = 'servfailrate.group.dynblocks.tests.powerdns.com.' | |
114 | self.doTestRCodeRate(name, dns.rcode.SERVFAIL) |