From 7f832fb3b2ac95eb202ba45742a95c21a7056efc Mon Sep 17 00:00:00 2001 From: "Brad P. Crochet" Date: Thu, 7 Jul 2016 11:00:01 -0400 Subject: [PATCH] Throw an error/exception when interactive overcloud update fails The overcloud update currently returns an exit code of 0 regardless of the outcome of the update. Unless the result is COMPLETE, the client now throws an exception, and therefore a non-0 RC. Also, change the unit tests to use 'COMPLETE' and not 'UPDATE_COMPLETE' since Heat returns status as 'COMPLETE'. Change-Id: Ib4aa7982718fda7c3b5fc4e5ea7501203c69bb98 Closes-Bug: 1599872 --- .../overcloud_update/test_overcloud_update.py | 19 +++++++++++++++++-- tripleoclient/v1/overcloud_update.py | 4 ++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/tripleoclient/tests/v1/overcloud_update/test_overcloud_update.py b/tripleoclient/tests/v1/overcloud_update/test_overcloud_update.py index bd972d598..56047fcd8 100644 --- a/tripleoclient/tests/v1/overcloud_update/test_overcloud_update.py +++ b/tripleoclient/tests/v1/overcloud_update/test_overcloud_update.py @@ -16,6 +16,7 @@ import mock import tempfile +from tripleoclient import exceptions from tripleoclient.tests.v1.overcloud_update import fakes from tripleoclient.v1 import overcloud_update @@ -31,7 +32,7 @@ class TestOvercloudUpdate(fakes.TestOvercloudUpdate): @mock.patch('tripleo_common.update.PackageUpdateManager') def test_update_out(self, update_manager): update_manager.return_value.get_status.return_value = ( - 'UPDATE_COMPLETE', {}) + 'COMPLETE', {}) argslist = ['overcloud', '-i', '--templates'] verifylist = [ ('stack', 'overcloud'), @@ -57,7 +58,7 @@ class TestOvercloudUpdate(fakes.TestOvercloudUpdate): answerfile.flush() update_manager.return_value.get_status.return_value = ( - 'UPDATE_COMPLETE', {}) + 'COMPLETE', {}) argslist = ['overcloud', '-i', '--answers-file', answerfile.name] verifylist = [ ('stack', 'overcloud'), @@ -74,3 +75,17 @@ class TestOvercloudUpdate(fakes.TestOvercloudUpdate): called_args = update_manager.call_args[1] self.assertEqual(called_args['tht_dir'], '/dev/null') self.assertEqual(called_args['environment_files'], ['/dev/null']) + + @mock.patch('tripleo_common.update.PackageUpdateManager') + def test_update_failed(self, update_manager): + update_manager.return_value.get_status.return_value = ( + 'FAILED', {}) + argslist = ['overcloud', '-i', '--templates'] + verifylist = [ + ('stack', 'overcloud'), + ('interactive', True), + ('templates', '/usr/share/openstack-tripleo-heat-templates/') + ] + parsed_args = self.check_parser(self.cmd, argslist, verifylist) + self.assertRaises(exceptions.DeploymentError, + self.cmd.take_action, parsed_args) diff --git a/tripleoclient/v1/overcloud_update.py b/tripleoclient/v1/overcloud_update.py index 32ab61227..baf249a1f 100644 --- a/tripleoclient/v1/overcloud_update.py +++ b/tripleoclient/v1/overcloud_update.py @@ -23,6 +23,7 @@ from openstackclient.i18n import _ from tripleo_common import update from tripleoclient import constants +from tripleoclient import exceptions class UpdateOvercloud(command.Command): @@ -97,5 +98,8 @@ class UpdateOvercloud(command.Command): if parsed_args.interactive: update_manager.do_interactive_update() + status, _ = update_manager.get_status() + if status not in ['COMPLETE']: + raise exceptions.DeploymentError("Stack update failed.") else: print("stack {0} status: {1}".format(parsed_args.stack, status))