Merge "Generate random heat stack name for cluster"

This commit is contained in:
Jenkins 2015-09-23 14:47:18 +00:00 committed by Gerrit Code Review
commit 4796e5c8ee
5 changed files with 21 additions and 33 deletions

View File

@ -82,6 +82,11 @@ class Cluster(object):
return None return None
@property
def stack_name(self):
extra = self.extra or {}
return extra.get('heat_stack_name', self.name)
class NodeGroup(object): class NodeGroup(object):
"""An object representing Node Group. """An object representing Node Group.

View File

@ -59,11 +59,20 @@ class HeatEngine(e.Engine):
target_count = self._get_ng_counts(cluster) target_count = self._get_ng_counts(cluster)
self._nullify_ng_counts(cluster) self._nullify_ng_counts(cluster)
cluster = self._generate_heat_stack_name(cluster)
self._launch_instances(cluster, target_count, CREATE_STAGES) self._launch_instances(cluster, target_count, CREATE_STAGES)
self._update_rollback_strategy(cluster) self._update_rollback_strategy(cluster)
@staticmethod
def _generate_heat_stack_name(cluster):
cluster = conductor.cluster_get(context.ctx(), cluster)
hsn = cluster.name + cluster.id[:8]
extra = cluster.extra.to_dict() if cluster.extra else {}
extra['heat_stack_name'] = hsn
conductor.cluster_update(context.ctx(), cluster, {'extra': extra})
return conductor.cluster_get(context.ctx(), cluster)
def _get_ng_counts(self, cluster): def _get_ng_counts(self, cluster):
count = {} count = {}
for node_group in cluster.node_groups: for node_group in cluster.node_groups:
@ -179,8 +188,9 @@ 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:
b.execute_with_retries(heat.client().stacks.delete, cluster.name) b.execute_with_retries(
stack = heat.get_stack(cluster.name) heat.client().stacks.delete, cluster.stack_name)
stack = heat.get_stack(cluster.stack_name)
heat.wait_stack_completion(stack) heat.wait_stack_completion(stack)
except heat_exc.HTTPNotFound: except heat_exc.HTTPNotFound:
LOG.warning(_LW('Did not find stack for cluster. Trying to delete ' LOG.warning(_LW('Did not find stack for cluster. Trying to delete '

View File

@ -25,7 +25,6 @@ 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
CONF = cfg.CONF CONF = cfg.CONF
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
@ -130,7 +129,7 @@ class ClusterStack(object):
heat = h.client() heat = h.client()
kwargs = { kwargs = {
'stack_name': self.cluster.name, 'stack_name': self.cluster.stack_name,
'timeout_mins': 180, 'timeout_mins': 180,
'disable_rollback': disable_rollback, 'disable_rollback': disable_rollback,
'parameters': {}, 'parameters': {},
@ -145,13 +144,13 @@ class ClusterStack(object):
.format(args=kwargs)) .format(args=kwargs))
b.execute_with_retries(heat.stacks.create, **kwargs) b.execute_with_retries(heat.stacks.create, **kwargs)
else: else:
stack = h.get_stack(self.cluster.name) stack = h.get_stack(self.cluster.stack_name)
self.last_updated_time = stack.updated_time self.last_updated_time = stack.updated_time
LOG.debug("Updating Heat stack {stack} with args: " LOG.debug("Updating Heat stack {stack} with args: "
"{args}".format(stack=stack, args=kwargs)) "{args}".format(stack=stack, args=kwargs))
b.execute_with_retries(stack.update, **kwargs) b.execute_with_retries(stack.update, **kwargs)
self.heat_stack = h.get_stack(self.cluster.name) self.heat_stack = h.get_stack(self.cluster.stack_name)
def _need_aa_server_group(self, node_group): def _need_aa_server_group(self, node_group):
for node_process in node_group.node_processes: for node_process in node_group.node_processes:

View File

@ -27,7 +27,6 @@ import sahara.plugins.base as plugin_base
import sahara.service.api as api import sahara.service.api as api
from sahara.utils import general as g from sahara.utils import general as g
import sahara.utils.openstack.cinder as cinder import sahara.utils.openstack.cinder as cinder
import sahara.utils.openstack.heat as heat
import sahara.utils.openstack.nova as nova import sahara.utils.openstack.nova as nova
@ -255,15 +254,6 @@ def check_cluster_unique_name(name):
if name in [cluster.name for cluster in api.get_clusters()]: if name in [cluster.name for cluster in api.get_clusters()]:
raise ex.NameAlreadyExistsException( raise ex.NameAlreadyExistsException(
_("Cluster with name '%s' already exists") % name) _("Cluster with name '%s' already exists") % name)
check_heat_stack_name(name)
def check_heat_stack_name(cluster_name):
if CONF.infrastructure_engine == 'heat':
if heat.get_stack(cluster_name, raise_on_missing=False):
raise ex.NameAlreadyExistsException(
_("Cluster name '%s' is already used as Heat stack name")
% cluster_name)
def check_cluster_hostnames_lengths(cluster_name, node_groups): def check_cluster_hostnames_lengths(cluster_name, node_groups):

View File

@ -18,7 +18,6 @@ import six
import testtools import testtools
from sahara import exceptions from sahara import exceptions
from sahara import main
from sahara.service import api from sahara.service import api
from sahara.service.validations import clusters as c from sahara.service.validations import clusters as c
from sahara.service.validations import clusters_schema as c_schema from sahara.service.validations import clusters_schema as c_schema
@ -95,21 +94,6 @@ class TestClusterCreateValidation(u.ValidationTestCase):
"Cluster with name 'test' already exists") "Cluster with name 'test' already exists")
) )
def test_cluster_create_with_heat_stack_exists(self):
main.CONF.set_override('infrastructure_engine', 'heat')
self.addCleanup(main.CONF.clear_override, 'infrastructure_engine')
data = {
'name': 'test-heat',
'plugin_name': 'fake',
'hadoop_version': '0.1'
}
self._assert_create_object_validation(
data=data,
bad_req_i=(1, 'NAME_ALREADY_EXISTS',
"Cluster name 'test-heat' is already "
"used as Heat stack name")
)
def test_cluster_create_v_keypair_exists(self): def test_cluster_create_v_keypair_exists(self):
self._assert_create_object_validation( self._assert_create_object_validation(
data={ data={