)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5535e45c5a5d547e2ed270779f28ac58ba645a67","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Update queued-for-delete from the ComputeAPI during deletion/restoration"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch updates queued-for-delete column in the instance_mapping"},{"line_number":10,"context_line":"table from the ComputeAPI during normal delete, force delete and"},{"line_number":11,"context_line":"soft-delete (for both local delete and cell delete) operations."},{"line_number":12,"context_line":"Note that as the name of the column suggests, it is only \"queued\""},{"line_number":13,"context_line":"for deletion and does not guarantee successful deletion of the instance."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"5f7c97a3_77f2fa07","line":10,"range":{"start_line":10,"start_character":33,"end_line":10,"end_character":60},"updated":"2018-07-11 14:37:06.000000000","message":"These are basically the same thing, it\u0027s just that force bypasses some status checks.\n\nThe three cases from the spec are:\n\n1. normal delete - the cell and compute service are up and nova-api casts to nova-compute to do the deletion; we should update the instance mapping after casting to compute\n\n2. local delete - the cell is up but the compute service is down (or the instance is shelved offloaded); in this case we call instance.destroy() in the API code - so update the instance mapping after that instance.destroy() call completes.\n\n3. soft delete - in this case, similar to #1, update the instance mapping after casting to nova-compute to complete the soft delete operation. And on restore, update the instance mapping after casting to compute to restore the instance.","commit_id":"75234103d4146f18c20af1557c0fb4bc07454e53"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"c38b9afb278e12c9390b2af9fc47a973024269db","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Update queued-for-delete from the ComputeAPI during deletion/restoration"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch updates queued-for-delete column in the instance_mapping"},{"line_number":10,"context_line":"table from the ComputeAPI during normal delete, force delete and"},{"line_number":11,"context_line":"soft-delete (for both local delete and cell delete) operations."},{"line_number":12,"context_line":"Note that as the name of the column suggests, it is only \"queued\""},{"line_number":13,"context_line":"for deletion and does not guarantee successful deletion of the instance."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"5f7c97a3_d753ce39","line":10,"range":{"start_line":10,"start_character":33,"end_line":10,"end_character":60},"in_reply_to":"5f7c97a3_77f2fa07","updated":"2018-07-13 08:47:07.000000000","message":"my reasoning was that normal/force/soft are types of delete since each of them have a separate call back and each of these types could be local (where the compute is not available/is down) which is done at the API level and normal one which is done at the cell compute level.\n\nI will update this with normal, local and soft if that\u0027s better and consistent.","commit_id":"75234103d4146f18c20af1557c0fb4bc07454e53"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5cba3eea4ca38e5b7ec108c682a85dcdfbceb6f9","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Update queued-for-delete from the ComputeAPI during deletion/restoration"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch updates queued-for-delete column in the instance_mapping"},{"line_number":10,"context_line":"table from the ComputeAPI during normal delete, force delete and"},{"line_number":11,"context_line":"soft-delete (for both local delete and cell delete) operations."},{"line_number":12,"context_line":"Note that as the name of the column suggests, it is only \"queued\""},{"line_number":13,"context_line":"for deletion and does not guarantee successful deletion of the instance."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"5f7c97a3_fa170a53","line":10,"range":{"start_line":10,"start_character":33,"end_line":10,"end_character":60},"in_reply_to":"5f7c97a3_d753ce39","updated":"2018-07-19 21:25:21.000000000","message":"Sure, I knew what you meant, it just kind of stuck out to me.","commit_id":"75234103d4146f18c20af1557c0fb4bc07454e53"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"766ec764655febde91b3df92a4496e64e9f7e354","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Update queued-for-delete from the ComputeAPI during deletion/restoration"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch updates queued-for-delete column in the instance_mapping"},{"line_number":10,"context_line":"table from the ComputeAPI during normal delete, force delete and"},{"line_number":11,"context_line":"soft-delete (for both local delete and cell delete) operations."},{"line_number":12,"context_line":"Note that as the name of the column suggests, it is only \"queued\""},{"line_number":13,"context_line":"for deletion and does not guarantee successful deletion of the instance."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"5f7c97a3_068b8468","line":10,"range":{"start_line":10,"start_character":33,"end_line":10,"end_character":60},"in_reply_to":"5f7c97a3_fa170a53","updated":"2018-07-20 09:01:16.000000000","message":"heh okay :)","commit_id":"75234103d4146f18c20af1557c0fb4bc07454e53"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fffc680aae169c01bc16f137b2b19c1dfe79c008","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Update queued-for-delete from the ComputeAPI during deletion/restoration"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch updates queued-for-delete column in the instance_mapping"},{"line_number":10,"context_line":"table from the ComputeAPI during normal delete, local delete (when"},{"line_number":11,"context_line":"the compute service is down) and soft-delete operations."},{"line_number":12,"context_line":"Note that as the name of the column suggests, it is only \"queued\""},{"line_number":13,"context_line":"for deletion and does not guarantee successful deletion of the instance."},{"line_number":14,"context_line":"Hence the value could be stale which is fine, considering its use is"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"5f7c97a3_5d3f18b1","line":11,"range":{"start_line":10,"start_character":61,"end_line":11,"end_character":28},"updated":"2018-07-19 21:34:35.000000000","message":"or for shelved offloaded instances\n\nJust being pedantic, you don\u0027t have to update this.","commit_id":"7f6fa05f66d6dd0678d3f5d86bd98bff5b9bec32"}],"nova/compute/api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5535e45c5a5d547e2ed270779f28ac58ba645a67","unresolved":false,"context_lines":[{"line_number":2130,"context_line":"            # compute service."},{"line_number":2131,"context_line":"            self.placementclient.delete_allocation_for_instance("},{"line_number":2132,"context_line":"                context, instance.uuid)"},{"line_number":2133,"context_line":"            cb(context, instance, bdms, local\u003dTrue)"},{"line_number":2134,"context_line":"            instance.destroy()"},{"line_number":2135,"context_line":""},{"line_number":2136,"context_line":"    def _update_queued_for_deletion_in_api(self, context, instance, qfd):"},{"line_number":2137,"context_line":"        # NOTE(tssurya): We query the instance_mapping record of this instance"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_57ac9e87","line":2134,"range":{"start_line":2133,"start_character":12,"end_line":2134,"end_character":30},"updated":"2018-07-11 14:37:06.000000000","message":"Hmm, so your cb (callback) here is one of the _do_*_delete methods. We could just do the _update_queued_for_deletion_in_api() call after instance.destroy() here, but we\u0027d still have to add the _update_queued_for_deletion_in_api calls in the callback methods for the local\u003dFalse cases, so it\u0027s probably easier to just leave the _update_queued_for_deletion_in_api call in the callback methods as long as it happens at the end of those methods (after the rpc cast (local\u003dFalse) or instance.save() (local\u003dTrue)).","commit_id":"75234103d4146f18c20af1557c0fb4bc07454e53"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5cba3eea4ca38e5b7ec108c682a85dcdfbceb6f9","unresolved":false,"context_lines":[{"line_number":2130,"context_line":"            # compute service."},{"line_number":2131,"context_line":"            self.placementclient.delete_allocation_for_instance("},{"line_number":2132,"context_line":"                context, instance.uuid)"},{"line_number":2133,"context_line":"            cb(context, instance, bdms, local\u003dTrue)"},{"line_number":2134,"context_line":"            instance.destroy()"},{"line_number":2135,"context_line":""},{"line_number":2136,"context_line":"    def _update_queued_for_deletion_in_api(self, context, instance, qfd):"},{"line_number":2137,"context_line":"        # NOTE(tssurya): We query the instance_mapping record of this instance"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_dd1ec85c","line":2134,"range":{"start_line":2133,"start_character":12,"end_line":2134,"end_character":30},"in_reply_to":"5f7c97a3_52c6ec9e","updated":"2018-07-19 21:25:21.000000000","message":"Yup, just talking myself through this and weighing options.","commit_id":"75234103d4146f18c20af1557c0fb4bc07454e53"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"c38b9afb278e12c9390b2af9fc47a973024269db","unresolved":false,"context_lines":[{"line_number":2130,"context_line":"            # compute service."},{"line_number":2131,"context_line":"            self.placementclient.delete_allocation_for_instance("},{"line_number":2132,"context_line":"                context, instance.uuid)"},{"line_number":2133,"context_line":"            cb(context, instance, bdms, local\u003dTrue)"},{"line_number":2134,"context_line":"            instance.destroy()"},{"line_number":2135,"context_line":""},{"line_number":2136,"context_line":"    def _update_queued_for_deletion_in_api(self, context, instance, qfd):"},{"line_number":2137,"context_line":"        # NOTE(tssurya): We query the instance_mapping record of this instance"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_52c6ec9e","line":2134,"range":{"start_line":2133,"start_character":12,"end_line":2134,"end_character":30},"in_reply_to":"5f7c97a3_57ac9e87","updated":"2018-07-13 08:47:07.000000000","message":"\u003e Hmm, so your cb (callback) here is one of the _do_*_delete methods.\n \u003e We could just do the _update_queued_for_deletion_in_api() call\n \u003e after instance.destroy() here, but we\u0027d still have to add the\n \u003e _update_queued_for_deletion_in_api calls in the callback methods\n \u003e for the local\u003dFalse cases, so it\u0027s probably easier to just leave\n \u003e the _update_queued_for_deletion_in_api call in the \n \u003e callback methods\n\nyes, I did this just for the code to be more clean. If we do this after instance.destroy(), at least we would be consistent (that the instance is indeed deleted successfully) in the local_delete case, but anyhow for the other types its not consistent.\n\n \u003e as long as it happens at the end of those methods (after the rpc\n \u003e cast (local\u003dFalse) or instance.save() (local\u003dTrue)).","commit_id":"75234103d4146f18c20af1557c0fb4bc07454e53"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"4e89d4eb7a58b3dce566f9165bbefeecee63de41","unresolved":false,"context_lines":[{"line_number":2138,"context_line":"        # and update the queued_for_delete flag to True (or False according to"},{"line_number":2139,"context_line":"        # the state of the instance). This just means that the instance is"},{"line_number":2140,"context_line":"        # queued for deletion (or is no longer queued for deletion). It does"},{"line_number":2141,"context_line":"        # not guarantee its successful deletion (or restoration)."},{"line_number":2142,"context_line":"        im \u003d objects.InstanceMapping.get_by_instance_uuid(context,"},{"line_number":2143,"context_line":"                                                          instance.uuid)"},{"line_number":2144,"context_line":"        im.queued_for_delete \u003d qfd"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_b7c65215","line":2141,"updated":"2018-07-11 14:37:10.000000000","message":"add that this is done to handle the down cell situation.","commit_id":"75234103d4146f18c20af1557c0fb4bc07454e53"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5535e45c5a5d547e2ed270779f28ac58ba645a67","unresolved":false,"context_lines":[{"line_number":2145,"context_line":"        im.save()"},{"line_number":2146,"context_line":""},{"line_number":2147,"context_line":"    def _do_delete(self, context, instance, bdms, local\u003dFalse):"},{"line_number":2148,"context_line":"        self._update_queued_for_deletion_in_api(context, instance, True)"},{"line_number":2149,"context_line":"        if local:"},{"line_number":2150,"context_line":"            instance.vm_state \u003d vm_states.DELETED"},{"line_number":2151,"context_line":"            instance.task_state \u003d None"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_97b6b6fc","line":2148,"updated":"2018-07-11 14:37:06.000000000","message":"This should happen at the end of this method in case the cast or save fails.","commit_id":"75234103d4146f18c20af1557c0fb4bc07454e53"},{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"8057719b600421f6cb040c98294c3b7818343d63","unresolved":false,"context_lines":[{"line_number":2145,"context_line":"        im.save()"},{"line_number":2146,"context_line":""},{"line_number":2147,"context_line":"    def _do_delete(self, context, instance, bdms, local\u003dFalse):"},{"line_number":2148,"context_line":"        self._update_queued_for_deletion_in_api(context, instance, True)"},{"line_number":2149,"context_line":"        if local:"},{"line_number":2150,"context_line":"            instance.vm_state \u003d vm_states.DELETED"},{"line_number":2151,"context_line":"            instance.task_state \u003d None"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_49d84c7f","line":2148,"in_reply_to":"5f7c97a3_4c42b63d","updated":"2018-07-13 10:27:27.000000000","message":"ok, got it ,thanks","commit_id":"75234103d4146f18c20af1557c0fb4bc07454e53"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6d4efaa26761bfaa0c22d492bb810aebbc86128f","unresolved":false,"context_lines":[{"line_number":2145,"context_line":"        im.save()"},{"line_number":2146,"context_line":""},{"line_number":2147,"context_line":"    def _do_delete(self, context, instance, bdms, local\u003dFalse):"},{"line_number":2148,"context_line":"        self._update_queued_for_deletion_in_api(context, instance, True)"},{"line_number":2149,"context_line":"        if local:"},{"line_number":2150,"context_line":"            instance.vm_state \u003d vm_states.DELETED"},{"line_number":2151,"context_line":"            instance.task_state \u003d None"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_4c42b63d","line":2148,"in_reply_to":"5f7c97a3_68c1a74e","updated":"2018-07-12 12:07:54.000000000","message":"We won\u0027t know if the delete failed in the compute so we just have to set the flag and hope it\u0027s correct - the queued_for_delete flag is only going to be used when there is a down cell anyway, so it\u0027s an exceptional situation when we rely on this.","commit_id":"75234103d4146f18c20af1557c0fb4bc07454e53"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"c38b9afb278e12c9390b2af9fc47a973024269db","unresolved":false,"context_lines":[{"line_number":2145,"context_line":"        im.save()"},{"line_number":2146,"context_line":""},{"line_number":2147,"context_line":"    def _do_delete(self, context, instance, bdms, local\u003dFalse):"},{"line_number":2148,"context_line":"        self._update_queued_for_deletion_in_api(context, instance, True)"},{"line_number":2149,"context_line":"        if local:"},{"line_number":2150,"context_line":"            instance.vm_state \u003d vm_states.DELETED"},{"line_number":2151,"context_line":"            instance.task_state \u003d None"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_12c0747d","line":2148,"in_reply_to":"5f7c97a3_97b6b6fc","updated":"2018-07-13 08:47:07.000000000","message":"Done","commit_id":"75234103d4146f18c20af1557c0fb4bc07454e53"},{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"dd260179bf90a720cf8e26592aa970b88536fdd7","unresolved":false,"context_lines":[{"line_number":2145,"context_line":"        im.save()"},{"line_number":2146,"context_line":""},{"line_number":2147,"context_line":"    def _do_delete(self, context, instance, bdms, local\u003dFalse):"},{"line_number":2148,"context_line":"        self._update_queued_for_deletion_in_api(context, instance, True)"},{"line_number":2149,"context_line":"        if local:"},{"line_number":2150,"context_line":"            instance.vm_state \u003d vm_states.DELETED"},{"line_number":2151,"context_line":"            instance.task_state \u003d None"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_68c1a74e","line":2148,"in_reply_to":"5f7c97a3_97b6b6fc","updated":"2018-07-12 06:02:14.000000000","message":"yeah, it should, and what about cast failed but we don\u0027t know it actually failed in compute side? \n\ndelete failed should not mark the qfd flag but we don\u0027t have chance to know that, right?","commit_id":"75234103d4146f18c20af1557c0fb4bc07454e53"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5535e45c5a5d547e2ed270779f28ac58ba645a67","unresolved":false,"context_lines":[{"line_number":2156,"context_line":"                                                   delete_type\u003d\u0027delete\u0027)"},{"line_number":2157,"context_line":""},{"line_number":2158,"context_line":"    def _do_force_delete(self, context, instance, bdms, local\u003dFalse):"},{"line_number":2159,"context_line":"        self._update_queued_for_deletion_in_api(context, instance, True)"},{"line_number":2160,"context_line":"        if local:"},{"line_number":2161,"context_line":"            instance.vm_state \u003d vm_states.DELETED"},{"line_number":2162,"context_line":"            instance.task_state \u003d None"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_77b51aed","line":2159,"updated":"2018-07-11 14:37:06.000000000","message":"same","commit_id":"75234103d4146f18c20af1557c0fb4bc07454e53"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"c38b9afb278e12c9390b2af9fc47a973024269db","unresolved":false,"context_lines":[{"line_number":2156,"context_line":"                                                   delete_type\u003d\u0027delete\u0027)"},{"line_number":2157,"context_line":""},{"line_number":2158,"context_line":"    def _do_force_delete(self, context, instance, bdms, local\u003dFalse):"},{"line_number":2159,"context_line":"        self._update_queued_for_deletion_in_api(context, instance, True)"},{"line_number":2160,"context_line":"        if local:"},{"line_number":2161,"context_line":"            instance.vm_state \u003d vm_states.DELETED"},{"line_number":2162,"context_line":"            instance.task_state \u003d None"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_32bd7003","line":2159,"in_reply_to":"5f7c97a3_77b51aed","updated":"2018-07-13 08:47:07.000000000","message":"Done","commit_id":"75234103d4146f18c20af1557c0fb4bc07454e53"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5535e45c5a5d547e2ed270779f28ac58ba645a67","unresolved":false,"context_lines":[{"line_number":2167,"context_line":"                                                   delete_type\u003d\u0027force_delete\u0027)"},{"line_number":2168,"context_line":""},{"line_number":2169,"context_line":"    def _do_soft_delete(self, context, instance, bdms, local\u003dFalse):"},{"line_number":2170,"context_line":"        self._update_queued_for_deletion_in_api(context, instance, True)"},{"line_number":2171,"context_line":"        if local:"},{"line_number":2172,"context_line":"            instance.vm_state \u003d vm_states.SOFT_DELETED"},{"line_number":2173,"context_line":"            instance.task_state \u003d None"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_37c7a268","line":2170,"updated":"2018-07-11 14:37:06.000000000","message":"same","commit_id":"75234103d4146f18c20af1557c0fb4bc07454e53"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"c38b9afb278e12c9390b2af9fc47a973024269db","unresolved":false,"context_lines":[{"line_number":2167,"context_line":"                                                   delete_type\u003d\u0027force_delete\u0027)"},{"line_number":2168,"context_line":""},{"line_number":2169,"context_line":"    def _do_soft_delete(self, context, instance, bdms, local\u003dFalse):"},{"line_number":2170,"context_line":"        self._update_queued_for_deletion_in_api(context, instance, True)"},{"line_number":2171,"context_line":"        if local:"},{"line_number":2172,"context_line":"            instance.vm_state \u003d vm_states.SOFT_DELETED"},{"line_number":2173,"context_line":"            instance.task_state \u003d None"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_9231e4be","line":2170,"in_reply_to":"5f7c97a3_37c7a268","updated":"2018-07-13 08:47:07.000000000","message":"Done","commit_id":"75234103d4146f18c20af1557c0fb4bc07454e53"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5535e45c5a5d547e2ed270779f28ac58ba645a67","unresolved":false,"context_lines":[{"line_number":2215,"context_line":""},{"line_number":2216,"context_line":"        self._record_action_start(context, instance, instance_actions.RESTORE)"},{"line_number":2217,"context_line":""},{"line_number":2218,"context_line":"        self._update_queued_for_deletion_in_api(context, instance, False)"},{"line_number":2219,"context_line":"        if instance.host:"},{"line_number":2220,"context_line":"            instance.task_state \u003d task_states.RESTORING"},{"line_number":2221,"context_line":"            instance.deleted_at \u003d None"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_f7bccab6","line":2218,"updated":"2018-07-11 14:37:06.000000000","message":"This should go at the end of the method once we\u0027ve successfully saved or cast.\n\nAlso, where is this tested?","commit_id":"75234103d4146f18c20af1557c0fb4bc07454e53"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5cba3eea4ca38e5b7ec108c682a85dcdfbceb6f9","unresolved":false,"context_lines":[{"line_number":2215,"context_line":""},{"line_number":2216,"context_line":"        self._record_action_start(context, instance, instance_actions.RESTORE)"},{"line_number":2217,"context_line":""},{"line_number":2218,"context_line":"        self._update_queued_for_deletion_in_api(context, instance, False)"},{"line_number":2219,"context_line":"        if instance.host:"},{"line_number":2220,"context_line":"            instance.task_state \u003d task_states.RESTORING"},{"line_number":2221,"context_line":"            instance.deleted_at \u003d None"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_3d2fbc89","line":2218,"in_reply_to":"5f7c97a3_5254acc6","updated":"2018-07-19 21:25:21.000000000","message":"Heh, \"mush up\" sounds....mushy?","commit_id":"75234103d4146f18c20af1557c0fb4bc07454e53"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"c38b9afb278e12c9390b2af9fc47a973024269db","unresolved":false,"context_lines":[{"line_number":2215,"context_line":""},{"line_number":2216,"context_line":"        self._record_action_start(context, instance, instance_actions.RESTORE)"},{"line_number":2217,"context_line":""},{"line_number":2218,"context_line":"        self._update_queued_for_deletion_in_api(context, instance, False)"},{"line_number":2219,"context_line":"        if instance.host:"},{"line_number":2220,"context_line":"            instance.task_state \u003d task_states.RESTORING"},{"line_number":2221,"context_line":"            instance.deleted_at \u003d None"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_5254acc6","line":2218,"in_reply_to":"5f7c97a3_f7bccab6","updated":"2018-07-13 08:47:07.000000000","message":"I will mush up a test case for restore.","commit_id":"75234103d4146f18c20af1557c0fb4bc07454e53"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fffc680aae169c01bc16f137b2b19c1dfe79c008","unresolved":false,"context_lines":[{"line_number":2133,"context_line":"            cb(context, instance, bdms, local\u003dTrue)"},{"line_number":2134,"context_line":"            instance.destroy()"},{"line_number":2135,"context_line":""},{"line_number":2136,"context_line":"    def _update_queued_for_deletion_in_api(self, context, instance, qfd):"},{"line_number":2137,"context_line":"        # NOTE(tssurya): We query the instance_mapping record of this instance"},{"line_number":2138,"context_line":"        # and update the queued_for_delete flag to True (or False according to"},{"line_number":2139,"context_line":"        # the state of the instance). This just means that the instance is"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_fd34e4ad","line":2136,"range":{"start_line":2136,"start_character":35,"end_line":2136,"end_character":42},"updated":"2018-07-19 21:34:35.000000000","message":"nit: This is redundant.","commit_id":"7f6fa05f66d6dd0678d3f5d86bd98bff5b9bec32"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"447010eb9ad98c03dd8fb69f871174fa5fb88396","unresolved":false,"context_lines":[{"line_number":2133,"context_line":"            cb(context, instance, bdms, local\u003dTrue)"},{"line_number":2134,"context_line":"            instance.destroy()"},{"line_number":2135,"context_line":""},{"line_number":2136,"context_line":"    def _update_queued_for_deletion_in_api(self, context, instance, qfd):"},{"line_number":2137,"context_line":"        # NOTE(tssurya): We query the instance_mapping record of this instance"},{"line_number":2138,"context_line":"        # and update the queued_for_delete flag to True (or False according to"},{"line_number":2139,"context_line":"        # the state of the instance). This just means that the instance is"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_58f2c66a","line":2136,"range":{"start_line":2136,"start_character":35,"end_line":2136,"end_character":42},"in_reply_to":"5f7c97a3_fd34e4ad","updated":"2018-07-19 22:52:47.000000000","message":"Done","commit_id":"7f6fa05f66d6dd0678d3f5d86bd98bff5b9bec32"}],"nova/objects/instance.py":[{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"acb5db19550fc6a8c9bd67b70cfd5f178174ca10","unresolved":false,"context_lines":[{"line_number":629,"context_line":"            self._from_db_object(self._context, self, db_inst)"},{"line_number":630,"context_line":"            # NOTE(tssurya): We query the instance_mapping record of this"},{"line_number":631,"context_line":"            # instance and set the queued_for_delete flag to True."},{"line_number":632,"context_line":"            _update_queued_for_delete(self._context, self)"},{"line_number":633,"context_line":"        except exception.ConstraintNotMet:"},{"line_number":634,"context_line":"            raise exception.ObjectActionError(action\u003d\u0027destroy\u0027,"},{"line_number":635,"context_line":"                                              reason\u003d\u0027host changed\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_4e5425fd","line":632,"updated":"2018-07-10 12:55:01.000000000","message":"As noted in the spec, this is an upcall and hence, instead of doing it here, it should be done in the computeAPI before the call gets propagated downwards. However the trick is how do we make sure the deletion get indeed completed or not...","commit_id":"e6a2b536643a04dc5f6a876e9b2fd5401cd9c66c"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"0c931fb19c8e6f4f59a5001b1e0152da33e46456","unresolved":false,"context_lines":[{"line_number":629,"context_line":"            self._from_db_object(self._context, self, db_inst)"},{"line_number":630,"context_line":"            # NOTE(tssurya): We query the instance_mapping record of this"},{"line_number":631,"context_line":"            # instance and set the queued_for_delete flag to True."},{"line_number":632,"context_line":"            _update_queued_for_delete(self._context, self)"},{"line_number":633,"context_line":"        except exception.ConstraintNotMet:"},{"line_number":634,"context_line":"            raise exception.ObjectActionError(action\u003d\u0027destroy\u0027,"},{"line_number":635,"context_line":"                                              reason\u003d\u0027host changed\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_ae5db916","line":632,"in_reply_to":"5f7c97a3_4e5425fd","updated":"2018-07-10 12:55:51.000000000","message":"s/get/gets","commit_id":"e6a2b536643a04dc5f6a876e9b2fd5401cd9c66c"}],"nova/tests/unit/compute/test_compute.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5535e45c5a5d547e2ed270779f28ac58ba645a67","unresolved":false,"context_lines":[{"line_number":9801,"context_line":"                               return_value\u003d(None, instance)):"},{"line_number":9802,"context_line":"            with mock.patch.object(self.compute_api.network_api,"},{"line_number":9803,"context_line":"                                   \u0027deallocate_for_instance\u0027):"},{"line_number":9804,"context_line":"                with mock.patch.object(objects.InstanceMapping,"},{"line_number":9805,"context_line":"                                       \u0027get_by_instance_uuid\u0027):"},{"line_number":9806,"context_line":"                    self.compute_api.delete(self.context, instance)"},{"line_number":9807,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_37c8024c","line":9804,"updated":"2018-07-11 14:37:06.000000000","message":"nit: you could just add this to the method rather than more nested mocks:\n\n@mock.patch(\u0027nova.compute.api.API._update_queued_for_deletion_in_api\u0027)","commit_id":"75234103d4146f18c20af1557c0fb4bc07454e53"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"c38b9afb278e12c9390b2af9fc47a973024269db","unresolved":false,"context_lines":[{"line_number":9801,"context_line":"                               return_value\u003d(None, instance)):"},{"line_number":9802,"context_line":"            with mock.patch.object(self.compute_api.network_api,"},{"line_number":9803,"context_line":"                                   \u0027deallocate_for_instance\u0027):"},{"line_number":9804,"context_line":"                with mock.patch.object(objects.InstanceMapping,"},{"line_number":9805,"context_line":"                                       \u0027get_by_instance_uuid\u0027):"},{"line_number":9806,"context_line":"                    self.compute_api.delete(self.context, instance)"},{"line_number":9807,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_72d0c8c9","line":9804,"in_reply_to":"5f7c97a3_37c8024c","updated":"2018-07-13 08:47:07.000000000","message":"Done","commit_id":"75234103d4146f18c20af1557c0fb4bc07454e53"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5535e45c5a5d547e2ed270779f28ac58ba645a67","unresolved":false,"context_lines":[{"line_number":9803,"context_line":"                                   \u0027deallocate_for_instance\u0027):"},{"line_number":9804,"context_line":"                with mock.patch.object(objects.InstanceMapping,"},{"line_number":9805,"context_line":"                                       \u0027get_by_instance_uuid\u0027):"},{"line_number":9806,"context_line":"                    self.compute_api.delete(self.context, instance)"},{"line_number":9807,"context_line":""},{"line_number":9808,"context_line":"    def test_attach_volume_invalid(self):"},{"line_number":9809,"context_line":"        instance \u003d fake_instance.fake_instance_obj(None, **{"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_37f1e297","line":9806,"updated":"2018-07-11 14:37:06.000000000","message":"I don\u0027t even know what this is testing...but that\u0027s unrelated to what you\u0027re doing here.","commit_id":"75234103d4146f18c20af1557c0fb4bc07454e53"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fffc680aae169c01bc16f137b2b19c1dfe79c008","unresolved":false,"context_lines":[{"line_number":9794,"context_line":""},{"line_number":9795,"context_line":"    def test_add_remove_fixed_ip(self):"},{"line_number":9796,"context_line":"        instance \u003d self._create_fake_instance_obj(params\u003d{\u0027host\u0027: CONF.host})"},{"line_number":9797,"context_line":"        cm \u003d objects.CellMappingList.get_all(self.context)"},{"line_number":9798,"context_line":"        im \u003d objects.InstanceMapping(self.context,"},{"line_number":9799,"context_line":"            project_id\u003dself.context.project_id, instance_uuid\u003dinstance.uuid,"},{"line_number":9800,"context_line":"            cell_mapping\u003dcm[1])"},{"line_number":9801,"context_line":"        im.create()"},{"line_number":9802,"context_line":"        self.compute_api.add_fixed_ip(self.context, instance, \u00271\u0027)"},{"line_number":9803,"context_line":"        self.compute_api.remove_fixed_ip(self.context,"},{"line_number":9804,"context_line":"                                         instance, \u0027192.168.1.1\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_bd3aec93","line":9801,"range":{"start_line":9797,"start_character":8,"end_line":9801,"end_character":19},"updated":"2018-07-19 21:34:35.000000000","message":"Do we really need this? Why not just add the mock to the method?\n\n@mock.patch(\u0027nova.compute.api.API._update_queued_for_deletion_in_api\u0027)","commit_id":"7f6fa05f66d6dd0678d3f5d86bd98bff5b9bec32"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"766ec764655febde91b3df92a4496e64e9f7e354","unresolved":false,"context_lines":[{"line_number":9813,"context_line":"        i_ref \u003d self._create_fake_instance_obj()"},{"line_number":9814,"context_line":"        self.assertEqual(i_ref[\u0027name\u0027], i_ref[\u0027uuid\u0027])"},{"line_number":9815,"context_line":""},{"line_number":9816,"context_line":"    @mock.patch(\u0027nova.compute.api.API._update_queued_for_deletion\u0027)"},{"line_number":9817,"context_line":"    def test_add_remove_fixed_ip(self, mock_update_queued_for_delete):"},{"line_number":9818,"context_line":"        instance \u003d self._create_fake_instance_obj(params\u003d{\u0027host\u0027: CONF.host})"},{"line_number":9819,"context_line":"        self.compute_api.add_fixed_ip(self.context, instance, \u00271\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"5f7c97a3_4b6ae51a","line":9816,"updated":"2018-07-20 09:01:16.000000000","message":"sure, we could mock it like this, but then I was thinking down the lane, we don\u0027t assert the mock anywhere and it seemed like we didn\u0027t test anything; like you said here: https://review.openstack.org/#/c/566813/6/nova/tests/unit/compute/test_compute.py@9806.","commit_id":"b117471084b15fc3275c9711ab273d7230460266"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2d41b7270c2566970dba2f1c71c003587489a63e","unresolved":false,"context_lines":[{"line_number":9813,"context_line":"        i_ref \u003d self._create_fake_instance_obj()"},{"line_number":9814,"context_line":"        self.assertEqual(i_ref[\u0027name\u0027], i_ref[\u0027uuid\u0027])"},{"line_number":9815,"context_line":""},{"line_number":9816,"context_line":"    @mock.patch(\u0027nova.compute.api.API._update_queued_for_deletion\u0027)"},{"line_number":9817,"context_line":"    def test_add_remove_fixed_ip(self, mock_update_queued_for_delete):"},{"line_number":9818,"context_line":"        instance \u003d self._create_fake_instance_obj(params\u003d{\u0027host\u0027: CONF.host})"},{"line_number":9819,"context_line":"        self.compute_api.add_fixed_ip(self.context, instance, \u00271\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"5f7c97a3_b3f0cf67","line":9816,"in_reply_to":"5f7c97a3_4b6ae51a","updated":"2018-07-20 12:57:54.000000000","message":"It\u0027s asserted in the other tests in test_compute_api.","commit_id":"b117471084b15fc3275c9711ab273d7230460266"}],"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":"5535e45c5a5d547e2ed270779f28ac58ba645a67","unresolved":false,"context_lines":[{"line_number":1038,"context_line":"    def _test_delete(self, delete_type, mock_save, mock_bdm_get, mock_elevated,"},{"line_number":1039,"context_line":"                     mock_get_cn, mock_up, mock_record, mock_inst_update,"},{"line_number":1040,"context_line":"                     mock_deallocate, mock_inst_meta, mock_inst_destroy,"},{"line_number":1041,"context_line":"                     mock_notify, mock_del_token, mock_get_inst, mock_save_im,"},{"line_number":1042,"context_line":"                     mock_image_delete, mock_mig_get, **attrs):"},{"line_number":1043,"context_line":"        expected_save_calls \u003d [mock.call()]"},{"line_number":1044,"context_line":"        expected_record_calls \u003d []"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_f73fea1f","line":1041,"range":{"start_line":1041,"start_character":65,"end_line":1041,"end_character":77},"updated":"2018-07-11 14:37:06.000000000","message":"You should assert this is called.","commit_id":"75234103d4146f18c20af1557c0fb4bc07454e53"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"c38b9afb278e12c9390b2af9fc47a973024269db","unresolved":false,"context_lines":[{"line_number":1038,"context_line":"    def _test_delete(self, delete_type, mock_save, mock_bdm_get, mock_elevated,"},{"line_number":1039,"context_line":"                     mock_get_cn, mock_up, mock_record, mock_inst_update,"},{"line_number":1040,"context_line":"                     mock_deallocate, mock_inst_meta, mock_inst_destroy,"},{"line_number":1041,"context_line":"                     mock_notify, mock_del_token, mock_get_inst, mock_save_im,"},{"line_number":1042,"context_line":"                     mock_image_delete, mock_mig_get, **attrs):"},{"line_number":1043,"context_line":"        expected_save_calls \u003d [mock.call()]"},{"line_number":1044,"context_line":"        expected_record_calls \u003d []"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_d2de7cda","line":1041,"range":{"start_line":1041,"start_character":65,"end_line":1041,"end_character":77},"in_reply_to":"5f7c97a3_f73fea1f","updated":"2018-07-13 08:47:07.000000000","message":"Done","commit_id":"75234103d4146f18c20af1557c0fb4bc07454e53"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5535e45c5a5d547e2ed270779f28ac58ba645a67","unresolved":false,"context_lines":[{"line_number":5397,"context_line":"                self.context, requested_networks, 5)"},{"line_number":5398,"context_line":"        self.assertEqual(4, count)"},{"line_number":5399,"context_line":""},{"line_number":5400,"context_line":"    @mock.patch.object(objects.InstanceMapping, \u0027save\u0027)"},{"line_number":5401,"context_line":"    @mock.patch.object(objects.InstanceMapping, \u0027get_by_instance_uuid\u0027)"},{"line_number":5402,"context_line":"    def test_update_queued_for_deletion_in_api(self, mock_get, mock_save):"},{"line_number":5403,"context_line":"        uuid \u003d uuids.inst"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_d71bcec8","line":5400,"range":{"start_line":5400,"start_character":4,"end_line":5400,"end_character":55},"updated":"2018-07-11 14:37:06.000000000","message":"You don\u0027t really need this since mock_get could just return a Mock and then you can assert that save() was called on that mock.","commit_id":"75234103d4146f18c20af1557c0fb4bc07454e53"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5535e45c5a5d547e2ed270779f28ac58ba645a67","unresolved":false,"context_lines":[{"line_number":5403,"context_line":"        uuid \u003d uuids.inst"},{"line_number":5404,"context_line":"        inst \u003d objects.Instance(uuid\u003duuid)"},{"line_number":5405,"context_line":"        im \u003d objects.InstanceMapping(instance_uuid\u003duuid,"},{"line_number":5406,"context_line":"                                     queued_for_delete\u003dFalse)"},{"line_number":5407,"context_line":"        self.assertFalse(im.queued_for_delete)"},{"line_number":5408,"context_line":"        mock_get.return_value \u003d im"},{"line_number":5409,"context_line":"        self.compute_api._update_queued_for_deletion_in_api(self.context, inst,"},{"line_number":5410,"context_line":"                                                            True)"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_9773161d","line":5407,"range":{"start_line":5406,"start_character":37,"end_line":5407,"end_character":46},"updated":"2018-07-11 14:37:06.000000000","message":"Don\u0027t really need this.","commit_id":"75234103d4146f18c20af1557c0fb4bc07454e53"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5535e45c5a5d547e2ed270779f28ac58ba645a67","unresolved":false,"context_lines":[{"line_number":5410,"context_line":"                                                            True)"},{"line_number":5411,"context_line":"        self.assertTrue(im.queued_for_delete)"},{"line_number":5412,"context_line":"        mock_get.assert_called_once_with(self.context, inst.uuid)"},{"line_number":5413,"context_line":"        self.assertEqual(1, mock_save.call_count)"},{"line_number":5414,"context_line":""},{"line_number":5415,"context_line":"    @mock.patch.object(objects.InstanceMapping, \u0027get_by_instance_uuid\u0027,"},{"line_number":5416,"context_line":"            side_effect\u003dexception.InstanceMappingNotFound(uuid\u003d\u0027fake\u0027))"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_975c7681","line":5413,"range":{"start_line":5413,"start_character":8,"end_line":5413,"end_character":49},"updated":"2018-07-11 14:37:06.000000000","message":"Could just be: mock_save.assert_called_once_with()","commit_id":"75234103d4146f18c20af1557c0fb4bc07454e53"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fffc680aae169c01bc16f137b2b19c1dfe79c008","unresolved":false,"context_lines":[{"line_number":4034,"context_line":"        instance.vm_state \u003d vm_states.SOFT_DELETED"},{"line_number":4035,"context_line":"        instance.task_state \u003d None"},{"line_number":4036,"context_line":"        instance.save()"},{"line_number":4037,"context_line":"        im \u003d objects.InstanceMapping.get_by_instance_uuid(self.context,"},{"line_number":4038,"context_line":"                                                          instance.uuid)"},{"line_number":4039,"context_line":"        im.queued_for_delete \u003d True"},{"line_number":4040,"context_line":"        with mock.patch.object(self.compute_api, \u0027compute_rpcapi\u0027) as rpc:"},{"line_number":4041,"context_line":"            self.compute_api.restore(admin_context, instance)"},{"line_number":4042,"context_line":"            rpc.restore_instance.assert_called_once_with(admin_context,"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_bd53ccdd","line":4039,"range":{"start_line":4037,"start_character":8,"end_line":4039,"end_character":35},"updated":"2018-07-19 21:34:35.000000000","message":"Why is this needed? If it\u0027s not saved, does it make a difference?","commit_id":"7f6fa05f66d6dd0678d3f5d86bd98bff5b9bec32"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"447010eb9ad98c03dd8fb69f871174fa5fb88396","unresolved":false,"context_lines":[{"line_number":4034,"context_line":"        instance.vm_state \u003d vm_states.SOFT_DELETED"},{"line_number":4035,"context_line":"        instance.task_state \u003d None"},{"line_number":4036,"context_line":"        instance.save()"},{"line_number":4037,"context_line":"        im \u003d objects.InstanceMapping.get_by_instance_uuid(self.context,"},{"line_number":4038,"context_line":"                                                          instance.uuid)"},{"line_number":4039,"context_line":"        im.queued_for_delete \u003d True"},{"line_number":4040,"context_line":"        with mock.patch.object(self.compute_api, \u0027compute_rpcapi\u0027) as rpc:"},{"line_number":4041,"context_line":"            self.compute_api.restore(admin_context, instance)"},{"line_number":4042,"context_line":"            rpc.restore_instance.assert_called_once_with(admin_context,"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_f8bb9271","line":4039,"range":{"start_line":4037,"start_character":8,"end_line":4039,"end_character":35},"in_reply_to":"5f7c97a3_bd53ccdd","updated":"2018-07-19 22:52:47.000000000","message":"I\u0027m not even sure how this doesn\u0027t explode since this is a no-db test and you\u0027re not mocking out InstanceMapping.get_by_instance_uuid.","commit_id":"7f6fa05f66d6dd0678d3f5d86bd98bff5b9bec32"}]}
