diff --git a/ansible/group_vars/pdu/pdu.yml b/ansible/group_vars/pdu/pdu.yml new file mode 100644 index 00000000000..9fd068a2b2b --- /dev/null +++ b/ansible/group_vars/pdu/pdu.yml @@ -0,0 +1,3 @@ +# snmp community strings +snmp_rocommunity: public +snmp_rwcommunity: private diff --git a/tests/common/plugins/psu_controller/__init__.py b/tests/common/plugins/psu_controller/__init__.py index 6eb1bfbcefb..3b625341d3b 100644 --- a/tests/common/plugins/psu_controller/__init__.py +++ b/tests/common/plugins/psu_controller/__init__.py @@ -3,7 +3,7 @@ import pytest -def psu_controller_factory(controller_ip, controller_protocol, dut_hostname): +def psu_controller_factory(controller_ip, controller_protocol, dut_hostname, pdu): """ @summary: Factory function for creating PSU controller according to different management protocol. @param controller_ip: IP address of the PSU controller host. @@ -13,11 +13,11 @@ def psu_controller_factory(controller_ip, controller_protocol, dut_hostname): logging.info("Creating psu controller object") if controller_protocol == "snmp": import snmp_psu_controllers - return snmp_psu_controllers.get_psu_controller(controller_ip, dut_hostname) + return snmp_psu_controllers.get_psu_controller(controller_ip, dut_hostname, pdu) @pytest.fixture(scope="module") -def psu_controller(duthost): +def psu_controller(duthost, pdu): """ @summary: Fixture for controlling power supply to PSUs of DUT @param duthost: Fixture duthost defined in sonic-mgmt/tests/conftest.py @@ -48,7 +48,7 @@ def psu_controller(duthost): logging.info("No protocol is defined in inventory file for '%s'. Try to use default 'snmp'" % pdu_host) controller_protocol = "snmp" - controller = psu_controller_factory(controller_ip, controller_protocol, duthost.hostname) + controller = psu_controller_factory(controller_ip, controller_protocol, duthost.hostname, pdu) yield controller diff --git a/tests/common/plugins/psu_controller/snmp_psu_controllers.py b/tests/common/plugins/psu_controller/snmp_psu_controllers.py index fc926d380d8..4f1e9868886 100644 --- a/tests/common/plugins/psu_controller/snmp_psu_controllers.py +++ b/tests/common/plugins/psu_controller/snmp_psu_controllers.py @@ -28,7 +28,7 @@ def get_psu_controller_type(self): SYSDESCR = "1.3.6.1.2.1.1.1.0" psu = None cmdGen = cmdgen.CommandGenerator() - snmp_auth = cmdgen.CommunityData('public') + snmp_auth = cmdgen.CommunityData(self.snmp_rocommunity) errorIndication, errorStatus, errorIndex, varBinds = cmdGen.getCmd( snmp_auth, cmdgen.UdpTransportTarget((self.controller, 161), timeout=5.0), @@ -92,7 +92,7 @@ def _get_pdu_ports(self): This method depends on this configuration to find out the PDU ports connected to PSUs of specific DUT. """ cmdGen = cmdgen.CommandGenerator() - snmp_auth = cmdgen.CommunityData('public') + snmp_auth = cmdgen.CommunityData(self.snmp_rocommunity) errorIndication, errorStatus, errorIndex, varTable = cmdGen.nextCmd( snmp_auth, cmdgen.UdpTransportTarget((self.controller, 161)), @@ -108,11 +108,13 @@ def _get_pdu_ports(self): # Remove the preceding PORT_NAME_BASE_OID, remaining string is the PDU port ID self.pdu_ports.append(current_oid.replace(self.PORT_NAME_BASE_OID, '')) - def __init__(self, hostname, controller): + def __init__(self, hostname, controller, pdu): logging.info("Initializing " + self.__class__.__name__) PsuControllerBase.__init__(self) self.hostname = hostname self.controller = controller + self.snmp_rocommunity = pdu['snmp_rocommunity'] + self.snmp_rwcommunity = pdu['snmp_rwcommunity'] self.pdu_ports = [] self.psuType = None self.get_psu_controller_type() @@ -140,7 +142,7 @@ def turn_on_psu(self, psu_id): port_oid = self.pPORT_CONTROL_BASE_OID + self.pdu_ports[rfc1902.Integer(psu_id)] errorIndication, errorStatus, _, _ = \ cmdgen.CommandGenerator().setCmd( - cmdgen.CommunityData('private'), + cmdgen.CommunityData(self.snmp_rwcommunity), cmdgen.UdpTransportTarget((self.controller, 161)), (port_oid, rfc1902.Integer(self.CONTROL_ON)), ) @@ -169,7 +171,7 @@ def turn_off_psu(self, psu_id): port_oid = self.pPORT_CONTROL_BASE_OID + self.pdu_ports[rfc1902.Integer(psu_id)] errorIndication, errorStatus, _, _ = \ cmdgen.CommandGenerator().setCmd( - cmdgen.CommunityData('private'), + cmdgen.CommunityData(self.snmp_rwcommunity), cmdgen.UdpTransportTarget((self.controller, 161)), (port_oid, rfc1902.Integer(self.CONTROL_OFF)), ) @@ -200,7 +202,7 @@ def get_psu_status(self, psu_id=None): """ results = [] cmdGen = cmdgen.CommandGenerator() - snmp_auth = cmdgen.CommunityData('public') + snmp_auth = cmdgen.CommunityData(self.snmp_rocommunity) errorIndication, errorStatus, errorIndex, varTable = cmdGen.nextCmd( snmp_auth, cmdgen.UdpTransportTarget((self.controller, 161)), @@ -227,9 +229,9 @@ def close(self): pass -def get_psu_controller(controller_ip, dut_hostname): +def get_psu_controller(controller_ip, dut_hostname, pdu): """ @summary: Factory function to create the actual PSU controller object. @return: The actual PSU controller object. Returns None if something went wrong. """ - return snmpPsuController(dut_hostname, controller_ip) + return snmpPsuController(dut_hostname, controller_ip, pdu) diff --git a/tests/conftest.py b/tests/conftest.py index fbd40ad612c..7ccc911e04c 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -324,6 +324,14 @@ def eos(): return eos +@pytest.fixture(scope='session') +def pdu(): + """ read and yield pdu configuration """ + with open('../ansible/group_vars/pdu/pdu.yml') as stream: + pdu = yaml.safe_load(stream) + return pdu + + @pytest.fixture(scope="module") def creds(duthost): """ read credential information according to the dut inventory """