diff --git a/heat/engine/resources/openstack/heat/software_deployment.py b/heat/engine/resources/openstack/heat/software_deployment.py index 968e743f31..6e27661371 100644 --- a/heat/engine/resources/openstack/heat/software_deployment.py +++ b/heat/engine/resources/openstack/heat/software_deployment.py @@ -638,14 +638,16 @@ class SoftwareDeploymentGroup(resource_group.ResourceGroup): def FnGetAtt(self, key, *path): rg = super(SoftwareDeploymentGroup, self) if key == self.STDOUTS: - return rg.FnGetAtt( - rg.ATTR_ATTRIBUTES, SoftwareDeployment.STDOUT) - if key == self.STDERRS: - return rg.FnGetAtt( - rg.ATTR_ATTRIBUTES, SoftwareDeployment.STDERR) - if key == self.STATUS_CODES: - return rg.FnGetAtt( - rg.ATTR_ATTRIBUTES, SoftwareDeployment.STATUS_CODE) + n_attr = SoftwareDeployment.STDOUT + elif key == self.STDERRS: + n_attr = SoftwareDeployment.STDERR + elif key == self.STATUS_CODES: + n_attr = SoftwareDeployment.STATUS_CODE + else: + return None + + rg_attr = rg.FnGetAtt(rg.ATTR_ATTRIBUTES, n_attr) + return attributes.select_from_attribute(rg_attr, path) class SoftwareDeployments(SoftwareDeploymentGroup): diff --git a/heat/tests/test_software_deployment.py b/heat/tests/test_software_deployment.py index 5918273507..ca74552c4e 100644 --- a/heat/tests/test_software_deployment.py +++ b/heat/tests/test_software_deployment.py @@ -1279,6 +1279,60 @@ class SoftwareDeploymentGroupTest(common.HeatTestCase): mock.call('deploy_status_code'), ]) + server2.FnGetAtt.assert_has_calls([ + mock.call('deploy_stdout'), + mock.call('deploy_stderr'), + mock.call('deploy_status_code'), + ]) + + def test_attributes_path(self): + stack = utils.parse_stack(self.template) + snip = stack.t.resource_definitions(stack)['deploy_mysql'] + resg = sd.SoftwareDeploymentGroup('test', snip, stack) + nested = self.patchobject(resg, 'nested') + server1 = mock.MagicMock() + server2 = mock.MagicMock() + nested.return_value = { + 'server1': server1, + 'server2': server2 + } + + server1.FnGetAtt.return_value = 'Thing happened on server1' + server2.FnGetAtt.return_value = 'ouch' + self.assertEqual('Thing happened on server1', + resg.FnGetAtt('deploy_stdouts', 'server1')) + self.assertEqual('ouch', + resg.FnGetAtt('deploy_stdouts', 'server2')) + + server1.FnGetAtt.return_value = '' + server2.FnGetAtt.return_value = 'Its gone Pete Tong' + self.assertEqual('', resg.FnGetAtt('deploy_stderrs', 'server1')) + self.assertEqual('Its gone Pete Tong', + resg.FnGetAtt('deploy_stderrs', 'server2')) + + server1.FnGetAtt.return_value = 0 + server2.FnGetAtt.return_value = 1 + self.assertEqual(0, resg.FnGetAtt('deploy_status_codes', 'server1')) + self.assertEqual(1, resg.FnGetAtt('deploy_status_codes', 'server2')) + + server1.FnGetAtt.assert_has_calls([ + mock.call('deploy_stdout'), + mock.call('deploy_stdout'), + mock.call('deploy_stderr'), + mock.call('deploy_stderr'), + mock.call('deploy_status_code'), + mock.call('deploy_status_code'), + ]) + + server2.FnGetAtt.assert_has_calls([ + mock.call('deploy_stdout'), + mock.call('deploy_stdout'), + mock.call('deploy_stderr'), + mock.call('deploy_stderr'), + mock.call('deploy_status_code'), + mock.call('deploy_status_code'), + ]) + def test_validate(self): stack = utils.parse_stack(self.template) snip = stack.t.resource_definitions(stack)['deploy_mysql']