306 lines
14 KiB
Python
306 lines
14 KiB
Python
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
"""
|
|
Test class for snmp module.
|
|
"""
|
|
|
|
from unittest import mock
|
|
|
|
from pysnmp.entity.rfc3413.oneliner import cmdgen
|
|
from pysnmp import error as snmp_error
|
|
import testtools
|
|
|
|
from scciclient.irmc import snmp
|
|
|
|
|
|
class IRMCSnmpTestCase(testtools.TestCase):
|
|
"""Tests for SNMP module
|
|
|
|
Unit Test Cases for getting information via snmp module
|
|
"""
|
|
|
|
def setUp(self):
|
|
super(IRMCSnmpTestCase, self).setUp()
|
|
|
|
def test_get_irmc_firmware_version(self):
|
|
snmp_client = mock.Mock()
|
|
snmp_client.get.side_effect = ['iRMC S4', '7.82F']
|
|
cmd1 = snmp.BMC_NAME_OID
|
|
cmd2 = snmp.IRMC_FW_VERSION_OID
|
|
actual_out = snmp.get_irmc_firmware_version(snmp_client)
|
|
self.assertEqual('iRMC S4-7.82F', actual_out)
|
|
snmp_client.get.assert_has_calls([mock.call(cmd1),
|
|
mock.call(cmd2)])
|
|
|
|
def test_get_irmc_firmware_version_BMC_only(self):
|
|
snmp_client = mock.Mock()
|
|
snmp_client.get.side_effect = ['iRMC S4', '']
|
|
cmd1 = snmp.BMC_NAME_OID
|
|
cmd2 = snmp.IRMC_FW_VERSION_OID
|
|
actual_out = snmp.get_irmc_firmware_version(snmp_client)
|
|
self.assertEqual('iRMC S4', actual_out)
|
|
snmp_client.get.assert_has_calls([mock.call(cmd1),
|
|
mock.call(cmd2)])
|
|
|
|
def test_get_irmc_firmware_version_FW_only(self):
|
|
snmp_client = mock.Mock()
|
|
snmp_client.get.side_effect = ['', '7.82F']
|
|
cmd1 = snmp.BMC_NAME_OID
|
|
cmd2 = snmp.IRMC_FW_VERSION_OID
|
|
actual_out = snmp.get_irmc_firmware_version(snmp_client)
|
|
self.assertEqual('7.82F', actual_out)
|
|
snmp_client.get.assert_has_calls([mock.call(cmd1),
|
|
mock.call(cmd2)])
|
|
|
|
def test_get_irmc_firmware_version_blank(self):
|
|
snmp_client = mock.Mock()
|
|
snmp_client.get.side_effect = ['', '']
|
|
cmd1 = snmp.BMC_NAME_OID
|
|
cmd2 = snmp.IRMC_FW_VERSION_OID
|
|
actual_out = snmp.get_irmc_firmware_version(snmp_client)
|
|
self.assertEqual('', actual_out)
|
|
snmp_client.get.assert_has_calls([mock.call(cmd1),
|
|
mock.call(cmd2)])
|
|
|
|
def test_get_irmc_firmware_version_exception(self):
|
|
snmp_client = mock.Mock()
|
|
snmp_client.get.side_effect = snmp.SNMPFailure('Error')
|
|
cmd1 = snmp.BMC_NAME_OID
|
|
e = self.assertRaises(snmp.SNMPIRMCFirmwareFailure,
|
|
snmp.get_irmc_firmware_version,
|
|
snmp_client)
|
|
snmp_client.get.assert_has_calls([mock.call(cmd1)])
|
|
self.assertEqual('SNMP operation \'GET IRMC FIRMWARE VERSION\''
|
|
' failed: Error', str(e))
|
|
|
|
def test_get_bios_firmware_version(self):
|
|
snmp_client = mock.Mock()
|
|
snmp_client.return_value = 'V4.6.5.4 R1.15.0 for D3099-B1x'
|
|
snmp_client.get.return_value = 'V4.6.5.4 R1.15.0 for D3099-B1x'
|
|
cmd = snmp.BIOS_FW_VERSION_OID
|
|
actual_out = snmp.get_bios_firmware_version(snmp_client)
|
|
self.assertEqual('V4.6.5.4 R1.15.0 for D3099-B1x', actual_out)
|
|
snmp_client.get.assert_called_once_with(cmd)
|
|
|
|
def test_get_bios_firmware_version_exception(self):
|
|
snmp_client = mock.Mock()
|
|
snmp_client.get.side_effect = snmp.SNMPFailure('Error')
|
|
cmd = snmp.BIOS_FW_VERSION_OID
|
|
e = self.assertRaises(snmp.SNMPBIOSFirmwareFailure,
|
|
snmp.get_bios_firmware_version,
|
|
snmp_client)
|
|
snmp_client.get.assert_called_once_with(cmd)
|
|
self.assertEqual('SNMP operation \'GET BIOS FIRMWARE VERSION\''
|
|
' failed: Error', str(e))
|
|
|
|
def test_get_server_model(self):
|
|
snmp_client = mock.Mock()
|
|
snmp_client.return_value = 'TX2540M1F5'
|
|
snmp_client.get.return_value = 'TX2540M1F5'
|
|
cmd = snmp.SERVER_MODEL_OID
|
|
actual_out = snmp.get_server_model(snmp_client)
|
|
self.assertEqual('TX2540M1F5', actual_out)
|
|
snmp_client.get.assert_called_once_with(cmd)
|
|
|
|
def test_get_server_model_exception(self):
|
|
snmp_client = mock.Mock()
|
|
snmp_client.get.side_effect = snmp.SNMPFailure('Error')
|
|
cmd = snmp.SERVER_MODEL_OID
|
|
e = self.assertRaises(snmp.SNMPServerModelFailure,
|
|
snmp.get_server_model,
|
|
snmp_client)
|
|
snmp_client.get.assert_called_once_with(cmd)
|
|
self.assertEqual('SNMP operation \'GET SERVER MODEL\''
|
|
' failed: Error', str(e))
|
|
|
|
|
|
@mock.patch.object(cmdgen, 'CommandGenerator', autospec=True)
|
|
class SNMPClientTestCase(testtools.TestCase):
|
|
def setUp(self):
|
|
super(SNMPClientTestCase, self).setUp()
|
|
self.address = '1.2.3.4'
|
|
self.port = '6700'
|
|
self.oid = 'oid'
|
|
self.value = 'value'
|
|
|
|
def test___init__(self, mock_cmdgen):
|
|
client = snmp.SNMPClient(self.address, self.port, snmp.SNMP_V1)
|
|
mock_cmdgen.assert_called_once_with()
|
|
self.assertEqual(self.address, client.address)
|
|
self.assertEqual(self.port, client.port)
|
|
self.assertEqual(snmp.SNMP_V1, client.version)
|
|
self.assertIsNone(client.community)
|
|
self.assertNotIn('security', client.__dict__)
|
|
self.assertEqual(mock_cmdgen.return_value, client.cmd_gen)
|
|
|
|
def test_get(self, mock_cmdgen):
|
|
var_bind = (self.oid, self.value)
|
|
mock_cmdgenerator = mock_cmdgen.return_value
|
|
mock_cmdgenerator.getCmd.return_value = ("", None, 0, [var_bind])
|
|
client = snmp.SNMPClient(self.address, self.port, snmp.SNMP_V3)
|
|
val = client.get(self.oid)
|
|
self.assertEqual(var_bind[1], val)
|
|
mock_cmdgenerator.getCmd.assert_called_once_with(mock.ANY, mock.ANY,
|
|
self.oid)
|
|
|
|
@mock.patch.object(cmdgen, 'CommunityData', autospec=True)
|
|
def test__get_auth_v1(self, mock_community, mock_cmdgen):
|
|
client = snmp.SNMPClient(self.address, self.port, snmp.SNMP_V1)
|
|
client._get_auth()
|
|
mock_cmdgen.assert_called_once_with()
|
|
mock_community.assert_called_once_with(client.community, mpModel=0)
|
|
|
|
@mock.patch.object(cmdgen, 'CommunityData', autospec=True)
|
|
def test__get_auth_v2c(self, mock_community, mock_cmdgen):
|
|
client = snmp.SNMPClient(self.address, self.port, snmp.SNMP_V2C)
|
|
client._get_auth()
|
|
mock_cmdgen.assert_called_once_with()
|
|
mock_community.assert_called_once_with(client.community, mpModel=1)
|
|
|
|
@mock.patch.object(cmdgen, 'UsmUserData', autospec=True)
|
|
def test__get_auth_v3(self, mock_user, mock_cmdgen):
|
|
client = snmp.SNMPClient(self.address, self.port, snmp.SNMP_V3)
|
|
client._get_auth()
|
|
mock_cmdgen.assert_called_once_with()
|
|
mock_user.assert_called_once_with(client.security)
|
|
|
|
@mock.patch.object(cmdgen, 'UdpTransportTarget', autospec=True)
|
|
def test__get_transport(self, mock_transport, mock_cmdgen):
|
|
client = snmp.SNMPClient(self.address, self.port, snmp.SNMP_V3)
|
|
client._get_transport()
|
|
mock_cmdgen.assert_called_once_with()
|
|
mock_transport.assert_called_once_with((client.address, client.port))
|
|
|
|
@mock.patch.object(cmdgen, 'UdpTransportTarget', autospec=True)
|
|
def test__get_transport_err(self, mock_transport, mock_cmdgen):
|
|
mock_transport.side_effect = snmp_error.PySnmpError()
|
|
client = snmp.SNMPClient(self.address, self.port, snmp.SNMP_V3)
|
|
self.assertRaises(snmp_error.PySnmpError, client._get_transport)
|
|
mock_cmdgen.assert_called_once_with()
|
|
mock_transport.assert_called_once_with((client.address, client.port))
|
|
|
|
def test_get_pdu_err(self, mock_cmdgen):
|
|
var_bind = (self.oid, self.value)
|
|
error_status = mock.Mock()
|
|
error_status.prettyPrint = lambda: "pdu error"
|
|
mock_cmdgenerator = mock_cmdgen.return_value
|
|
mock_cmdgenerator.getCmd.return_value = (None, error_status, 1,
|
|
[var_bind])
|
|
client = snmp.SNMPClient(self.address, self.port, snmp.SNMP_V3)
|
|
self.assertRaises(snmp.SNMPFailure, client.get, self.oid)
|
|
mock_cmdgenerator.getCmd.assert_called_once_with(mock.ANY, mock.ANY,
|
|
self.oid)
|
|
|
|
def test_get_next(self, mock_cmdgen):
|
|
var_bind = (self.oid, self.value)
|
|
mock_cmdgenerator = mock_cmdgen.return_value
|
|
mock_cmdgenerator.nextCmd.return_value = (
|
|
"", None, 0, [[var_bind, var_bind]])
|
|
client = snmp.SNMPClient(self.address, self.port, snmp.SNMP_V3)
|
|
val = client.get_next(self.oid)
|
|
self.assertEqual([self.value, self.value], val)
|
|
mock_cmdgenerator.nextCmd.assert_called_once_with(mock.ANY, mock.ANY,
|
|
self.oid)
|
|
|
|
@mock.patch.object(snmp.SNMPClient, '_get_transport', autospec=True)
|
|
def test_get_err_transport(self, mock_transport, mock_cmdgen):
|
|
mock_transport.side_effect = snmp_error.PySnmpError
|
|
mock_cmdgenerator = mock_cmdgen.return_value
|
|
client = snmp.SNMPClient(self.address, self.port, snmp.SNMP_V3)
|
|
self.assertRaises(snmp.SNMPFailure, client.get, self.oid)
|
|
self.assertFalse(mock_cmdgenerator.getCmd.called)
|
|
|
|
@mock.patch.object(snmp.SNMPClient, '_get_transport', autospec=True)
|
|
def test_get_next_err_transport(self, mock_transport,
|
|
mock_cmdgen):
|
|
mock_transport.side_effect = snmp_error.PySnmpError
|
|
mock_cmdgenerator = mock_cmdgen.return_value
|
|
client = snmp.SNMPClient(self.address, self.port, snmp.SNMP_V3)
|
|
self.assertRaises(snmp.SNMPFailure, client.get_next, self.oid)
|
|
self.assertFalse(mock_cmdgenerator.nextCmd.called)
|
|
|
|
def test_get_err_engine(self, mock_cmdgen):
|
|
var_bind = (self.oid, self.value)
|
|
mock_cmdgenerator = mock_cmdgen.return_value
|
|
mock_cmdgenerator.getCmd.return_value = ("engine error", None, 0,
|
|
[var_bind])
|
|
client = snmp.SNMPClient(self.address, self.port, snmp.SNMP_V3)
|
|
self.assertRaises(snmp.SNMPFailure, client.get, self.oid)
|
|
mock_cmdgenerator.getCmd.assert_called_once_with(mock.ANY, mock.ANY,
|
|
self.oid)
|
|
|
|
def test_get_next_err_engine(self, mock_cmdgen):
|
|
var_bind = (self.oid, self.value)
|
|
mock_cmdgenerator = mock_cmdgen.return_value
|
|
mock_cmdgenerator.nextCmd.return_value = ("engine error", None, 0,
|
|
[[var_bind, var_bind]])
|
|
client = snmp.SNMPClient(self.address, self.port, snmp.SNMP_V3)
|
|
self.assertRaises(snmp.SNMPFailure, client.get_next, self.oid)
|
|
mock_cmdgenerator.nextCmd.assert_called_once_with(mock.ANY, mock.ANY,
|
|
self.oid)
|
|
|
|
def test_get_next_pdu_err(self, mock_cmdgen):
|
|
var_bind = (self.oid, self.value)
|
|
error_status = mock.Mock()
|
|
error_status.prettyPrint = lambda: "pdu error"
|
|
mock_cmdgenerator = mock_cmdgen.return_value
|
|
mock_cmdgenerator.nextCmd.return_value = (None, error_status, 1,
|
|
[var_bind])
|
|
client = snmp.SNMPClient(self.address, self.port, snmp.SNMP_V3)
|
|
self.assertRaises(snmp.SNMPFailure, client.get_next, self.oid)
|
|
mock_cmdgenerator.nextCmd.assert_called_once_with(mock.ANY, mock.ANY,
|
|
self.oid)
|
|
|
|
def test_set(self, mock_cmdgen):
|
|
var_bind = (self.oid, self.value)
|
|
mock_cmdgenerator = mock_cmdgen.return_value
|
|
mock_cmdgenerator.setCmd.return_value = ("", None, 0, [var_bind])
|
|
client = snmp.SNMPClient(self.address, self.port, snmp.SNMP_V3)
|
|
client.set(self.oid, self.value)
|
|
mock_cmdgenerator.setCmd.assert_called_once_with(mock.ANY, mock.ANY,
|
|
var_bind)
|
|
|
|
@mock.patch.object(snmp.SNMPClient, '_get_transport', autospec=True)
|
|
def test_set_err_transport(self, mock_transport, mock_cmdgen):
|
|
mock_transport.side_effect = snmp_error.PySnmpError
|
|
mock_cmdgenerator = mock_cmdgen.return_value
|
|
client = snmp.SNMPClient(self.address, self.port, snmp.SNMP_V3)
|
|
self.assertRaises(snmp.SNMPFailure,
|
|
client.set, self.oid, self.value)
|
|
self.assertFalse(mock_cmdgenerator.setCmd.called)
|
|
|
|
def test_set_err_engine(self, mock_cmdgen):
|
|
var_bind = (self.oid, self.value)
|
|
mock_cmdgenerator = mock_cmdgen.return_value
|
|
mock_cmdgenerator.setCmd.return_value = ("engine error", None, 0,
|
|
[var_bind])
|
|
client = snmp.SNMPClient(self.address, self.port, snmp.SNMP_V3)
|
|
self.assertRaises(snmp.SNMPFailure,
|
|
client.set, self.oid, self.value)
|
|
mock_cmdgenerator.setCmd.assert_called_once_with(mock.ANY, mock.ANY,
|
|
var_bind)
|
|
|
|
def test_set_pdu_err(self, mock_cmdgen):
|
|
var_bind = (self.oid, self.value)
|
|
error_status = mock.Mock()
|
|
error_status.prettyPrint = lambda: "pdu error"
|
|
mock_cmdgenerator = mock_cmdgen.return_value
|
|
mock_cmdgenerator.setCmd.return_value = (None, error_status, 1,
|
|
[var_bind])
|
|
client = snmp.SNMPClient(self.address, self.port, snmp.SNMP_V3)
|
|
self.assertRaises(snmp.SNMPFailure,
|
|
client.set, self.oid, self.value)
|
|
mock_cmdgenerator.setCmd.assert_called_once_with(mock.ANY, mock.ANY,
|
|
var_bind)
|