]> git.ipfire.org Git - thirdparty/pdns.git/blame - regression-tests.dnsdist/test_SNMP.py
Merge pull request #13774 from rgacogne/ddist-quiche-config-atomic-load
[thirdparty/pdns.git] / regression-tests.dnsdist / test_SNMP.py
CommitLineData
9f4eb5cc
RG
1#!/usr/bin/env python
2import dns
3import time
4
5from pysnmp.hlapi import *
6from dnsdisttests import DNSDistTest
7
8class 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)