Updates the node count key for all types of bay
By default the key to get node count is "number_of_minions" which is not true for baymodels other than kubernetes and it raises "KeyError" so that status of bay will not be updated. Closes-Bug: #1489725 Change-Id: I9f6a8ebbc26f501d54ef97937329845a12002d6c
This commit is contained in:
parent
4eac3173d3
commit
6a264b6f11
@ -217,6 +217,9 @@ class HeatPoller(object):
|
|||||||
self.context = self.openstack_client.context
|
self.context = self.openstack_client.context
|
||||||
self.bay = bay
|
self.bay = bay
|
||||||
self.attempts = 0
|
self.attempts = 0
|
||||||
|
baymodel = conductor_utils.retrieve_baymodel(self.context, bay)
|
||||||
|
self.template_def = TDef.get_template_definition(
|
||||||
|
'vm', baymodel.cluster_distro, baymodel.coe)
|
||||||
|
|
||||||
def poll_and_check(self):
|
def poll_and_check(self):
|
||||||
# TODO(yuanying): temporary implementation to update api_address,
|
# TODO(yuanying): temporary implementation to update api_address,
|
||||||
@ -240,13 +243,17 @@ class HeatPoller(object):
|
|||||||
|
|
||||||
self.bay.status = stack.stack_status
|
self.bay.status = stack.stack_status
|
||||||
self.bay.status_reason = stack.stack_status_reason
|
self.bay.status_reason = stack.stack_status_reason
|
||||||
self.bay.node_count = stack.parameters['number_of_minions']
|
stack_nc_param = self.template_def.get_heat_param(
|
||||||
|
bay_attr='node_count')
|
||||||
|
self.bay.node_count = stack.parameters[stack_nc_param]
|
||||||
self.bay.save()
|
self.bay.save()
|
||||||
raise loopingcall.LoopingCallDone()
|
raise loopingcall.LoopingCallDone()
|
||||||
elif stack.stack_status != self.bay.status:
|
elif stack.stack_status != self.bay.status:
|
||||||
self.bay.status = stack.stack_status
|
self.bay.status = stack.stack_status
|
||||||
self.bay.status_reason = stack.stack_status_reason
|
self.bay.status_reason = stack.stack_status_reason
|
||||||
self.bay.node_count = stack.parameters['number_of_minions']
|
stack_nc_param = self.template_def.get_heat_param(
|
||||||
|
bay_attr='node_count')
|
||||||
|
self.bay.node_count = stack.parameters[stack_nc_param]
|
||||||
self.bay.save()
|
self.bay.save()
|
||||||
if stack.stack_status == bay_status.CREATE_FAILED:
|
if stack.stack_status == bay_status.CREATE_FAILED:
|
||||||
LOG.error(_LE('Unable to create bay, stack_id: %(stack_id)s, '
|
LOG.error(_LE('Unable to create bay, stack_id: %(stack_id)s, '
|
||||||
|
@ -299,6 +299,21 @@ class TemplateDefinition(object):
|
|||||||
|
|
||||||
return template_params
|
return template_params
|
||||||
|
|
||||||
|
def get_heat_param(self, bay_attr=None, baymodel_attr=None):
|
||||||
|
"""Returns stack param name using bay and baymodel attributes
|
||||||
|
:param bay_attr bay attribute from which it maps to stack attribute
|
||||||
|
:param baymodel_attr baymodel attribute from which it maps
|
||||||
|
to stack attribute
|
||||||
|
|
||||||
|
:return stack parameter name or None
|
||||||
|
"""
|
||||||
|
for mapping in self.param_mappings:
|
||||||
|
if (mapping.bay_attr == bay_attr and
|
||||||
|
mapping.baymodel_attr == baymodel_attr):
|
||||||
|
return mapping.heat_param
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
def update_outputs(self, stack, bay):
|
def update_outputs(self, stack, bay):
|
||||||
for output in self.output_mappings:
|
for output in self.output_mappings:
|
||||||
output.set_output(stack, bay)
|
output.set_output(stack, bay)
|
||||||
|
@ -536,15 +536,19 @@ class TestBayConductorWithK8s(base.TestCase):
|
|||||||
mock_heat_client.stacks.update.assert_called_once_with(mock_stack_id,
|
mock_heat_client.stacks.update.assert_called_once_with(mock_stack_id,
|
||||||
**expected_args)
|
**expected_args)
|
||||||
|
|
||||||
|
@patch('magnum.conductor.utils.retrieve_baymodel')
|
||||||
@patch('oslo_config.cfg')
|
@patch('oslo_config.cfg')
|
||||||
@patch('magnum.common.clients.OpenStackClients')
|
@patch('magnum.common.clients.OpenStackClients')
|
||||||
def setup_poll_test(self, mock_openstack_client, cfg):
|
def setup_poll_test(self, mock_openstack_client, cfg,
|
||||||
|
mock_retrieve_baymodel):
|
||||||
cfg.CONF.bay_heat.max_attempts = 10
|
cfg.CONF.bay_heat.max_attempts = 10
|
||||||
bay = mock.MagicMock()
|
bay = mock.MagicMock()
|
||||||
mock_heat_stack = mock.MagicMock()
|
mock_heat_stack = mock.MagicMock()
|
||||||
mock_heat_client = mock.MagicMock()
|
mock_heat_client = mock.MagicMock()
|
||||||
mock_heat_client.stacks.get.return_value = mock_heat_stack
|
mock_heat_client.stacks.get.return_value = mock_heat_stack
|
||||||
mock_openstack_client.heat.return_value = mock_heat_client
|
mock_openstack_client.heat.return_value = mock_heat_client
|
||||||
|
baymodel = objects.BayModel(self.context, **self.baymodel_dict)
|
||||||
|
mock_retrieve_baymodel.return_value = baymodel
|
||||||
poller = bay_conductor.HeatPoller(mock_openstack_client, bay)
|
poller = bay_conductor.HeatPoller(mock_openstack_client, bay)
|
||||||
return (mock_heat_stack, bay, poller)
|
return (mock_heat_stack, bay, poller)
|
||||||
|
|
||||||
@ -691,6 +695,25 @@ class TestBayConductorWithK8s(base.TestCase):
|
|||||||
mock_heat_stack.timeout_mins = 60
|
mock_heat_stack.timeout_mins = 60
|
||||||
self.assertRaises(loopingcall.LoopingCallDone, poller.poll_and_check)
|
self.assertRaises(loopingcall.LoopingCallDone, poller.poll_and_check)
|
||||||
|
|
||||||
|
def test_poll_node_count(self):
|
||||||
|
mock_heat_stack, bay, poller = self.setup_poll_test()
|
||||||
|
|
||||||
|
mock_heat_stack.parameters = {'number_of_minions': 1}
|
||||||
|
mock_heat_stack.stack_status = bay_status.CREATE_IN_PROGRESS
|
||||||
|
poller.poll_and_check()
|
||||||
|
|
||||||
|
self.assertEqual(bay.node_count, 1)
|
||||||
|
|
||||||
|
@patch('magnum.conductor.handlers.bay_conductor._update_stack_outputs')
|
||||||
|
def test_poll_node_count_by_update(self, mock_update_stack_outputs):
|
||||||
|
mock_heat_stack, bay, poller = self.setup_poll_test()
|
||||||
|
|
||||||
|
mock_heat_stack.parameters = {'number_of_minions': 2}
|
||||||
|
mock_heat_stack.stack_status = bay_status.UPDATE_COMPLETE
|
||||||
|
self.assertRaises(loopingcall.LoopingCallDone, poller.poll_and_check)
|
||||||
|
|
||||||
|
self.assertEqual(bay.node_count, 2)
|
||||||
|
|
||||||
|
|
||||||
class TestHandler(db_base.DbTestCase):
|
class TestHandler(db_base.DbTestCase):
|
||||||
|
|
||||||
@ -881,6 +904,41 @@ class TestBayConductorWithSwarm(base.TestCase):
|
|||||||
}
|
}
|
||||||
self.assertEqual(expected, definition)
|
self.assertEqual(expected, definition)
|
||||||
|
|
||||||
|
@patch('magnum.conductor.utils.retrieve_baymodel')
|
||||||
|
@patch('oslo_config.cfg')
|
||||||
|
@patch('magnum.common.clients.OpenStackClients')
|
||||||
|
def setup_poll_test(self, mock_openstack_client, cfg,
|
||||||
|
mock_retrieve_baymodel):
|
||||||
|
cfg.CONF.bay_heat.max_attempts = 10
|
||||||
|
bay = mock.MagicMock()
|
||||||
|
mock_heat_stack = mock.MagicMock()
|
||||||
|
mock_heat_client = mock.MagicMock()
|
||||||
|
mock_heat_client.stacks.get.return_value = mock_heat_stack
|
||||||
|
mock_openstack_client.heat.return_value = mock_heat_client
|
||||||
|
baymodel = objects.BayModel(self.context, **self.baymodel_dict)
|
||||||
|
mock_retrieve_baymodel.return_value = baymodel
|
||||||
|
poller = bay_conductor.HeatPoller(mock_openstack_client, bay)
|
||||||
|
return (mock_heat_stack, bay, poller)
|
||||||
|
|
||||||
|
def test_poll_node_count(self):
|
||||||
|
mock_heat_stack, bay, poller = self.setup_poll_test()
|
||||||
|
|
||||||
|
mock_heat_stack.parameters = {'number_of_nodes': 1}
|
||||||
|
mock_heat_stack.stack_status = bay_status.CREATE_IN_PROGRESS
|
||||||
|
poller.poll_and_check()
|
||||||
|
|
||||||
|
self.assertEqual(bay.node_count, 1)
|
||||||
|
|
||||||
|
@patch('magnum.conductor.handlers.bay_conductor._update_stack_outputs')
|
||||||
|
def test_poll_node_count_by_update(self, mock_update_stack_outputs):
|
||||||
|
mock_heat_stack, bay, poller = self.setup_poll_test()
|
||||||
|
|
||||||
|
mock_heat_stack.parameters = {'number_of_nodes': 2}
|
||||||
|
mock_heat_stack.stack_status = bay_status.UPDATE_COMPLETE
|
||||||
|
self.assertRaises(loopingcall.LoopingCallDone, poller.poll_and_check)
|
||||||
|
|
||||||
|
self.assertEqual(bay.node_count, 2)
|
||||||
|
|
||||||
|
|
||||||
class TestBayConductorWithMesos(base.TestCase):
|
class TestBayConductorWithMesos(base.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
@ -961,3 +1019,38 @@ class TestBayConductorWithMesos(base.TestCase):
|
|||||||
'number_of_slaves': '1',
|
'number_of_slaves': '1',
|
||||||
}
|
}
|
||||||
self.assertEqual(expected, definition)
|
self.assertEqual(expected, definition)
|
||||||
|
|
||||||
|
@patch('magnum.conductor.utils.retrieve_baymodel')
|
||||||
|
@patch('oslo_config.cfg')
|
||||||
|
@patch('magnum.common.clients.OpenStackClients')
|
||||||
|
def setup_poll_test(self, mock_openstack_client, cfg,
|
||||||
|
mock_retrieve_baymodel):
|
||||||
|
cfg.CONF.bay_heat.max_attempts = 10
|
||||||
|
bay = mock.MagicMock()
|
||||||
|
mock_heat_stack = mock.MagicMock()
|
||||||
|
mock_heat_client = mock.MagicMock()
|
||||||
|
mock_heat_client.stacks.get.return_value = mock_heat_stack
|
||||||
|
mock_openstack_client.heat.return_value = mock_heat_client
|
||||||
|
baymodel = objects.BayModel(self.context, **self.baymodel_dict)
|
||||||
|
mock_retrieve_baymodel.return_value = baymodel
|
||||||
|
poller = bay_conductor.HeatPoller(mock_openstack_client, bay)
|
||||||
|
return (mock_heat_stack, bay, poller)
|
||||||
|
|
||||||
|
def test_poll_node_count(self):
|
||||||
|
mock_heat_stack, bay, poller = self.setup_poll_test()
|
||||||
|
|
||||||
|
mock_heat_stack.parameters = {'number_of_slaves': 1}
|
||||||
|
mock_heat_stack.stack_status = bay_status.CREATE_IN_PROGRESS
|
||||||
|
poller.poll_and_check()
|
||||||
|
|
||||||
|
self.assertEqual(bay.node_count, 1)
|
||||||
|
|
||||||
|
@patch('magnum.conductor.handlers.bay_conductor._update_stack_outputs')
|
||||||
|
def test_poll_node_count_by_update(self, mock_update_stack_outputs):
|
||||||
|
mock_heat_stack, bay, poller = self.setup_poll_test()
|
||||||
|
|
||||||
|
mock_heat_stack.parameters = {'number_of_slaves': 2}
|
||||||
|
mock_heat_stack.stack_status = bay_status.UPDATE_COMPLETE
|
||||||
|
self.assertRaises(loopingcall.LoopingCallDone, poller.poll_and_check)
|
||||||
|
|
||||||
|
self.assertEqual(bay.node_count, 2)
|
||||||
|
@ -186,6 +186,12 @@ class AtomicK8sTemplateDefinitionTestCase(base.TestCase):
|
|||||||
self.assertEqual(mock_bay.discovery_url, expected_discovery_url)
|
self.assertEqual(mock_bay.discovery_url, expected_discovery_url)
|
||||||
self.assertEqual(discovery_url, expected_discovery_url)
|
self.assertEqual(discovery_url, expected_discovery_url)
|
||||||
|
|
||||||
|
def test_k8s_get_heat_param(self):
|
||||||
|
k8s_def = tdef.AtomicK8sTemplateDefinition()
|
||||||
|
|
||||||
|
heat_param = k8s_def.get_heat_param(bay_attr='node_count')
|
||||||
|
self.assertEqual(heat_param, 'number_of_minions')
|
||||||
|
|
||||||
|
|
||||||
class AtomicSwarmTemplateDefinitionTestCase(base.TestCase):
|
class AtomicSwarmTemplateDefinitionTestCase(base.TestCase):
|
||||||
|
|
||||||
@ -246,3 +252,18 @@ class AtomicSwarmTemplateDefinitionTestCase(base.TestCase):
|
|||||||
actual_url = swarm_def.get_discovery_url(mock_bay)
|
actual_url = swarm_def.get_discovery_url(mock_bay)
|
||||||
|
|
||||||
self.assertEqual(mock_bay.discovery_url, actual_url)
|
self.assertEqual(mock_bay.discovery_url, actual_url)
|
||||||
|
|
||||||
|
def test_swarm_get_heat_param(self):
|
||||||
|
k8s_def = tdef.AtomicSwarmTemplateDefinition()
|
||||||
|
|
||||||
|
heat_param = k8s_def.get_heat_param(bay_attr='node_count')
|
||||||
|
self.assertEqual(heat_param, 'number_of_nodes')
|
||||||
|
|
||||||
|
|
||||||
|
class AtomicMesosTemplateDefinitionTestCase(base.TestCase):
|
||||||
|
|
||||||
|
def test_mesos_get_heat_param(self):
|
||||||
|
k8s_def = tdef.UbuntuMesosTemplateDefinition()
|
||||||
|
|
||||||
|
heat_param = k8s_def.get_heat_param(bay_attr='node_count')
|
||||||
|
self.assertEqual(heat_param, 'number_of_slaves')
|
||||||
|
Loading…
Reference in New Issue
Block a user