)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"8cc594e7e7fddcb161a59f4082acabb194c58eeb","unresolved":false,"context_lines":[{"line_number":13,"context_line":"from the database."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"The ResourceProvider object hash is changed without updating the"},{"line_number":16,"context_line":"version because no ResourceProviders are yet used over RPC."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: Icf0874e00bbee23aa805349e08273be09160c0de"},{"line_number":19,"context_line":"Partially-Implements: blueprint generic-resource-pools"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"1aa78d24_3958ef55","line":16,"updated":"2016-07-06 23:20:17.000000000","message":"So, I don\u0027t think this is correct. And I may have let more of these slip than needed in recent patches. But we\u0027re creating ResourceProvider objects in ComputeNode.create_inventory() from the compute node. That means we most certainly are using these over RPC and thus need to be respecting the rules here.\n\nJay\u0027s almost-deletion of that code had me thinking we were safe I think, but it\u0027s still in tree and still used, which means we\u0027re on the clock.","commit_id":"a4ea897b911c819b51b68b50493b9dc1f12a891b"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"78484209b96f399484b0aeff7b11ff5b1a1fe776","unresolved":false,"context_lines":[{"line_number":13,"context_line":"from the database."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"The ResourceProvider object hash is changed without updating the"},{"line_number":16,"context_line":"version because no ResourceProviders are yet used over RPC."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: Icf0874e00bbee23aa805349e08273be09160c0de"},{"line_number":19,"context_line":"Partially-Implements: blueprint generic-resource-pools"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"1aa78d24_40c95bab","line":16,"in_reply_to":"1aa78d24_3958ef55","updated":"2016-07-07 14:17:29.000000000","message":"roger","commit_id":"a4ea897b911c819b51b68b50493b9dc1f12a891b"}],"nova/exception.py":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4a070f640434f1eb88612e3c7401cf80cfc05503","unresolved":false,"context_lines":[{"line_number":2087,"context_line":""},{"line_number":2088,"context_line":""},{"line_number":2089,"context_line":"class ResourceProviderInUse(NovaException):"},{"line_number":2090,"context_line":"    msg_fmt \u003d _(\"Resource provider has allocations.\")"},{"line_number":2091,"context_line":""},{"line_number":2092,"context_line":""},{"line_number":2093,"context_line":"class UnsupportedPointerModelRequested(Invalid):"}],"source_content_type":"text/x-python","patch_set":2,"id":"1aa78d24_949aa66c","line":2090,"range":{"start_line":2090,"start_character":35,"end_line":2090,"end_character":51},"updated":"2016-07-06 14:44:11.000000000","message":"super femtonit: I\u0027d enforce that saying \"RP already has allocations.\"","commit_id":"6669fbd3866031f256a02752296081a7aa609727"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"246176bd007bb81437c1183e4edb0e958c71711e","unresolved":false,"context_lines":[{"line_number":2087,"context_line":""},{"line_number":2088,"context_line":""},{"line_number":2089,"context_line":"class ResourceProviderInUse(NovaException):"},{"line_number":2090,"context_line":"    msg_fmt \u003d _(\"Resource provider has allocations.\")"},{"line_number":2091,"context_line":""},{"line_number":2092,"context_line":""},{"line_number":2093,"context_line":"class UnsupportedPointerModelRequested(Invalid):"}],"source_content_type":"text/x-python","patch_set":2,"id":"1aa78d24_c1a2adad","line":2090,"in_reply_to":"1aa78d24_949aa66c","updated":"2016-07-06 15:32:19.000000000","message":"I don\u0027t think \"already\" would be grammatically correct here as that implies the exception is in response to try to add allocations and that is causing a conflict. This error happens in two different situations:\n\n* a resource provider destroy is attempted while there are existing allocations\n* a resource provider has its inventory updated in a way that would conflict with existing alloctions (for example total is lowered below usage or a class of inventory is entirely removed from a provider).","commit_id":"6669fbd3866031f256a02752296081a7aa609727"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"a16c4234b70c268b5ccf3ae4117f11545323aaec","unresolved":false,"context_lines":[{"line_number":2087,"context_line":""},{"line_number":2088,"context_line":""},{"line_number":2089,"context_line":"class ResourceProviderInUse(NovaException):"},{"line_number":2090,"context_line":"    msg_fmt \u003d _(\"Resource provider has allocations.\")"},{"line_number":2091,"context_line":""},{"line_number":2092,"context_line":""},{"line_number":2093,"context_line":"class UnsupportedPointerModelRequested(Invalid):"}],"source_content_type":"text/x-python","patch_set":2,"id":"1aa78d24_bc1ea46d","line":2090,"in_reply_to":"1aa78d24_c1a2adad","updated":"2016-07-06 15:53:30.000000000","message":"K, fair enough. I don\u0027t want to teach English here ;-)","commit_id":"6669fbd3866031f256a02752296081a7aa609727"}],"nova/objects/resource_provider.py":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4a070f640434f1eb88612e3c7401cf80cfc05503","unresolved":false,"context_lines":[{"line_number":45,"context_line":"              .filter(models.ResourceProvider.id \u003d\u003d _id).delete())"},{"line_number":46,"context_line":"    if not result:"},{"line_number":47,"context_line":"        raise exception.NotFound()"},{"line_number":48,"context_line":"    (context.session.query(models.Inventory)"},{"line_number":49,"context_line":"     .filter(models.Inventory.resource_provider_id \u003d\u003d _id).delete())"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"@db_api.api_context_manager.writer"}],"source_content_type":"text/x-python","patch_set":2,"id":"1aa78d24_f4320a0f","line":49,"range":{"start_line":48,"start_character":0,"end_line":49,"end_character":68},"updated":"2016-07-06 14:44:11.000000000","message":"What if we have an exception for deleting all the related inventories but then the RP is already deleted ? We could be a bit more defensive, nope ? At least, we should first try to delete the related inventories before deleting the FK.","commit_id":"6669fbd3866031f256a02752296081a7aa609727"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"246176bd007bb81437c1183e4edb0e958c71711e","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    if not result:"},{"line_number":47,"context_line":"        raise exception.NotFound()"},{"line_number":48,"context_line":"    (context.session.query(models.Inventory)"},{"line_number":49,"context_line":"     .filter(models.Inventory.resource_provider_id \u003d\u003d _id).delete())"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"@db_api.api_context_manager.writer"}],"source_content_type":"text/x-python","patch_set":2,"id":"1aa78d24_4197dd47","line":49,"in_reply_to":"1aa78d24_f4320a0f","updated":"2016-07-06 15:32:19.000000000","message":"Will change, thanks.","commit_id":"6669fbd3866031f256a02752296081a7aa609727"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4a070f640434f1eb88612e3c7401cf80cfc05503","unresolved":false,"context_lines":[{"line_number":288,"context_line":"        db_rp \u003d self._create_in_db(self._context, updates)"},{"line_number":289,"context_line":"        self._from_db_object(self._context, self, db_rp)"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    @base.remotable"},{"line_number":292,"context_line":"    def destroy(self):"},{"line_number":293,"context_line":"        self._delete(self._context, self.id)"},{"line_number":294,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1aa78d24_68463e50","line":291,"updated":"2016-07-06 14:44:11.000000000","message":"Look how we\u0027re fortunate to not yet use the ResourceProvider object...","commit_id":"6669fbd3866031f256a02752296081a7aa609727"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"8cc594e7e7fddcb161a59f4082acabb194c58eeb","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        raise exception.ResourceProviderInUse()"},{"line_number":44,"context_line":"    # Delete any inventory associated with the resource provider"},{"line_number":45,"context_line":"    (context.session.query(models.Inventory)"},{"line_number":46,"context_line":"     .filter(models.Inventory.resource_provider_id \u003d\u003d _id).delete())"},{"line_number":47,"context_line":"    result \u003d (context.session.query(models.ResourceProvider)"},{"line_number":48,"context_line":"              .filter(models.ResourceProvider.id \u003d\u003d _id).delete())"},{"line_number":49,"context_line":"    if not result:"}],"source_content_type":"text/x-python","patch_set":3,"id":"1aa78d24_b99e9f04","line":46,"updated":"2016-07-06 23:20:17.000000000","message":"You can break the line after .filter( and would certainly prefer that you do, instead of what you have here.","commit_id":"a4ea897b911c819b51b68b50493b9dc1f12a891b"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"1e29355bc7ebb4ea13a7077c4dda5de07ecd36ee","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        raise exception.ResourceProviderInUse()"},{"line_number":44,"context_line":"    # Delete any inventory associated with the resource provider"},{"line_number":45,"context_line":"    (context.session.query(models.Inventory)"},{"line_number":46,"context_line":"     .filter(models.Inventory.resource_provider_id \u003d\u003d _id).delete())"},{"line_number":47,"context_line":"    result \u003d (context.session.query(models.ResourceProvider)"},{"line_number":48,"context_line":"              .filter(models.ResourceProvider.id \u003d\u003d _id).delete())"},{"line_number":49,"context_line":"    if not result:"}],"source_content_type":"text/x-python","patch_set":3,"id":"1aa78d24_94fc21b9","line":46,"in_reply_to":"1aa78d24_b99e9f04","updated":"2016-07-07 15:10:59.000000000","message":"Agreed, let\u0027s avoid any confusion with tuples here (\u003c3 Python where (a)\u003d\u003da vs. (a,) !\u003d a)","commit_id":"a4ea897b911c819b51b68b50493b9dc1f12a891b"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"8cc594e7e7fddcb161a59f4082acabb194c58eeb","unresolved":false,"context_lines":[{"line_number":344,"context_line":"        return _create_rp_in_db(context, updates)"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"    @staticmethod"},{"line_number":347,"context_line":"    def _delete(context, id):"},{"line_number":348,"context_line":"        _delete_rp_from_db(context, id)"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":3,"id":"1aa78d24_59c21bea","line":347,"updated":"2016-07-06 23:20:17.000000000","message":"Didn\u0027t we say we were going to stop doing this now that the oslo bug is fixed?","commit_id":"a4ea897b911c819b51b68b50493b9dc1f12a891b"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"78484209b96f399484b0aeff7b11ff5b1a1fe776","unresolved":false,"context_lines":[{"line_number":344,"context_line":"        return _create_rp_in_db(context, updates)"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"    @staticmethod"},{"line_number":347,"context_line":"    def _delete(context, id):"},{"line_number":348,"context_line":"        _delete_rp_from_db(context, id)"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":3,"id":"1aa78d24_a0b3df4b","line":347,"in_reply_to":"1aa78d24_59c21bea","updated":"2016-07-07 14:17:29.000000000","message":"Yes, but I was shooting for consistency with the other stuff already in this object. I can:\n\n* leave it as it is\n* change it for just this one\n* change it for just this one and in a followup change all the others back to the norm\n\nYour preference?","commit_id":"a4ea897b911c819b51b68b50493b9dc1f12a891b"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"1e29355bc7ebb4ea13a7077c4dda5de07ecd36ee","unresolved":false,"context_lines":[{"line_number":344,"context_line":"        return _create_rp_in_db(context, updates)"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"    @staticmethod"},{"line_number":347,"context_line":"    def _delete(context, id):"},{"line_number":348,"context_line":"        _delete_rp_from_db(context, id)"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":3,"id":"1aa78d24_d4f069cb","line":347,"in_reply_to":"1aa78d24_a0b3df4b","updated":"2016-07-07 15:10:59.000000000","message":"I think we can avoid reproducing that pattern, please.","commit_id":"a4ea897b911c819b51b68b50493b9dc1f12a891b"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"63ddf21e976cf6d1f1b68c9da9619d7adff59537","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    # Don\u0027t delete the resource provider if it has allocations."},{"line_number":39,"context_line":"    rp_allocations \u003d ("},{"line_number":40,"context_line":"        context.session.query(models.Allocation)"},{"line_number":41,"context_line":"        .filter(models.Allocation.resource_provider_id \u003d\u003d _id).all())"},{"line_number":42,"context_line":"    if rp_allocations:"},{"line_number":43,"context_line":"        raise exception.ResourceProviderInUse()"},{"line_number":44,"context_line":"    # Delete any inventory associated with the resource provider"}],"source_content_type":"text/x-python","patch_set":4,"id":"1aa78d24_4b75ea61","line":41,"updated":"2016-07-07 19:00:28.000000000","message":"How about we not return all allocations in the database for a resource provider and instead do a COUNT(*) query and just return whether any records exist? :)","commit_id":"83bf54716b283e9bdd1376fdd7fe3ce4294a49a2"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"63ddf21e976cf6d1f1b68c9da9619d7adff59537","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        raise exception.ResourceProviderInUse()"},{"line_number":44,"context_line":"    # Delete any inventory associated with the resource provider"},{"line_number":45,"context_line":"    (context.session.query(models.Inventory)"},{"line_number":46,"context_line":"     .filter(models.Inventory.resource_provider_id \u003d\u003d _id).delete())"},{"line_number":47,"context_line":"    result \u003d (context.session.query(models.ResourceProvider)"},{"line_number":48,"context_line":"              .filter(models.ResourceProvider.id \u003d\u003d _id).delete())"},{"line_number":49,"context_line":"    if not result:"}],"source_content_type":"text/x-python","patch_set":4,"id":"1aa78d24_2b705e71","line":46,"updated":"2016-07-07 19:00:28.000000000","message":"Just a style complaint here, but I find the use of containing parens here offputting. Something like this is more readable IMHO:\n\n where_expr \u003d (models.Inventory.resource_provider_id \u003d\u003d _id)\n query \u003d context.session.query(models.Inventory).filter(*where_expr)\n query.delete()\n\n where_expr \u003d (models.ResourceProvider.id \u003d\u003d _id)\n query \u003d context.session.query(models.ResourceProvider).filter(*where_expr)\n if not query.delete():\n      raise ...","commit_id":"83bf54716b283e9bdd1376fdd7fe3ce4294a49a2"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d94dfada7995f7f3ecaa8596e2f991356c9a7135","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        raise exception.ResourceProviderInUse()"},{"line_number":44,"context_line":"    # Delete any inventory associated with the resource provider"},{"line_number":45,"context_line":"    (context.session.query(models.Inventory)"},{"line_number":46,"context_line":"     .filter(models.Inventory.resource_provider_id \u003d\u003d _id).delete())"},{"line_number":47,"context_line":"    result \u003d (context.session.query(models.ResourceProvider)"},{"line_number":48,"context_line":"              .filter(models.ResourceProvider.id \u003d\u003d _id).delete())"},{"line_number":49,"context_line":"    if not result:"}],"source_content_type":"text/x-python","patch_set":4,"id":"1aa78d24_c107fbc7","line":46,"in_reply_to":"1aa78d24_2b705e71","updated":"2016-07-07 19:43:14.000000000","message":"I hate them too. I\u0027m glad you spoke up.","commit_id":"83bf54716b283e9bdd1376fdd7fe3ce4294a49a2"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"a1fbf0b5f09197e725427ce9aff3c46fd9ce9c17","unresolved":false,"context_lines":[{"line_number":266,"context_line":"class ResourceProvider(base.NovaObject):"},{"line_number":267,"context_line":"    # Version 1.0: Initial version"},{"line_number":268,"context_line":"    # Version 1.1: Add destroy()"},{"line_number":269,"context_line":"    VERSION \u003d \u00271.1\u0027"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"    fields \u003d {"},{"line_number":272,"context_line":"        \u0027id\u0027: fields.IntegerField(read_only\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":4,"id":"1aa78d24_bc3932a6","line":269,"updated":"2016-07-07 20:02:59.000000000","message":"Chatted on IRC, dansmith is totally correct. We agreed to remove the ComputeNode.create_inventory()/update_inventory() stuff (which is the place that actually sends this object over the wire) when we submit the patch that makes the resource tracker call the new placement REST API for setting inventory.","commit_id":"83bf54716b283e9bdd1376fdd7fe3ce4294a49a2"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"63ddf21e976cf6d1f1b68c9da9619d7adff59537","unresolved":false,"context_lines":[{"line_number":266,"context_line":"class ResourceProvider(base.NovaObject):"},{"line_number":267,"context_line":"    # Version 1.0: Initial version"},{"line_number":268,"context_line":"    # Version 1.1: Add destroy()"},{"line_number":269,"context_line":"    VERSION \u003d \u00271.1\u0027"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"    fields \u003d {"},{"line_number":272,"context_line":"        \u0027id\u0027: fields.IntegerField(read_only\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":4,"id":"1aa78d24_8b6b5284","line":269,"updated":"2016-07-07 19:00:28.000000000","message":"Nothing is using the ResourceProvider object yet over the wire, so there is no need to increment the version at this time.","commit_id":"83bf54716b283e9bdd1376fdd7fe3ce4294a49a2"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d94dfada7995f7f3ecaa8596e2f991356c9a7135","unresolved":false,"context_lines":[{"line_number":266,"context_line":"class ResourceProvider(base.NovaObject):"},{"line_number":267,"context_line":"    # Version 1.0: Initial version"},{"line_number":268,"context_line":"    # Version 1.1: Add destroy()"},{"line_number":269,"context_line":"    VERSION \u003d \u00271.1\u0027"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"    fields \u003d {"},{"line_number":272,"context_line":"        \u0027id\u0027: fields.IntegerField(read_only\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":4,"id":"1aa78d24_0125835a","line":269,"in_reply_to":"1aa78d24_8b6b5284","updated":"2016-07-07 19:43:14.000000000","message":"Yes there is. Please see comments on an earlier patchset.","commit_id":"83bf54716b283e9bdd1376fdd7fe3ce4294a49a2"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"48cef3112f827c47b09ebcecc70bfb2d5c606449","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    result \u003d context.session.query(models.ResourceProvider).\\"},{"line_number":48,"context_line":"             filter(models.ResourceProvider.id \u003d\u003d _id).delete()"},{"line_number":49,"context_line":"    if not result:"},{"line_number":50,"context_line":"        raise exception.NotFound()"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"@db_api.api_context_manager.writer"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_ce0c433e","line":50,"updated":"2016-07-07 21:20:25.000000000","message":"nit, but we typically provide a specific NotFound exception for these cases.","commit_id":"2628e0b26d3653044d07b4bfe642be7e13a7ae34"}],"nova/tests/functional/db/test_resource_provider.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"63ddf21e976cf6d1f1b68c9da9619d7adff59537","unresolved":false,"context_lines":[{"line_number":128,"context_line":"                          created_resource_provider.destroy)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def test_destroy_allocated_resource_provider_fails(self):"},{"line_number":131,"context_line":"        db_rp, db_allocation \u003d self._make_allocation()"},{"line_number":132,"context_line":"        self.assertRaises(exception.ResourceProviderInUse,"},{"line_number":133,"context_line":"                          db_rp.destroy)"},{"line_number":134,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1aa78d24_6b66e6bb","line":131,"updated":"2016-07-07 19:00:28.000000000","message":"Not entirely sure why you refer to the variables as db_rp and db_allocation when they are objects.ResourceProvider and objects.Allocation not database records/resultproxies... Might be better to just name them rp and alloc to avoid confusion.","commit_id":"83bf54716b283e9bdd1376fdd7fe3ce4294a49a2"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d94dfada7995f7f3ecaa8596e2f991356c9a7135","unresolved":false,"context_lines":[{"line_number":128,"context_line":"                          created_resource_provider.destroy)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def test_destroy_allocated_resource_provider_fails(self):"},{"line_number":131,"context_line":"        db_rp, db_allocation \u003d self._make_allocation()"},{"line_number":132,"context_line":"        self.assertRaises(exception.ResourceProviderInUse,"},{"line_number":133,"context_line":"                          db_rp.destroy)"},{"line_number":134,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1aa78d24_c1d53b1c","line":131,"in_reply_to":"1aa78d24_6b66e6bb","updated":"2016-07-07 19:43:14.000000000","message":"I thought the same thing this morning when making these changes.","commit_id":"83bf54716b283e9bdd1376fdd7fe3ce4294a49a2"}]}
