From 349f5f7b85466910bfe61928f49620c17c6620ef Mon Sep 17 00:00:00 2001 From: xuweibj Date: Sun, 27 Jan 2019 21:02:41 -0500 Subject: [PATCH] fix issue 5969, handle power actions info format on 2.04 --- .../lib/python/agent/hwctl/redfish_client.py | 23 ++++- .../tests/unit/json_data/manager_rsp.json | 5 +- .../unit/json_data/manager_rsp_v123.json | 93 +++++++++++++++++++ .../unit/json_data/system_action_rsp.json | 23 +++++ .../tests/unit/json_data/systems_rsp.json | 9 +- .../unit/json_data/systems_rsp_v123.json | 86 +++++++++++++++++ .../tests/unit/json_data/with_error_rsp.json | 18 +--- .../unit/test_hwctl/test_redfish_client.py | 28 +++++- 8 files changed, 251 insertions(+), 34 deletions(-) create mode 100644 xCAT-openbmc-py/lib/python/agent/tests/unit/json_data/manager_rsp_v123.json create mode 100644 xCAT-openbmc-py/lib/python/agent/tests/unit/json_data/system_action_rsp.json create mode 100644 xCAT-openbmc-py/lib/python/agent/tests/unit/json_data/systems_rsp_v123.json diff --git a/xCAT-openbmc-py/lib/python/agent/hwctl/redfish_client.py b/xCAT-openbmc-py/lib/python/agent/hwctl/redfish_client.py index db9152309..0900f63bf 100644 --- a/xCAT-openbmc-py/lib/python/agent/hwctl/redfish_client.py +++ b/xCAT-openbmc-py/lib/python/agent/hwctl/redfish_client.py @@ -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) diff --git a/xCAT-openbmc-py/lib/python/agent/tests/unit/json_data/manager_rsp.json b/xCAT-openbmc-py/lib/python/agent/tests/unit/json_data/manager_rsp.json index 1a03cc082..99c1a768a 100644 --- a/xCAT-openbmc-py/lib/python/agent/tests/unit/json_data/manager_rsp.json +++ b/xCAT-openbmc-py/lib/python/agent/tests/unit/json_data/manager_rsp.json @@ -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": { diff --git a/xCAT-openbmc-py/lib/python/agent/tests/unit/json_data/manager_rsp_v123.json b/xCAT-openbmc-py/lib/python/agent/tests/unit/json_data/manager_rsp_v123.json new file mode 100644 index 000000000..38c406265 --- /dev/null +++ b/xCAT-openbmc-py/lib/python/agent/tests/unit/json_data/manager_rsp_v123.json @@ -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" + } + } + } +} diff --git a/xCAT-openbmc-py/lib/python/agent/tests/unit/json_data/system_action_rsp.json b/xCAT-openbmc-py/lib/python/agent/tests/unit/json_data/system_action_rsp.json new file mode 100644 index 000000000..decbf8cac --- /dev/null +++ b/xCAT-openbmc-py/lib/python/agent/tests/unit/json_data/system_action_rsp.json @@ -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": {} +} diff --git a/xCAT-openbmc-py/lib/python/agent/tests/unit/json_data/systems_rsp.json b/xCAT-openbmc-py/lib/python/agent/tests/unit/json_data/systems_rsp.json index caee86e6b..eee81f42e 100644 --- a/xCAT-openbmc-py/lib/python/agent/tests/unit/json_data/systems_rsp.json +++ b/xCAT-openbmc-py/lib/python/agent/tests/unit/json_data/systems_rsp.json @@ -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" } } } diff --git a/xCAT-openbmc-py/lib/python/agent/tests/unit/json_data/systems_rsp_v123.json b/xCAT-openbmc-py/lib/python/agent/tests/unit/json_data/systems_rsp_v123.json new file mode 100644 index 000000000..caee86e6b --- /dev/null +++ b/xCAT-openbmc-py/lib/python/agent/tests/unit/json_data/systems_rsp_v123.json @@ -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" + ] + } + } +} diff --git a/xCAT-openbmc-py/lib/python/agent/tests/unit/json_data/with_error_rsp.json b/xCAT-openbmc-py/lib/python/agent/tests/unit/json_data/with_error_rsp.json index e88ecd915..95630660b 100644 --- a/xCAT-openbmc-py/lib/python/agent/tests/unit/json_data/with_error_rsp.json +++ b/xCAT-openbmc-py/lib/python/agent/tests/unit/json_data/with_error_rsp.json @@ -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" + } } diff --git a/xCAT-openbmc-py/lib/python/agent/tests/unit/test_hwctl/test_redfish_client.py b/xCAT-openbmc-py/lib/python/agent/tests/unit/test_hwctl/test_redfish_client.py index bc98e66de..0318531c8 100644 --- a/xCAT-openbmc-py/lib/python/agent/tests/unit/test_hwctl/test_redfish_client.py +++ b/xCAT-openbmc-py/lib/python/agent/tests/unit/test_hwctl/test_redfish_client.py @@ -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