diff --git a/tangostationcontrol/tangostationcontrol/clients/snmp_client.py b/tangostationcontrol/tangostationcontrol/clients/snmp_client.py index d57e8eb25b01aa5a545de2eac6bee0e9993438cb..385789a28d40a172baa1da1777b40ee34c469b1a 100644 --- a/tangostationcontrol/tangostationcontrol/clients/snmp_client.py +++ b/tangostationcontrol/tangostationcontrol/clients/snmp_client.py @@ -3,6 +3,7 @@ from tangostationcontrol.clients.comms_client import CommClient from pysnmp import hlapi from pysnmp.smi import builder +from pathlib import Path import numpy import logging @@ -232,20 +233,26 @@ class snmp_attribute: return vals +from pysmi import debug +debug.setLogger(debug.Debug('all')) + class mib_loader: def __init__(self): self.mibBuilder = builder.MibBuilder() - def set_pymib_dir(self, mib_dir): - mib_source = builder.DirMibSource(mib_dir) + def set_pymib_dir(self, mib_dir : str): + abs_path = str(Path().absolute()).replace("\\", "/") + + if mib_dir[0] != "/": + mib_dir = "/" + mib_dir + + dir_path = abs_path + mib_dir + + mib_source = builder.DirMibSource(dir_path) self.mibBuilder.addMibSources(mib_source) def load_pymib(self, mib_name): self.mibBuilder.loadModule(mib_name) - def compile_mibs(self, path): - from pysnmp.smi import compiler - compiler.addMibCompiler(self.mibBuilder, sources=[path, ]) - diff --git a/tangostationcontrol/tangostationcontrol/test/clients/SNMP_mib_loading/TEST-MIB.py b/tangostationcontrol/tangostationcontrol/test/clients/SNMP_mib_loading/TEST-MIB.py new file mode 100644 index 0000000000000000000000000000000000000000..09a2e39b5f053c3e58a4f4169e162ed78612b3f4 --- /dev/null +++ b/tangostationcontrol/tangostationcontrol/test/clients/SNMP_mib_loading/TEST-MIB.py @@ -0,0 +1,6 @@ +Integer32, MibScalar, MibTable, MibTableRow, MibTableColumn, TimeTicks, iso, Gauge32, MibIdentifier, Bits, Counter32 = mibBuilder.importSymbols("SNMPv2-SMI", "Integer32", "MibScalar", "MibTable", "MibTableRow", "MibTableColumn", "TimeTicks", "iso", "Gauge32", "MibIdentifier", "Bits","Counter32") +ConstraintsIntersection, ConstraintsUnion, ValueSizeConstraint, SingleValueConstraint, ValueRangeConstraint = mibBuilder.importSymbols("ASN1-REFINEMENT", "ConstraintsIntersection", "ConstraintsUnion", "ValueSizeConstraint", "SingleValueConstraint", "ValueRangeConstraint") +NamedValues, = mibBuilder.importSymbols("ASN1-ENUMERATION", "NamedValues") + +testNamedValue = MibScalar((9, 8, 7, 6, 5, 4, 3, 2, 1), Integer32().subtype(subtypeSpec=ConstraintsUnion(SingleValueConstraint(1, 2, 3, 4, 5, 6, 7))).clone(namedValues=NamedValues(("A", 1), ("B", 2), ("C", 3), ("D", 4)))).setMaxAccess("readonly") +mibBuilder.exportSymbols("TEST-MIB", testNamedValue=testNamedValue) diff --git a/tangostationcontrol/tangostationcontrol/test/clients/SNMP_mib_loading/__init__.py b/tangostationcontrol/tangostationcontrol/test/clients/SNMP_mib_loading/__init__.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/tangostationcontrol/tangostationcontrol/test/clients/test_mib_loading.py b/tangostationcontrol/tangostationcontrol/test/clients/test_mib_loading.py index 255d8c2bcc24e10ff44905bd4a2e9e312a8e21fe..380f5bff5c6857a12e726e4fd83abaf7fd619ec4 100644 --- a/tangostationcontrol/tangostationcontrol/test/clients/test_mib_loading.py +++ b/tangostationcontrol/tangostationcontrol/test/clients/test_mib_loading.py @@ -1,14 +1,74 @@ -from pysnmp import hlapi -import numpy - from unittest import mock from tangostationcontrol.test import base -from tangostationcontrol.clients.snmp_client import mib_loader +from tangostationcontrol.clients.snmp_client import mib_loader +from pysnmp.smi import builder, view +import pysnmp.hlapi as pysnmp +from pysnmp.smi.rfc1902 import ObjectIdentity class TestMibLoading(base.TestCase): + #name and directory of the pymib file + mib = "TEST-MIB" + + # entry point is 'tango/tangostationcontrol' + rel_dir = "/tangostationcontrol/test/clients/SNMP_mib_loading" + def test_load(self): - pass + """" + This test tests the loading of pymib files. + It does this by trying to load a test pymib file named TEST-MIB.py in /SNMP_pymibs + """ + + # if any of this fails the test is considered unsuccessful + loader = mib_loader() + loader.set_pymib_dir(self.rel_dir) + loader.load_pymib(self.mib) + + self.assertTrue(True) + + def test_content(self): + """ + This file contains a 1 variable named: testNamedValue with oid "9.8.7.6.5.4.3.2.1" with named values: ("A", 1), ("B", 2), ("C", 3), ("D", 4) + In order to confirm that the mib is indeed loaded correctly this test has to get the oids, the values and the named values + + """ + + # same as before + loader = mib_loader() + loader.set_pymib_dir(self.rel_dir) + loader.load_pymib(self.mib) + + # used to view mibs client side + mibView = view.MibViewController(loader.mibBuilder) + + # The expected testNamedValue parameters as written in TEST-MIB.py + testNamedValue = "testNamedValue" + testNamedValue_oid = "9.8.7.6.5.4.3.2.1" + testNamedValue_named = "A" + testNamedValue_value = 1 + + # get testValue and set a value of 1 + obj_T = pysnmp.ObjectType(ObjectIdentity(self.mib, testNamedValue), pysnmp.Integer32(1)) + obj_T.resolveWithMib(mibView) + + # get the oid + self.assertEqual(str(obj_T[0]), testNamedValue_oid) + + # get the name format: mib::name + self.assertEqual(obj_T[0].prettyPrint(), f"{self.mib}::{testNamedValue}") + + # get the namedValue + self.assertEqual(str(obj_T[1]), testNamedValue_named) + + # get the numerical value + self.assertEqual(int(obj_T[1]), testNamedValue_value) + + + + + + + diff --git a/tangostationcontrol/tangostationcontrol/test/clients/test_snmp_client.py b/tangostationcontrol/tangostationcontrol/test/clients/test_snmp_client.py index 86a6301f9848f8f81c2d75bf3d0b94adb219310c..43de716254d8ecbc2e335b4e1945e0c026ac7d5d 100644 --- a/tangostationcontrol/tangostationcontrol/test/clients/test_snmp_client.py +++ b/tangostationcontrol/tangostationcontrol/test/clients/test_snmp_client.py @@ -5,7 +5,7 @@ from unittest import mock from tangostationcontrol.test import base -from tangostationcontrol.clients.snmp_client import SNMP_client, snmp_attribute +from tangostationcontrol.clients.snmp_client import SNMP_client, snmp_attribute, mib_loader class server_imitator: @@ -196,3 +196,6 @@ class TestSNMP(base.TestCase): # check to make sure the value is indeed 2 self.assertEqual(ret_val, 2, f"Expected: to get {2}, got: {ret_val} of type {type(ret_val)}") + + +