From f71a64d0c0dee8fc5cecfd5b813089ccc7f32ad7 Mon Sep 17 00:00:00 2001 From: Jonathan Provost Date: Fri, 21 Oct 2016 11:15:53 -0400 Subject: [PATCH] Let PDU outlets notify the core directly In order to remove the mutual dependency of the PDU and the PDUOutlet class, the PDUOutlet class will be responsible to talk to the core and make the appropriate data transformations. This will allow the PDU class to, eventually, manage more OID registers associated to the outlet than simply its state. --- virtualpdu/pdu/__init__.py | 33 +++++++++----------- virtualpdu/pdu/apc_rackpdu.py | 4 +-- virtualpdu/pdu/baytech_mrp27.py | 4 +-- virtualpdu/tests/integration/pdu/test_pdu.py | 5 +-- 4 files changed, 21 insertions(+), 25 deletions(-) diff --git a/virtualpdu/pdu/__init__.py b/virtualpdu/pdu/__init__.py index 8a34ff3..163299b 100644 --- a/virtualpdu/pdu/__init__.py +++ b/virtualpdu/pdu/__init__.py @@ -45,18 +45,25 @@ class PDUOutletStates(BasePDUOutletStates): class PDUOutlet(object): states = PDUOutletStates() - def __init__(self, outlet_number, pdu): + def __init__(self, pdu_name, outlet_number, core): + self.pdu_name = pdu_name self.outlet_number = outlet_number - self.pdu = pdu + self.core = core self.oid = None @property def state(self): - return self.pdu.get_outlet_state(self.outlet_number) + return self.states.from_core( + self.core.get_pdu_outlet_state( + pdu=self.pdu_name, + outlet=self.outlet_number)) @state.setter def state(self, state): - self.pdu.set_outlet_state(self.outlet_number, state) + self.core.pdu_outlet_state_changed( + pdu=self.pdu_name, + outlet=self.outlet_number, + state=self.states.to_core(state)) class PDU(object): @@ -66,24 +73,12 @@ class PDU(object): def __init__(self, name, core): self.name = name - self.core = core self.oids = [ - self.outlet_class(outlet_number=o + self.outlet_index_start, - pdu=self, + self.outlet_class(pdu_name=self.name, + outlet_number=o + self.outlet_index_start, + core=core, ) for o in range(self.outlet_count) ] self.oid_mapping = {oid.oid: oid for oid in self.oids} - - def set_outlet_state(self, outlet_number, value): - self.core.pdu_outlet_state_changed( - pdu=self.name, - outlet=outlet_number, - state=self.outlet_class.states.to_core(value)) - - def get_outlet_state(self, outlet_number): - return self.outlet_class.states.from_core( - self.core.get_pdu_outlet_state( - pdu=self.name, - outlet=outlet_number)) diff --git a/virtualpdu/pdu/apc_rackpdu.py b/virtualpdu/pdu/apc_rackpdu.py index 51681a1..1a8f0ea 100644 --- a/virtualpdu/pdu/apc_rackpdu.py +++ b/virtualpdu/pdu/apc_rackpdu.py @@ -42,9 +42,9 @@ class APCRackPDUOutletStates(BasePDUOutletStates): class APCRackPDUOutlet(PDUOutlet): states = APCRackPDUOutletStates() - def __init__(self, outlet_number, pdu): + def __init__(self, pdu_name, outlet_number, core): super(APCRackPDUOutlet, self).__init__( - outlet_number, pdu) + pdu_name, outlet_number, core) self.oid = rPDU_outlet_control_outlet_command + (self.outlet_number, ) diff --git a/virtualpdu/pdu/baytech_mrp27.py b/virtualpdu/pdu/baytech_mrp27.py index 2ac86ab..f7f8d33 100644 --- a/virtualpdu/pdu/baytech_mrp27.py +++ b/virtualpdu/pdu/baytech_mrp27.py @@ -40,9 +40,9 @@ class BaytechMRP27PDUOutletStates(BasePDUOutletStates): class BaytechMRP27PDUOutlet(PDUOutlet): states = BaytechMRP27PDUOutletStates() - def __init__(self, outlet_number, pdu): + def __init__(self, pdu_name, outlet_number, core): super(BaytechMRP27PDUOutlet, self).__init__( - outlet_number, pdu) + pdu_name, outlet_number, core) self.oid = sBTA_modules_RPC_outlet_state + (1, self.outlet_number) diff --git a/virtualpdu/tests/integration/pdu/test_pdu.py b/virtualpdu/tests/integration/pdu/test_pdu.py index 3ced144..d670776 100644 --- a/virtualpdu/tests/integration/pdu/test_pdu.py +++ b/virtualpdu/tests/integration/pdu/test_pdu.py @@ -37,8 +37,9 @@ class TestPDU(PDUTestCase): def test_get_valid_oid_wrong_community(self): self.core_mock.get_pdu_outlet_state.return_value = core.POWER_ON self.pdu.oid_mapping[enterprises + (88, 1)] = \ - pdu.PDUOutlet(outlet_number=1, - pdu=self.pdu) + pdu.PDUOutlet(pdu_name=self.pdu.name, + outlet_number=1, + core=self.core_mock) self.assertEqual(self.pdu.outlet_class.states.ON, self.snmp_get(enterprises + (88, 1)))