2
0
mirror of https://github.com/xcat2/xcat-core.git synced 2025-06-01 19:17:06 +00:00

Merge pull request #5981 from xuweibj/I5969

fix issue 5969, handle power actions info format on 2.04
This commit is contained in:
zet809 2019-01-30 16:29:09 +08:00 committed by GitHub
commit d83620397d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 251 additions and 34 deletions

View File

@ -54,6 +54,7 @@ BOOTSOURCE_GET_STATE = {
manager_reset_string = '#Manager.Reset'
system_reset_string = '#ComputerSystem.Reset'
reset_type_string = 'ResetType@Redfish.AllowableValues'
reset_action_string = '@Redfish.ActionInfo'
class RedfishRest(object):
@ -156,7 +157,7 @@ class RedfishRest(object):
if 'Name' in data:
self._print_record_log('%s %s' % (code, data['Name']), cmd)
elif 'error' in data:
self._print_record_log('%s %s' % (code, data['error']['Message']), cmd)
self._print_record_log('%s %s' % (code, data['error']['message']), cmd)
return data
def login(self):
@ -207,9 +208,15 @@ class RedfishRest(object):
members = self._get_members(MANAGER_URL)
target_url = members[0]['@odata.id']
data = self.request('GET', target_url, cmd='get_bmc_actions')
try:
actions = data['Actions'][manager_reset_string][reset_type_string]
target_url = data['Actions'][manager_reset_string]['target']
actions_dict = data['Actions'][manager_reset_string]
target_url = actions_dict['target']
if reset_action_string in actions_dict:
action_info = self.request('GET', actions_dict[reset_action_string], cmd='get_bmc_actions')
actions = action_info['Parameters'][0]['AllowableValues']
else:
actions = actions_dict[reset_type_string]
except KeyError as e:
raise SelfServerException('Get KeyError %s' % e.args)
@ -229,9 +236,15 @@ class RedfishRest(object):
members = self._get_members(SYSTEMS_URL)
target_url = members[0]['@odata.id']
data = self.request('GET', target_url, cmd='get_power_actions')
try:
actions = data['Actions'][system_reset_string][reset_type_string]
target_url = data['Actions'][system_reset_string]['target']
actions_dict = data['Actions'][system_reset_string]
target_url = actions_dict['target']
if reset_action_string in actions_dict:
action_info = self.request('GET', actions_dict[reset_action_string], cmd='get_power_actions')
actions = action_info['Parameters'][0]['AllowableValues']
else:
actions = actions_dict[reset_type_string]
except KeyError as e:
raise SelfServerException('Get KeyError %s' % e.args)

View File

@ -70,10 +70,7 @@
"Actions": {
"#Manager.Reset": {
"target": "/redfish/v1/Managers/BMC/Actions/Manager.Reset",
"ResetType@Redfish.AllowableValues": [
"ForceRestart",
"GracefulRestart"
]
"@Redfish.ActionInfo": "/redfish/v1/Managers/BMC/ResetActionInfo"
}
},
"Oem": {

View File

@ -0,0 +1,93 @@
{
"@odata.context": "/redfish/v1/$metadata#Manager.Manager",
"@odata.type": "#Manager.v1_5_0.Manager",
"@odata.id": "/redfish/v1/Managers/BMC",
"Id": "BMC",
"Description": "Aspeed BMC",
"Name": "Manager",
"ManagerType": "BMC",
"UUID": "006126AB-B608-E911-8000-0CC47AD55B4E",
"Model": "P9DSU 9006-22P",
"DateTime": "2019-01-22T06:22:55+00:00",
"DateTimeLocalOffset": "+00:00",
"FirmwareVersion": "2.04",
"Status": {
"State": "Enabled",
"Health": "OK"
},
"PowerState": "On",
"SerialConsole": {
"ServiceEnabled": true,
"MaxConcurrentSessions": 1,
"ConnectTypesSupported": [
"IPMI"
]
},
"CommandShell": {
"ServiceEnabled": true,
"MaxConcurrentSessions": 0,
"ConnectTypesSupported": [
"SSH"
]
},
"GraphicalConsole": {
"ServiceEnabled": true,
"MaxConcurrentSessions": 4,
"ConnectTypesSupported": [
"KVMIP"
]
},
"EthernetInterfaces": {
"@odata.id": "/redfish/v1/Managers/BMC/EthernetInterfaces"
},
"SerialInterfaces": {
"@odata.id": "/redfish/v1/Managers/BMC/SerialInterfaces"
},
"NetworkProtocol": {
"@odata.id": "/redfish/v1/Managers/BMC/NetworkProtocol"
},
"LogServices": {
"@odata.id": "/redfish/v1/Managers/BMC/LogServices"
},
"VirtualMedia": {
"@odata.id": "/redfish/v1/Managers/BMC/VirtualMedia"
},
"Links": {
"ManagerForServers": [
{
"@odata.id": "/redfish/v1/Systems/Computer"
}
],
"ManagerForChassis": [
{
"@odata.id": "/redfish/v1/Chassis/Planar"
}
],
"ManagerInChassis": {
"@odata.id": "/redfish/v1/Chassis/Planar"
}
},
"Actions": {
"#Manager.Reset": {
"target": "/redfish/v1/Managers/BMC/Actions/Manager.Reset",
"ResetType@Redfish.AllowableValues": [
"ForceRestart",
"GracefulRestart"
]
}
},
"Oem": {
"Supermicro": {
"@odata.type": "#SMCManager.v1_0_1.SMCManager",
"FanMode": {
"@odata.id": "/redfish/v1/Managers/BMC/Oem/Supermicro/FanMode"
},
"MouseMode": {
"@odata.id": "/redfish/v1/Managers/BMC/Oem/Supermicro/MouseMode"
},
"SMTP": {
"@odata.id": "/redfish/v1/Managers/BMC/Oem/Supermicro/SMTP"
}
}
}
}

View File

@ -0,0 +1,23 @@
{
"@odata.context": "/redfish/v1/$metadata#ActionInfo.ActionInfo",
"@odata.type": "#ActionInfo.v1_1_0.ActionInfo",
"@odata.id": "/redfish/v1/Systems/Computer/ResetActionInfo",
"Id": "ResetActionInfo",
"Name": "Reset Action Info",
"Parameters": [
{
"Name": "ResetType",
"Required": true,
"DataType": "String",
"AllowableValues": [
"On",
"ForceOff",
"GracefulShutdown",
"GracefulRestart",
"ForceRestart",
"ForceOn"
]
}
],
"Oem": {}
}

View File

@ -73,14 +73,7 @@
"Actions": {
"#ComputerSystem.Reset": {
"target": "/redfish/v1/Systems/Computer/Actions/ComputerSystem.Reset",
"ResetType@Redfish.AllowableValues": [
"On",
"ForceOff",
"GracefulShutdown",
"GracefulRestart",
"ForceRestart",
"ForceOn"
]
"@Redfish.ActionInfo": "/redfish/v1/Systems/Computer/ResetActionInfo"
}
}
}

View File

@ -0,0 +1,86 @@
{
"@odata.context": "/redfish/v1/$metadata#ComputerSystem.ComputerSystem",
"@odata.type": "#ComputerSystem.v1_5_0.ComputerSystem",
"@odata.id": "/redfish/v1/Systems/Computer",
"Id": "Computer",
"Name": "OpenPOWER Computer System",
"Description": "OpenPOWER Computer System",
"Status": {
"State": "Enabled",
"Health": "Critical"
},
"SerialNumber": "C829UAE15A10564",
"PartNumber": "9006-22P",
"Manufacturer": "IBM",
"Model": "SYSTEM",
"SystemType": "Physical",
"BiosVersion": "2.04 20190118",
"UUID": "00000000-0000-0000-0000-0000000000",
"ProcessorSummary": {
"Count": 2,
"Model": "POWER CPU",
"Status": {
"State": "Enabled",
"Health": "OK"
}
},
"IndicatorLED": "Off",
"PowerState": "On",
"Boot": {
"BootSourceOverrideMode": "Legacy",
"BootSourceOverrideEnabled": "Once",
"BootSourceOverrideTarget": "None",
"BootSourceOverrideTarget@Redfish.AllowableValues": [
"None",
"Pxe",
"Hdd",
"Diags",
"Cd",
"BiosSetup",
"Usb",
"Floppy"
]
},
"HostWatchdogTimer": {
"FunctionEnabled": true,
"WarningAction": "None",
"WarningAction@Redfish.AllowableValues": [
"None"
],
"TimeoutAction": "None",
"TimeoutAction@Redfish.AllowableValues": [
"None",
"ResetSystem",
"PowerDown",
"PowerCycle"
],
"Status": {
"State": "StandbyOffline"
}
},
"Links": {
"Chassis": [
{
"@odata.id": "/redfish/v1/Chassis/chassis0"
}
],
"ManagedBy": [
{
"@odata.id": "/redfish/v1/Managers/BMC"
}
]
},
"Actions": {
"#ComputerSystem.Reset": {
"target": "/redfish/v1/Systems/Computer/Actions/ComputerSystem.Reset",
"ResetType@Redfish.AllowableValues": [
"On",
"ForceOff",
"GracefulShutdown",
"GracefulRestart",
"ForceRestart",
"ForceOn"
]
}
}
}

View File

@ -1,15 +1,7 @@
{
"@odata.context":"/redfish/v1/$metadata#ChassisCollection.ChassisCollection",
"@odata.type":"#ChassisCollection.ChassisCollection",
"@odata.id":"/redfish/v1/Chassis",
"error":{
"Message": "Chassis Collection"
},
"Description":"Chassis Collection",
"Members":[
{
"@odata.id":"/redfish/v1/Chassis/Planar"
}
],
"Members@odata.count":1
"error":
{
"message": "Successfully Completed Request",
"code": "Base.1.4.0.Success"
}
}

View File

@ -222,15 +222,24 @@ class TestRedfishClient(object):
self.rf_rest._get_members = mock.Mock(return_value=[ {"@odata.id": self.manager_url + '/BMC'} ])
with open("%s/manager_rsp.json" % DATA_DIR,'r') as load_f:
rsp = json.load(load_f)
with open("%s/bmc_action_rsp.json" % DATA_DIR,'r') as load_f:
actioninfo = json.load(load_f)
self.rf_rest.request = mock.Mock(side_effect=[rsp, actioninfo])
reset_string = '#Manager.Reset'
assert self.rf_rest._get_bmc_actions() == (rsp['Actions'][reset_string]['target'], actioninfo['Parameters'][0]['AllowableValues'])
def test__get_bmc_actions_v123(self):
self.rf_rest._get_members = mock.Mock(return_value=[ {"@odata.id": self.manager_url + '/BMC'} ])
with open("%s/manager_rsp_v123.json" % DATA_DIR,'r') as load_f:
rsp = json.load(load_f)
self.rf_rest.request = mock.Mock(return_value=rsp)
reset_string = '#Manager.Reset'
assert self.rf_rest._get_bmc_actions() == (rsp['Actions'][reset_string]['target'], rsp['Actions'][reset_string]['ResetType@Redfish.AllowableValues'])
assert self.rf_rest._get_bmc_actions() == (rsp['Actions'][reset_string]['target'], rsp['Actions'][reset_string]['ResetType@Redfish.AllowableValues'])
def test__get_bmc_actions_keyerror(self):
self.rf_rest._get_members = mock.Mock(return_value=[ {"@odata.id": self.manager_url + '/BMC'} ])
with open("%s/manager_rsp.json" % DATA_DIR,'r') as load_f:
rsp = json.load(load_f)
del rsp['Actions']['#Manager.Reset']['ResetType@Redfish.AllowableValues']
self.rf_rest.request = mock.Mock(return_value=rsp)
with pytest.raises(SelfServerException) as excinfo:
self.rf_rest._get_bmc_actions()
@ -256,6 +265,16 @@ class TestRedfishClient(object):
self.rf_rest._get_members = mock.Mock(return_value=[ {"@odata.id": self.systems_url + '/Computer'} ])
with open("%s/systems_rsp.json" % DATA_DIR,'r') as load_f:
rsp = json.load(load_f)
with open("%s/system_action_rsp.json" % DATA_DIR,'r') as load_f:
actioninfo = json.load(load_f)
self.rf_rest.request = mock.Mock(side_effect=[rsp, actioninfo])
reset_string = '#ComputerSystem.Reset'
assert self.rf_rest._get_power_actions() == (rsp['Actions'][reset_string]['target'], actioninfo['Parameters'][0]['AllowableValues'])
def test__get_power_actions_v123(self):
self.rf_rest._get_members = mock.Mock(return_value=[ {"@odata.id": self.systems_url + '/Computer'} ])
with open("%s/systems_rsp_v123.json" % DATA_DIR,'r') as load_f:
rsp = json.load(load_f)
self.rf_rest.request = mock.Mock(return_value=rsp)
reset_string = '#ComputerSystem.Reset'
assert self.rf_rest._get_power_actions() == (rsp['Actions'][reset_string]['target'], rsp['Actions'][reset_string]['ResetType@Redfish.AllowableValues'])
@ -264,7 +283,6 @@ class TestRedfishClient(object):
self.rf_rest._get_members = mock.Mock(return_value=[ {"@odata.id": self.systems_url + '/Computer'} ])
with open("%s/systems_rsp.json" % DATA_DIR,'r') as load_f:
rsp = json.load(load_f)
del rsp['Actions']['#ComputerSystem.Reset']['target']
self.rf_rest.request = mock.Mock(return_value=rsp)
with pytest.raises(SelfServerException) as excinfo:
self.rf_rest._get_power_actions()
@ -274,8 +292,10 @@ class TestRedfishClient(object):
def test_set_power_state(self):
with open("%s/systems_rsp.json" % DATA_DIR,'r') as load_f:
rsp = json.load(load_f)
with open("%s/system_action_rsp.json" % DATA_DIR,'r') as load_f:
actioninfo = json.load(load_f)
reset_string = '#ComputerSystem.Reset'
self.rf_rest._get_power_actions = mock.Mock(return_value=(rsp['Actions'][reset_string]['target'], rsp['Actions'][reset_string]['ResetType@Redfish.AllowableValues']))
self.rf_rest._get_power_actions = mock.Mock(return_value=(rsp['Actions'][reset_string]['target'], actioninfo['Parameters'][0]['AllowableValues']))
self.rf_rest.request = mock.Mock(return_value=None)
assert self.rf_rest.set_power_state('on') == None
assert self.rf_rest.request