From 085b222ce9769db5443b919da04835c827be2ce1 Mon Sep 17 00:00:00 2001 From: TJ Bailey Date: Tue, 26 Jul 2022 11:06:42 -0400 Subject: [PATCH 1/8] Add SetSessionService to redfish_config adding SetSessionService command to redfish_config to set BMC default session timeout policy. Fixes #5008 --- .../fragments/5008-addSetSessionService.yml | 2 + plugins/module_utils/redfish_utils.py | 61 +++++++++++++++++++ .../redfish/redfish_config.py | 33 +++++++++- 3 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 changelogs/fragments/5008-addSetSessionService.yml diff --git a/changelogs/fragments/5008-addSetSessionService.yml b/changelogs/fragments/5008-addSetSessionService.yml new file mode 100644 index 00000000000..b2b124c48b4 --- /dev/null +++ b/changelogs/fragments/5008-addSetSessionService.yml @@ -0,0 +1,2 @@ +minor_changes: + - redfish_config - add ``SetSessionService`` to set default session timeout policy (https://github.com/ansible-collections/community.general/issues/5008). diff --git a/plugins/module_utils/redfish_utils.py b/plugins/module_utils/redfish_utils.py index 10afeb3b612..404980f0e79 100644 --- a/plugins/module_utils/redfish_utils.py +++ b/plugins/module_utils/redfish_utils.py @@ -229,6 +229,7 @@ def _find_sessionservice_resource(self): return {'ret': False, 'msg': "SessionService resource not found"} else: session_service = data["SessionService"]["@odata.id"] + self.session_service_uri = session_service response = self.get_request(self.root_uri + session_service) if response['ret'] is False: return response @@ -3051,3 +3052,63 @@ def get_manager_inventory(self, manager_uri): def get_multi_manager_inventory(self): return self.aggregate_managers(self.get_manager_inventory) + + def set_sessionservice(self, sessionservice_config): + result = {} + response = self.get_request(self.root_uri + self.session_service_uri) + if response['ret'] is False: + return response + current_sessionservice_config= response['data'] + payload = {} + for property in sessionservice_config.keys(): + value = sessionservice_config[property] + if property not in current_sessionservice_config: + return {'ret': False, 'msg': "Property %s in sessionservice_config is invalid" % property} + if isinstance(value, dict): + if isinstance(current_sessionservice_config[property], dict): + payload[property] = value + elif isinstance(current_sessionservice_config[property], list): + payload[property] = list() + payload[property].append(value) + else: + return {'ret': False, 'msg': "Value of property %s in sessionservice_config is invalid" % property} + else: + payload[property] = value + + need_change = False + for property in payload.keys(): + set_value = payload[property] + cur_value = current_sessionservice_config[property] + if not isinstance(set_value, dict) and not isinstance(set_value, list): + if set_value != cur_value: + need_change = True + if isinstance(set_value, dict): + for subprop in payload[property].keys(): + if subprop not in current_sessionservice_config[property]: + need_change = True + break + sub_set_value = payload[property][subprop] + sub_cur_value = current_sessionservice_config[property][subprop] + if sub_set_value != sub_cur_value: + need_change = True + if isinstance(set_value, list): + if len(set_value) != len(cur_value): + need_change = True + continue + for i in range(len(set_value)): + for subprop in payload[property][i].keys(): + if subprop not in current_sessionservice_config[property][i]: + need_change = True + break + sub_set_value = payload[property][i][subprop] + sub_cur_value = current_sessionservice_config[property][i][subprop] + if sub_set_value != sub_cur_value: + need_change = True + if not need_change: + return {'ret': True, 'changed': False, 'msg': "SessionService already configured"} + + response = self.patch_request(self.root_uri + self.session_service_uri, payload) + if response['ret'] is False: + return response + return {'ret': True, 'changed': True, 'msg': "Modified SessionService"} + diff --git a/plugins/modules/remote_management/redfish/redfish_config.py b/plugins/modules/remote_management/redfish/redfish_config.py index 9c59e29955b..65c739df513 100644 --- a/plugins/modules/remote_management/redfish/redfish_config.py +++ b/plugins/modules/remote_management/redfish/redfish_config.py @@ -112,6 +112,12 @@ - Redfish HostInterface instance ID if multiple HostInterfaces are present. type: str version_added: '4.1.0' + sessionservice_config: + required: false + description: + - Setting dict of SessionService. + type: dict + version_added: '5.4.0' author: "Jose Delarosa (@jose-delarosa)" ''' @@ -234,6 +240,16 @@ baseuri: "{{ baseuri }}" username: "{{ username }}" password: "{{ password }}" + + - name: Set SessionService Session Timeout to 30 minutes + community.general.redfish_config: + category: SessionService + command: SetSessionService + sessionservice_config: + SessionTimeout: 1800 + baseuri: "{{ baseuri }}" + username: "{{ username }}" + password: "{{ password }}" ''' RETURN = ''' @@ -253,7 +269,8 @@ CATEGORY_COMMANDS_ALL = { "Systems": ["SetBiosDefaultSettings", "SetBiosAttributes", "SetBootOrder", "SetDefaultBootOrder"], - "Manager": ["SetNetworkProtocols", "SetManagerNic", "SetHostInterface"] + "Manager": ["SetNetworkProtocols", "SetManagerNic", "SetHostInterface"], + "SessionService": ["SetSessionService"] } @@ -283,6 +300,7 @@ def main(): strip_etag_quotes=dict(type='bool', default=False), hostinterface_config=dict(type='dict', default={}), hostinterface_id=dict(), + sessionservice_config=dict(type='dict', default={}), ), required_together=[ ('username', 'password'), @@ -329,6 +347,9 @@ def main(): # HostInterface instance ID hostinterface_id = module.params['hostinterface_id'] + # SessionService config options + sessionservice_config = module.params['sessionservice_config'] + # Build root URI root_uri = "https://" + module.params['baseuri'] rf_utils = RedfishUtils(creds, root_uri, timeout, module, @@ -375,6 +396,16 @@ def main(): elif command == "SetHostInterface": result = rf_utils.set_hostinterface_attributes(hostinterface_config, hostinterface_id) + elif category == "SessionService": + # execute only if we find a SessionService resource + result = rf_utils._find_sessionservice_resource() + if result['ret'] is False: + module.fail_json(msg=to_native(result['msg'])) + + for command in command_list: + if command == "SetSessionService": + result = rf_utils.set_sessionservice(sessionservice_config) + # Return data back or fail with proper message if result['ret'] is True: if result.get('warning'): From d3eab9c4129bf68b0d5d464d14c42b5a3d9b1e94 Mon Sep 17 00:00:00 2001 From: TJ Bailey Date: Tue, 26 Jul 2022 11:23:55 -0400 Subject: [PATCH 2/8] fix white space issues --- plugins/module_utils/redfish_utils.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/plugins/module_utils/redfish_utils.py b/plugins/module_utils/redfish_utils.py index 404980f0e79..d6df9c659a5 100644 --- a/plugins/module_utils/redfish_utils.py +++ b/plugins/module_utils/redfish_utils.py @@ -3058,7 +3058,7 @@ def set_sessionservice(self, sessionservice_config): response = self.get_request(self.root_uri + self.session_service_uri) if response['ret'] is False: return response - current_sessionservice_config= response['data'] + current_sessionservice_config = response['data'] payload = {} for property in sessionservice_config.keys(): value = sessionservice_config[property] @@ -3111,4 +3111,3 @@ def set_sessionservice(self, sessionservice_config): if response['ret'] is False: return response return {'ret': True, 'changed': True, 'msg': "Modified SessionService"} - From 49268d13ff4260bf23f69e203c6c41c8674f8adc Mon Sep 17 00:00:00 2001 From: TJ Bailey Date: Tue, 23 Aug 2022 15:28:35 -0400 Subject: [PATCH 3/8] Making Requested changes: - changed category from SessionService to Sessions - changed set_sessionservice() to set_session_service() - other misc. changes for cleanup --- plugins/module_utils/redfish_utils.py | 34 +++++++++---------- .../redfish/redfish_config.py | 22 ++++++------ 2 files changed, 27 insertions(+), 29 deletions(-) diff --git a/plugins/module_utils/redfish_utils.py b/plugins/module_utils/redfish_utils.py index d6df9c659a5..1a849c30829 100644 --- a/plugins/module_utils/redfish_utils.py +++ b/plugins/module_utils/redfish_utils.py @@ -3053,42 +3053,40 @@ def get_manager_inventory(self, manager_uri): def get_multi_manager_inventory(self): return self.aggregate_managers(self.get_manager_inventory) - def set_sessionservice(self, sessionservice_config): + def set_session_service(self, sessions_config): result = {} response = self.get_request(self.root_uri + self.session_service_uri) if response['ret'] is False: return response - current_sessionservice_config = response['data'] + current_sessions_config = response['data'] payload = {} - for property in sessionservice_config.keys(): - value = sessionservice_config[property] - if property not in current_sessionservice_config: - return {'ret': False, 'msg': "Property %s in sessionservice_config is invalid" % property} + for property, value in sessions_config.items(): + value = sessions_config[property] + if property not in current_sessions_config: + return {'ret': False, 'msg': "Property %s in sessions_config is invalid" % property} if isinstance(value, dict): - if isinstance(current_sessionservice_config[property], dict): + if isinstance(current_sessions_config[property], dict): payload[property] = value - elif isinstance(current_sessionservice_config[property], list): - payload[property] = list() - payload[property].append(value) + elif isinstance(current_sessions_config[property], list): + payload[property] = [value] else: - return {'ret': False, 'msg': "Value of property %s in sessionservice_config is invalid" % property} + return {'ret': False, 'msg': "Value of property %s in sessions_config is invalid" % property} else: payload[property] = value need_change = False - for property in payload.keys(): - set_value = payload[property] - cur_value = current_sessionservice_config[property] + for property, set_value in payload.items(): + cur_value = current_sessions_config[property] if not isinstance(set_value, dict) and not isinstance(set_value, list): if set_value != cur_value: need_change = True if isinstance(set_value, dict): for subprop in payload[property].keys(): - if subprop not in current_sessionservice_config[property]: + if subprop not in current_sessions_config[property]: need_change = True break sub_set_value = payload[property][subprop] - sub_cur_value = current_sessionservice_config[property][subprop] + sub_cur_value = current_sessions_config[property][subprop] if sub_set_value != sub_cur_value: need_change = True if isinstance(set_value, list): @@ -3097,11 +3095,11 @@ def set_sessionservice(self, sessionservice_config): continue for i in range(len(set_value)): for subprop in payload[property][i].keys(): - if subprop not in current_sessionservice_config[property][i]: + if subprop not in current_sessions_config[property][i]: need_change = True break sub_set_value = payload[property][i][subprop] - sub_cur_value = current_sessionservice_config[property][i][subprop] + sub_cur_value = current_sessions_config[property][i][subprop] if sub_set_value != sub_cur_value: need_change = True if not need_change: diff --git a/plugins/modules/remote_management/redfish/redfish_config.py b/plugins/modules/remote_management/redfish/redfish_config.py index 65c739df513..58c7f3fd148 100644 --- a/plugins/modules/remote_management/redfish/redfish_config.py +++ b/plugins/modules/remote_management/redfish/redfish_config.py @@ -112,10 +112,10 @@ - Redfish HostInterface instance ID if multiple HostInterfaces are present. type: str version_added: '4.1.0' - sessionservice_config: + sessions_config: required: false description: - - Setting dict of SessionService. + - Setting dict of Sessions. type: dict version_added: '5.4.0' @@ -243,9 +243,9 @@ - name: Set SessionService Session Timeout to 30 minutes community.general.redfish_config: - category: SessionService + category: Sessions command: SetSessionService - sessionservice_config: + sessions_config: SessionTimeout: 1800 baseuri: "{{ baseuri }}" username: "{{ username }}" @@ -270,7 +270,7 @@ "Systems": ["SetBiosDefaultSettings", "SetBiosAttributes", "SetBootOrder", "SetDefaultBootOrder"], "Manager": ["SetNetworkProtocols", "SetManagerNic", "SetHostInterface"], - "SessionService": ["SetSessionService"] + "Sessions": ["SetSessionService"], } @@ -300,7 +300,7 @@ def main(): strip_etag_quotes=dict(type='bool', default=False), hostinterface_config=dict(type='dict', default={}), hostinterface_id=dict(), - sessionservice_config=dict(type='dict', default={}), + sessions_config=dict(type='dict', default={}), ), required_together=[ ('username', 'password'), @@ -347,8 +347,8 @@ def main(): # HostInterface instance ID hostinterface_id = module.params['hostinterface_id'] - # SessionService config options - sessionservice_config = module.params['sessionservice_config'] + # Sessions config options + sessions_config = module.params['sessions_config'] # Build root URI root_uri = "https://" + module.params['baseuri'] @@ -396,15 +396,15 @@ def main(): elif command == "SetHostInterface": result = rf_utils.set_hostinterface_attributes(hostinterface_config, hostinterface_id) - elif category == "SessionService": - # execute only if we find a SessionService resource + elif category == "Sessions": + # execute only if we find a Sessions resource result = rf_utils._find_sessionservice_resource() if result['ret'] is False: module.fail_json(msg=to_native(result['msg'])) for command in command_list: if command == "SetSessionService": - result = rf_utils.set_sessionservice(sessionservice_config) + result = rf_utils.set_session_service(sessions_config) # Return data back or fail with proper message if result['ret'] is True: From 6f5ca81f5d2faa48581a36b24a66500d527d2ef1 Mon Sep 17 00:00:00 2001 From: tejabailey <33755314+tejabailey@users.noreply.github.com> Date: Thu, 1 Sep 2022 14:48:22 -0400 Subject: [PATCH 4/8] Apply suggestions from code review Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com> --- plugins/module_utils/redfish_utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/module_utils/redfish_utils.py b/plugins/module_utils/redfish_utils.py index 1a849c30829..27512e28637 100644 --- a/plugins/module_utils/redfish_utils.py +++ b/plugins/module_utils/redfish_utils.py @@ -3077,7 +3077,7 @@ def set_session_service(self, sessions_config): need_change = False for property, set_value in payload.items(): cur_value = current_sessions_config[property] - if not isinstance(set_value, dict) and not isinstance(set_value, list): + if not isinstance(set_value, (dict, list)): if set_value != cur_value: need_change = True if isinstance(set_value, dict): @@ -3094,7 +3094,7 @@ def set_session_service(self, sessions_config): need_change = True continue for i in range(len(set_value)): - for subprop in payload[property][i].keys(): + for subprop in set_value[i].keys(): if subprop not in current_sessions_config[property][i]: need_change = True break From 6c6536b301447b3e90d9897e4770585a8f65b646 Mon Sep 17 00:00:00 2001 From: TJ Bailey Date: Tue, 20 Sep 2022 12:54:56 -0400 Subject: [PATCH 5/8] Fix issues with checks --- plugins/module_utils/redfish_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/module_utils/redfish_utils.py b/plugins/module_utils/redfish_utils.py index 27512e28637..ac6546b54f4 100644 --- a/plugins/module_utils/redfish_utils.py +++ b/plugins/module_utils/redfish_utils.py @@ -3085,7 +3085,7 @@ def set_session_service(self, sessions_config): if subprop not in current_sessions_config[property]: need_change = True break - sub_set_value = payload[property][subprop] + sub_set_value = set_value[i][subprop] sub_cur_value = current_sessions_config[property][subprop] if sub_set_value != sub_cur_value: need_change = True From b09a68e43f4691716d26dcb8b5d864a81e6131cd Mon Sep 17 00:00:00 2001 From: TJ Bailey Date: Wed, 21 Sep 2022 09:55:22 -0400 Subject: [PATCH 6/8] Fix issues with checks part 2 --- plugins/module_utils/redfish_utils.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/module_utils/redfish_utils.py b/plugins/module_utils/redfish_utils.py index ac6546b54f4..33b03e446c1 100644 --- a/plugins/module_utils/redfish_utils.py +++ b/plugins/module_utils/redfish_utils.py @@ -3085,7 +3085,7 @@ def set_session_service(self, sessions_config): if subprop not in current_sessions_config[property]: need_change = True break - sub_set_value = set_value[i][subprop] + sub_set_value = set_value[subprop] sub_cur_value = current_sessions_config[property][subprop] if sub_set_value != sub_cur_value: need_change = True @@ -3098,8 +3098,8 @@ def set_session_service(self, sessions_config): if subprop not in current_sessions_config[property][i]: need_change = True break - sub_set_value = payload[property][i][subprop] - sub_cur_value = current_sessions_config[property][i][subprop] + sub_set_value = set_value[subprop] + sub_cur_value = current_sessions_config[property][subprop] if sub_set_value != sub_cur_value: need_change = True if not need_change: From 6a9719d0d523f2e4ef33a00f602376feb2e1363b Mon Sep 17 00:00:00 2001 From: TJ Bailey Date: Wed, 21 Sep 2022 10:25:14 -0400 Subject: [PATCH 7/8] Fix issues with checks part 3 --- plugins/module_utils/redfish_utils.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/module_utils/redfish_utils.py b/plugins/module_utils/redfish_utils.py index 33b03e446c1..612e73dbf22 100644 --- a/plugins/module_utils/redfish_utils.py +++ b/plugins/module_utils/redfish_utils.py @@ -3081,7 +3081,7 @@ def set_session_service(self, sessions_config): if set_value != cur_value: need_change = True if isinstance(set_value, dict): - for subprop in payload[property].keys(): + for subprop in set_value.keys(): if subprop not in current_sessions_config[property]: need_change = True break @@ -3098,8 +3098,8 @@ def set_session_service(self, sessions_config): if subprop not in current_sessions_config[property][i]: need_change = True break - sub_set_value = set_value[subprop] - sub_cur_value = current_sessions_config[property][subprop] + sub_set_value = set_value[i][subprop] + sub_cur_value = current_sessions_config[property][i][subprop] if sub_set_value != sub_cur_value: need_change = True if not need_change: From d6335e1e10dead08f1d52e5f365d0bbe845b944b Mon Sep 17 00:00:00 2001 From: tejabailey <33755314+tejabailey@users.noreply.github.com> Date: Fri, 23 Sep 2022 15:17:46 -0400 Subject: [PATCH 8/8] Update plugins/modules/remote_management/redfish/redfish_config.py Co-authored-by: Felix Fontein --- plugins/modules/remote_management/redfish/redfish_config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/modules/remote_management/redfish/redfish_config.py b/plugins/modules/remote_management/redfish/redfish_config.py index 58c7f3fd148..59db92d9f20 100644 --- a/plugins/modules/remote_management/redfish/redfish_config.py +++ b/plugins/modules/remote_management/redfish/redfish_config.py @@ -117,7 +117,7 @@ description: - Setting dict of Sessions. type: dict - version_added: '5.4.0' + version_added: '5.7.0' author: "Jose Delarosa (@jose-delarosa)" '''