From 0bba2bc31f4c6f4047fae00c61dbbec2a563f516 Mon Sep 17 00:00:00 2001 From: Masayoshi Mizuma Date: Tue, 16 Nov 2021 22:20:02 -0500 Subject: [PATCH] ipmi/command.py: Add bridge_request argument to set|get_power Add bridge_request argument to set_power and get_power so that the power request can be sent to the remote target. For example of the usage: ipmi_cmd = command.Command(bmc, userid, password) ipmi_cmd.get_power(bridge_request={"addr": 0x20}) Change-Id: I80428f8fbbec3fab905537df5000007fa20d2e92 --- pyghmi/ipmi/command.py | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/pyghmi/ipmi/command.py b/pyghmi/ipmi/command.py index 8fb9f667..a4e55d09 100644 --- a/pyghmi/ipmi/command.py +++ b/pyghmi/ipmi/command.py @@ -318,7 +318,7 @@ class Command(object): self.oem_init() self._oem.reseat_bay(bay) - def set_power(self, powerstate, wait=False): + def set_power(self, powerstate, wait=False, bridge_request=None): """Request power state change (helper) :param powerstate: @@ -334,28 +334,33 @@ class Command(object): requested state change for 300 seconds. If a non-zero number, adjust the wait time to the requested number of seconds + :param bridge_request: The target slave address and channel number for + the bridge request. :raises: IpmiException on an error :returns: dict -- A dict describing the response retrieved """ self.oem_init() if hasattr(self._oem, 'set_power'): - return self._oem.set_power(powerstate) + return self._oem.set_power(powerstate, + bridge_request=bridge_request) if hasattr(self._oem, 'process_power_state'): - powerstate = self._oem.process_power_state(powerstate) + powerstate = self._oem.process_power_state( + powerstate, bridge_request=bridge_request) if powerstate not in power_states: raise exc.InvalidParameterValue( "Unknown power state %s requested" % powerstate) newpowerstate = powerstate - oldpowerstate = self._get_power_state() + oldpowerstate = self._get_power_state(bridge_request=bridge_request) if oldpowerstate == newpowerstate: return {'powerstate': oldpowerstate} if newpowerstate == 'boot': newpowerstate = 'on' if oldpowerstate == 'off' else 'reset' response = self.raw_command( - netfn=0, command=2, data=[power_states[newpowerstate]]) + netfn=0, command=2, data=[power_states[newpowerstate]], + bridge_request=bridge_request) if 'error' in response: raise exc.IpmiException(response['error']) lastresponse = {'pendingpowerstate': newpowerstate} @@ -369,7 +374,9 @@ class Command(object): waitpowerstate = newpowerstate currpowerstate = None while currpowerstate != waitpowerstate and waitattempts > 0: - currpowerstate = self._get_power_state(delay_xmit=1) + currpowerstate = self._get_power_state( + delay_xmit=1, + bridge_request=bridge_request) waitattempts -= 1 if currpowerstate != waitpowerstate: raise exc.IpmiException( @@ -378,8 +385,9 @@ class Command(object): else: return lastresponse - def _get_power_state(self, delay_xmit=None): - response = self.raw_command(netfn=0, command=1, delay_xmit=delay_xmit) + def _get_power_state(self, delay_xmit=None, bridge_request=None): + response = self.raw_command(netfn=0, command=1, delay_xmit=delay_xmit, + bridge_request=bridge_request) if 'error' in response: raise exc.IpmiException(response['error']) assert (response['command'] == 1 and response['netfn'] == 1) @@ -526,19 +534,23 @@ class Command(object): rslun=rslun) return rsp - def get_power(self): + def get_power(self, bridge_request=None): """Get current power state of the managed system The response, if successful, should contain 'powerstate' key and either 'on' or 'off' to indicate current state. + :param bridge_request: The target slave address and channel number for + the bridge request. :returns: dict -- {'powerstate': value} """ self.oem_init() if hasattr(self._oem, 'get_power'): - return {'powerstate': self._oem.get_power()} + return {'powerstate': self._oem.get_power( + bridge_request=bridge_request)} - return {'powerstate': self._get_power_state()} + return {'powerstate': self._get_power_state( + bridge_request=bridge_request)} def set_identify(self, on=True, duration=None): """Request identify light