From 7c591f2b575b779ba562ef4b779971560d703f3a Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Mon, 15 Sep 2014 20:04:57 +0000 Subject: [PATCH] Fix ordering problem causing tests to fail randomly Iterates the dictionary in the same order when building the mox as the code uses when performing the operations. Also changed the UUID's to make them a little more distquishing. Change-Id: I2c43e7f85e1b2655a46c24dc209386fe7fb48fa4 --- stacktach/dbapi.py | 50 ++++++------ tests/unit/test_dbapi.py | 117 ++++++++++++----------------- tests/unit/test_glance_verifier.py | 37 +++++---- tests/unit/utils.py | 24 +++--- 4 files changed, 101 insertions(+), 127 deletions(-) diff --git a/stacktach/dbapi.py b/stacktach/dbapi.py index 832a80b..f3a3349 100644 --- a/stacktach/dbapi.py +++ b/stacktach/dbapi.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -284,26 +284,26 @@ def _find_exists_with_message_id(msg_id, exists_model, service): def _ping_processing_with_service(pings, service, version=1): exists_model = _exists_model_factory(service)['klass'] with transaction.commit_on_success(): - for msg_id, status_info in pings.items(): - try: - exists = _find_exists_with_message_id(msg_id, exists_model, - service) - for exists in exists: - if version == 1: - exists.send_status = status_info - elif version == 2: - exists.send_status = status_info.get("status", 0) - exists.event_id = status_info.get("event_id", "") - exists.save() - except exists_model.DoesNotExist: - msg = "Could not find Exists record with message_id = '%s' for %s" - msg = msg % (msg_id, service) - raise NotFoundException(message=msg) - except exists_model.MultipleObjectsReturned: - msg = "Multiple Exists records with message_id = '%s' for %s" - msg = msg % (msg_id, service) - print msg - raise APIException(message=msg) + for msg_id, status_info in pings.items(): + try: + rexists = _find_exists_with_message_id(msg_id, exists_model, + service) + for exists in rexists: + if version == 1: + exists.send_status = status_info + elif version == 2: + exists.send_status = status_info.get("status", 0) + exists.event_id = status_info.get("event_id", "") + exists.save() + except exists_model.DoesNotExist: + msg = "Could not find Exists record with message_id = '%s' for %s" + msg = msg % (msg_id, service) + raise NotFoundException(message=msg) + except exists_model.MultipleObjectsReturned: + msg = "Multiple Exists records with message_id = '%s' for %s" + msg = msg % (msg_id, service) + print msg + raise APIException(message=msg) def _exists_send_status_batch(request): @@ -545,14 +545,14 @@ def _update_tenant_info_cache(tenant_info): def _batch_update_tenant_info(info_list): tenant_info = dict((str(info['tenant']), info) for info in info_list) tenant_ids = set(tenant_info) - old_tenants = set(t['tenant'] for t in + old_tenants = set(t['tenant'] for t in models.TenantInfo.objects .filter(tenant__in=list(tenant_ids)) .values('tenant')) new_tenants = [] now = datetime.utcnow() for tenant in (tenant_ids - old_tenants): - new_tenants.append(models.TenantInfo(tenant=tenant, + new_tenants.append(models.TenantInfo(tenant=tenant, name=tenant_info[tenant]['name'], last_updated=now)) if new_tenants: @@ -612,5 +612,5 @@ def update_tenant_info(request, tenant_id): body = json.loads(request.body) if body['tenant'] != tenant_id: - raise BadRequestException(message="Invalid tenant: %s != %s" % (body['tenant'], tenant_id)) + raise BadRequestException(message="Invalid tenant: %s != %s" % (body['tenant'], tenant_id)) _update_tenant_info_cache(body) diff --git a/tests/unit/test_dbapi.py b/tests/unit/test_dbapi.py index 96aa9ef..9ebc85d 100644 --- a/tests/unit/test_dbapi.py +++ b/tests/unit/test_dbapi.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -430,7 +430,7 @@ class DBAPITestCase(StacktachBaseTestCase): fake_request = self.mox.CreateMockAnything() fake_request.method = 'PUT' - body_dict = dict(tenant=TEST_TENANT, + body_dict = dict(tenant=TEST_TENANT, name='test name', types=dict(test_type='thingy')) body = json.dumps(body_dict) @@ -459,7 +459,7 @@ class DBAPITestCase(StacktachBaseTestCase): TEST_DATE='test date time' mock_t1 = self.mox.CreateMock(models.TenantInfo) - mock_t1.id = 1 + mock_t1.id = 1 mock_t1.tenant = 'test_old' mock_t1.name = 'test old name' mock_t1.types = self.mox.CreateMockAnything() @@ -467,7 +467,7 @@ class DBAPITestCase(StacktachBaseTestCase): mock_t1.last_updated = TEST_DATE mock_t2 = self.mox.CreateMock(models.TenantInfo) - mock_t2.id = 2 + mock_t2.id = 2 mock_t2.tenant = 'test_new' mock_t2.name = 'test new name' mock_t2.last_updated = TEST_DATE @@ -496,10 +496,10 @@ class DBAPITestCase(StacktachBaseTestCase): fake_request = self.mox.CreateMockAnything() fake_request.method = 'PUT' - body_dict = dict(tenants=[dict(tenant='test_old', + body_dict = dict(tenants=[dict(tenant='test_old', name='test old name', types=dict(test_type='thingy')), - dict(tenant='test_new', + dict(tenant='test_new', name='test new name', types=dict(test_type='whatzit'))]) body = json.dumps(body_dict) @@ -679,22 +679,18 @@ class DBAPITestCase(StacktachBaseTestCase): trans_obj = self.mox.CreateMockAnything() transaction.commit_on_success().AndReturn(trans_obj) trans_obj.__enter__() - results1 = self.mox.CreateMockAnything() - models.InstanceExists.objects.select_for_update().AndReturn(results1) - exists1 = self.mox.CreateMockAnything() - results1.get(message_id=MESSAGE_ID_2).AndReturn(exists1) - exists1.save() - results2 = self.mox.CreateMockAnything() - models.InstanceExists.objects.select_for_update().AndReturn(results2) - exists2 = self.mox.CreateMockAnything() - results2.get(message_id=MESSAGE_ID_1).AndReturn(exists2) - exists2.save() + for uuid, code in messages.items(): + results = self.mox.CreateMockAnything() + models.InstanceExists.objects.select_for_update().AndReturn(results) + exists = self.mox.CreateMockAnything() + results.get(message_id=uuid).AndReturn(exists) + exists.save() trans_obj.__exit__(None, None, None) self.mox.ReplayAll() resp = dbapi.exists_send_status(fake_request, 'batch') self.assertEqual(resp.status_code, 200) - exists1.send_status = 200 + exists.send_status = 200 self.mox.VerifyAll() def test_send_status_batch_accepts_post_for_nova_and_glance_when_version_is_1( @@ -719,25 +715,20 @@ class DBAPITestCase(StacktachBaseTestCase): results1.get(message_id=MESSAGE_ID_3).AndReturn(exists1) exists1.save() trans_obj.__exit__(None, None, None) + trans_obj = self.mox.CreateMockAnything() transaction.commit_on_success().AndReturn(trans_obj) trans_obj.__enter__() - results1 = self.mox.CreateMockAnything() - models.ImageExists.objects.select_for_update().AndReturn(results1) - exists1A = self.mox.CreateMockAnything() - exists1B = self.mox.CreateMockAnything() - results1.filter(message_id=MESSAGE_ID_2).AndReturn( - [exists1A, exists1B]) - exists1A.save() - exists1B.save() - results2 = self.mox.CreateMockAnything() - models.ImageExists.objects.select_for_update().AndReturn(results2) - exists2A = self.mox.CreateMockAnything() - exists2B = self.mox.CreateMockAnything() - results2.filter(message_id=MESSAGE_ID_1).AndReturn( - [exists2A, exists2B]) - exists2A.save() - exists2B.save() + + for uuid, code in messages['glance'].items(): + query = self.mox.CreateMockAnything() + models.ImageExists.objects.select_for_update().AndReturn(query) + existsA = self.mox.CreateMockAnything() + existsB = self.mox.CreateMockAnything() + query.filter(message_id=uuid).AndReturn([existsA, existsB]) + existsA.save() + existsB.save() + trans_obj.__exit__(None, None, None) self.mox.ReplayAll() @@ -757,16 +748,12 @@ class DBAPITestCase(StacktachBaseTestCase): trans_obj = self.mox.CreateMockAnything() transaction.commit_on_success().AndReturn(trans_obj) trans_obj.__enter__() - results1 = self.mox.CreateMockAnything() - models.InstanceExists.objects.select_for_update().AndReturn(results1) - exists1 = self.mox.CreateMockAnything() - results1.get(message_id=MESSAGE_ID_2).AndReturn(exists1) - exists1.save() - results2 = self.mox.CreateMockAnything() - models.InstanceExists.objects.select_for_update().AndReturn(results2) - exists2 = self.mox.CreateMockAnything() - results2.get(message_id=MESSAGE_ID_1).AndReturn(exists2) - exists2.save() + for uuid, code in messages.items(): + results = self.mox.CreateMockAnything() + models.InstanceExists.objects.select_for_update().AndReturn(results) + exists = self.mox.CreateMockAnything() + results.get(message_id=uuid).AndReturn(exists) + exists.save() trans_obj.__exit__(None, None, None) self.mox.ReplayAll() @@ -799,39 +786,29 @@ class DBAPITestCase(StacktachBaseTestCase): body = json.dumps(body_dict) fake_request.body = body self.mox.StubOutWithMock(transaction, 'commit_on_success') + trans_obj = self.mox.CreateMockAnything() transaction.commit_on_success().AndReturn(trans_obj) trans_obj.__enter__() - results1 = self.mox.CreateMockAnything() - results2 = self.mox.CreateMockAnything() - models.InstanceExists.objects.select_for_update().AndReturn(results1) - exists1 = self.mox.CreateMockAnything() - results1.get(message_id=MESSAGE_ID_4).AndReturn(exists1) - exists1.save() - models.InstanceExists.objects.select_for_update().AndReturn(results2) - exists2 = self.mox.CreateMockAnything() - results2.get(message_id=MESSAGE_ID_3).AndReturn(exists2) - exists2.save() + for uuid, code in messages['nova'].items(): + results = self.mox.CreateMockAnything() + models.InstanceExists.objects.select_for_update().AndReturn(results) + exists = self.mox.CreateMockAnything() + results.get(message_id=uuid).AndReturn(exists) + exists.save() trans_obj.__exit__(None, None, None) + trans_obj = self.mox.CreateMockAnything() transaction.commit_on_success().AndReturn(trans_obj) trans_obj.__enter__() - results1 = self.mox.CreateMockAnything() - models.ImageExists.objects.select_for_update().AndReturn(results1) - exists1A = self.mox.CreateMockAnything() - exists1B = self.mox.CreateMockAnything() - results1.filter(message_id=MESSAGE_ID_2).AndReturn( - [exists1A, exists1B]) - exists1A.save() - exists1B.save() - results2 = self.mox.CreateMockAnything() - models.ImageExists.objects.select_for_update().AndReturn(results2) - exists2A = self.mox.CreateMockAnything() - exists2B = self.mox.CreateMockAnything() - results2.filter(message_id=MESSAGE_ID_1).AndReturn( - [exists2A, exists2B]) - exists2A.save() - exists2B.save() + for uuid, code in messages['glance'].items(): + results = self.mox.CreateMockAnything() + models.ImageExists.objects.select_for_update().AndReturn(results) + existsA = self.mox.CreateMockAnything() + existsB = self.mox.CreateMockAnything() + results.filter(message_id=uuid).AndReturn([existsA, existsB]) + existsA.save() + existsB.save() trans_obj.__exit__(None, None, None) self.mox.ReplayAll() diff --git a/tests/unit/test_glance_verifier.py b/tests/unit/test_glance_verifier.py index 4763ab7..1bb258d 100644 --- a/tests/unit/test_glance_verifier.py +++ b/tests/unit/test_glance_verifier.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -284,8 +284,8 @@ class GlanceVerifierTestCase(StacktachBaseTestCase): self.assertEqual(nf.field_name, 'image_size') self.assertEqual( nf.reason, "Failed at 2014-01-02 03:04:05 UTC for " - "12345678-6352-4dbc-8271-96cc54bf14cd: image_size field was " - "null for exist id 23") + "%s: image_size field was " + "null for exist id 23" % IMAGE_UUID_1) self.mox.VerifyAll() def test_should_verify_that_created_at_in_exist_is_not_null(self): @@ -305,8 +305,8 @@ class GlanceVerifierTestCase(StacktachBaseTestCase): self.assertEqual(exception.field_name, 'created_at') self.assertEqual(exception.reason, "Failed at 2014-01-01 01:02:03 UTC for " - "12345678-6352-4dbc-8271-96cc54bf14cd: created_at " - "field was null for exist id 23") + "%s: created_at " + "field was null for exist id 23" % IMAGE_UUID_1) self.mox.VerifyAll() def test_should_verify_that_uuid_in_exist_is_not_null(self): @@ -348,8 +348,8 @@ class GlanceVerifierTestCase(StacktachBaseTestCase): self.assertEqual( nf.reason, "Failed at 2014-01-01 01:02:03 UTC for " - "12345678-6352-4dbc-8271-96cc54bf14cd: owner field was null " - "for exist id 23") + "%s: owner field was null " + "for exist id 23" % IMAGE_UUID_1) self.mox.VerifyAll() def test_should_verify_that_uuid_value_is_uuid_like(self): @@ -536,14 +536,12 @@ class GlanceVerifierTestCase(StacktachBaseTestCase): exist3.save() exist4.save() exist5.save() - self.pool.apply_async(glance_verifier._verify, - args=([exist4],), callback=None) - self.pool.apply_async(glance_verifier._verify, args=([exist5],), - callback=None) - self.pool.apply_async(glance_verifier._verify, - args=([exist1, exist2],), callback=None) - self.pool.apply_async(glance_verifier._verify, args=([exist3],), - callback=None) + for value in sent_results.values(): + self.pool.apply_async(glance_verifier._verify, + args=(value,), callback=None) + for value in results.values(): + self.pool.apply_async(glance_verifier._verify, + args=(value,), callback=None) self.mox.ReplayAll() self.glance_verifier.verify_for_range(when_max) @@ -579,10 +577,9 @@ class GlanceVerifierTestCase(StacktachBaseTestCase): exist1.save() exist2.save() exist3.save() - self.pool.apply_async(glance_verifier._verify, args=([exist1, exist2],), - callback=callback) - self.pool.apply_async(glance_verifier._verify, args=([exist3],), - callback=callback) + for value in results.values(): + self.pool.apply_async(glance_verifier._verify, args=(value,), + callback=callback) self.mox.ReplayAll() self.glance_verifier.verify_for_range( when_max, callback=callback) diff --git a/tests/unit/utils.py b/tests/unit/utils.py index a333e1d..434cf19 100644 --- a/tests/unit/utils.py +++ b/tests/unit/utils.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -22,10 +22,10 @@ TENANT_ID_2 = 'testtenantid2' from stacktach import datetime_to_decimal as dt -IMAGE_UUID_1 = "12345678-6352-4dbc-8271-96cc54bf14cd" +IMAGE_UUID_1 = "1111aaaa-6352-4dbc-8271-96cc54bf14cd" -INSTANCE_ID_1 = "08f685d9-6352-4dbc-8271-96cc54bf14cd" -INSTANCE_ID_2 = "515adf96-41d3-b86d-5467-e584edc61dab" +INSTANCE_ID_1 = "2222bbbb-6352-4dbc-8271-96cc54bf14cd" +INSTANCE_ID_2 = "3333cccc-41d3-b86d-5467-e584edc61dab" INSTANCE_FLAVOR_ID_1 = "1" INSTANCE_FLAVOR_ID_2 = "performance2-120" @@ -36,16 +36,16 @@ INSTANCE_TYPE_ID_2 = '54321' DUMMY_TIME = datetime.datetime.utcnow() DECIMAL_DUMMY_TIME = dt.dt_to_decimal(DUMMY_TIME) -MESSAGE_ID_1 = "7f28f81b-29a2-43f2-9ba1-ccb3e53ab6c8" -MESSAGE_ID_2 = "4d596126-0f04-4329-865f-7b9a7bd69bcf" -MESSAGE_ID_3 = "4d596126-0f04-4329-865f-797387adf45c" -MESSAGE_ID_4 = "4d596126-0f04-4329-865f-797387adf45e" +MESSAGE_ID_1 = "4444dddd-29a2-43f2-9ba1-ccb3e53ab6c8" +MESSAGE_ID_2 = "5555eeee-0f04-4329-865f-7b9a7bd69bcf" +MESSAGE_ID_3 = "6666ffff-0f04-4329-865f-797387adf45c" +MESSAGE_ID_4 = "7777aaaa-0f04-4329-865f-797387adf45e" BANDWIDTH_PUBLIC_OUTBOUND = 1697240969 -REQUEST_ID_1 = 'req-611a4d70-9e47-4b27-a95e-27996cc40c06' -REQUEST_ID_2 = 'req-a951dec0-52ee-425d-9f56-d68bd1ad00ac' -REQUEST_ID_3 = 'req-039a33f7-5849-4406-8166-4db8cd085f52' +REQUEST_ID_1 = 'req-8888bbbb-9e47-4b27-a95e-27996cc40c06' +REQUEST_ID_2 = 'req-9999cccc-52ee-425d-9f56-d68bd1ad00ac' +REQUEST_ID_3 = 'req-0000dddd-5849-4406-8166-4db8cd085f52' RAX_OPTIONS_1 = '1' RAX_OPTIONS_2 = '2'