From 684ffe30da8df53a41f958c0e8848ee2ea2ab4de Mon Sep 17 00:00:00 2001 From: Jarrod Johnson Date: Tue, 27 Aug 2019 11:29:16 -0400 Subject: [PATCH] Support instanced configuration Add suspport for instanced configuration attributes. Change-Id: Idf5026fddc4318e847f42ac9fd44ce643c463100 --- pyghmi/ipmi/oem/lenovo/config.py | 97 ++++++++++++++++++++++++-------- 1 file changed, 75 insertions(+), 22 deletions(-) diff --git a/pyghmi/ipmi/oem/lenovo/config.py b/pyghmi/ipmi/oem/lenovo/config.py index 89ff5395..b3629e64 100644 --- a/pyghmi/ipmi/oem/lenovo/config.py +++ b/pyghmi/ipmi/oem/lenovo/config.py @@ -1,6 +1,6 @@ # vim: tabstop=4 shiftwidth=4 softtabstop=4 -# Copyright 2017 Lenovo +# Copyright 2017-2019 Lenovo # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -289,6 +289,7 @@ class LenovoFirmwareConfig(object): else: lenovo_group = group.get("ID") for setting in group.iter("setting"): + forceinstance = False is_list = False lenovo_setting = setting.get("ID") protect = True if setting.get("protected") == 'true' \ @@ -306,34 +307,26 @@ class LenovoFirmwareConfig(object): name = setting.find("mriName").text help = setting.find("desc").text onedata = setting.find('text_data') - if onedata: - if len(list(onedata.iter('instance'))) > 1: - protect = True if onedata is not None: if onedata.get('password') == 'true': protect = True enumdata = setting.find('enumerate_data') if enumdata is not None: if enumdata.get('maxinstance') is not None: - protect = True - for currchoice in enumdata.iter('choice'): - if len(list(currchoice.iter('instance'))) > 1: - protect = True - break + forceinstance = True if onedata is None: onedata = setting.find('numeric_data') if onedata is not None: if onedata.get('maxinstance') is not None: - protect = True # Not yet supported + forceinstance = True + instances = list(onedata.iter('instance')) + if not instances: + protect = True # not supported yet else: - instance = onedata.find('instance') - if instance is None: - protect = True # not supported yet - else: - current = instance.text - default = onedata.get('default', None) - if default == '': - default = None + current = [x.text for x in instances] + default = onedata.get('default', None) + if default == '': + default = None if (setting.find('cmd_data') is not None or setting.find('boolean_data') is not None): protect = True # Hide currently unsupported settings @@ -346,11 +339,11 @@ class LenovoFirmwareConfig(object): current = [] extraorder = ldata.get('ordered') == 'true' lenovo_value = None + instancetochoicemap = {} for choice in setting.iter("choice"): label = choice.find("label").text possible.append(label) - instance = choice.find("instance") - if instance is not None: + for instance in choice.iter("instance"): if is_list: if not extraorder: current.append(label) @@ -358,7 +351,11 @@ class LenovoFirmwareConfig(object): currentdict[ int(instance.get("order"))] = label else: - current = label + currid = instance.get('ID') + if currid: + instancetochoicemap[currid] = label + else: + current = label try: lenovo_value = int( choice.find('value').text) @@ -384,6 +381,62 @@ class LenovoFirmwareConfig(object): default.append(currentdef[order]) optionname = "%s.%s" % (cfglabel, name) alias = "%s.%s" % (lenovo_id, name) + if onedata is not None: + if current and len(current) > 1: + instidx = 1 + for inst in current: + optname = '{0}.{1}'.format(optionname, instidx) + options[optname] = dict(current=inst, + default=default, + possible=possible, + pending=None, + new_value=None, + help=help, + is_list=is_list, + lenovo_value=lenovo_value, + lenovo_id=lenovo_id, + lenovo_group=lenovo_group, + lenovo_setting=lenovo_setting, + lenovo_reboot=reset, + lenovo_protect=protect, + lenovo_instance=instidx, + readonly_expression=readonly, + hide_expression=hide, + sortid=sortid, + alias=alias) + sortid += 1 + instidx += 1 + continue + if current: + current = current[0] + if instancetochoicemap: + for currid in sorted(instancetochoicemap): + optname = '{0}.{1}'.format(optionname, currid) + current = instancetochoicemap[currid] + options[optname] = dict(current=current, + default=default, + possible=possible, + pending=None, + new_value=None, + help=help, + is_list=is_list, + lenovo_value=lenovo_value, + lenovo_id=lenovo_id, + lenovo_group=lenovo_group, + lenovo_setting=lenovo_setting, + lenovo_reboot=reset, + lenovo_protect=protect, + lenovo_instance=currid, + readonly_expression=readonly, + hide_expression=hide, + sortid=sortid, + alias=alias) + sortid += 1 + continue + lenovoinstance = "" + if forceinstance: + optionname = '{0}.{1}'.format(optionname, 1) + lenovoinstance = 1 options[optionname] = dict(current=current, default=default, possible=possible, @@ -397,10 +450,10 @@ class LenovoFirmwareConfig(object): lenovo_setting=lenovo_setting, lenovo_reboot=reset, lenovo_protect=protect, + lenovo_instance=lenovoinstance, readonly_expression=readonly, hide_expression=hide, sortid=sortid, - lenovo_instance="", alias=alias) sortid = sortid + 1 for opt in options: