Skip to content

Commit

Permalink
Add SetSessionService to redfish_config (#5009)
Browse files Browse the repository at this point in the history
* Add SetSessionService to redfish_config
adding SetSessionService command to redfish_config
to set BMC default session timeout policy.

Fixes #5008

* fix white space issues

* Making Requested changes:
 - changed category from SessionService to Sessions
 - changed set_sessionservice() to set_session_service()
 - other misc. changes for cleanup

* Apply suggestions from code review

Co-authored-by: Alexei Znamensky <[email protected]>

* Fix issues with checks

* Fix issues with checks part 2

* Fix issues with checks part 3

* Update plugins/modules/remote_management/redfish/redfish_config.py

Co-authored-by: Felix Fontein <[email protected]>

Co-authored-by: Alexei Znamensky <[email protected]>
Co-authored-by: Felix Fontein <[email protected]>
  • Loading branch information
3 people authored Sep 25, 2022
1 parent fb1cf91 commit d9d830a
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 1 deletion.
2 changes: 2 additions & 0 deletions changelogs/fragments/5008-addSetSessionService.yml
Original file line number Diff line number Diff line change
@@ -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).
58 changes: 58 additions & 0 deletions plugins/module_utils/redfish_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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"}
33 changes: 32 additions & 1 deletion plugins/modules/remote_management/redfish/redfish_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)"
'''
Expand Down Expand Up @@ -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 = '''
Expand All @@ -254,7 +270,8 @@
CATEGORY_COMMANDS_ALL = {
"Systems": ["SetBiosDefaultSettings", "SetBiosAttributes", "SetBootOrder",
"SetDefaultBootOrder"],
"Manager": ["SetNetworkProtocols", "SetManagerNic", "SetHostInterface"]
"Manager": ["SetNetworkProtocols", "SetManagerNic", "SetHostInterface"],
"Sessions": ["SetSessionService"],
}


Expand Down Expand Up @@ -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'),
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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'):
Expand Down

0 comments on commit d9d830a

Please sign in to comment.