Repository: ansible-collections/community.general

Issue:
add SetSessionService to redfish_config
### Summary

As a user, I want to set the default redfish session timeout policy on the BMC. 

### Issue Type

Feature Idea

### Component Name

redfish_config

### Additional Information

<!--- Paste example playbooks or commands between quotes below -->
```yaml (paste below)

```


### Code of Conduct

- [X] I agree to follow the Ansible Code of Conduct


Discussion:
Files identified in the description:
* [`plugins/modules/remote_management/redfish/redfish_config.py`](https://github.com/ansible-collections/community.general/blob/main/plugins/modules/remote_management/redfish/redfish_config.py)

If these files are incorrect, please update the `component name` section of the description or use the `!component` bot command.

[click here for bot help](https://github.com/ansible/ansibullbot/blob/devel/ISSUE_HELP.md)
<!--- boilerplate: components_banner --->
cc @bhavya06 @mraineri @rajeevkallur @renxulei @tomasg2012 @xmadsen
[click here for bot help](https://github.com/ansible/ansibullbot/blob/devel/ISSUE_HELP.md)
<!--- boilerplate: notify --->

Resolving patch:
diff --git a/plugins/module_utils/redfish_utils.py b/plugins/module_utils/redfish_utils.py
--- a/plugins/module_utils/redfish_utils.py
+++ b/plugins/module_utils/redfish_utils.py
@@ -240,6 +240,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
@@ -3081,3 +3082,60 @@ def get_manager_inventory(self, manager_uri):
 
     def get_multi_manager_inventory(self):
         return self.aggregate_managers(self.get_manager_inventory)
+
+    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_sessions_config = response['data']
+        payload = {}
+        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_sessions_config[property], dict):
+                    payload[property] = value
+                elif isinstance(current_sessions_config[property], list):
+                    payload[property] = [value]
+                else:
+                    return {'ret': False, 'msg': "Value of property %s in sessions_config is invalid" % property}
+            else:
+                payload[property] = value
+
+        need_change = False
+        for property, set_value in payload.items():
+            cur_value = current_sessions_config[property]
+            if not isinstance(set_value, (dict, list)):
+                if set_value != cur_value:
+                    need_change = True
+            if isinstance(set_value, dict):
+                for subprop in set_value.keys():
+                    if subprop not in current_sessions_config[property]:
+                        need_change = True
+                        break
+                    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 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 set_value[i].keys():
+                        if subprop not in current_sessions_config[property][i]:
+                            need_change = True
+                            break
+                        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:
+            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
--- a/plugins/modules/remote_management/redfish/redfish_config.py
+++ b/plugins/modules/remote_management/redfish/redfish_config.py
@@ -113,6 +113,12 @@
       - Redfish HostInterface instance ID if multiple HostInterfaces are present.
     type: str
     version_added: '4.1.0'
+  sessions_config:
+    required: false
+    description:
+      - Setting dict of Sessions.
+    type: dict
+    version_added: '5.7.0'
 
 author: "Jose Delarosa (@jose-delarosa)"
 '''
@@ -235,6 +241,16 @@
       baseuri: "{{ baseuri }}"
       username: "{{ username }}"
       password: "{{ password }}"
+
+  - name: Set SessionService Session Timeout to 30 minutes
+    community.general.redfish_config:
+      category: Sessions
+      command: SetSessionService
+      sessions_config:
+        SessionTimeout: 1800
+      baseuri: "{{ baseuri }}"
+      username: "{{ username }}"
+      password: "{{ password }}"
 '''
 
 RETURN = '''
@@ -254,7 +270,8 @@
 CATEGORY_COMMANDS_ALL = {
     "Systems": ["SetBiosDefaultSettings", "SetBiosAttributes", "SetBootOrder",
                 "SetDefaultBootOrder"],
-    "Manager": ["SetNetworkProtocols", "SetManagerNic", "SetHostInterface"]
+    "Manager": ["SetNetworkProtocols", "SetManagerNic", "SetHostInterface"],
+    "Sessions": ["SetSessionService"],
 }
 
 
@@ -284,6 +301,7 @@ def main():
             strip_etag_quotes=dict(type='bool', default=False),
             hostinterface_config=dict(type='dict', default={}),
             hostinterface_id=dict(),
+            sessions_config=dict(type='dict', default={}),
         ),
         required_together=[
             ('username', 'password'),
@@ -330,6 +348,9 @@ def main():
     # HostInterface instance ID
     hostinterface_id = module.params['hostinterface_id']
 
+    # Sessions config options
+    sessions_config = module.params['sessions_config']
+
     # Build root URI
     root_uri = "https://" + module.params['baseuri']
     rf_utils = RedfishUtils(creds, root_uri, timeout, module,
@@ -376,6 +397,16 @@ def main():
             elif command == "SetHostInterface":
                 result = rf_utils.set_hostinterface_attributes(hostinterface_config, hostinterface_id)
 
+    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_session_service(sessions_config)
+
     # Return data back or fail with proper message
     if result['ret'] is True:
         if result.get('warning'):


Test patch: