Fix ServerAddressOutputMapping for private clusters

Following changes were introduced in Train release:

- Allow setting network, subnet and FIP when creating cluster
  (I11579ff6b83d133c71c2cbf49ee4b20996dfb918)
- ng-7: Adapt parameter and output mappings
  (I45cf765977c7f5a92f28ae12c469b98435763163)

The first change allowed setting cluster.floating_ip_enabled but the
second change introduced ServerAddressOutputMapping conditional on
cluster_template.floating_ip_enabled which leads to an edge case where
if floating_ip_enabled is overriden to False when a cluster is created
when it is True in the cluster_template scope, we see this error in the
conductor logs: ValueError: Field `node_addresses[0]' cannot be None and
the cluster remains forever stuck in CREATE_IN_PROGRESS status despite
Heat reaching CREATE_COMPLETE. This commit addresses this issue by
correctly referring to the cluster.floating_ip_enabled.

Change-Id: Ic83f625178786d4750a66dd6dd6db35c05bc0272
Story: 2007550
Task: 39401
(cherry picked from commit 0e58e267d1)
This commit is contained in:
Bharat Kunwar 2020-04-14 15:37:49 +00:00 committed by Feilong Wang
parent e0fecc1dd3
commit bb5805332a
5 changed files with 12 additions and 4 deletions

View File

@ -28,7 +28,7 @@ class ServerAddressOutputMapping(template_def.OutputMapping):
self.heat_output = self.public_ip_output_key
def set_output(self, stack, cluster_template, cluster):
if not cluster_template.floating_ip_enabled:
if not cluster.floating_ip_enabled:
self.heat_output = self.private_ip_output_key
LOG.debug("Using heat_output: %s", self.heat_output)

View File

@ -65,7 +65,7 @@ class ServerAddressOutputMapping(template_def.NodeGroupOutputMapping):
self.is_stack_param = False
def set_output(self, stack, cluster_template, cluster):
if not cluster_template.floating_ip_enabled:
if not cluster.floating_ip_enabled:
self.heat_output = self.private_ip_output_key
LOG.debug("Using heat_output: %s", self.heat_output)

View File

@ -57,7 +57,7 @@ class MasterAddressOutputMapping(ServerAddressOutputMapping):
'swarm_secondary_masters_private']
def set_output(self, stack, cluster_template, cluster):
if not cluster_template.floating_ip_enabled:
if not cluster.floating_ip_enabled:
self.heat_output = self.private_ip_output_key
LOG.debug("Using heat_output: %s", self.heat_output)
@ -76,7 +76,7 @@ class NodeAddressOutputMapping(ServerAddressOutputMapping):
private_ip_output_key = 'swarm_nodes_private'
def set_output(self, stack, cluster_template, cluster):
if not cluster_template.floating_ip_enabled:
if not cluster.floating_ip_enabled:
self.heat_output = self.private_ip_output_key
LOG.debug("Using heat_output: %s", self.heat_output)

View File

@ -379,6 +379,7 @@ class BaseK8sTemplateDefinitionTestCase(base.TestCase):
mock_stack.to_dict.return_value = {'outputs': outputs}
mock_cluster_template = mock.MagicMock()
mock_cluster_template.floating_ip_enabled = floating_ip_enabled
self.mock_cluster.floating_ip_enabled = floating_ip_enabled
definition.update_outputs(mock_stack, mock_cluster_template,
self.mock_cluster)
@ -1730,6 +1731,7 @@ class AtomicSwarmModeTemplateDefinitionTestCase(base.TestCase):
mock_stack.to_dict.return_value = {'outputs': outputs}
mock_cluster_template = mock.MagicMock()
mock_cluster_template.floating_ip_enabled = floating_ip_enabled
self.mock_cluster.floating_ip_enabled = floating_ip_enabled
definition.update_outputs(mock_stack, mock_cluster_template,
self.mock_cluster)

View File

@ -0,0 +1,6 @@
---
fixes:
- |
Fix an issue with private clusters getting stuck in CREATE_IN_PROGRESS
status where floating_ip_enabled=True in the cluster template but this is
disabled when the cluster is created.