)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a4a154c3bce9bba1c5ac0a8fc418194b19d83c90","unresolved":false,"context_lines":[{"line_number":11,"context_line":"the instance record and if so, we need to go ahead and commit the quota"},{"line_number":12,"context_line":"decrement reservations. We\u0027re currently skipping the quotas.commit() if"},{"line_number":13,"context_line":"we *don\u0027t* find the instance record. I believe this is a regression as of"},{"line_number":14,"context_line":"commit 361b88383130be8da9d474d02a9f62136239d506."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"There are two reasons why we may fail to find the instance record after"},{"line_number":17,"context_line":"we successfully found the build request:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"3f79a3b5_eef82e4a","line":14,"range":{"start_line":14,"start_character":7,"end_line":14,"end_character":47},"updated":"2018-08-08 22:27:44.000000000","message":"Heh, which was a regression where we were decrementing too much.","commit_id":"39d87eac61544dbf8986c199106e53972b1aad22"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"38c9ac600c7fb62bfd46882fee4f30241cf65bf9","unresolved":false,"context_lines":[{"line_number":11,"context_line":"the instance record and if so, we need to go ahead and commit the quota"},{"line_number":12,"context_line":"decrement reservations. We\u0027re currently skipping the quotas.commit() if"},{"line_number":13,"context_line":"we *don\u0027t* find the instance record. I believe this is a regression as of"},{"line_number":14,"context_line":"commit 361b88383130be8da9d474d02a9f62136239d506."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"There are two reasons why we may fail to find the instance record after"},{"line_number":17,"context_line":"we successfully found the build request:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"3f79a3b5_c9020cb5","line":14,"range":{"start_line":14,"start_character":7,"end_line":14,"end_character":47},"in_reply_to":"3f79a3b5_eef82e4a","updated":"2018-08-08 22:46:45.000000000","message":"Heh, yup.","commit_id":"39d87eac61544dbf8986c199106e53972b1aad22"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a4a154c3bce9bba1c5ac0a8fc418194b19d83c90","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"  a) Conductor didn\u0027t create the instance record yet."},{"line_number":20,"context_line":"  b) Conductor deleted the instance record after finding the build"},{"line_number":21,"context_line":"     request was deleted by us (in the _delete_while_booting method)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"In either case, conductor doesn\u0027t do anything to decrement quota usage"},{"line_number":24,"context_line":"so we need to do it in the compute/api."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"3f79a3b5_4e9fe202","line":21,"range":{"start_line":21,"start_character":39,"end_line":21,"end_character":60},"updated":"2018-08-08 22:27:44.000000000","message":"Technically _attempt_delete_of_buildrequest but alas.","commit_id":"39d87eac61544dbf8986c199106e53972b1aad22"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"38c9ac600c7fb62bfd46882fee4f30241cf65bf9","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"  a) Conductor didn\u0027t create the instance record yet."},{"line_number":20,"context_line":"  b) Conductor deleted the instance record after finding the build"},{"line_number":21,"context_line":"     request was deleted by us (in the _delete_while_booting method)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"In either case, conductor doesn\u0027t do anything to decrement quota usage"},{"line_number":24,"context_line":"so we need to do it in the compute/api."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"3f79a3b5_e9fd88b1","line":21,"range":{"start_line":21,"start_character":39,"end_line":21,"end_character":60},"in_reply_to":"3f79a3b5_4e9fe202","updated":"2018-08-08 22:46:45.000000000","message":"Bah!","commit_id":"39d87eac61544dbf8986c199106e53972b1aad22"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"a1878d68ea8d5f7fa2329f8f9964995079fcda56","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"  a) Conductor didn\u0027t create the instance record yet."},{"line_number":20,"context_line":"  b) Conductor deleted the instance record after finding the build"},{"line_number":21,"context_line":"     request was deleted by us (in the _delete_while_booting method)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"In either case, conductor doesn\u0027t do anything to decrement quota usage"},{"line_number":24,"context_line":"so we need to do it in the compute/api."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"3f79a3b5_09e7a414","line":21,"range":{"start_line":21,"start_character":39,"end_line":21,"end_character":60},"in_reply_to":"3f79a3b5_e9fd88b1","updated":"2018-08-08 22:48:13.000000000","message":"Okay, so _attempt_delete_of_buildrequest is called from _delete_while_booting. I\u0027ll just make it say \"in the API\" since that\u0027s the important part.","commit_id":"39d87eac61544dbf8986c199106e53972b1aad22"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a4a154c3bce9bba1c5ac0a8fc418194b19d83c90","unresolved":false,"context_lines":[{"line_number":31,"context_line":"     request was deleted by us but after we looked up the instance"},{"line_number":32,"context_line":"  b) If we (the API) are racing with another delete request"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"If a) happens, we need to quotas.commit(). If b) happens, we need to"},{"line_number":35,"context_line":"quotas.rollback(). Since we can\u0027t know which case it was when we get"},{"line_number":36,"context_line":"InstanceNotFound, we\u0027ll do a quotas.rollback() to get rid of the"},{"line_number":37,"context_line":"reservation record and force a refresh of quota usages to make sure"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"3f79a3b5_6ea2de4d","line":34,"range":{"start_line":34,"start_character":3,"end_line":34,"end_character":6},"updated":"2018-08-08 22:27:44.000000000","message":"Which (a)? You have 2 (a)s above.","commit_id":"39d87eac61544dbf8986c199106e53972b1aad22"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"38c9ac600c7fb62bfd46882fee4f30241cf65bf9","unresolved":false,"context_lines":[{"line_number":31,"context_line":"     request was deleted by us but after we looked up the instance"},{"line_number":32,"context_line":"  b) If we (the API) are racing with another delete request"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"If a) happens, we need to quotas.commit(). If b) happens, we need to"},{"line_number":35,"context_line":"quotas.rollback(). Since we can\u0027t know which case it was when we get"},{"line_number":36,"context_line":"InstanceNotFound, we\u0027ll do a quotas.rollback() to get rid of the"},{"line_number":37,"context_line":"reservation record and force a refresh of quota usages to make sure"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"3f79a3b5_a931d0a4","line":34,"range":{"start_line":34,"start_character":3,"end_line":34,"end_character":6},"in_reply_to":"3f79a3b5_6ea2de4d","updated":"2018-08-08 22:46:45.000000000","message":"Yeah, I wrote up the second part some time after the first. Will fix.","commit_id":"39d87eac61544dbf8986c199106e53972b1aad22"}],"nova/compute/api.py":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"cab806622482323eb12c541a73a52c6ce3b05206","unresolved":false,"context_lines":[{"line_number":1779,"context_line":"                # deleted after the lookup. If this happens, it means we\u0027re"},{"line_number":1780,"context_line":"                # racing with another delete request, so we should rollback"},{"line_number":1781,"context_line":"                # quota here instead of committing it."},{"line_number":1782,"context_line":"                quotas.rollback()"},{"line_number":1783,"context_line":""},{"line_number":1784,"context_line":"            return True"},{"line_number":1785,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_80986acb","line":1782,"updated":"2018-07-25 17:39:05.000000000","message":"Thinking about this more, we could also get InstanceNotFound during instance.destroy() if conductor deleted the instance record after getting BuildRequestNotFound while trying to delete the build request. In that case, we need to quotas.commit() here. But how can we tell which it was? :(","commit_id":"41068ac96ab101e01ca207ed003bfe549a96f413"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"6493b9ccb1cb011c6cc12289078823dd318a30dd","unresolved":false,"context_lines":[{"line_number":1779,"context_line":"                # deleted after the lookup. If this happens, it means we\u0027re"},{"line_number":1780,"context_line":"                # racing with another delete request, so we should rollback"},{"line_number":1781,"context_line":"                # quota here instead of committing it."},{"line_number":1782,"context_line":"                quotas.rollback()"},{"line_number":1783,"context_line":""},{"line_number":1784,"context_line":"            return True"},{"line_number":1785,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_60ff4eb1","line":1782,"in_reply_to":"5f7c97a3_80986acb","updated":"2018-07-25 17:44:01.000000000","message":"Maybe what we could do here instead is call quota_usage_refresh to force a refresh.","commit_id":"41068ac96ab101e01ca207ed003bfe549a96f413"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a4a154c3bce9bba1c5ac0a8fc418194b19d83c90","unresolved":false,"context_lines":[{"line_number":1743,"context_line":"                                               instance.task_state,"},{"line_number":1744,"context_line":"                                               project_id, user_id)"},{"line_number":1745,"context_line":"            try:"},{"line_number":1746,"context_line":"                # NOTE(alaski): Though the conductor halts the build process it"},{"line_number":1747,"context_line":"                # does not currently delete the instance record. This is"},{"line_number":1748,"context_line":"                # because in the near future the instance record will not be"},{"line_number":1749,"context_line":"                # created if the buildrequest has been deleted here. For now we"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_ceabf21a","side":"PARENT","line":1746,"updated":"2018-08-08 22:27:44.000000000","message":"This note should probably also go away on master, since it\u0027s super old at this point.\n\nhttps://github.com/openstack/nova/blob/c18b1c1bd646d7cefa3d3e4b25ce59460d1a6ebc/nova/compute/api.py#L1816","commit_id":"3120f40f636ab4cbdcb9f5cd4e9175e99e1e1c63"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a4a154c3bce9bba1c5ac0a8fc418194b19d83c90","unresolved":false,"context_lines":[{"line_number":1778,"context_line":"                # We need to either rollback or commit here to get rid of the"},{"line_number":1779,"context_line":"                # reservation record, in any case."},{"line_number":1780,"context_line":"                quotas.rollback()"},{"line_number":1781,"context_line":"                # InstanceNotFound could also be raised by instance.destroy()"},{"line_number":1782,"context_line":"                # if conductor deleted the instance record after we looked it"},{"line_number":1783,"context_line":"                # up but before we attempted to destroy it. If that happened,"},{"line_number":1784,"context_line":"                # the correct thing to do would be to commit the reservations"},{"line_number":1785,"context_line":"                # instead of rolling them back. Since we can\u0027t differentiate"},{"line_number":1786,"context_line":"                # between the two scenarios for InstanceNotFound, refresh the"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_4e46027f","line":1783,"range":{"start_line":1781,"start_character":16,"end_line":1783,"end_character":59},"updated":"2018-08-08 22:27:44.000000000","message":"You basically said the same thing on L1774 right?","commit_id":"39d87eac61544dbf8986c199106e53972b1aad22"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"38c9ac600c7fb62bfd46882fee4f30241cf65bf9","unresolved":false,"context_lines":[{"line_number":1778,"context_line":"                # We need to either rollback or commit here to get rid of the"},{"line_number":1779,"context_line":"                # reservation record, in any case."},{"line_number":1780,"context_line":"                quotas.rollback()"},{"line_number":1781,"context_line":"                # InstanceNotFound could also be raised by instance.destroy()"},{"line_number":1782,"context_line":"                # if conductor deleted the instance record after we looked it"},{"line_number":1783,"context_line":"                # up but before we attempted to destroy it. If that happened,"},{"line_number":1784,"context_line":"                # the correct thing to do would be to commit the reservations"},{"line_number":1785,"context_line":"                # instead of rolling them back. Since we can\u0027t differentiate"},{"line_number":1786,"context_line":"                # between the two scenarios for InstanceNotFound, refresh the"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_e9682888","line":1783,"range":{"start_line":1781,"start_character":16,"end_line":1783,"end_character":59},"in_reply_to":"3f79a3b5_4e46027f","updated":"2018-08-08 22:46:45.000000000","message":"It sounds like it, but no, what I meant to point out is the difference between two racing deletes instance.destroy()ing vs conductor instance.destroy()ed during a create racing with a delete. I\u0027ll try to word it better.","commit_id":"39d87eac61544dbf8986c199106e53972b1aad22"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a4a154c3bce9bba1c5ac0a8fc418194b19d83c90","unresolved":false,"context_lines":[{"line_number":1787,"context_line":"                # quota usage for instances to clean things up if rollback()"},{"line_number":1788,"context_line":"                # wasn\u0027t the right choice."},{"line_number":1789,"context_line":"                quota.QUOTAS.usage_refresh(context,"},{"line_number":1790,"context_line":"                                           resource_names\u003d[\u0027instances\u0027])"},{"line_number":1791,"context_line":""},{"line_number":1792,"context_line":"            return True"},{"line_number":1793,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_ce07721c","line":1790,"range":{"start_line":1790,"start_character":60,"end_line":1790,"end_character":69},"updated":"2018-08-08 22:27:44.000000000","message":"Don\u0027t you also need \u0027cores\u0027 and \u0027ram\u0027 in here? _create_reservations creates reservations on instances, cores and ram. You likely missed this because the functional test is only counting instances.","commit_id":"39d87eac61544dbf8986c199106e53972b1aad22"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"38c9ac600c7fb62bfd46882fee4f30241cf65bf9","unresolved":false,"context_lines":[{"line_number":1787,"context_line":"                # quota usage for instances to clean things up if rollback()"},{"line_number":1788,"context_line":"                # wasn\u0027t the right choice."},{"line_number":1789,"context_line":"                quota.QUOTAS.usage_refresh(context,"},{"line_number":1790,"context_line":"                                           resource_names\u003d[\u0027instances\u0027])"},{"line_number":1791,"context_line":""},{"line_number":1792,"context_line":"            return True"},{"line_number":1793,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_a908f0d8","line":1790,"range":{"start_line":1790,"start_character":60,"end_line":1790,"end_character":69},"in_reply_to":"3f79a3b5_ce07721c","updated":"2018-08-08 22:46:45.000000000","message":"Yes, excellent catch. I missed it.","commit_id":"39d87eac61544dbf8986c199106e53972b1aad22"}],"nova/tests/functional/regressions/test_bug_1783613.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a4a154c3bce9bba1c5ac0a8fc418194b19d83c90","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        # Now check the quota again. Since the bug is fixed, ending usage"},{"line_number":122,"context_line":"        # should be current usage - 1."},{"line_number":123,"context_line":"        ending_usage \u003d self.api.get_limits()"},{"line_number":124,"context_line":"        self.assertEqual(current_usage[\u0027absolute\u0027][\u0027totalInstancesUsed\u0027] - 1,"},{"line_number":125,"context_line":"                         ending_usage[\u0027absolute\u0027][\u0027totalInstancesUsed\u0027])"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    def test_delete_while_booting_instance_destroy_fails(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_89ff3400","line":124,"updated":"2018-08-08 22:27:44.000000000","message":"Should also look at totalRAMUsed and totalCoresUsed.","commit_id":"39d87eac61544dbf8986c199106e53972b1aad22"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a4a154c3bce9bba1c5ac0a8fc418194b19d83c90","unresolved":false,"context_lines":[{"line_number":156,"context_line":"        # Now check the quota again. Since the bug is fixed, ending usage"},{"line_number":157,"context_line":"        # should be current usage - 1."},{"line_number":158,"context_line":"        ending_usage \u003d self.api.get_limits()"},{"line_number":159,"context_line":"        self.assertEqual(current_usage[\u0027absolute\u0027][\u0027totalInstancesUsed\u0027] - 1,"},{"line_number":160,"context_line":"                         ending_usage[\u0027absolute\u0027][\u0027totalInstancesUsed\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_49091c2a","line":159,"updated":"2018-08-08 22:27:44.000000000","message":"Should also look at totalRAMUsed and totalCoresUsed.","commit_id":"39d87eac61544dbf8986c199106e53972b1aad22"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3326c7675abb9aff48c8c6026868e74ee6cbfdf6","unresolved":false,"context_lines":[{"line_number":103,"context_line":"                          flavorRef\u003dself.flavor_id)"},{"line_number":104,"context_line":"        server \u003d self.api.post_server({\u0027server\u0027: server_req})"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        # Check quota to see we\u0027ve incremented usage by 1."},{"line_number":107,"context_line":"        current_usage \u003d self.api.get_limits()"},{"line_number":108,"context_line":"        self.assertEqual(starting_usage[\u0027absolute\u0027][\u0027totalInstancesUsed\u0027] + 1,"},{"line_number":109,"context_line":"                         current_usage[\u0027absolute\u0027][\u0027totalInstancesUsed\u0027])"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_3fb2cee7","line":106,"range":{"start_line":106,"start_character":53,"end_line":106,"end_character":57},"updated":"2018-08-09 02:06:11.000000000","message":"nit: remove this since it\u0027s more than just instances","commit_id":"456b3d68bc491a6965316e6a4f3fc11dd509237b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3326c7675abb9aff48c8c6026868e74ee6cbfdf6","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        current_usage \u003d self.api.get_limits()"},{"line_number":108,"context_line":"        self.assertEqual(starting_usage[\u0027absolute\u0027][\u0027totalInstancesUsed\u0027] + 1,"},{"line_number":109,"context_line":"                         current_usage[\u0027absolute\u0027][\u0027totalInstancesUsed\u0027])"},{"line_number":110,"context_line":"        self.assertEqual(starting_usage[\u0027absolute\u0027][\u0027totalCoresUsed\u0027] + 1,"},{"line_number":111,"context_line":"                         current_usage[\u0027absolute\u0027][\u0027totalCoresUsed\u0027])"},{"line_number":112,"context_line":"        self.assertEqual(starting_usage[\u0027absolute\u0027][\u0027totalRAMUsed\u0027] + 512,"},{"line_number":113,"context_line":"                         current_usage[\u0027absolute\u0027][\u0027totalRAMUsed\u0027])"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        # Stub out the API to make the instance lookup fail, simulating if"},{"line_number":116,"context_line":"        # conductor hadn\u0027t yet created it yet or deleted it after the build"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_9fbbe2c2","line":113,"range":{"start_line":110,"start_character":8,"end_line":113,"end_character":67},"updated":"2018-08-09 02:06:11.000000000","message":"nit: I\u0027d actually get the values off the flavor you\u0027re using, but these should be predictable ordering on the flavors we get back so it\u0027s probably OK.","commit_id":"456b3d68bc491a6965316e6a4f3fc11dd509237b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3326c7675abb9aff48c8c6026868e74ee6cbfdf6","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        self._wait_for_instance_delete(server[\u0027id\u0027])"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"        # Now check the quota again. Since the bug is fixed, ending usage"},{"line_number":126,"context_line":"        # should be current usage - 1."},{"line_number":127,"context_line":"        ending_usage \u003d self.api.get_limits()"},{"line_number":128,"context_line":"        self.assertEqual(current_usage[\u0027absolute\u0027][\u0027totalInstancesUsed\u0027] - 1,"},{"line_number":129,"context_line":"                         ending_usage[\u0027absolute\u0027][\u0027totalInstancesUsed\u0027])"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_5fb54acc","line":126,"range":{"start_line":126,"start_character":33,"end_line":126,"end_character":37},"updated":"2018-08-09 02:06:11.000000000","message":"nit: similar","commit_id":"456b3d68bc491a6965316e6a4f3fc11dd509237b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3326c7675abb9aff48c8c6026868e74ee6cbfdf6","unresolved":false,"context_lines":[{"line_number":140,"context_line":"                          flavorRef\u003dself.flavor_id)"},{"line_number":141,"context_line":"        server \u003d self.api.post_server({\u0027server\u0027: server_req})"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        # Check quota to see we\u0027ve incremented usage by 1."},{"line_number":144,"context_line":"        current_usage \u003d self.api.get_limits()"},{"line_number":145,"context_line":"        self.assertEqual(starting_usage[\u0027absolute\u0027][\u0027totalInstancesUsed\u0027] + 1,"},{"line_number":146,"context_line":"                         current_usage[\u0027absolute\u0027][\u0027totalInstancesUsed\u0027])"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_1fc7d247","line":143,"range":{"start_line":143,"start_character":53,"end_line":143,"end_character":57},"updated":"2018-08-09 02:06:11.000000000","message":"same","commit_id":"456b3d68bc491a6965316e6a4f3fc11dd509237b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3326c7675abb9aff48c8c6026868e74ee6cbfdf6","unresolved":false,"context_lines":[{"line_number":166,"context_line":"        self._wait_for_instance_delete(server[\u0027id\u0027])"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"        # Now check the quota again. Since the bug is fixed, ending usage"},{"line_number":169,"context_line":"        # should be current usage - 1."},{"line_number":170,"context_line":"        ending_usage \u003d self.api.get_limits()"},{"line_number":171,"context_line":"        self.assertEqual(current_usage[\u0027absolute\u0027][\u0027totalInstancesUsed\u0027] - 1,"},{"line_number":172,"context_line":"                         ending_usage[\u0027absolute\u0027][\u0027totalInstancesUsed\u0027])"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_bfc57e3e","line":169,"range":{"start_line":169,"start_character":33,"end_line":169,"end_character":37},"updated":"2018-08-09 02:06:11.000000000","message":"derp","commit_id":"456b3d68bc491a6965316e6a4f3fc11dd509237b"}],"nova/tests/unit/compute/test_compute_api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a4a154c3bce9bba1c5ac0a8fc418194b19d83c90","unresolved":false,"context_lines":[{"line_number":1490,"context_line":"                                                       inst))"},{"line_number":1491,"context_line":"            self.assertFalse(quota_mock.commit.called)"},{"line_number":1492,"context_line":"            self.assertTrue(quota_mock.rollback.called)"},{"line_number":1493,"context_line":"            self.assertTrue(mock_refresh.called)"},{"line_number":1494,"context_line":""},{"line_number":1495,"context_line":"        test()"},{"line_number":1496,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_290e2032","line":1493,"range":{"start_line":1493,"start_character":12,"end_line":1493,"end_character":48},"updated":"2018-08-08 22:27:44.000000000","message":"Would be better to use mock_refresh.assert_called_once_with(...) probably.","commit_id":"39d87eac61544dbf8986c199106e53972b1aad22"}]}
