Skip to content

Commit f2a7177

Browse files
committed
Improve ret handling across cherrypy/tornado
this seems to do the right thing in more scenarios.
1 parent 59c013a commit f2a7177

2 files changed

Lines changed: 35 additions & 13 deletions

File tree

pepper/cli.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -580,12 +580,16 @@ def poll_for_returns(self, api, load):
580580
},
581581
}])
582582

583-
responded = set(jid_ret['return'][0].keys()) ^ set(ret_nodes)
583+
inner_ret = jid_ret['return'][0]
584+
# sometimes ret is nested in data
585+
if 'data' in inner_ret:
586+
inner_ret = inner_ret['data']
587+
588+
responded = set(inner_ret.keys()) ^ set(ret_nodes)
589+
584590
for node in responded:
585-
yield None, "{{{}: {}}}".format(
586-
node,
587-
jid_ret['return'][0][node])
588-
ret_nodes = list(jid_ret['return'][0].keys())
591+
yield None, [{node: inner_ret[node]}]
592+
ret_nodes = list(inner_ret.keys())
589593

590594
if set(ret_nodes) == set(nodes):
591595
exit_code = 0
@@ -594,8 +598,9 @@ def poll_for_returns(self, api, load):
594598
time.sleep(self.seconds_to_wait)
595599

596600
exit_code = exit_code if self.options.fail_if_minions_dont_respond else 0
597-
yield exit_code, "{{Failed: {}}}".format(
598-
list(set(ret_nodes) ^ set(nodes)))
601+
failed = list(set(ret_nodes) ^ set(nodes))
602+
if failed:
603+
yield exit_code, {'Failed': failed}
599604

600605
def login(self, api):
601606
if self.options.mktoken:
@@ -628,6 +633,7 @@ def login(self, api):
628633
self.auth = auth
629634
return auth
630635

636+
631637
def low(self, api, load):
632638
path = '/run' if self.options.userun else '/'
633639

pepper/script.py

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,29 @@ def output(self):
5050
def __call__(self):
5151
try:
5252
for exit_code, result in self.cli.run():
53-
if HAS_SALT and not self.cli.options.userun and self.opts:
54-
logger.info('Use Salt outputters')
55-
for ret in json.loads(result)['return']:
53+
if HAS_SALT and self.opts:
54+
logger.debug('Use Salt outputters')
55+
result = json.loads(result)
56+
57+
if 'return' in result:
58+
result = result['return']
59+
60+
for ret in result:
5661
if isinstance(ret, dict):
57-
if self.cli.options.client == 'local':
62+
if self.cli.options.client.startswith('local'):
5863
for minionid, minionret in ret.items():
59-
if isinstance(minionret, dict) and 'ret' in minionret:
64+
# rest_tornado doesnt return full_return directly
65+
# it will always be from get_event, so the output differs slightly
66+
logger.error(minionret)
67+
if isinstance(minionret, dict) and 'return' in minionret:
68+
# version >= 2017.7
69+
salt.output.display_output(
70+
{minionid: minionret['return']},
71+
self.cli.options.output or minionret.get('out', None) or 'nested',
72+
opts=self.opts
73+
)
74+
# cherrypy returns with ret via full_return
75+
elif isinstance(minionret, dict) and 'ret' in minionret:
6076
# version >= 2017.7
6177
salt.output.display_output(
6278
{minionid: minionret['ret']},
@@ -95,7 +111,7 @@ def __call__(self):
95111
print(result)
96112
if exit_code is not None:
97113
if exit_code == 0:
98-
return PepperRetcode().validate(self.cli.options, json.loads(result)['return'])
114+
return PepperRetcode().validate(self.cli.options, result)
99115
return exit_code
100116
except (PepperException, PepperAuthException, PepperArgumentsException) as exc:
101117
print('Pepper error: {0}'.format(exc), file=sys.stderr)

0 commit comments

Comments
 (0)