From ea0ba0ae45cbbc243161797efc6bfde0fb707682 Mon Sep 17 00:00:00 2001 From: Drago Rosson Date: Fri, 30 Sep 2016 18:14:03 +0000 Subject: [PATCH] Don't get derived config if resource ID unset SoftwareDeployments that do not have CREATE as one of their actions will not have a resource ID when they are updated. In this case, handle_update should not attempt to retrieve the SoftwareDeployment's derived config because it will fail. Closes-Bug: #1629397 Change-Id: Ia49a549e11e2e6a1e9399a1370f990780c17bf0d (cherry picked from commit 5fc3e013b5df382c2fa6fbfb08c65b4d1c46cd9c) --- .../openstack/heat/software_deployment.py | 12 +++++--- .../heat/test_software_deployment.py | 28 +++++++++++++++++++ 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/heat/engine/resources/openstack/heat/software_deployment.py b/heat/engine/resources/openstack/heat/software_deployment.py index 43dabc1bac..018d0071f5 100644 --- a/heat/engine/resources/openstack/heat/software_deployment.py +++ b/heat/engine/resources/openstack/heat/software_deployment.py @@ -435,10 +435,14 @@ class SoftwareDeployment(signal_responder.SignalResponder): return self._check_complete() def handle_update(self, json_snippet, tmpl_diff, prop_diff): - prev_derived_config = self._get_derived_config_id() - old_config = self._load_config(prev_derived_config) - old_inputs = {i.name(): i - for i in old_config[rpc_api.SOFTWARE_CONFIG_INPUTS]} + if self.resource_id is None: + prev_derived_config = None + old_inputs = {} + else: + prev_derived_config = self._get_derived_config_id() + old_config = self._load_config(prev_derived_config) + old_inputs = {i.name(): i + for i in old_config[rpc_api.SOFTWARE_CONFIG_INPUTS]} self.properties = json_snippet.properties(self.properties_schema, self.context) diff --git a/heat/tests/openstack/heat/test_software_deployment.py b/heat/tests/openstack/heat/test_software_deployment.py index f9f73df001..5d5de17aa0 100644 --- a/heat/tests/openstack/heat/test_software_deployment.py +++ b/heat/tests/openstack/heat/test_software_deployment.py @@ -136,6 +136,21 @@ class SoftwareDeploymentTest(common.HeatTestCase): } } + template_update_only = { + 'HeatTemplateFormatVersion': '2012-12-12', + 'Resources': { + 'deployment_mysql': { + 'Type': 'OS::Heat::SoftwareDeployment', + 'Properties': { + 'server': '9f1f0e00-05d2-4ca5-8602-95021f19c9d0', + 'config': '48e8ade1-9196-42d5-89a2-f709fde42632', + 'input_values': {'foo': 'bar'}, + 'actions': ['UPDATE'], + } + } + } + } + template_no_config = { 'HeatTemplateFormatVersion': '2012-12-12', 'Resources': { @@ -881,6 +896,19 @@ class SoftwareDeploymentTest(common.HeatTestCase): self.deployment.handle_update, snippet, None, prop_diff) + def test_handle_update_with_update_only(self): + self._create_stack(self.template_update_only) + rsrc = self.stack['deployment_mysql'] + prop_diff = { + 'input_values': {'foo': 'different'} + } + props = copy.copy(rsrc.properties.data) + props.update(prop_diff) + snippet = rsrc_defn.ResourceDefinition(rsrc.name, rsrc.type(), props) + self.deployment.handle_update( + json_snippet=snippet, tmpl_diff=None, prop_diff=prop_diff) + self.rpc_client.show_software_deployment.assert_not_called() + def test_handle_suspend_resume(self): self._create_stack(self.template_delete_suspend_resume)