Exit w/ valid code when no servers are deleted.

This change updates do_delete in v1_1/shell.py to keep track of
deletion failures and raises an exception when all of the specified
servers cannot be deleted.  This in turn causes nova client to exit
with a correct exit code when no successful deletes occur.

Change-Id: I16ee7a4c754cf2e8add09a41becbcc37edc767ff
Fixes: bug #1185009
This commit is contained in:
Matt Thompson 2013-06-04 10:39:10 +01:00
parent f67c5e0cf9
commit fa0d6e85a2
3 changed files with 36 additions and 0 deletions
novaclient

@ -383,6 +383,9 @@ class FakeHTTPClient(base_client.HTTPClient):
def delete_servers_1234(self, **kw):
return (202, {}, None)
def delete_servers_5678(self, **kw):
return (202, {}, None)
def delete_servers_1234_metadata_test_key(self, **kw):
return (204, {}, None)

@ -635,6 +635,32 @@ class ShellTest(utils.TestCase):
self.run_command('delete sample-server')
self.assert_called('DELETE', '/servers/1234')
def test_delete_two_with_two_existent(self):
self.run_command('delete 1234 5678')
self.assert_called('DELETE', '/servers/1234', pos=-3)
self.assert_called('DELETE', '/servers/5678', pos=-1)
self.run_command('delete sample-server sample-server2')
self.assert_called('DELETE', '/servers/1234', pos=-3)
self.assert_called('DELETE', '/servers/5678', pos=-1)
def test_delete_two_with_one_nonexistent(self):
self.run_command('delete 1234 123456789')
self.assert_called_anytime('DELETE', '/servers/1234')
self.run_command('delete sample-server nonexistentserver')
self.assert_called_anytime('DELETE', '/servers/1234')
def test_delete_one_with_one_nonexistent(self):
cmd = 'delete 123456789'
self.assertRaises(exceptions.CommandError, self.run_command, cmd)
cmd = 'delete nonexistent-server1'
self.assertRaises(exceptions.CommandError, self.run_command, cmd)
def test_delete_two_with_two_nonexistent(self):
cmd = 'delete 123456789 987654321'
self.assertRaises(exceptions.CommandError, self.run_command, cmd)
cmd = 'delete nonexistent-server1 nonexistent-server2'
self.assertRaises(exceptions.CommandError, self.run_command, cmd)
def test_diagnostics(self):
self.run_command('diagnostics 1234')
self.assert_called('GET', '/servers/1234/diagnostics')

@ -1337,12 +1337,19 @@ def do_show(cs, args):
help='Name or ID of server(s).')
def do_delete(cs, args):
"""Immediately shut down and delete specified server(s)."""
failure_count = 0
for server in args.server:
try:
_find_server(cs, server).delete()
except Exception as e:
failure_count += 1
print(e)
if failure_count == len(args.server):
raise exceptions.CommandError("Unable to delete any of the specified "
"servers.")
def _find_server(cs, server):
"""Get a server by name or ID."""