From eb7190264eef1fcd52bf46aa128a4e3e58f46017 Mon Sep 17 00:00:00 2001 From: Xander Madsen Date: Thu, 2 May 2019 08:48:57 -0400 Subject: [PATCH] Add GetChassisPower command to Chassis category of redfish_facts (#54314) * Add GetChassisPower as viable Chassis command in redfish_facts * Add conditional to catch command == 'GetChassisPower' * Implement get_chassis_power() retrieving Watts-related and other useful power data from each Chassis * Add RelatedItem property and remove MemberId property * Check for length of data['PowerControl'] to be > 0 before checking index 0 of the list. * Fix return statement being inside loop and result key not being 'entries' as is expected * Update lib/ansible/module_utils/redfish_utils.py Co-Authored-By: xmadsen * Update lib/ansible/module_utils/redfish_utils.py Co-Authored-By: xmadsen * Update redfish_facts.py --- lib/ansible/module_utils/redfish_utils.py | 38 +++++++++++++++++++ .../redfish/redfish_facts.py | 4 +- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/lib/ansible/module_utils/redfish_utils.py b/lib/ansible/module_utils/redfish_utils.py index 083b4c3c4c..2ea036050b 100644 --- a/lib/ansible/module_utils/redfish_utils.py +++ b/lib/ansible/module_utils/redfish_utils.py @@ -920,6 +920,44 @@ class RedfishUtils(object): result["entries"] = fan_results return result + def get_chassis_power(self): + result = {} + key = "Power" + + # Get these entries, but does not fail if not found + properties = ['Name', 'PowerAllocatedWatts', + 'PowerAvailableWatts', 'PowerCapacityWatts', + 'PowerConsumedWatts', 'PowerMetrics', + 'PowerRequestedWatts', 'RelatedItem', 'Status'] + + chassis_power_results = [] + # Go through list + for chassis_uri in self.chassis_uri_list: + chassis_power_result = {} + response = self.get_request(self.root_uri + chassis_uri) + if response['ret'] is False: + return response + result['ret'] = True + data = response['data'] + if key in data: + response = self.get_request(self.root_uri + chassis_uri + + "/" + key) + data = response['data'] + if 'PowerControl' in data: + if len(data['PowerControl']) > 0: + data = data['PowerControl'][0] + for property in properties: + if property in data: + chassis_power_result[property] = data[property] + else: + return {'ret': False, 'msg': 'Key PowerControl not found.'} + chassis_power_results.append(chassis_power_result) + else: + return {'ret': False, 'msg': 'Key Power not found.'} + + result['entries'] = chassis_power_results + return result + def get_chassis_thermals(self): result = {} sensors = [] diff --git a/lib/ansible/modules/remote_management/redfish/redfish_facts.py b/lib/ansible/modules/remote_management/redfish/redfish_facts.py index 8a8ae59346..28a9bb1fb9 100644 --- a/lib/ansible/modules/remote_management/redfish/redfish_facts.py +++ b/lib/ansible/modules/remote_management/redfish/redfish_facts.py @@ -170,7 +170,7 @@ CATEGORY_COMMANDS_ALL = { "GetMemoryInventory", "GetNicInventory", "GetStorageControllerInventory", "GetDiskInventory", "GetBiosAttributes", "GetBootOrder"], - "Chassis": ["GetFanInventory", "GetPsuInventory", "GetChassisThermals"], + "Chassis": ["GetFanInventory", "GetPsuInventory", "GetChassisPower", "GetChassisThermals"], "Accounts": ["ListUsers"], "Update": ["GetFirmwareInventory", "GetFirmwareUpdateCapabilities"], "Manager": ["GetManagerNicInventory", "GetLogs"], @@ -281,6 +281,8 @@ def main(): result["psu"] = rf_utils.get_psu_inventory() elif command == "GetChassisThermals": result["thermals"] = rf_utils.get_chassis_thermals() + elif command == "GetChassisPower": + result["chassis_power"] = rf_utils.get_chassis_power() elif category == "Accounts": # execute only if we find an Account service resource