2
0
mirror of https://github.com/xcat2/confluent.git synced 2026-09-28 16:20:54 +00:00

Implement better indication of pending when available

This commit is contained in:
Jarrod Johnson
2026-09-23 09:51:35 -04:00
parent 6f8920d47e
commit 9f5873fe19
3 changed files with 95 additions and 28 deletions
+8 -5
View File
@@ -78,6 +78,9 @@ argparser.add_option('-m', '--maxnodes', type='int',
help='Specify a maximum number of '
'nodes to configure, '
'prompting if over the threshold')
argparser.add_option('-p', '--pending', dest='showpending',
action='store_true', default=False,
help='Show pending changes for attributes')
(options, args) = argparser.parse_args()
cfgpaths = {
@@ -304,21 +307,21 @@ async def main():
if options.comparedefault:
continue
rcode |= await client.print_attrib_path(path, session, list(queryparms[path]),
NullOpt(), queryparms[path])
NullOpt(), queryparms[path], showpending=options.showpending)
if printsys == 'all' or printextbmc or printbmc or printallbmc:
if printbmc or not printextbmc:
rcode |= await client.print_attrib_path(
'/noderange/{0}/configuration/management_controller/extended/all'.format(noderange),
session, printbmc, options, attrprefix='bmc.')
session, printbmc, options, attrprefix='bmc.', showpending=options.showpending)
if options.extra:
if options.advanced:
rcode |= await client.print_attrib_path(
'/noderange/{0}/configuration/management_controller/extended/extra_advanced'.format(noderange),
session, printextbmc, options)
session, printextbmc, options, showpending=options.showpending)
else:
rcode |= await client.print_attrib_path(
'/noderange/{0}/configuration/management_controller/extended/extra'.format(noderange),
session, printextbmc, options)
session, printextbmc, options, showpending=options.showpending)
if printsys or options.exclude:
if printsys == 'all':
printsys = []
@@ -328,7 +331,7 @@ async def main():
path = '/noderange/{0}/configuration/system/advanced'.format(
noderange)
rcode |= await client.print_attrib_path(path, session, printsys,
options)
options, showpending=options.showpending)
sys.exit(rcode)
if __name__ == '__main__':
+44 -12
View File
@@ -523,7 +523,21 @@ def _sort_attrib(k):
return sortutil.naturalize_string('{}'.format(k[1]['sortid']))
return sortutil.naturalize_string(k[0])
async def print_attrib_path(path, session, requestargs, options, rename=None, attrprefix=None):
def _is_nondefault(currattr):
if currattr.get('default', None) is None:
return False # no default specified cannot tell
if 'value' not in currattr: # can't compare if no value specified
return False
if currattr['value'] != currattr['default']:
return True
# ok, the potentially pending value is the same, but check active
if 'active' not in currattr:
return False
if currattr['active'] != currattr['default']:
return True
return False
async def print_attrib_path(path, session, requestargs, options, rename=None, attrprefix=None, showpending=False):
exitcode = 0
seenattributes = NestedDict()
allnodes = set([])
@@ -551,12 +565,26 @@ async def print_attrib_path(path, session, requestargs, options, rename=None, at
currattr = res['databynode'][node][attr]
if show_attr(attr, requestargs, seenattributes, options, node):
if 'value' in currattr:
if currattr['value'] is not None:
val = currattr['value']
if isinstance(val, list):
val = ','.join(val)
currval = currattr.get('value', None)
if isinstance(currval, list):
currval = ','.join(currval)
activeval = currattr.get('active', currval)
if isinstance(activeval, list):
activeval = ','.join(activeval)
if activeval != currval:
if currval is None:
currval = ''
if activeval is None:
activeval = ''
if showpending:
attrout = f'{node}: {printattr}: {activeval} -> {currval}'
else:
attrout = f'{node}: {printattr}: {currval} (Pending)'
elif showpending:
continue
elif currval is not None:
attrout = '{0}: {1}: {2}'.format(
node, printattr, val).strip()
node, printattr, currval).strip()
else:
attrout = '{0}: {1}:'.format(node, printattr)
elif 'isset' in currattr:
@@ -604,15 +632,19 @@ async def print_attrib_path(path, session, requestargs, options, rename=None, at
except AttributeError:
exclude = False
if ((requestargs and not exclude) or
(currattr.get('default', None) is not None and
currattr.get('value', None) is not None and
currattr['value'] != currattr['default'])):
cval = ','.join(currattr['value']) if isinstance(
_is_nondefault(currattr)):
currval = ','.join(currattr['value']) if isinstance(
currattr['value'], list) else currattr['value']
activeval = ','.join(currattr['active']) if isinstance(
currattr.get('active'), list) else currattr.get('active')
dval = ','.join(currattr['default']) if isinstance(
currattr['default'], list) else currattr['default']
cprint('{0}: {1}: {2} (Default: {3})'.format(
node, printattr, cval, dval))
outmsg = '{0}: {1}: {2} (Default: {3}'.format(
node, printattr, currval, dval)
if 'active' in currattr:
outmsg += ', Pending change from: {0}'.format(activeval)
outmsg += ')'
cprint(outmsg)
else:
try:
+43 -11
View File
@@ -473,7 +473,21 @@ def _sort_attrib(k):
return sortutil.naturalize_string('{}'.format(k[1]['sortid']))
return sortutil.naturalize_string(k[0])
def print_attrib_path(path, session, requestargs, options, rename=None, attrprefix=None):
def _is_nondefault(currattr):
if currattr.get('default', None) is None:
return False # no default specified cannot tell
if 'value' not in currattr: # can't compare if no value specified
return False
if currattr['value'] != currattr['default']:
return True
# ok, the potentially pending value is the same, but check active
if 'active' not in currattr:
return False
if currattr['active'] != currattr['default']:
return True
return False
def print_attrib_path(path, session, requestargs, options, rename=None, attrprefix=None, showpending=False):
exitcode = 0
seenattributes = NestedDict()
allnodes = set([])
@@ -501,12 +515,26 @@ def print_attrib_path(path, session, requestargs, options, rename=None, attrpref
currattr = res['databynode'][node][attr]
if show_attr(attr, requestargs, seenattributes, options, node):
if 'value' in currattr:
if currattr['value'] is not None:
val = currattr['value']
if isinstance(val, list):
val = ','.join(val)
currval = currattr.get('value', None)
if isinstance(currval, list):
currval = ','.join(currval)
activeval = currattr.get('active', currval)
if isinstance(activeval, list):
activeval = ','.join(activeval)
if activeval != currval:
if currval is None:
currval = ''
if activeval is None:
activeval = ''
if showpending:
attrout = f'{node}: {printattr}: {activeval} -> {currval}'
else:
attrout = f'{node}: {printattr}: {currval} (Pending)'
elif showpending:
continue
elif currval is not None:
attrout = '{0}: {1}: {2}'.format(
node, printattr, val).strip()
node, printattr, currval).strip()
else:
attrout = '{0}: {1}:'.format(node, printattr)
elif 'isset' in currattr:
@@ -554,15 +582,19 @@ def print_attrib_path(path, session, requestargs, options, rename=None, attrpref
except AttributeError:
exclude = False
if ((requestargs and not exclude) or
(currattr.get('default', None) is not None and
currattr.get('value', None) is not None and
currattr['value'] != currattr['default'])):
_is_nondefault(currattr)):
cval = ','.join(currattr['value']) if isinstance(
currattr['value'], list) else currattr['value']
activeval = ','.join(currattr['active']) if isinstance(
currattr.get('active'), list) else currattr.get('active')
dval = ','.join(currattr['default']) if isinstance(
currattr['default'], list) else currattr['default']
cprint('{0}: {1}: {2} (Default: {3})'.format(
node, printattr, cval, dval))
outmsg = '{0}: {1}: {2} (Default: {3}'.format(
node, printattr, cval, dval)
if 'active' in currattr:
outmsg += ', Pending change from: {0}'.format(activeval)
outmsg += ')'
cprint(outmsg)
else:
try: