2
0
mirror of https://opendev.org/x/pyghmi synced 2026-04-01 07:43:39 +00:00

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
This commit is contained in:
Masayoshi Mizuma
2021-11-16 22:20:02 -05:00
parent 1ef6a0cb8b
commit 0bba2bc31f

View File

@@ -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