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'