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.

This commit is contained in:
Chris Church 2014-02-25 17:11:04 -05:00
parent a1ec54920f
commit a18b9e2270
2 changed files with 18 additions and 16 deletions

View File

@ -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]

View File

@ -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():