diff --git a/heatclient/tests/unit/test_shell.py b/heatclient/tests/unit/test_shell.py index ad0a0b6b..9803123f 100644 --- a/heatclient/tests/unit/test_shell.py +++ b/heatclient/tests/unit/test_shell.py @@ -4270,21 +4270,53 @@ class ShellTestDeployment(ShellBase): def test_deploy_delete(self): self.register_keystone_auth_fixture() headers = {'content-type': 'application/json'} + + deploy_resp_dict = {'software_deployment': { + 'config_id': 'dummy_config_id' + }} + + deploy_resp_string = jsonutils.dumps(deploy_resp_dict) + deploy_http_resp = fakes.FakeHTTPResponse(200, 'OK', + headers, deploy_resp_string) + http_resp = fakes.FakeHTTPResponse(204, 'OK', headers, None) response = (http_resp, '') + + def _get_deployment_request_except(id): + self.client.request('/software_deployments/%s' % id, + 'GET').AndRaise(exc.HTTPNotFound()) + + def _delete_deployment_request_except(id): + self.client.request('/software_deployments/%s' % id, + 'GET').AndReturn(deploy_http_resp) + self.client.request('/software_deployments/%s' % id, + 'DELETE').AndRaise(exc.HTTPNotFound()) + + def _delete_config_request_except(id): + self.client.request('/software_deployments/%s' % id, + 'GET').AndReturn(deploy_http_resp) + self.client.request('/software_deployments/%s' % id, + 'DELETE').AndReturn(http_resp) + self.client.request('/software_configs/dummy_config_id', + 'DELETE').AndRaise(exc.HTTPNotFound()) + + def _delete_request_success(id): + self.client.request('/software_deployments/%s' % id, + 'GET').AndReturn(deploy_http_resp) + self.client.request('/software_deployments/%s' % id, + 'DELETE').AndReturn(http_resp) + self.client.request('/software_configs/dummy_config_id', + 'DELETE').AndReturn(http_resp) + if self.client == http.SessionClient: - self.client.request( - '/software_deployments/defg', - 'DELETE').AndReturn(http_resp) - self.client.request( - '/software_deployments/qwer', - 'DELETE').AndReturn(http_resp) - self.client.request( - '/software_deployments/defg', - 'DELETE').AndRaise(exc.HTTPNotFound()) - self.client.request( - '/software_deployments/qwer', - 'DELETE').AndRaise(exc.HTTPNotFound()) + _get_deployment_request_except('defg') + _get_deployment_request_except('qwer') + _delete_deployment_request_except('defg') + _delete_deployment_request_except('qwer') + _delete_config_request_except('defg') + _delete_config_request_except('qwer') + _delete_request_success('defg') + _delete_request_success('qwer') else: self.client.raw_request( 'DELETE', '/software_deployments/defg').AndReturn(response) @@ -4299,9 +4331,20 @@ class ShellTestDeployment(ShellBase): self.m.ReplayAll() - self.assertEqual('', self.shell('deployment-delete defg qwer')) self.assertRaises(exc.CommandError, self.shell, 'deployment-delete defg qwer') + self.assertRaises(exc.CommandError, self.shell, + 'deployment-delete defg qwer') + + output = self.shell('deployment-delete defg qwer') + self.assertRegexpMatches(output, 'Failed to delete the correlative ' + 'config dummy_config_id of ' + 'deployment defg') + self.assertRegexpMatches(output, 'Failed to delete the correlative ' + 'config dummy_config_id of ' + 'deployment qwer') + + self.assertEqual('', self.shell('deployment-delete defg qwer')) def test_deploy_metadata(self): self.register_keystone_auth_fixture() diff --git a/heatclient/v1/shell.py b/heatclient/v1/shell.py index 9c76f89e..1c84b529 100644 --- a/heatclient/v1/shell.py +++ b/heatclient/v1/shell.py @@ -1363,15 +1363,28 @@ def do_deployment_metadata_show(hc, args): @utils.arg('id', metavar='', nargs='+', help=_('IDs of the deployments to delete.')) def do_deployment_delete(hc, args): - '''Delete a software deployment.''' + '''Delete software deployments.''' failure_count = 0 for deploy_id in args.id: try: + sd = hc.software_deployments.get(deployment_id=deploy_id) hc.software_deployments.delete(deployment_id=deploy_id) - except exc.HTTPNotFound as e: + except Exception as e: + if isinstance(e, exc.HTTPNotFound): + print(_('Deployment with ID %s not found') % deploy_id) failure_count += 1 - print(e) + continue + + # just try best to delete the corresponding config + try: + config_id = getattr(sd, 'config_id') + hc.software_configs.delete(config_id=config_id) + except Exception: + print(_('Failed to delete the correlative config' + ' %(config_id)s of deployment %(deploy_id)s') % + {'config_id': config_id, 'deploy_id': deploy_id}) + if failure_count == len(args.id): raise exc.CommandError(_("Unable to delete any of the specified " "deployments."))