Turn Resource.update() into a coroutine.
Change-Id: I625a2d81095cc28161f8e2342121bfe1939611e3
tmpl_diff = self.update_template_diff(after, before)
prop_diff = self.update_template_diff_properties(after, before)
if callable(getattr(self, 'handle_update', None)):
- result = self.handle_update(after, tmpl_diff, prop_diff)
+ handle_data = self.handle_update(after, tmpl_diff, prop_diff)
+ yield
+ if callable(getattr(self, 'check_update_complete', None)):
+ while not self.check_update_complete(handle_data):
+ yield
except UpdateReplace:
logger.debug("Resource %s update requires replacement" % self.name)
raise
from heat.openstack.common import timeutils
from heat.engine.properties import Properties
from heat.engine import properties
+from heat.engine import scheduler
from heat.engine import stack_resource
logger = logging.getLogger(__name__)
(lb,))
resolved_snippet = self.stack.resolve_static_data(
lb_resource.json_snippet)
- lb_resource.update(resolved_snippet)
+ scheduler.TaskRunner(lb_resource.update, resolved_snippet)()
def FnGetRefId(self):
return unicode(self.name)
# Reduce the min size to 0, should complete without adjusting
update_snippet = copy.deepcopy(rsrc.parsed_template())
update_snippet['Properties']['MinSize'] = '0'
- self.assertEqual(None, rsrc.update(update_snippet))
+ scheduler.TaskRunner(rsrc.update, update_snippet)()
self.assertEqual(['WebServerGroup-0'], rsrc.get_instance_names())
# trigger adjustment to reduce to 0, there should be no more instances
self.assertEqual(['WebServerGroup-0'], rsrc.get_instance_names())
update_snippet = copy.deepcopy(rsrc.parsed_template())
update_snippet['Properties']['AvailabilityZones'] = ['foo']
- self.assertRaises(resource.UpdateReplace,
- rsrc.update, update_snippet)
+ updater = scheduler.TaskRunner(rsrc.update, update_snippet)
+ self.assertRaises(resource.UpdateReplace, updater)
rsrc.delete()
self.m.VerifyAll()
# Reduce the max size to 2, should complete without adjusting
update_snippet = copy.deepcopy(rsrc.parsed_template())
update_snippet['Properties']['MaxSize'] = '2'
- self.assertEqual(None, rsrc.update(update_snippet))
+ scheduler.TaskRunner(rsrc.update, update_snippet)()
self.assertEqual(['WebServerGroup-0'], rsrc.get_instance_names())
self.assertEqual('2', rsrc.properties['MaxSize'])
update_snippet = copy.deepcopy(rsrc.parsed_template())
update_snippet['Properties']['MinSize'] = '2'
- self.assertEqual(None, rsrc.update(update_snippet))
+ scheduler.TaskRunner(rsrc.update, update_snippet)()
self.assertEqual(['WebServerGroup-0', 'WebServerGroup-1'],
rsrc.get_instance_names())
self.assertEqual('2', rsrc.properties['MinSize'])
update_snippet = copy.deepcopy(rsrc.parsed_template())
update_snippet['Properties']['DesiredCapacity'] = '2'
- self.assertEqual(None, rsrc.update(update_snippet))
+ scheduler.TaskRunner(rsrc.update, update_snippet)()
self.assertEqual(['WebServerGroup-0', 'WebServerGroup-1'],
rsrc.get_instance_names())
# have no effect, it's an optional parameter
update_snippet = copy.deepcopy(rsrc.parsed_template())
del(update_snippet['Properties']['DesiredCapacity'])
- self.assertEqual(None, rsrc.update(update_snippet))
+ scheduler.TaskRunner(rsrc.update, update_snippet)()
self.assertEqual(['WebServerGroup-0', 'WebServerGroup-1'],
rsrc.get_instance_names())
self.assertEqual(['WebServerGroup-0'], rsrc.get_instance_names())
update_snippet = copy.deepcopy(rsrc.parsed_template())
update_snippet['Properties']['Cooldown'] = '61'
- self.assertEqual(None, rsrc.update(update_snippet))
+ scheduler.TaskRunner(rsrc.update, update_snippet)()
self.assertEqual('61', rsrc.properties['Cooldown'])
rsrc.delete()
self.assertEqual(['WebServerGroup-0'], rsrc.get_instance_names())
update_snippet = copy.deepcopy(rsrc.parsed_template())
update_snippet['Properties']['Cooldown'] = '61'
- self.assertEqual(None, rsrc.update(update_snippet))
+ scheduler.TaskRunner(rsrc.update, update_snippet)()
rsrc.delete()
self.m.VerifyAll()
# Update scaling policy
update_snippet = copy.deepcopy(up_policy.parsed_template())
update_snippet['Properties']['ScalingAdjustment'] = '2'
- self.assertEqual(None, up_policy.update(update_snippet))
+ scheduler.TaskRunner(up_policy.update, update_snippet)()
self.assertEqual('2',
up_policy.properties['ScalingAdjustment'])
snippet['Properties']['alarm_actions'] = []
snippet['Properties']['ok_actions'] = ['signal_handler']
- self.assertEqual(None, rsrc.update(snippet))
+ scheduler.TaskRunner(rsrc.update, snippet)()
self.m.VerifyAll()
snippet = copy.deepcopy(rsrc.parsed_template())
snippet['Properties']['counter_name'] = 'temp'
- self.assertRaises(resource.UpdateReplace,
- rsrc.update, snippet)
+ updater = scheduler.TaskRunner(rsrc.update, snippet)
+ self.assertRaises(resource.UpdateReplace, updater)
self.m.VerifyAll()
snippet['Properties']['Statistic'] = 'Maximum'
snippet['Properties']['Threshold'] = '39'
- self.assertEqual(None, rsrc.update(snippet))
+ scheduler.TaskRunner(rsrc.update, snippet)()
rsrc.delete()
self.m.VerifyAll()
snippet = copy.deepcopy(rsrc.parsed_template())
snippet['Properties']['MetricName'] = 'temp'
- self.assertRaises(resource.UpdateReplace,
- rsrc.update, snippet)
+ updater = scheduler.TaskRunner(rsrc.update, snippet)
+ self.assertRaises(resource.UpdateReplace, updater)
rsrc.delete()
self.m.VerifyAll()
update_template = copy.deepcopy(instance.t)
update_template['Metadata'] = {'test': 123}
- self.assertEqual(None, instance.update(update_template))
+ scheduler.TaskRunner(instance.update, update_template)()
self.assertEqual(instance.metadata, {'test': 123})
def test_instance_update_instance_type(self):
body={'confirmResize': None}).AndReturn((202, None))
self.m.ReplayAll()
- self.assertEqual(None, instance.update(update_template))
+ scheduler.TaskRunner(instance.update, update_template)()
self.assertEqual(instance.state, (instance.UPDATE, instance.COMPLETE))
self.m.VerifyAll()
body={'resize': {'flavorRef': 2}}).AndReturn((202, None))
self.m.ReplayAll()
- error = self.assertRaises(exception.ResourceFailure,
- instance.update, update_template)
+ updater = scheduler.TaskRunner(instance.update, update_template)
+ error = self.assertRaises(exception.ResourceFailure, updater)
self.assertEqual(
"Error: Resizing to 'm1.small' failed, status 'ACTIVE'",
str(error))
update_template = copy.deepcopy(instance.t)
update_template['Notallowed'] = {'test': 123}
- self.assertRaises(resource.UpdateReplace,
- instance.update, update_template)
+ updater = scheduler.TaskRunner(instance.update, update_template)
+ self.assertRaises(resource.UpdateReplace, updater)
def test_instance_update_properties(self):
return_server = self.fc.servers.list()[1]
update_template = copy.deepcopy(instance.t)
update_template['Properties']['KeyName'] = 'mustreplace'
- self.assertRaises(resource.UpdateReplace,
- instance.update, update_template)
+ updater = scheduler.TaskRunner(instance.update, update_template)
+ self.assertRaises(resource.UpdateReplace, updater)
def test_instance_status_build(self):
return_server = self.fc.servers.list()[0]
update_snippet['Properties']['Size'] = '2'
tmpl_diff = {'Properties': {'Size': '2'}}
prop_diff = {'Size': '2'}
- self.assertRaises(exception.ResourceFailure,
- rsrc.update, update_snippet)
+ updater = scheduler.TaskRunner(rsrc.update, update_snippet)
+ self.assertRaises(exception.ResourceFailure, updater)
self.assertEqual((rsrc.UPDATE, rsrc.FAILED), rsrc.state)
update_snippet = copy.deepcopy(rsrc.parsed_template())
update_snippet['Metadata'] = 'notallowedforupdate'
- self.assertRaises(resource.UpdateReplace,
- rsrc.update, update_snippet)
+ updater = scheduler.TaskRunner(rsrc.update, update_snippet)
+ self.assertRaises(resource.UpdateReplace, updater)
rsrc.delete()
self.m.VerifyAll()
update_snippet = copy.deepcopy(rsrc.parsed_template())
update_snippet['Properties']['AvailabilityZones'] = ['wibble']
- self.assertRaises(resource.UpdateReplace,
- rsrc.update, update_snippet)
+ updater = scheduler.TaskRunner(rsrc.update, update_snippet)
+ self.assertRaises(resource.UpdateReplace, updater)
rsrc.delete()
self.m.VerifyAll()
update_template = copy.deepcopy(rsrc.t)
update_template['Properties']['admin_state_up'] = False
- self.assertEqual(None, rsrc.update(update_template))
+ scheduler.TaskRunner(rsrc.update, update_template)()
self.m.VerifyAll()
update_template = copy.deepcopy(rsrc.t)
update_template['Properties']['firewall_rules'] = ['3', '4']
- self.assertEqual(None, rsrc.update(update_template))
+ scheduler.TaskRunner(rsrc.update, update_template)()
self.m.VerifyAll()
update_template = copy.deepcopy(rsrc.t)
update_template['Properties']['protocol'] = 'icmp'
- self.assertEqual(None, rsrc.update(update_template))
+ scheduler.TaskRunner(rsrc.update, update_template)()
self.m.VerifyAll()
update_template = copy.deepcopy(rsrc.t)
update_template['Properties']['delay'] = 10
- self.assertEqual(None, rsrc.update(update_template))
+ scheduler.TaskRunner(rsrc.update, update_template)()
self.m.VerifyAll()
update_template = copy.deepcopy(rsrc.t)
update_template['Properties']['admin_state_up'] = False
- self.assertEqual(None, rsrc.update(update_template))
+ scheduler.TaskRunner(rsrc.update, update_template)()
self.m.VerifyAll()
update_template = copy.deepcopy(rsrc.t)
update_template['Properties']['monitors'] = ['mon123', 'mon789']
- self.assertEqual(None, rsrc.update(update_template))
+ scheduler.TaskRunner(rsrc.update, update_template)()
self.m.VerifyAll()
update_template = copy.deepcopy(rsrc.t)
update_template['Properties']['members'] = ['5678']
- self.assertEqual(None, rsrc.update(update_template))
+ scheduler.TaskRunner(rsrc.update, update_template)()
self.m.VerifyAll()
def test_update_missing_member(self):
update_template = copy.deepcopy(rsrc.t)
update_template['Properties']['members'] = []
- self.assertEqual(None, rsrc.update(update_template))
+ scheduler.TaskRunner(rsrc.update, update_template)()
self.assertEqual((rsrc.UPDATE, rsrc.COMPLETE), rsrc.state)
self.m.VerifyAll()
self.m.ReplayAll()
update_template = copy.deepcopy(cs.t)
update_template['Metadata'] = {'test': 123}
- self.assertEqual(None, cs.update(update_template))
+ scheduler.TaskRunner(cs.update, update_template)()
self.assertEqual(cs.metadata, {'test': 123})
def test_cs_update_replace(self):
update_template = copy.deepcopy(cs.t)
update_template['Notallowed'] = {'test': 123}
- self.assertRaises(resource.UpdateReplace, cs.update, update_template)
+ updater = scheduler.TaskRunner(cs.update, update_template)
+ self.assertRaises(resource.UpdateReplace, updater)
def test_cs_update_properties(self):
return_server = self.fc.servers.list()[1]
update_template = copy.deepcopy(cs.t)
update_template['Properties']['user_data'] = 'mustreplace'
- self.assertRaises(resource.UpdateReplace,
- cs.update, update_template)
+ updater = scheduler.TaskRunner(cs.update, update_template)
+ self.assertRaises(resource.UpdateReplace, updater)
def test_cs_status_build(self):
return_server = self.fc.servers.list()[0]
utmpl, tmpl_diff, prop_diff).AndReturn(None)
self.m.ReplayAll()
- self.assertEqual(None, res.update(utmpl))
+ scheduler.TaskRunner(res.update, utmpl)()
self.assertEqual((res.UPDATE, res.COMPLETE), res.state)
self.m.VerifyAll()
utmpl, tmpl_diff, prop_diff).AndRaise(resource.UpdateReplace())
self.m.ReplayAll()
# should be re-raised so parser.Stack can handle replacement
- self.assertRaises(resource.UpdateReplace, res.update, utmpl)
+ updater = scheduler.TaskRunner(res.update, utmpl)
+ self.assertRaises(resource.UpdateReplace, updater)
self.m.VerifyAll()
def test_update_fail_missing_req_prop(self):
utmpl = {'Type': 'GenericResourceType', 'Properties': {}}
- self.assertRaises(exception.ResourceFailure, res.update, utmpl)
+ updater = scheduler.TaskRunner(res.update, utmpl)
+ self.assertRaises(exception.ResourceFailure, updater)
self.assertEqual((res.UPDATE, res.FAILED), res.state)
def test_update_fail_prop_typo(self):
utmpl = {'Type': 'GenericResourceType', 'Properties': {'Food': 'xyz'}}
- self.assertRaises(exception.ResourceFailure, res.update, utmpl)
+ updater = scheduler.TaskRunner(res.update, utmpl)
+ self.assertRaises(exception.ResourceFailure, updater)
self.assertEqual((res.UPDATE, res.FAILED), res.state)
def test_update_not_implemented(self):
generic_rsrc.ResourceWithProps.handle_update(
utmpl, tmpl_diff, prop_diff).AndRaise(NotImplemented)
self.m.ReplayAll()
- self.assertRaises(exception.ResourceFailure, res.update, utmpl)
+ updater = scheduler.TaskRunner(res.update, utmpl)
+ self.assertRaises(exception.ResourceFailure, updater)
self.assertEqual((res.UPDATE, res.FAILED), res.state)
self.m.VerifyAll()
update_template = copy.deepcopy(server.t)
update_template['Metadata'] = {'test': 123}
- self.assertEqual(None, server.update(update_template))
+ scheduler.TaskRunner(server.update, update_template)()
self.assertEqual(server.metadata, {'test': 123})
server.t['Metadata'] = {'test': 456}
body={'confirmResize': None}).AndReturn((202, None))
self.m.ReplayAll()
- self.assertEqual(None, server.update(update_template))
+ scheduler.TaskRunner(server.update, update_template)()
self.assertEqual(server.state, (server.UPDATE, server.COMPLETE))
self.m.VerifyAll()
body={'resize': {'flavorRef': 2}}).AndReturn((202, None))
self.m.ReplayAll()
- error = self.assertRaises(exception.ResourceFailure,
- server.update, update_template)
+ updater = scheduler.TaskRunner(server.update, update_template)
+ error = self.assertRaises(exception.ResourceFailure, updater)
self.assertEqual(
"Error: Resizing to 'm1.small' failed, status 'ACTIVE'",
str(error))
update_template = copy.deepcopy(server.t)
update_template['Properties']['flavor'] = 'm1.smigish'
- self.assertRaises(resource.UpdateReplace,
- server.update, update_template)
+ updater = scheduler.TaskRunner(server.update, update_template)
+ self.assertRaises(resource.UpdateReplace, updater)
def test_server_update_server_flavor_policy_update(self):
stack_name = 'test_server_update_flavor_replace'
# update
update_template['Properties']['flavor_update_policy'] = 'REPLACE'
update_template['Properties']['flavor'] = 'm1.smigish'
- self.assertRaises(resource.UpdateReplace,
- server.update, update_template)
+ updater = scheduler.TaskRunner(server.update, update_template)
+ self.assertRaises(resource.UpdateReplace, updater)
def test_server_update_replace(self):
return_server = self.fc.servers.list()[1]
update_template = copy.deepcopy(server.t)
update_template['Notallowed'] = {'test': 123}
- self.assertRaises(resource.UpdateReplace,
- server.update, update_template)
+ updater = scheduler.TaskRunner(server.update, update_template)
+ self.assertRaises(resource.UpdateReplace, updater)
def test_server_update_properties(self):
return_server = self.fc.servers.list()[1]
update_template = copy.deepcopy(server.t)
update_template['Properties']['key_name'] = 'mustreplace'
- self.assertRaises(resource.UpdateReplace,
- server.update, update_template)
+ updater = scheduler.TaskRunner(server.update, update_template)
+ self.assertRaises(resource.UpdateReplace, updater)
def test_server_status_build(self):
return_server = self.fc.servers.list()[0]