Merge "Generate random heat stack name for cluster"
This commit is contained in:
commit
4796e5c8ee
|
@ -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.
|
||||||
|
|
|
@ -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 '
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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={
|
||||||
|
|
Loading…
Reference in New Issue