mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-10-30 19:02:27 +00:00 
			
		
		
		
	fix issue 5969, handle power actions info format on 2.04
This commit is contained in:
		| @@ -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) | ||||
|  | ||||
|   | ||||
| @@ -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": { | ||||
|   | ||||
| @@ -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" | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
| @@ -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": {} | ||||
| } | ||||
| @@ -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" | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -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" | ||||
|       ] | ||||
|     } | ||||
|   } | ||||
| } | ||||
| @@ -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" | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user