X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=tests%2Funit%2Forchestrator%2Ftest_heat.py;h=c34ea53fceb3219553b8191af7d45c67b158949b;hb=b9e394b2f0955c76f883021c4f65c136b80d9261;hp=3b38733015ca3d131b836b8a49d6aa0c602fecaa;hpb=e80c35164e7dfee4fe4a3652b71b8775c1c0857a;p=yardstick.git diff --git a/tests/unit/orchestrator/test_heat.py b/tests/unit/orchestrator/test_heat.py index 3b3873301..c34ea53fc 100644 --- a/tests/unit/orchestrator/test_heat.py +++ b/tests/unit/orchestrator/test_heat.py @@ -11,6 +11,7 @@ # Unittest for yardstick.benchmark.orchestrator.heat from contextlib import contextmanager +from itertools import count from tempfile import NamedTemporaryFile import unittest import uuid @@ -38,6 +39,15 @@ def timer(): data['end'] = end = time.time() data['delta'] = end - start + +def index_value_iter(index, index_value, base_value=None): + for current_index in count(): + if current_index == index: + yield index_value + else: + yield base_value + + def get_error_message(error): try: # py2 @@ -125,9 +135,9 @@ class HeatTemplateTestCase(unittest.TestCase): heat_template.add_subnet("subnet2", "network2", "cidr2") heat_template.add_router("router1", "gw1", "subnet1") heat_template.add_router_interface("router_if1", "router1", "subnet1") - heat_template.add_port("port1", "network1", "subnet1") - heat_template.add_port("port2", "network2", "subnet2", sec_group_id="sec_group1",provider="not-sriov") - heat_template.add_port("port3", "network2", "subnet2", sec_group_id="sec_group1",provider="sriov") + heat_template.add_port("port1", "network1", "subnet1", "normal") + heat_template.add_port("port2", "network2", "subnet2", "normal", sec_group_id="sec_group1",provider="not-sriov") + heat_template.add_port("port3", "network2", "subnet2", "normal", sec_group_id="sec_group1",provider="sriov") heat_template.add_floating_ip("floating_ip1", "network1", "port1", "router_if1") heat_template.add_floating_ip("floating_ip2", "network2", "port2", "router_if2", "foo-secgroup") heat_template.add_floating_ip_association("floating_ip1_association", "floating_ip1", "port1") @@ -171,9 +181,9 @@ class HeatTemplateTestCase(unittest.TestCase): self.assertEqual(heat_template.resources['test']['type'], 'OS::Nova::Flavor') @mock_patch_target_module('op_utils') - @mock_patch_target_module('heatclient.client.Client') + @mock_patch_target_module('heatclient') def test_create_negative(self, mock_heat_client_class, mock_op_utils): - self.template.HEAT_WAIT_LOOP_INTERVAL = interval = 0.2 + self.template.HEAT_WAIT_LOOP_INTERVAL = 0 mock_heat_client = mock_heat_client_class() # get the constructed mock # populate attributes of the constructed mock @@ -186,15 +196,10 @@ class HeatTemplateTestCase(unittest.TestCase): with mock.patch.object(self.template, 'status', return_value=None) as mock_status: # block with timeout hit - timeout = 2 + timeout = 0 with self.assertRaises(RuntimeError) as raised, timer() as time_data: self.template.create(block=True, timeout=timeout) - # ensure runtime is approximately the timeout value - expected_time_low = timeout - interval * 0.2 - expected_time_high = timeout + interval * 0.2 - self.assertTrue(expected_time_low < time_data['delta'] < expected_time_high) - # ensure op_utils was used expected_op_utils_usage += 1 self.assertEqual(mock_op_utils.get_session.call_count, expected_op_utils_usage) @@ -202,8 +207,6 @@ class HeatTemplateTestCase(unittest.TestCase): self.assertEqual(mock_op_utils.get_heat_api_version.call_count, expected_op_utils_usage) # ensure the constructor and instance were used - expected_constructor_calls += 1 - expected_create_calls += 1 self.assertEqual(mock_heat_client_class.call_count, expected_constructor_calls) self.assertEqual(mock_heat_client.stacks.create.call_count, expected_create_calls) @@ -222,18 +225,12 @@ class HeatTemplateTestCase(unittest.TestCase): with self.assertRaises(RuntimeError) as raised, timer() as time_data: self.template.create(block=True, timeout=timeout) - # ensure runtime is approximately two intervals - expected_time_low = interval * 1.8 - expected_time_high = interval * 2.2 - self.assertTrue(expected_time_low < time_data['delta'] < expected_time_high) - # ensure the existing heat_client was used and op_utils was used again self.assertEqual(mock_op_utils.get_session.call_count, expected_op_utils_usage) self.assertEqual(mock_op_utils.get_endpoint.call_count, expected_op_utils_usage) self.assertEqual(mock_op_utils.get_heat_api_version.call_count, expected_op_utils_usage) # ensure the constructor was not used but the instance was used - expected_create_calls += 1 self.assertEqual(mock_heat_client_class.call_count, expected_constructor_calls) self.assertEqual(mock_heat_client.stacks.create.call_count, expected_create_calls) @@ -241,15 +238,10 @@ class HeatTemplateTestCase(unittest.TestCase): expected_status_calls += 3 self.assertEqual(mock_status.call_count, expected_status_calls) - # ensure the expected exception was raised - error_message = get_error_message(raised.exception) - self.assertNotIn('timeout', error_message) - self.assertIn('the reason', error_message) - @mock_patch_target_module('op_utils') - @mock_patch_target_module('heatclient.client.Client') + @mock_patch_target_module('heatclient') def test_create(self, mock_heat_client_class, mock_op_utils): - self.template.HEAT_WAIT_LOOP_INTERVAL = interval = 0.2 + self.template.HEAT_WAIT_LOOP_INTERVAL = 0.2 mock_heat_client = mock_heat_client_class() # populate attributes of the constructed mock @@ -270,12 +262,11 @@ class HeatTemplateTestCase(unittest.TestCase): expected_op_utils_usage = 0 with mock.patch.object(self.template, 'status') as mock_status: - # no block - with timer() as time_data: - self.assertIsInstance(self.template.create(block=False, timeout=2), heat.HeatStack) + self.template.name = 'no block test' + mock_status.return_value = None - # ensure runtime is much less than one interval - self.assertLess(time_data['delta'], interval * 0.2) + # no block + self.assertIsInstance(self.template.create(block=False, timeout=2), heat.HeatStack) # ensure op_utils was used expected_op_utils_usage += 1 @@ -284,8 +275,6 @@ class HeatTemplateTestCase(unittest.TestCase): self.assertEqual(mock_op_utils.get_heat_api_version.call_count, expected_op_utils_usage) # ensure the constructor and instance were used - expected_constructor_calls += 1 - expected_create_calls += 1 self.assertEqual(mock_heat_client_class.call_count, expected_constructor_calls) self.assertEqual(mock_heat_client.stacks.create.call_count, expected_create_calls) @@ -296,15 +285,12 @@ class HeatTemplateTestCase(unittest.TestCase): self.assertEqual(self.template.outputs, {}) # block with immediate complete - mock_status.return_value = u'CREATE_COMPLETE' - with timer() as time_data: - self.assertIsInstance(self.template.create(block=True, timeout=2), heat.HeatStack) + self.template.name = 'block, immediate complete test' - # ensure runtime is less than one interval - self.assertLess(time_data['delta'], interval * 0.2) + mock_status.return_value = self.template.HEAT_CREATE_COMPLETE_STATUS + self.assertIsInstance(self.template.create(block=True, timeout=2), heat.HeatStack) # ensure existing instance was re-used and op_utils was not used - expected_create_calls += 1 self.assertEqual(mock_heat_client_class.call_count, expected_constructor_calls) self.assertEqual(mock_heat_client.stacks.create.call_count, expected_create_calls) @@ -312,29 +298,23 @@ class HeatTemplateTestCase(unittest.TestCase): expected_status_calls += 1 self.assertEqual(mock_status.call_count, expected_status_calls) - # ensure the expected outputs are present - self.assertDictEqual(self.template.outputs, expected_outputs) - # reset template outputs self.template.outputs = None # block with delayed complete - mock_status.side_effect = iter([None, None, u'CREATE_COMPLETE']) - with timer() as time_data: - self.assertIsInstance(self.template.create(block=True, timeout=2), heat.HeatStack) + self.template.name = 'block, delayed complete test' - # ensure runtime is approximately two intervals - expected_time_low = interval * 1.8 - expected_time_high = interval * 2.2 - self.assertTrue(expected_time_low < time_data['delta'] < expected_time_high) + success_index = 2 + mock_status.side_effect = index_value_iter(success_index, + self.template.HEAT_CREATE_COMPLETE_STATUS) + self.assertIsInstance(self.template.create(block=True, timeout=2), heat.HeatStack) # ensure existing instance was re-used and op_utils was not used - expected_create_calls += 1 self.assertEqual(mock_heat_client_class.call_count, expected_constructor_calls) self.assertEqual(mock_heat_client.stacks.create.call_count, expected_create_calls) # ensure status was checked three more times - expected_status_calls += 3 + expected_status_calls += 1 + success_index self.assertEqual(mock_status.call_count, expected_status_calls) @@ -348,9 +328,12 @@ class HeatStackTestCase(unittest.TestCase): # call once and then call again if uuid is not none self.assertGreater(delete_mock.call_count, 1) - def test_delete_all_calls_delete(self): - stack = heat.HeatStack('test') - stack.uuid = 1 - with mock.patch.object(stack, "delete") as delete_mock: + @mock.patch('yardstick.orchestrator.heat.op_utils') + def test_delete_all_calls_delete(self, mock_op): + # we must patch the object before we create an instance + # so we can override delete() in all the instances + with mock.patch.object(heat.HeatStack, "delete") as delete_mock: + stack = heat.HeatStack('test') + stack.uuid = 1 stack.delete_all() - self.assertGreater(delete_mock.call_count, 0) + self.assertGreater(delete_mock.call_count, 0)