From a18b9e22700c86423548e3bee85a24df3df6f0c7 Mon Sep 17 00:00:00 2001 From: Chris Church Date: Tue, 25 Feb 2014 17:11:04 -0500 Subject: [PATCH] AC-1061 Fix inventory script to return dict with failed flag when there is an error instead of an empty dict so that ansible-playbook will propagate the error message. --- awx/main/tests/scripts.py | 22 +++++++++++----------- awx/plugins/inventory/awxrest.py | 12 +++++++----- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/awx/main/tests/scripts.py b/awx/main/tests/scripts.py index 90b62d1158..0c3712656a 100644 --- a/awx/main/tests/scripts.py +++ b/awx/main/tests/scripts.py @@ -137,10 +137,10 @@ class InventoryScriptTest(BaseScriptTest): def test_without_inventory_id(self): rc, stdout, stderr = self.run_inventory_script(list=True) self.assertNotEqual(rc, 0, stderr) - self.assertEqual(json.loads(stdout), {}) + self.assertEqual(json.loads(stdout), {'failed': True}) rc, stdout, stderr = self.run_inventory_script(host=self.hosts[0].name) self.assertNotEqual(rc, 0, stderr) - self.assertEqual(json.loads(stdout), {}) + self.assertEqual(json.loads(stdout), {'failed': True}) def test_list_with_inventory_id_as_argument(self): inventory = self.inventories[0] @@ -293,11 +293,11 @@ class InventoryScriptTest(BaseScriptTest): os.environ['INVENTORY_ID'] = str(inventory.pk) rc, stdout, stderr = self.run_inventory_script(host=host.name) self.assertNotEqual(rc, 0, stderr) - self.assertEqual(json.loads(stdout), {}) + self.assertEqual(json.loads(stdout), {'failed': True}) # Invalid hostname not in database. rc, stdout, stderr = self.run_inventory_script(host='blah.example.com') self.assertNotEqual(rc, 0, stderr) - self.assertEqual(json.loads(stdout), {}) + self.assertEqual(json.loads(stdout), {'failed': True}) def test_with_invalid_inventory_id(self): inventory_pks = set(map(lambda x: x.pk, self.inventories)) @@ -305,19 +305,19 @@ class InventoryScriptTest(BaseScriptTest): os.environ['INVENTORY_ID'] = str(invalid_id) rc, stdout, stderr = self.run_inventory_script(list=True) self.assertNotEqual(rc, 0, stderr) - self.assertEqual(json.loads(stdout), {}) + self.assertEqual(json.loads(stdout), {'failed': True}) os.environ['INVENTORY_ID'] = 'not_an_int' rc, stdout, stderr = self.run_inventory_script(list=True) self.assertNotEqual(rc, 0, stderr) - self.assertEqual(json.loads(stdout), {}) + self.assertEqual(json.loads(stdout), {'failed': True}) os.environ['INVENTORY_ID'] = str(invalid_id) rc, stdout, stderr = self.run_inventory_script(host=self.hosts[1].name) self.assertNotEqual(rc, 0, stderr) - self.assertEqual(json.loads(stdout), {}) + self.assertEqual(json.loads(stdout), {'failed': True}) os.environ['INVENTORY_ID'] = 'not_an_int' rc, stdout, stderr = self.run_inventory_script(host=self.hosts[2].name) self.assertNotEqual(rc, 0, stderr) - self.assertEqual(json.loads(stdout), {}) + self.assertEqual(json.loads(stdout), {'failed': True}) def test_with_deleted_inventory(self): inventory = self.inventories[0] @@ -326,7 +326,7 @@ class InventoryScriptTest(BaseScriptTest): os.environ['INVENTORY_ID'] = str(inventory.pk) rc, stdout, stderr = self.run_inventory_script(list=True) self.assertNotEqual(rc, 0, stderr) - self.assertEqual(json.loads(stdout), {}) + self.assertEqual(json.loads(stdout), {'failed': True}) def test_without_list_or_host_argument(self): inventory = self.inventories[0] @@ -334,7 +334,7 @@ class InventoryScriptTest(BaseScriptTest): os.environ['INVENTORY_ID'] = str(inventory.pk) rc, stdout, stderr = self.run_inventory_script() self.assertNotEqual(rc, 0, stderr) - self.assertEqual(json.loads(stdout), {}) + self.assertEqual(json.loads(stdout), {'failed': True}) def test_with_both_list_and_host_arguments(self): inventory = self.inventories[0] @@ -342,7 +342,7 @@ class InventoryScriptTest(BaseScriptTest): os.environ['INVENTORY_ID'] = str(inventory.pk) rc, stdout, stderr = self.run_inventory_script(list=True, host='blah') self.assertNotEqual(rc, 0, stderr) - self.assertEqual(json.loads(stdout), {}) + self.assertEqual(json.loads(stdout), {'failed': True}) def test_with_disabled_hosts(self): inventory = self.inventories[1] diff --git a/awx/plugins/inventory/awxrest.py b/awx/plugins/inventory/awxrest.py index 2b684f4d91..0c70e1a83f 100755 --- a/awx/plugins/inventory/awxrest.py +++ b/awx/plugins/inventory/awxrest.py @@ -36,6 +36,7 @@ import json import optparse import os import sys +import traceback import urllib import urlparse @@ -106,6 +107,7 @@ class InventoryScript(object): try: # Command line argument takes precedence over environment # variable. + raise ValueError('foo') self.inventory_id = int(self.options.get('inventory_id', 0) or \ os.getenv('INVENTORY_ID', 0)) except ValueError: @@ -126,13 +128,13 @@ class InventoryScript(object): else: raise RuntimeError('Either --list or --host must be specified') except Exception, e: - # Always return an empty hash on stdout, even when an error occurs. - sys.stdout.write(json.dumps({})) + sys.stdout.write('%s\n' % json.dumps(dict(failed=True))) if self.options.get('traceback', False): - raise - sys.stderr.write(str(e) + '\n') + sys.stderr.write(traceback.format_exc()) + else: + sys.stderr.write('%s\n' % str(e)) if hasattr(e, 'response'): - sys.stderr.write(e.response.content + '\n') + sys.stderr.write('%s\n' % e.response.content) sys.exit(1) def main():