)]}'
{"nova/compute/manager.py":[{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"f45a01cc7936cc3fa0b0a823f1d813dbb0bcd51f","unresolved":false,"context_lines":[{"line_number":914,"context_line":"        self._delete_scheduler_instance_info(context, instance.uuid)"},{"line_number":915,"context_line":""},{"line_number":916,"context_line":"    def _delete_instance_actions_and_events(self, context, instance):"},{"line_number":917,"context_line":"        action_list \u003d obj_action.InstanceActionList.get_by_instance_uuid("},{"line_number":918,"context_line":"            context, instance.uuid)"},{"line_number":919,"context_line":""},{"line_number":920,"context_line":"        for action in action_list:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a2fa921_e2519a0f","line":917,"updated":"2015-10-07 11:58:33.000000000","message":"I think we can use objects.InstanceActionList since it\u0027s include in objects/__init__.py , don\u0027t need obj_action","commit_id":"78e01922aeb54b0ae0cd69a4b3320167d0ce2bb6"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"5b48eb42cfddf3867b50a19979c3635ed4e47e13","unresolved":false,"context_lines":[{"line_number":914,"context_line":"        self._delete_scheduler_instance_info(context, instance.uuid)"},{"line_number":915,"context_line":""},{"line_number":916,"context_line":"    def _delete_instance_actions_and_events(self, context, instance):"},{"line_number":917,"context_line":"        action_list \u003d obj_action.InstanceActionList.get_by_instance_uuid("},{"line_number":918,"context_line":"            context, instance.uuid)"},{"line_number":919,"context_line":""},{"line_number":920,"context_line":"        for action in action_list:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a2fa921_2102053e","line":917,"in_reply_to":"7a2fa921_e2519a0f","updated":"2015-10-08 08:35:37.000000000","message":"Done","commit_id":"78e01922aeb54b0ae0cd69a4b3320167d0ce2bb6"}],"nova/compute/utils.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"7a6216741ee93146f2d171340c92d5498c8c39eb","unresolved":false,"context_lines":[{"line_number":544,"context_line":"                self.context, uuid, self.event_name, exc_val\u003dexc_val,"},{"line_number":545,"context_line":"                exc_tb\u003dexc_tb, want_result\u003dFalse)"},{"line_number":546,"context_line":""},{"line_number":547,"context_line":"        if self.event_name \u003d\u003d \u0027compute_terminate_instance\u0027:"},{"line_number":548,"context_line":"            for uuid in self.instance_uuids:"},{"line_number":549,"context_line":"                self._delete_instance_actions_and_events(self.context, uuid)"},{"line_number":550,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"fa80f949_baead50d","line":547,"updated":"2015-11-05 11:45:24.000000000","message":"we can just delete instance related stuff at db layer, as we delete other stuff https://github.com/openstack/nova/blob/master/nova/db/sqlalchemy/api.py#L1712","commit_id":"d7b1f2c293a6d267844edbe038a5049b1ceb9e07"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"523a0820acdc1cb10281543bba013e5b0e496a2c","unresolved":false,"context_lines":[{"line_number":544,"context_line":"                self.context, uuid, self.event_name, exc_val\u003dexc_val,"},{"line_number":545,"context_line":"                exc_tb\u003dexc_tb, want_result\u003dFalse)"},{"line_number":546,"context_line":""},{"line_number":547,"context_line":"        if self.event_name \u003d\u003d \u0027compute_terminate_instance\u0027:"},{"line_number":548,"context_line":"            for uuid in self.instance_uuids:"},{"line_number":549,"context_line":"                self._delete_instance_actions_and_events(self.context, uuid)"},{"line_number":550,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"da85f559_9e9793eb","line":547,"in_reply_to":"da85f559_2298f3bf","updated":"2015-11-11 05:38:08.000000000","message":"@Takashi, thanks, I see the problem now.\n\nThe hard-code event name \u0027compute_terminate_instance\u0027 can be avoid by we add new parameter to decorator \u0027wrap_instance_event\u0027, then we pass that parameter down here, if that parameter tell us cleanup the instance action, then the code cleanup them. What would you think?\n\nOne more problem with this way is that we still have problem when the instance was deleted at nova-api side, https://github.com/openstack/nova/blob/master/nova/compute/api.py#L1848, so this is why we put that cleanup down to the db layer is more simple. Another thought is the success finish event for delete looks like meanless, because all the actions will be deleted immediately. So I\u0027m thinking whether make sense to not add finish event when success, use the same way as I said above, add new parameter to the decorator, that parameter will tell this code to ignore add finish event when success.","commit_id":"d7b1f2c293a6d267844edbe038a5049b1ceb9e07"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"a4b655570d9eb48224f6744a69e9268bed7242da","unresolved":false,"context_lines":[{"line_number":544,"context_line":"                self.context, uuid, self.event_name, exc_val\u003dexc_val,"},{"line_number":545,"context_line":"                exc_tb\u003dexc_tb, want_result\u003dFalse)"},{"line_number":546,"context_line":""},{"line_number":547,"context_line":"        if self.event_name \u003d\u003d \u0027compute_terminate_instance\u0027:"},{"line_number":548,"context_line":"            for uuid in self.instance_uuids:"},{"line_number":549,"context_line":"                self._delete_instance_actions_and_events(self.context, uuid)"},{"line_number":550,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"da85f559_c03e8c8a","line":547,"in_reply_to":"da85f559_2ee3d034","updated":"2015-11-11 11:06:30.000000000","message":"@Takashi, I talk with Nikola at IRC. We agree on move those logic into instance object destroy method, then we can handle all the instance deletion cases. And add flag to the decorator wrap_instance_event to indicate skipping the finish event when delete instance..","commit_id":"d7b1f2c293a6d267844edbe038a5049b1ceb9e07"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"39d86927b9705588f87c0cb3dad8e0296cb73613","unresolved":false,"context_lines":[{"line_number":544,"context_line":"                self.context, uuid, self.event_name, exc_val\u003dexc_val,"},{"line_number":545,"context_line":"                exc_tb\u003dexc_tb, want_result\u003dFalse)"},{"line_number":546,"context_line":""},{"line_number":547,"context_line":"        if self.event_name \u003d\u003d \u0027compute_terminate_instance\u0027:"},{"line_number":548,"context_line":"            for uuid in self.instance_uuids:"},{"line_number":549,"context_line":"                self._delete_instance_actions_and_events(self.context, uuid)"},{"line_number":550,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"da85f559_2ee3d034","line":547,"in_reply_to":"da85f559_9e9793eb","updated":"2015-11-11 08:11:49.000000000","message":"Alex - I was against doing this in the DB layer several PS\u0027s ago because it leaks details about nova application logic into the DB layer that should not concern itself with any of that stuff.\n\nYou do bring up a good point about the local delete, but I think that this is really an issue with the fact that local delete does not deal with instance events at all. We should fix local delete though, not add radnom code to the DB layer.","commit_id":"d7b1f2c293a6d267844edbe038a5049b1ceb9e07"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"e2c8b082a912f59ed47aacc75c235ff444f054af","unresolved":false,"context_lines":[{"line_number":544,"context_line":"                self.context, uuid, self.event_name, exc_val\u003dexc_val,"},{"line_number":545,"context_line":"                exc_tb\u003dexc_tb, want_result\u003dFalse)"},{"line_number":546,"context_line":""},{"line_number":547,"context_line":"        if self.event_name \u003d\u003d \u0027compute_terminate_instance\u0027:"},{"line_number":548,"context_line":"            for uuid in self.instance_uuids:"},{"line_number":549,"context_line":"                self._delete_instance_actions_and_events(self.context, uuid)"},{"line_number":550,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"da85f559_2298f3bf","line":547,"in_reply_to":"fa80f949_baead50d","updated":"2015-11-10 12:28:51.000000000","message":"In case of \u0027compute_terminate_instance\u0027(deleting an instance),\nif action events records is soft deleted in the \u0027instance_destroy\u0027 method in db layer, \u0027event_finish\u0027 process is failed because action events records have already been soft deleted.\nSo \u0027event_finish\u0027 should be executed before action events records is soft deleted.","commit_id":"d7b1f2c293a6d267844edbe038a5049b1ceb9e07"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"15c62a7e0d183c22fbb79bd5aaf153eb92df98dd","unresolved":false,"context_lines":[{"line_number":541,"context_line":"        return self"},{"line_number":542,"context_line":""},{"line_number":543,"context_line":"    def __exit__(self, exc_type, exc_val, exc_tb):"},{"line_number":544,"context_line":"        if not self.skip_finish_event:"},{"line_number":545,"context_line":"            for uuid in self.instance_uuids:"},{"line_number":546,"context_line":"                objects.InstanceActionEvent.event_finish_with_failure("},{"line_number":547,"context_line":"                    self.context, uuid, self.event_name, exc_val\u003dexc_val,"}],"source_content_type":"text/x-python","patch_set":11,"id":"ba8a016a_87ae6696","line":544,"range":{"start_line":544,"start_character":8,"end_line":544,"end_character":38},"updated":"2015-11-18 16:39:39.000000000","message":"Well this is not exactly what we want - we do want to record the event and then promptly \"delete\" it. The record can be used for forensics since we never actually delete stuff.","commit_id":"35dd986200ebad3c86fc86b725ab19dc47271519"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"df0a2e310693c4c0e57cc790cc3560763ddf27b8","unresolved":false,"context_lines":[{"line_number":541,"context_line":"        return self"},{"line_number":542,"context_line":""},{"line_number":543,"context_line":"    def __exit__(self, exc_type, exc_val, exc_tb):"},{"line_number":544,"context_line":"        if not self.skip_finish_event:"},{"line_number":545,"context_line":"            for uuid in self.instance_uuids:"},{"line_number":546,"context_line":"                objects.InstanceActionEvent.event_finish_with_failure("},{"line_number":547,"context_line":"                    self.context, uuid, self.event_name, exc_val\u003dexc_val,"}],"source_content_type":"text/x-python","patch_set":11,"id":"ba8a016a_a80fa437","line":544,"in_reply_to":"ba8a016a_87ae6696","updated":"2015-11-19 02:46:24.000000000","message":"If the way that EventReporter is called in wrap_instance_event method in nova/compute/manager.py is taken,\nthe finish process of instance action event is performed after soft deleting instance action events in destroy method in instance object.\n\nSo how about the following way?\n\nAdd a flag to event_finish_with_failure method\u0027s argument in InstanceActionEvent object.\nAnd pass the True flag to event_finish_with_failure method when deleting an instance.\nThen find recoeds in database table with read_deleted\u003dTrue if the flag is true.","commit_id":"35dd986200ebad3c86fc86b725ab19dc47271519"}],"nova/db/sqlalchemy/api.py":[{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"f45a01cc7936cc3fa0b0a823f1d813dbb0bcd51f","unresolved":false,"context_lines":[{"line_number":5850,"context_line":"    return event"},{"line_number":5851,"context_line":""},{"line_number":5852,"context_line":""},{"line_number":5853,"context_line":"def action_event_delete(context, event_id):"},{"line_number":5854,"context_line":"    session \u003d get_session()"},{"line_number":5855,"context_line":"    with session.begin():"},{"line_number":5856,"context_line":"        model_query(context, models.InstanceActionEvent, session\u003dsession).\\"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a2fa921_02f4d683","line":5853,"updated":"2015-10-07 11:58:33.000000000","message":"is it possible we create a function to delete all event\nthat has the action id? so we don\u0027t need to query one by one and delete one by one?","commit_id":"78e01922aeb54b0ae0cd69a4b3320167d0ce2bb6"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"5b48eb42cfddf3867b50a19979c3635ed4e47e13","unresolved":false,"context_lines":[{"line_number":5850,"context_line":"    return event"},{"line_number":5851,"context_line":""},{"line_number":5852,"context_line":""},{"line_number":5853,"context_line":"def action_event_delete(context, event_id):"},{"line_number":5854,"context_line":"    session \u003d get_session()"},{"line_number":5855,"context_line":"    with session.begin():"},{"line_number":5856,"context_line":"        model_query(context, models.InstanceActionEvent, session\u003dsession).\\"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a2fa921_81be7963","line":5853,"in_reply_to":"7a2fa921_02f4d683","updated":"2015-10-08 08:35:37.000000000","message":"I added deleting events in \u0027action_delete\u0027 method and removed this method.","commit_id":"78e01922aeb54b0ae0cd69a4b3320167d0ce2bb6"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"bef25a89d30efcf715b02e306e863353cad32f64","unresolved":false,"context_lines":[{"line_number":5715,"context_line":"    session \u003d get_session()"},{"line_number":5716,"context_line":"    with session.begin():"},{"line_number":5717,"context_line":"        query \u003d model_query(context, models.InstanceAction,"},{"line_number":5718,"context_line":"                            session\u003dsession, read_deleted\u003d\u0027yes\u0027).\\"},{"line_number":5719,"context_line":"                           filter_by(instance_uuid\u003dvalues[\u0027instance_uuid\u0027]).\\"},{"line_number":5720,"context_line":"                           filter_by(request_id\u003dvalues[\u0027request_id\u0027])"},{"line_number":5721,"context_line":"        if query.update(values) !\u003d 1:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a2fa921_68e0d9fa","line":5718,"updated":"2015-10-08 10:52:55.000000000","message":"So this seems sloppy to me. It would be much better to bubble this up to the db API, so that we can express when we expect that the instance action may have been soft deleted.\n\nI wonder really if there is even a valid reason to do this at all. When is it a valid thing to action_finish for a deleted instance.","commit_id":"ae8a1ff05c9ec55899ede4a5703e4d06d353db18"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"3a6d014373ae16570fddb9b24f495c292234aa44","unresolved":false,"context_lines":[{"line_number":5715,"context_line":"    session \u003d get_session()"},{"line_number":5716,"context_line":"    with session.begin():"},{"line_number":5717,"context_line":"        query \u003d model_query(context, models.InstanceAction,"},{"line_number":5718,"context_line":"                            session\u003dsession, read_deleted\u003d\u0027yes\u0027).\\"},{"line_number":5719,"context_line":"                           filter_by(instance_uuid\u003dvalues[\u0027instance_uuid\u0027]).\\"},{"line_number":5720,"context_line":"                           filter_by(request_id\u003dvalues[\u0027request_id\u0027])"},{"line_number":5721,"context_line":"        if query.update(values) !\u003d 1:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a2fa921_710e5a8d","line":5718,"in_reply_to":"7a2fa921_5477b3d2","updated":"2015-10-09 04:58:45.000000000","message":"Done.\nA \u0027read_deleted\u0027 flag is specified(\u0027yes\u0027) only in the instance deletion case in PS3.","commit_id":"ae8a1ff05c9ec55899ede4a5703e4d06d353db18"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"dec320ed9ea5663d8995ecbf041c8a4b1343cf0b","unresolved":false,"context_lines":[{"line_number":5715,"context_line":"    session \u003d get_session()"},{"line_number":5716,"context_line":"    with session.begin():"},{"line_number":5717,"context_line":"        query \u003d model_query(context, models.InstanceAction,"},{"line_number":5718,"context_line":"                            session\u003dsession, read_deleted\u003d\u0027yes\u0027).\\"},{"line_number":5719,"context_line":"                           filter_by(instance_uuid\u003dvalues[\u0027instance_uuid\u0027]).\\"},{"line_number":5720,"context_line":"                           filter_by(request_id\u003dvalues[\u0027request_id\u0027])"},{"line_number":5721,"context_line":"        if query.update(values) !\u003d 1:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a2fa921_ae06f91a","line":5718,"in_reply_to":"7a2fa921_68e0d9fa","updated":"2015-10-08 11:28:26.000000000","message":"The reason why adding \"read_deleted\u003d\u0027yes\u0027\" is to avoid occurring the \u0027InstanceActionNotFound\u0027 error when the instance deletion operation.\n\nWhen the instance deletion operation is executed,\n_delete_instance_actions_and_events method in nova/compute/manager.py is called.\n(_delete_instance_actions_and_events method is added in this patch.)\nAt that moment, the records in \u0027instance_actions\u0027 tables are soft deleted.\n\nAfter that, \u0027action_finish\u0027 is called.\nIf \"read_deleted\u003d\u0027yes\u0027\" is not specified, the record cannot be gotten because it has already been soft deleted.\nSo \u0027InstanceActionNotFound\u0027 error occurs.","commit_id":"ae8a1ff05c9ec55899ede4a5703e4d06d353db18"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"9a463b4c6e46c5d0309e10453a170745f2f865fd","unresolved":false,"context_lines":[{"line_number":5715,"context_line":"    session \u003d get_session()"},{"line_number":5716,"context_line":"    with session.begin():"},{"line_number":5717,"context_line":"        query \u003d model_query(context, models.InstanceAction,"},{"line_number":5718,"context_line":"                            session\u003dsession, read_deleted\u003d\u0027yes\u0027).\\"},{"line_number":5719,"context_line":"                           filter_by(instance_uuid\u003dvalues[\u0027instance_uuid\u0027]).\\"},{"line_number":5720,"context_line":"                           filter_by(request_id\u003dvalues[\u0027request_id\u0027])"},{"line_number":5721,"context_line":"        if query.update(values) !\u003d 1:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a2fa921_5477b3d2","line":5718,"in_reply_to":"7a2fa921_ae06f91a","updated":"2015-10-08 13:15:04.000000000","message":"I understand that and I think it\u0027s the wrong thing to do. Either make sure this isn\u0027t happening, or add an explicit flag. This is just too big of a hammer for what you want to solve and has the potential to hide bugs in the future.","commit_id":"ae8a1ff05c9ec55899ede4a5703e4d06d353db18"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"6f1ffc4b638f1fb89dbbb9cd328e33906704232e","unresolved":false,"context_lines":[{"line_number":5807,"context_line":"    session \u003d get_session()"},{"line_number":5808,"context_line":"    # A deleted record need be gotten in the instance deletion."},{"line_number":5809,"context_line":"    read_deleted \u003d \u0027yes\u0027 if (values[\u0027event\u0027] \u003d\u003d"},{"line_number":5810,"context_line":"        \u0027compute_terminate_instance\u0027) else \u0027no\u0027"},{"line_number":5811,"context_line":"    with session.begin():"},{"line_number":5812,"context_line":"        action \u003d _action_get_by_request_id(context, values[\u0027instance_uuid\u0027],"},{"line_number":5813,"context_line":"                                           values[\u0027request_id\u0027], session,"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a2fa921_2b29469e","line":5810,"updated":"2015-10-09 09:34:57.000000000","message":"not very happy with this living in the DB layer, especially since this relies on an event name which is generated from the manager method name, which is actually part of the RPC API contract and versioned. There is just too much coupling happening here.","commit_id":"7b757a3789dc27e5fecbdcf9ab9e1caca76915bc"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"d2927e0057c566cbe81b7c7255ce152fd1ada89d","unresolved":false,"context_lines":[{"line_number":5739,"context_line":"    return action"},{"line_number":5740,"context_line":""},{"line_number":5741,"context_line":""},{"line_number":5742,"context_line":"def action_delete(context, action_id):"},{"line_number":5743,"context_line":"    session \u003d get_session()"},{"line_number":5744,"context_line":"    with session.begin():"},{"line_number":5745,"context_line":"        model_query(context, models.InstanceAction, session\u003dsession).\\"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a2ca52d_0d2c00aa","line":5742,"updated":"2015-10-15 08:34:56.000000000","message":"Should we make it clear that this also deletes ActionEvent records? Seems like we should at least name it accordingly both here and in the object.","commit_id":"4b7fb439a3b53f5a99941d050ed36abfbd0827f9"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"72684385db28575fa45af086d28f4cc2371dbe38","unresolved":false,"context_lines":[{"line_number":5739,"context_line":"    return action"},{"line_number":5740,"context_line":""},{"line_number":5741,"context_line":""},{"line_number":5742,"context_line":"def action_delete(context, action_id):"},{"line_number":5743,"context_line":"    session \u003d get_session()"},{"line_number":5744,"context_line":"    with session.begin():"},{"line_number":5745,"context_line":"        model_query(context, models.InstanceAction, session\u003dsession).\\"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a29b11f_fa242fb0","line":5742,"in_reply_to":"5a2ca52d_0d2c00aa","updated":"2015-10-19 01:41:07.000000000","message":"Done","commit_id":"4b7fb439a3b53f5a99941d050ed36abfbd0827f9"}],"nova/objects/instance_action.py":[{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"1c517c6ba29f154da2d62383cbe0e9b776ca3b8d","unresolved":false,"context_lines":[{"line_number":103,"context_line":"class InstanceActionList(base.ObjectListBase, base.NovaObject):"},{"line_number":104,"context_line":"    # Version 1.0: Initial version"},{"line_number":105,"context_line":"    #              InstanceAction \u003c\u003d version 1.2"},{"line_number":106,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":107,"context_line":"    fields \u003d {"},{"line_number":108,"context_line":"        \u0027objects\u0027: fields.ListOfObjectsField(\u0027InstanceAction\u0027),"},{"line_number":109,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a29b11f_83cb0ca5","line":106,"range":{"start_line":106,"start_character":15,"end_line":106,"end_character":18},"updated":"2015-10-20 12:26:42.000000000","message":"We need to bump this and ...","commit_id":"d9abdd56fb735acec557de0f9c6252c5605d960d"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"b8afd9d208f6f4be6c363d35a4fb0dcc1ce6d829","unresolved":false,"context_lines":[{"line_number":103,"context_line":"class InstanceActionList(base.ObjectListBase, base.NovaObject):"},{"line_number":104,"context_line":"    # Version 1.0: Initial version"},{"line_number":105,"context_line":"    #              InstanceAction \u003c\u003d version 1.2"},{"line_number":106,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":107,"context_line":"    fields \u003d {"},{"line_number":108,"context_line":"        \u0027objects\u0027: fields.ListOfObjectsField(\u0027InstanceAction\u0027),"},{"line_number":109,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a29b11f_153aa3cc","line":106,"in_reply_to":"3a29b11f_83cb0ca5","updated":"2015-10-21 07:32:24.000000000","message":"Done","commit_id":"d9abdd56fb735acec557de0f9c6252c5605d960d"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"1c517c6ba29f154da2d62383cbe0e9b776ca3b8d","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        }"},{"line_number":110,"context_line":"    # NOTE(danms): InstanceAction was at 1.1 before we added this"},{"line_number":111,"context_line":"    obj_relationships \u003d {"},{"line_number":112,"context_line":"        \u0027objects\u0027: [(\u00271.0\u0027, \u00271.2\u0027)]"},{"line_number":113,"context_line":"        }"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    @base.remotable_classmethod"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a29b11f_63c11080","line":112,"range":{"start_line":112,"start_character":20,"end_line":112,"end_character":34},"updated":"2015-10-20 12:26:42.000000000","message":"Actually add (\u00271.1\u0027, \u00271.2\u0027) instead of just changing this right?","commit_id":"d9abdd56fb735acec557de0f9c6252c5605d960d"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"b8afd9d208f6f4be6c363d35a4fb0dcc1ce6d829","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        }"},{"line_number":110,"context_line":"    # NOTE(danms): InstanceAction was at 1.1 before we added this"},{"line_number":111,"context_line":"    obj_relationships \u003d {"},{"line_number":112,"context_line":"        \u0027objects\u0027: [(\u00271.0\u0027, \u00271.2\u0027)]"},{"line_number":113,"context_line":"        }"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    @base.remotable_classmethod"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a29b11f_d52f4b86","line":112,"in_reply_to":"3a29b11f_63c11080","updated":"2015-10-21 07:32:24.000000000","message":"Done","commit_id":"d9abdd56fb735acec557de0f9c6252c5605d960d"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"39d86927b9705588f87c0cb3dad8e0296cb73613","unresolved":false,"context_lines":[{"line_number":102,"context_line":"@base.NovaObjectRegistry.register"},{"line_number":103,"context_line":"class InstanceActionList(base.ObjectListBase, base.NovaObject):"},{"line_number":104,"context_line":"    # Version 1.0: Initial version"},{"line_number":105,"context_line":"    #              InstanceAction \u003c\u003d version 1.2"},{"line_number":106,"context_line":"    VERSION \u003d \u00271.1\u0027"},{"line_number":107,"context_line":"    fields \u003d {"},{"line_number":108,"context_line":"        \u0027objects\u0027: fields.ListOfObjectsField(\u0027InstanceAction\u0027),"}],"source_content_type":"text/x-python","patch_set":9,"id":"da85f559_6e4b182b","line":105,"range":{"start_line":105,"start_character":46,"end_line":105,"end_character":48},"updated":"2015-11-11 08:11:49.000000000","message":"We should be adding a new comment here not modifying an existing one I think.","commit_id":"d7b1f2c293a6d267844edbe038a5049b1ceb9e07"}],"nova/tests/unit/objects/test_instance_action.py":[{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"1c517c6ba29f154da2d62383cbe0e9b776ca3b8d","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        action \u003d instance_action.InstanceAction.action_start("},{"line_number":182,"context_line":"            self.context, \u0027fake-uuid\u0027, \u0027fake-action\u0027)"},{"line_number":183,"context_line":"        action.destroy_with_events()"},{"line_number":184,"context_line":"        mock_delete.assert_called_once_with(self.context, fake_action[\u0027id\u0027])"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"class TestInstanceActionObject(test_objects._LocalTest,"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a29b11f_836f8cc4","line":184,"range":{"start_line":184,"start_character":7,"end_line":184,"end_character":76},"updated":"2015-10-20 12:26:42.000000000","message":"This whole test is not very useful.","commit_id":"d9abdd56fb735acec557de0f9c6252c5605d960d"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"b8afd9d208f6f4be6c363d35a4fb0dcc1ce6d829","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        action \u003d instance_action.InstanceAction.action_start("},{"line_number":182,"context_line":"            self.context, \u0027fake-uuid\u0027, \u0027fake-action\u0027)"},{"line_number":183,"context_line":"        action.destroy_with_events()"},{"line_number":184,"context_line":"        mock_delete.assert_called_once_with(self.context, fake_action[\u0027id\u0027])"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"class TestInstanceActionObject(test_objects._LocalTest,"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a29b11f_55a81bdb","line":184,"in_reply_to":"3a29b11f_836f8cc4","updated":"2015-10-21 07:32:24.000000000","message":"But it should be added for test coverage.","commit_id":"d9abdd56fb735acec557de0f9c6252c5605d960d"}]}
