Adding retry ability to heatclient calls

All heatclient calls wrapped in execute_with_retry
method to avoid occasional errors

partially implements bp clients-calls-retry

Change-Id: I835fd79b5783f4a5271cec67b013ba8aeba3091a
This commit is contained in:
Andrey Pavlov 2015-04-24 13:23:48 +03:00 committed by Sergey Reshetnyak
parent f96a28023f
commit ff98dd848f
3 changed files with 16 additions and 10 deletions

View File

@ -26,6 +26,7 @@ from sahara.service.heat import templates as ht
from sahara.service import volumes from sahara.service import volumes
from sahara.utils import cluster_progress_ops as cpo from sahara.utils import cluster_progress_ops as cpo
from sahara.utils import general as g from sahara.utils import general as g
from sahara.utils.openstack import base as b
from sahara.utils.openstack import heat from sahara.utils.openstack import heat
conductor = c.API conductor = c.API
@ -39,10 +40,10 @@ class HeatEngine(e.Engine):
def _add_volumes(self, ctx, cluster): def _add_volumes(self, ctx, cluster):
for instance in g.get_instances(cluster): for instance in g.get_instances(cluster):
res_names = heat.client().resources.get( res_names = heat.get_resource(
cluster.name, instance.instance_name).required_by cluster.name, instance.instance_name).required_by
for res_name in res_names: for res_name in res_names:
vol_res = heat.client().resources.get(cluster.name, res_name) vol_res = heat.get_resource(cluster.name, res_name)
if vol_res.resource_type == (('OS::Cinder::' if vol_res.resource_type == (('OS::Cinder::'
'VolumeAttachment')): 'VolumeAttachment')):
volume_id = vol_res.physical_resource_id volume_id = vol_res.physical_resource_id
@ -177,7 +178,7 @@ class HeatEngine(e.Engine):
def shutdown_cluster(self, cluster): def shutdown_cluster(self, cluster):
"""Shutdown specified cluster and all related resources.""" """Shutdown specified cluster and all related resources."""
try: try:
heat.client().stacks.delete(cluster.name) b.execute_with_retries(heat.client().stacks.delete, cluster.name)
stack = heat.get_stack(cluster.name) stack = heat.get_stack(cluster.name)
heat.wait_stack_completion(stack) heat.wait_stack_completion(stack)
except heat_exc.HTTPNotFound: except heat_exc.HTTPNotFound:

View File

@ -20,6 +20,7 @@ import six
import yaml import yaml
from sahara.utils import general as g from sahara.utils import general as g
from sahara.utils.openstack import base as b
from sahara.utils.openstack import heat as h from sahara.utils.openstack import heat as h
from sahara.utils.openstack import neutron from sahara.utils.openstack import neutron
@ -91,11 +92,11 @@ class ClusterTemplate(object):
'template': main_tmpl} 'template': main_tmpl}
if not update_existing: if not update_existing:
heat.stacks.create(**kwargs) b.execute_with_retries(heat.stacks.create, **kwargs)
else: else:
for stack in heat.stacks.list(): for stack in b.execute_with_retries(heat.stacks.list):
if stack.stack_name == self.cluster.name: if stack.stack_name == self.cluster.name:
stack.update(**kwargs) b.execute_with_retries(stack.update, **kwargs)
break break
return ClusterStack(self, h.get_stack(self.cluster.name)) return ClusterStack(self, h.get_stack(self.cluster.name))
@ -337,10 +338,9 @@ class ClusterStack(object):
count = self.tmpl.node_groups_extra[node_group.id]['node_count'] count = self.tmpl.node_groups_extra[node_group.id]['node_count']
heat = h.client()
for i in range(0, count): for i in range(0, count):
name = _get_inst_name(self.tmpl.cluster.name, node_group.name, i) name = _get_inst_name(self.tmpl.cluster.name, node_group.name, i)
res = heat.resources.get(self.heat_stack.id, name) res = h.get_resource(self.heat_stack.id, name)
insts.append((name, res.physical_resource_id)) insts.append((name, res.physical_resource_id))
return insts return insts

View File

@ -49,7 +49,7 @@ def client():
def get_stack(stack_name): def get_stack(stack_name):
heat = client() heat = client()
for stack in heat.stacks.list(): for stack in base.execute_with_retries(heat.stacks.list):
if stack.stack_name == stack_name: if stack.stack_name == stack_name:
return stack return stack
@ -62,7 +62,12 @@ def wait_stack_completion(stack):
# maybe is not set in heat database # maybe is not set in heat database
while stack.status in ['IN_PROGRESS', '']: while stack.status in ['IN_PROGRESS', '']:
context.sleep(1) context.sleep(1)
stack.get() base.execute_with_retries(stack.get)
if stack.status != 'COMPLETE': if stack.status != 'COMPLETE':
raise ex.HeatStackException(stack.stack_status) raise ex.HeatStackException(stack.stack_status)
def get_resource(stack, resource):
return base.execute_with_retries(
client().resources.get, stack, resource)