]>
Commit | Line | Data |
---|---|---|
9f4eb5cc RG |
1 | #!/usr/bin/env python |
2 | import dns | |
3 | import time | |
4 | ||
5 | from pysnmp.hlapi import * | |
6 | from dnsdisttests import DNSDistTest | |
7 | ||
8 | class TestSNMP(DNSDistTest): | |
b38aaeb5 OM |
9 | # wait 1s so that the uptime is > 0 |
10 | _extraStartupSleep = 1 | |
9f4eb5cc RG |
11 | _snmpTimeout = 2.0 |
12 | _snmpServer = '127.0.0.1' | |
13 | _snmpPort = 161 | |
14 | _snmpV2Community = 'secretcommunity' | |
15 | _snmpV3User = 'secretuser' | |
16 | _snmpV3AuthKey = 'mysecretauthkey' | |
17 | _snmpV3EncKey = 'mysecretenckey' | |
18 | _snmpOID = '1.3.6.1.4.1.43315.3' | |
19 | _queriesSent = 0 | |
20 | _config_template = """ | |
21 | newServer{address="127.0.0.1:%s", name="servername"} | |
22 | snmpAgent(true) | |
ff2b5b03 | 23 | setVerboseHealthChecks(true) |
9f4eb5cc | 24 | """ |
ff2b5b03 | 25 | _verboseMode = True |
9f4eb5cc RG |
26 | |
27 | def _checkStatsValues(self, results, queriesCountersValue): | |
b4f23783 | 28 | for i in list(range(1, 5)) + list(range(6, 20)) + list(range(24, 35)) + [ 35 ] : |
9f4eb5cc RG |
29 | oid = self._snmpOID + '.1.' + str(i) + '.0' |
30 | self.assertTrue(oid in results) | |
31 | self.assertTrue(isinstance(results[oid], Counter64)) | |
32 | ||
33 | for i in range(20, 23): | |
34 | oid = self._snmpOID + '.1.' + str(i) + '.0' | |
35 | self.assertTrue(isinstance(results[oid], OctetString)) | |
36 | ||
37 | # check uptime > 0 | |
38 | self.assertGreater(results['1.3.6.1.4.1.43315.3.1.24.0'], 0) | |
39 | # check memory usage > 0 | |
40 | self.assertGreater(results['1.3.6.1.4.1.43315.3.1.25.0'], 0) | |
41 | ||
42 | # check that the queries, responses and rdQueries counters are now at queriesCountersValue | |
43 | for i in [1, 2, 28]: | |
44 | oid = self._snmpOID + '.1.' + str(i) + '.0' | |
4bfebc93 | 45 | self.assertEqual(results[oid], queriesCountersValue) |
9f4eb5cc RG |
46 | |
47 | # the others counters (except for latency ones) should still be at 0 | |
b4f23783 | 48 | for i in [3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 26, 27, 29, 30, 31, 35, 36]: |
9f4eb5cc | 49 | oid = self._snmpOID + '.1.' + str(i) + '.0' |
4bfebc93 | 50 | self.assertEqual(results[oid], 0) |
9f4eb5cc RG |
51 | |
52 | # check the backend stats | |
53 | print(results) | |
54 | ||
55 | ## types | |
56 | for i in [3, 4, 5, 6, 7, 11, 12, 13]: | |
57 | oid = self._snmpOID + '.2.1.' + str(i) + '.0' | |
58 | self.assertTrue(isinstance(results[oid], Counter64)) | |
59 | for i in [2, 8, 9, 10]: | |
60 | oid = self._snmpOID + '.2.1.' + str(i) + '.0' | |
61 | self.assertTrue(isinstance(results[oid], OctetString)) | |
62 | ||
63 | ## name | |
4bfebc93 | 64 | self.assertEqual(str(results['1.3.6.1.4.1.43315.3.2.1.2.0']), "servername") |
9f4eb5cc | 65 | ## weight |
4bfebc93 | 66 | self.assertEqual(results['1.3.6.1.4.1.43315.3.2.1.4.0'], 1) |
9f4eb5cc | 67 | ## outstanding |
4bfebc93 | 68 | self.assertEqual(results['1.3.6.1.4.1.43315.3.2.1.5.0'], 0) |
9f4eb5cc | 69 | ## qpslimit |
4bfebc93 | 70 | self.assertEqual(results['1.3.6.1.4.1.43315.3.2.1.6.0'], 0) |
9f4eb5cc | 71 | ## reused |
4bfebc93 | 72 | self.assertEqual(results['1.3.6.1.4.1.43315.3.2.1.7.0'], 0) |
9f4eb5cc | 73 | ## state |
4bfebc93 | 74 | self.assertEqual(str(results['1.3.6.1.4.1.43315.3.2.1.8.0']), "up") |
9f4eb5cc | 75 | ## address |
4bfebc93 | 76 | self.assertEqual(str(results['1.3.6.1.4.1.43315.3.2.1.9.0']), ("127.0.0.1:%s" % (self._testServerPort))) |
9f4eb5cc | 77 | ## pools |
4bfebc93 | 78 | self.assertEqual(str(results['1.3.6.1.4.1.43315.3.2.1.10.0']), "") |
9f4eb5cc | 79 | ## queries |
4bfebc93 | 80 | self.assertEqual(results['1.3.6.1.4.1.43315.3.2.1.12.0'], queriesCountersValue) |
9f4eb5cc | 81 | ## order |
4bfebc93 | 82 | self.assertEqual(results['1.3.6.1.4.1.43315.3.2.1.13.0'], 1) |
9f4eb5cc RG |
83 | |
84 | def _getSNMPStats(self, auth): | |
85 | results = {} | |
86 | for (errorIndication, errorStatus, errorIndex, varBinds) in nextCmd(SnmpEngine(), | |
87 | auth, | |
88 | UdpTransportTarget((self._snmpServer, self._snmpPort), timeout=self._snmpTimeout), | |
89 | ContextData(), | |
90 | ObjectType(ObjectIdentity(self._snmpOID)), | |
91 | lookupMib=False): | |
92 | self.assertFalse(errorIndication) | |
93 | self.assertFalse(errorStatus) | |
94 | self.assertTrue(varBinds) | |
95 | for key, value in varBinds: | |
96 | keystr = key.prettyPrint() | |
97 | if not keystr.startswith(self._snmpOID): | |
98 | continue | |
99 | results[keystr] = value | |
100 | ||
101 | return results | |
102 | ||
103 | def _checkStats(self, auth, name): | |
9f4eb5cc RG |
104 | |
105 | results = self._getSNMPStats(auth) | |
106 | self._checkStatsValues(results, self.__class__._queriesSent) | |
107 | ||
108 | query = dns.message.make_query(name, 'A', 'IN', use_edns=False) | |
109 | response = dns.message.make_response(query) | |
110 | rrset = dns.rrset.from_text(name, | |
111 | 3600, | |
112 | dns.rdataclass.IN, | |
113 | dns.rdatatype.A, | |
114 | '127.0.0.1') | |
115 | response.answer.append(rrset) | |
116 | ||
117 | # send a query | |
118 | (receivedQuery, receivedResponse) = self.sendUDPQuery(query, response) | |
119 | self.assertTrue(receivedQuery) | |
120 | self.assertTrue(receivedResponse) | |
121 | receivedQuery.id = query.id | |
4bfebc93 CH |
122 | self.assertEqual(query, receivedQuery) |
123 | self.assertEqual(response, receivedResponse) | |
9f4eb5cc RG |
124 | self.__class__._queriesSent = self.__class__._queriesSent + 1 |
125 | ||
126 | results = self._getSNMPStats(auth) | |
127 | self._checkStatsValues(results, self.__class__._queriesSent) | |
128 | ||
129 | def testSNMPv2Stats(self): | |
130 | """ | |
131 | SNMP: Retrieve statistics via SNMPv2c | |
132 | """ | |
133 | ||
134 | auth = CommunityData(self._snmpV2Community, mpModel=1) | |
135 | name = 'simplea.snmpv2c.tests.powerdns.com.' | |
136 | self._checkStats(auth, name) | |
137 | ||
138 | def testSNMPv3Stats(self): | |
139 | """ | |
140 | SNMP: Retrieve statistics via SNMPv3 | |
141 | """ | |
142 | ||
143 | auth = UsmUserData(self._snmpV3User, | |
144 | authKey=self._snmpV3AuthKey, | |
145 | privKey=self._snmpV3EncKey, | |
146 | authProtocol=usmHMACSHAAuthProtocol, | |
147 | privProtocol=usmAesCfb128Protocol) | |
148 | name = 'simplea.snmpv2.tests.powerdns.com.' | |
149 | self._checkStats(auth, name) |