Update StackDefinition resource data on metadata refresh

After refreshing the metadata of a resource its attributes may change, so
we need to update the StackDefinition with the new data.

Change-Id: Iec521317bffc0b381a0d965daef7939b1146ce50
Partially-Implements: blueprint stack-definition
This commit is contained in:
Zane Bitter
2017-07-19 17:35:39 -04:00
parent 82721f8865
commit 119f3e4aa5
4 changed files with 21 additions and 8 deletions

View File

@@ -55,6 +55,7 @@ from heat.engine import service_software_config
from heat.engine import service_stack_watch from heat.engine import service_stack_watch
from heat.engine import stack as parser from heat.engine import stack as parser
from heat.engine import stack_lock from heat.engine import stack_lock
from heat.engine import stk_defn
from heat.engine import support from heat.engine import support
from heat.engine import template as templatem from heat.engine import template as templatem
from heat.engine import update from heat.engine import update
@@ -1849,10 +1850,12 @@ class EngineService(service.ServiceBase):
# update metadata which is used by other resources, e.g # update metadata which is used by other resources, e.g
# when signalling a WaitConditionHandle resource, and other # when signalling a WaitConditionHandle resource, and other
# resources may refer to WaitCondition Fn::GetAtt Data # resources may refer to WaitCondition Fn::GetAtt Data
for r in stack.dependencies: for r in stack._explicit_dependencies():
if (r.name != rsrc.name and r.id is not None and if r.action != r.INIT:
r.action != r.INIT): if r.name != rsrc.name:
r.metadata_update() r.metadata_update()
stk_defn.update_resource_data(stack.defn, r.name,
r.node_data())
s = self._get_stack(cnxt, stack_identity) s = self._get_stack(cnxt, stack_identity)

View File

@@ -13,10 +13,10 @@
from oslo_log import log as logging from oslo_log import log as logging
from oslo_utils import timeutils from oslo_utils import timeutils
import six
from heat.common import context from heat.common import context
from heat.engine import stack from heat.engine import stack
from heat.engine import stk_defn
from heat.engine import watchrule from heat.engine import watchrule
from heat.objects import stack as stack_object from heat.objects import stack as stack_object
from heat.objects import watch_rule as watch_rule_object from heat.objects import watch_rule as watch_rule_object
@@ -88,8 +88,10 @@ class StackWatch(object):
def run_alarm_action(stk, actions, details): def run_alarm_action(stk, actions, details):
for action in actions: for action in actions:
action(details=details) action(details=details)
for res in six.itervalues(stk): for res in stk._explicit_dependencies():
res.metadata_update() res.metadata_update()
stk_defn.update_resource_data(stk.defn, res.name,
res.node_data())
for wr in wrs: for wr in wrs:
rule = watchrule.WatchRule.load(stk.context, watch=wr) rule = watchrule.WatchRule.load(stk.context, watch=wr)

View File

@@ -47,7 +47,8 @@ policy_template = '''
} }
}, },
"Random" : { "Random" : {
"Type" : "OS::Heat::RandomString" "Type" : "OS::Heat::RandomString",
"DependsOn" : "WebServerScaleDownPolicy"
} }
} }
} }

View File

@@ -25,6 +25,7 @@ from heat.engine.resources.openstack.nova import server
from heat.engine import scheduler from heat.engine import scheduler
from heat.engine import service from heat.engine import service
from heat.engine import stack as stk from heat.engine import stack as stk
from heat.engine import stk_defn
from heat.engine import template as tmpl from heat.engine import template as tmpl
from heat.tests import common from heat.tests import common
from heat.tests import utils from heat.tests import utils
@@ -190,8 +191,11 @@ class MetadataRefreshTest(common.HeatTestCase):
s2.attributes.reset_resolved_values() s2.attributes.reset_resolved_values()
# Run metadata update to pick up the new value from S2 # Run metadata update to pick up the new value from S2
s1.metadata_update() # (simulating run_alarm_action() in service_stack_watch)
s2.metadata_update() s2.metadata_update()
stk_defn.update_resource_data(stack.defn, s2.name, s2.node_data())
s1.metadata_update()
stk_defn.update_resource_data(stack.defn, s1.name, s1.node_data())
# Verify the updated value is correct in S1 # Verify the updated value is correct in S1
content = self._get_metadata_content(s1.metadata_get()) content = self._get_metadata_content(s1.metadata_get())
@@ -324,6 +328,7 @@ class MetadataRefreshServerTest(common.HeatTestCase):
self.assertEqual((stack.CREATE, stack.COMPLETE), stack.state) self.assertEqual((stack.CREATE, stack.COMPLETE), stack.state)
s1 = stack['instance1'] s1 = stack['instance1']
s2 = stack['instance2']
md = s1.metadata_get() md = s1.metadata_get()
self.assertEqual({u'template_data': '192.0.2.1'}, md) self.assertEqual({u'template_data': '192.0.2.1'}, md)
@@ -334,6 +339,8 @@ class MetadataRefreshServerTest(common.HeatTestCase):
s1.metadata_set(new_md) s1.metadata_set(new_md)
md = s1.metadata_get(refresh=True) md = s1.metadata_get(refresh=True)
self.assertEqual(new_md, md) self.assertEqual(new_md, md)
s2.attributes.reset_resolved_values()
stk_defn.update_resource_data(stack.defn, s2.name, s2.node_data())
s1.metadata_update() s1.metadata_update()
md = s1.metadata_get(refresh=True) md = s1.metadata_get(refresh=True)
self.assertEqual(new_md, md) self.assertEqual(new_md, md)