Bug 1504052
| Summary: | Exception should be handled when resources are mapped to non-existent paths in the templates | ||
|---|---|---|---|
| Product: | Red Hat OpenStack | Reporter: | Udi Kalifon <ukalifon> |
| Component: | openstack-tripleo-common | Assignee: | Rabi Mishra <ramishra> |
| Status: | CLOSED ERRATA | QA Contact: | Ronnie Rasouli <rrasouli> |
| Severity: | high | Docs Contact: | |
| Priority: | high | ||
| Version: | 12.0 (Pike) | CC: | dbecker, emacchi, jamsmith, jslagle, mburns, morazi, ramishra, rhel-osp-director-maint, shardy, slinaber, therve |
| Target Milestone: | z3 | Keywords: | Triaged, ZStream |
| Target Release: | 12.0 (Pike) | ||
| Hardware: | Unspecified | ||
| OS: | Unspecified | ||
| Whiteboard: | |||
| Fixed In Version: | openstack-tripleo-common-7.6.13-1.el7ost | Doc Type: | If docs needed, set a value |
| Doc Text: | Story Points: | --- | |
| Clone Of: | Environment: | ||
| Last Closed: | 2018-08-20 12:58:30 UTC | Type: | Bug |
| Regression: | --- | Mount Type: | --- |
| Documentation: | --- | CRM: | |
| Verified Versions: | Category: | --- | |
| oVirt Team: | --- | RHEL 7.3 requirements from Atomic Host: | |
| Cloudforms Team: | --- | Target Upstream Version: | |
| Embargoed: | |||
Is it possible that the action is passing None in place of the contents of the file that is not found, instead of raising an error at the point where it is not finding it? Ok I tried to reproduce this directly via mistral to enable easier debugging, here are the steps I took:
Working with an existing deployed overcloud, default name/plan "overcloud":
mkdir tmp2
cd tmp2
openstack container save overcloud
vim environments/ssl/enable-tls.yaml # modify path as in report above
openstack object create overcloud environments/ssl/enable-tls.yaml
vim plan-environment.yaml # Add environments/ssl/enable-tls.yaml to the environments list, if it's not already present
openstack object create overcloud plan-environment.yaml
At this point we should have a plan which replicates that described by Udi
Then we run the deploy action manually via mistralclient:
echo '{"timeout": "60"}' > input.json
openstack action execution run tripleo.deployment.deploy input.json
(undercloud) [stack@undercloud plan_tmp]$ openstack action execution run tripleo.deployment.deploy input.json
{"result": "Failed to run action [action_ex_id=None, action_cls='<class 'mistral.actions.action_factory.DeployStackAction'>', attributes='{}', params='{u'timeout': u'60'}']\n ERROR: resources.Controller<nested_stack>.resources.0<http://192.168.24.1:8080/v1/AUTH_ef51214d730b4eaaa63d006cbf03145b/overcloud/puppet/controller-role.yaml>: : The template is not a JSON object or YAML mapping."}
So I think the reproduces the same issue reported?
bacport merged upstream, would be taken care of in rebase? Verified thanks to Steven helpful process:
$ openstack action execution run tripleo.deployment.deploy input.json
{"result": "404 Client Error: Not Found for url: https://192.168.24.2:13808/v1/AUTH_cc07ed8e1e704c9c8670b644871dadf8/overcloud/environments/puppet/extraconfig/tls/tls-cert-inject.yaml"}
Since the problem described in this bug report should be resolved in a recent advisory, it has been closed with a resolution of ERRATA. For information on the advisory, and where to find the updated files, follow the link below. If the solution does not work for you, open a new bug report. https://access.redhat.com/errata/RHSA-2018:2331 |
Description of problem: I uploaded to the swift container a new environments/ssl/enable-tls.yaml file, which had the following mapping in it: resource_registry: OS::TripleO::NodeTLSData: ../puppet/extraconfig/tls/tls-cert-inject.yaml The relative path was not correct because it should have started with "../../" and not just "../" :) When trying to deploy the plan from the GUI the result was this error: Failed to run action [action_ex_id=300a4b16-da1f-45d3-a676-9ba9567250e2, action_cls='<class 'mistral.actions.action_factory.DeployStackAction'>', attributes='{}', params='{u'skip_deploy_identifier': False, u'container': u'netisossl', u'timeout': 240}'] ERROR: resources.Controller<nested_stack>.resources.0<https://<<server>>:13808/v1/AUTH_45f6383d2d81450fae5b64dd35a1da32/netisossl/puppet/controller-role.yaml>: : The template is not a JSON object or YAML mapping. In the Mistral executor log you see this exception: 2017-10-19 13:15:45.784 1775 ERROR mistral.executors.default_executor [req-35266ae4-6978-438c-9b5b-d0cfee75321d ddbc2ea1b0454d499ef13bfb9f981f90 45f6383d2d81450fae5b64dd35a1da32 - default default] Failed to run action [action_ex_id=None, action_cls='<class 'mistral.actions.action_factory.GetFlattenedParametersAction'>', attributes='{}', params='{u'container': u'netisossl'}'] ERROR: The template is not a JSON object or YAML mapping.: HTTPBadRequest: ERROR: The template is not a JSON object or YAML mapping. Traceback (most recent call last): File "/usr/lib/python2.7/site-packages/mistral/executors/default_executor.py", line 109, in run_action result = action.run(context.ctx()) File "/usr/lib/python2.7/site-packages/tripleo_common/actions/parameters.py", line 414, in run processed_data = super(GetFlattenedParametersAction, self).run(context) File "/usr/lib/python2.7/site-packages/tripleo_common/actions/parameters.py", line 79, in run 'heat_resource_tree': heat.stacks.validate(**fields), File "/usr/lib/python2.7/site-packages/heatclient/v1/stacks.py", line 332, in validate resp = self.client.post(url, **args) File "/usr/lib/python2.7/site-packages/heatclient/common/http.py", line 289, in post return self.client_request("POST", url, **kwargs) File "/usr/lib/python2.7/site-packages/heatclient/common/http.py", line 279, in client_request resp, body = self.json_request(method, url, **kwargs) File "/usr/lib/python2.7/site-packages/heatclient/common/http.py", line 268, in json_request resp = self._http_request(url, method, **kwargs) File "/usr/lib/python2.7/site-packages/heatclient/common/http.py", line 231, in _http_request raise exc.from_response(resp) HTTPBadRequest: ERROR: The template is not a JSON object or YAML mapping. It's very hard to understand from the errors what the source of the problem. It starts with the broken relative path in enable-tls.yaml and results in the GUI complaining about controller-role.yaml being not a JSON or YAML file (in fact it doesn't exist in this path). Version-Release number of selected component (if applicable): openstack-tripleo-common-7.6.1-0.20170926174320.el7ost.noarch openstack-mistral-executor-5.1.1-0.20170926064249.943a0ad.el7ost.noarch openstack-heat-engine-9.0.1-0.20170925083033.el7ost.noarch How reproducible: 100% Steps to Reproduce: 1. Break a relative path in one of the environment files that you're using in the deployment 2. Upload the file with the broken path to swift 3. Start a deployment Actual results: Mistral action fails. You get no clear error why this happens. Expected results: A clear error message pointing immediately to the broken relative path.