)]}'
{"doc/notification_samples/instance-delete-end.json":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"53c09c88596d6abac1acee410f0b15e209a841bf","unresolved":false,"context_lines":[{"line_number":13,"context_line":"            \"ip_addresses\":[],"},{"line_number":14,"context_line":"            \"kernel_id\":\"\","},{"line_number":15,"context_line":"            \"launched_at\":\"2012-10-29T13:42:11Z\","},{"line_number":16,"context_line":"            \"image_ref\": \"155d900f-4e14-4e4c-a73d-069cbf4541e6\","},{"line_number":17,"context_line":"            \"metadata\":{},"},{"line_number":18,"context_line":"            \"node\":\"fake-mini\","},{"line_number":19,"context_line":"            \"os_type\":null,"}],"source_content_type":"application/json","patch_set":25,"id":"7aa08908_f17605d7","line":16,"range":{"start_line":16,"start_character":13,"end_line":16,"end_character":22},"updated":"2016-06-10 08:34:51.000000000","message":"maybe image_id is better here?\n\nI think the db model used to think about URLs, hence the ref.","commit_id":"32e03a2409b0b12c0349460576c5d453fc828c40"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fcd0c4f4dca10d36e670f0e35e4ec55517286e04","unresolved":false,"context_lines":[{"line_number":13,"context_line":"            \"ip_addresses\":[],"},{"line_number":14,"context_line":"            \"kernel_id\":\"\","},{"line_number":15,"context_line":"            \"launched_at\":\"2012-10-29T13:42:11Z\","},{"line_number":16,"context_line":"            \"image_ref\": \"155d900f-4e14-4e4c-a73d-069cbf4541e6\","},{"line_number":17,"context_line":"            \"metadata\":{},"},{"line_number":18,"context_line":"            \"node\":\"fake-mini\","},{"line_number":19,"context_line":"            \"os_type\":null,"}],"source_content_type":"application/json","patch_set":25,"id":"7aa08908_2dcdc6b7","line":16,"range":{"start_line":16,"start_character":13,"end_line":16,"end_character":22},"in_reply_to":"7aa08908_f17605d7","updated":"2016-06-10 12:29:45.000000000","message":"Done","commit_id":"32e03a2409b0b12c0349460576c5d453fc828c40"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b4f51bc9cf76891ce3f2de6dbfee05f83cc608c4","unresolved":false,"context_lines":[{"line_number":10,"context_line":"            \"fault\":null,"},{"line_number":11,"context_line":"            \"host\":\"compute\","},{"line_number":12,"context_line":"            \"host_name\":\"some-server\","},{"line_number":13,"context_line":"            \"ip_addresses\":[],"},{"line_number":14,"context_line":"            \"kernel_id\":\"\","},{"line_number":15,"context_line":"            \"launched_at\":\"2012-10-29T13:42:11Z\","},{"line_number":16,"context_line":"            \"image_uuid\": \"155d900f-4e14-4e4c-a73d-069cbf4541e6\","}],"source_content_type":"application/json","patch_set":37,"id":"3aaa91ec_2b98c0bf","line":13,"updated":"2016-06-29 19:32:10.000000000","message":"Why is this empty in delete.end? Because we\u0027ve deallocated ports?","commit_id":"9d82c6a2fd5689492134dcd5fc76159af2ce9852"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a60f20e1a63ae86f08ed5375bf50d8f94fa52531","unresolved":false,"context_lines":[{"line_number":10,"context_line":"            \"fault\":null,"},{"line_number":11,"context_line":"            \"host\":\"compute\","},{"line_number":12,"context_line":"            \"host_name\":\"some-server\","},{"line_number":13,"context_line":"            \"ip_addresses\":[],"},{"line_number":14,"context_line":"            \"kernel_id\":\"\","},{"line_number":15,"context_line":"            \"launched_at\":\"2012-10-29T13:42:11Z\","},{"line_number":16,"context_line":"            \"image_uuid\": \"155d900f-4e14-4e4c-a73d-069cbf4541e6\","}],"source_content_type":"application/json","patch_set":37,"id":"3aaa91ec_a0303b57","line":13,"in_reply_to":"3aaa91ec_2b98c0bf","updated":"2016-06-30 07:26:47.000000000","message":"Honestly I don\u0027t know. This is how the legacy notification behaves as well. The instance.info_cache.network_info is empty in the instance when the _complete_deletion() is called in the compute.manager. \n\nIf this is not the expected behavior then I can open a bug for it and try to fix the behavior. During the transformation I only fixed things that is related to the structure of the notification or things that are not part of the payload as those are hard to fix later. But these kind of behavior change is easy to fix later and I wanted to make the transformation as transparent as possible regarding behavior.","commit_id":"9d82c6a2fd5689492134dcd5fc76159af2ce9852"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1965e7328cbd01cd70735132a32c1c6922a066fb","unresolved":false,"context_lines":[{"line_number":10,"context_line":"            \"fault\":null,"},{"line_number":11,"context_line":"            \"host\":\"compute\","},{"line_number":12,"context_line":"            \"host_name\":\"some-server\","},{"line_number":13,"context_line":"            \"ip_addresses\":[],"},{"line_number":14,"context_line":"            \"kernel_id\":\"\","},{"line_number":15,"context_line":"            \"launched_at\":\"2012-10-29T13:42:11Z\","},{"line_number":16,"context_line":"            \"image_uuid\": \"155d900f-4e14-4e4c-a73d-069cbf4541e6\","}],"source_content_type":"application/json","patch_set":37,"id":"3aaa91ec_98445647","line":13,"in_reply_to":"3aaa91ec_41d5eb40","updated":"2016-07-01 07:02:56.000000000","message":"Thanks for the pointers. Based on these I feel that the current behavior is OK.","commit_id":"9d82c6a2fd5689492134dcd5fc76159af2ce9852"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0d2d41427decd9c5f4694b9cbce38cc91a7cc908","unresolved":false,"context_lines":[{"line_number":10,"context_line":"            \"fault\":null,"},{"line_number":11,"context_line":"            \"host\":\"compute\","},{"line_number":12,"context_line":"            \"host_name\":\"some-server\","},{"line_number":13,"context_line":"            \"ip_addresses\":[],"},{"line_number":14,"context_line":"            \"kernel_id\":\"\","},{"line_number":15,"context_line":"            \"launched_at\":\"2012-10-29T13:42:11Z\","},{"line_number":16,"context_line":"            \"image_uuid\": \"155d900f-4e14-4e4c-a73d-069cbf4541e6\","}],"source_content_type":"application/json","patch_set":37,"id":"3aaa91ec_41d5eb40","line":13,"in_reply_to":"3aaa91ec_a0303b57","updated":"2016-06-30 21:56:20.000000000","message":"Probably because of this:\n\nhttps://github.com/openstack/nova/blob/master/nova/compute/manager.py#L2289\n\nAnd then when we save the instance:\n\nhttps://github.com/openstack/nova/blob/master/nova/compute/manager.py#L2314\n\nit updates itself:\n\nhttps://github.com/openstack/nova/blob/master/nova/objects/instance.py#L732","commit_id":"9d82c6a2fd5689492134dcd5fc76159af2ce9852"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"9e55a0d880c434bf7e47a83734f34352447bc249","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"event_type\":\"instance.delete.end\","},{"line_number":3,"context_line":"    \"payload\":{"},{"line_number":4,"context_line":"        \"nova_object.data\":{"},{"line_number":5,"context_line":"            \"architecture\":\"x86_64\","},{"line_number":6,"context_line":"            \"availability_zone\":null,"}],"source_content_type":"application/json","patch_set":41,"id":"3aaa91ec_e62c14ae","line":3,"updated":"2016-06-30 09:44:50.000000000","message":"I have a concern, how can we make sure our JSON schemas we provide for helping are good, and not wrong about the fields ?\n\nDo you plan to have a follow-up change for checking it ?","commit_id":"3fc5af5f1f82ffbbf75e40f45945a346663a2399"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"ed73a32f8b88d1568484c173dbf07effafc31344","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"event_type\":\"instance.delete.end\","},{"line_number":3,"context_line":"    \"payload\":{"},{"line_number":4,"context_line":"        \"nova_object.data\":{"},{"line_number":5,"context_line":"            \"architecture\":\"x86_64\","},{"line_number":6,"context_line":"            \"availability_zone\":null,"}],"source_content_type":"application/json","patch_set":41,"id":"3aaa91ec_61c76e98","line":3,"in_reply_to":"3aaa91ec_e62c14ae","updated":"2016-06-30 09:47:10.000000000","message":"Meh, nevermind.","commit_id":"3fc5af5f1f82ffbbf75e40f45945a346663a2399"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7f7fc067c4c7043a5368a0fae7c88e703b0ea68a","unresolved":false,"context_lines":[{"line_number":28,"context_line":"            \"flavor\": {"},{"line_number":29,"context_line":"                \"nova_object.name\": \"FlavorPayload\","},{"line_number":30,"context_line":"                \"nova_object.data\": {"},{"line_number":31,"context_line":"                    \"flavor_id\": \"1\","},{"line_number":32,"context_line":"                    \"root_gb\": 1,"},{"line_number":33,"context_line":"                    \"vcpus\": 1,"},{"line_number":34,"context_line":"                    \"ephemeral_gb\": 0,"}],"source_content_type":"application/json","patch_set":41,"id":"3aaa91ec_1a8a4564","line":31,"range":{"start_line":31,"start_character":34,"end_line":31,"end_character":35},"updated":"2016-06-30 13:32:44.000000000","message":"This is a uuid by default if not provided when creating a flavor:\n\nhttps://github.com/openstack/nova/blob/master/nova/compute/flavors.py#L74-75\n\nSo using a uuid in the sampe might be a bit nicer to avoid confusion with the flavor.id column.","commit_id":"3fc5af5f1f82ffbbf75e40f45945a346663a2399"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"633f8f28159b4d5e92b89c414a83e832f7182da9","unresolved":false,"context_lines":[{"line_number":28,"context_line":"            \"flavor\": {"},{"line_number":29,"context_line":"                \"nova_object.name\": \"FlavorPayload\","},{"line_number":30,"context_line":"                \"nova_object.data\": {"},{"line_number":31,"context_line":"                    \"flavor_id\": \"1\","},{"line_number":32,"context_line":"                    \"root_gb\": 1,"},{"line_number":33,"context_line":"                    \"vcpus\": 1,"},{"line_number":34,"context_line":"                    \"ephemeral_gb\": 0,"}],"source_content_type":"application/json","patch_set":41,"id":"3aaa91ec_9e010208","line":31,"range":{"start_line":31,"start_character":34,"end_line":31,"end_character":35},"in_reply_to":"3aaa91ec_03d4a0e9","updated":"2016-06-30 15:10:12.000000000","message":"Graaah.","commit_id":"3fc5af5f1f82ffbbf75e40f45945a346663a2399"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"239b3ba8955e69d5930e50ff785cacd6d3247006","unresolved":false,"context_lines":[{"line_number":28,"context_line":"            \"flavor\": {"},{"line_number":29,"context_line":"                \"nova_object.name\": \"FlavorPayload\","},{"line_number":30,"context_line":"                \"nova_object.data\": {"},{"line_number":31,"context_line":"                    \"flavor_id\": \"1\","},{"line_number":32,"context_line":"                    \"root_gb\": 1,"},{"line_number":33,"context_line":"                    \"vcpus\": 1,"},{"line_number":34,"context_line":"                    \"ephemeral_gb\": 0,"}],"source_content_type":"application/json","patch_set":41,"id":"3aaa91ec_03d4a0e9","line":31,"range":{"start_line":31,"start_character":34,"end_line":31,"end_character":35},"in_reply_to":"3aaa91ec_1a8a4564","updated":"2016-06-30 14:26:34.000000000","message":"Good point. Done.","commit_id":"3fc5af5f1f82ffbbf75e40f45945a346663a2399"}],"nova/compute/manager.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7d85843e53fed486b7f391336952e3852944edbe","unresolved":false,"context_lines":[{"line_number":743,"context_line":"            bdm.destroy()"},{"line_number":744,"context_line":""},{"line_number":745,"context_line":"        self._update_resource_tracker(context, instance)"},{"line_number":746,"context_line":"        self._notify_about_instance_usage(context, instance, \"delete.end\","},{"line_number":747,"context_line":"                system_metadata\u003dsystem_meta)"},{"line_number":748,"context_line":"        compute_utils.notify_about_instance_action(context,"},{"line_number":749,"context_line":"                                                   instance,"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_55f26cd3","line":746,"range":{"start_line":746,"start_character":13,"end_line":746,"end_character":41},"updated":"2016-06-06 14:33:27.000000000","message":"I keep wondering if we want a helper method that does both of these things?","commit_id":"f0f09e23afddb875c8b4a74398826f94689bddeb"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5b1aa4bd3a5cc68921f1e44988f7267f6eb66bae","unresolved":false,"context_lines":[{"line_number":743,"context_line":"            bdm.destroy()"},{"line_number":744,"context_line":""},{"line_number":745,"context_line":"        self._update_resource_tracker(context, instance)"},{"line_number":746,"context_line":"        self._notify_about_instance_usage(context, instance, \"delete.end\","},{"line_number":747,"context_line":"                system_metadata\u003dsystem_meta)"},{"line_number":748,"context_line":"        compute_utils.notify_about_instance_action(context,"},{"line_number":749,"context_line":"                                                   instance,"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_765f79e5","line":746,"range":{"start_line":746,"start_character":13,"end_line":746,"end_character":41},"in_reply_to":"7aa08908_55f26cd3","updated":"2016-06-07 15:48:18.000000000","message":"I thought I keep it separate so that it will be easier to remove the legacy one later on. Also the legacy _notify_about_instance_usage has the generic extra_info parameter that I want to avoid as it goes against the \u0027let\u0027s defined the content of our notifications\u0027 goal. \nLast (an least) changing the signature, call path here will blow up the existing unit tests.\n\nAnyhow I can do it if needed I just wanted to add some reasoning to the current version before we decide","commit_id":"f0f09e23afddb875c8b4a74398826f94689bddeb"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7d85843e53fed486b7f391336952e3852944edbe","unresolved":false,"context_lines":[{"line_number":746,"context_line":"        self._notify_about_instance_usage(context, instance, \"delete.end\","},{"line_number":747,"context_line":"                system_metadata\u003dsystem_meta)"},{"line_number":748,"context_line":"        compute_utils.notify_about_instance_action(context,"},{"line_number":749,"context_line":"                                                   instance,"},{"line_number":750,"context_line":"                                                   self.host,"},{"line_number":751,"context_line":"                                                   action\u003d\u0027delete\u0027,"},{"line_number":752,"context_line":"                                                   phase\u003d\u0027end\u0027)"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_d5265c67","line":749,"range":{"start_line":749,"start_character":51,"end_line":749,"end_character":52},"updated":"2016-06-06 14:33:27.000000000","message":"micro nit, I prefer the indention used in the above line, so we don\u0027t add so many lines here.","commit_id":"f0f09e23afddb875c8b4a74398826f94689bddeb"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5b1aa4bd3a5cc68921f1e44988f7267f6eb66bae","unresolved":false,"context_lines":[{"line_number":746,"context_line":"        self._notify_about_instance_usage(context, instance, \"delete.end\","},{"line_number":747,"context_line":"                system_metadata\u003dsystem_meta)"},{"line_number":748,"context_line":"        compute_utils.notify_about_instance_action(context,"},{"line_number":749,"context_line":"                                                   instance,"},{"line_number":750,"context_line":"                                                   self.host,"},{"line_number":751,"context_line":"                                                   action\u003d\u0027delete\u0027,"},{"line_number":752,"context_line":"                                                   phase\u003d\u0027end\u0027)"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_b6e9e182","line":749,"range":{"start_line":749,"start_character":51,"end_line":749,"end_character":52},"in_reply_to":"7aa08908_d5265c67","updated":"2016-06-07 15:48:18.000000000","message":"Done","commit_id":"f0f09e23afddb875c8b4a74398826f94689bddeb"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7d85843e53fed486b7f391336952e3852944edbe","unresolved":false,"context_lines":[{"line_number":748,"context_line":"        compute_utils.notify_about_instance_action(context,"},{"line_number":749,"context_line":"                                                   instance,"},{"line_number":750,"context_line":"                                                   self.host,"},{"line_number":751,"context_line":"                                                   action\u003d\u0027delete\u0027,"},{"line_number":752,"context_line":"                                                   phase\u003d\u0027end\u0027)"},{"line_number":753,"context_line":"        self._clean_instance_console_tokens(context, instance)"},{"line_number":754,"context_line":"        self._delete_scheduler_instance_info(context, instance.uuid)"},{"line_number":755,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_1573c481","line":752,"range":{"start_line":751,"start_character":51,"end_line":752,"end_character":63},"updated":"2016-06-06 14:33:27.000000000","message":"it might be nice if these were referring to constants, given they are fixed.","commit_id":"f0f09e23afddb875c8b4a74398826f94689bddeb"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5b1aa4bd3a5cc68921f1e44988f7267f6eb66bae","unresolved":false,"context_lines":[{"line_number":748,"context_line":"        compute_utils.notify_about_instance_action(context,"},{"line_number":749,"context_line":"                                                   instance,"},{"line_number":750,"context_line":"                                                   self.host,"},{"line_number":751,"context_line":"                                                   action\u003d\u0027delete\u0027,"},{"line_number":752,"context_line":"                                                   phase\u003d\u0027end\u0027)"},{"line_number":753,"context_line":"        self._clean_instance_console_tokens(context, instance)"},{"line_number":754,"context_line":"        self._delete_scheduler_instance_info(context, instance.uuid)"},{"line_number":755,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_16a71550","line":752,"range":{"start_line":751,"start_character":51,"end_line":752,"end_character":63},"in_reply_to":"7aa08908_1573c481","updated":"2016-06-07 15:48:18.000000000","message":"Good point. Done.","commit_id":"f0f09e23afddb875c8b4a74398826f94689bddeb"},{"author":{"_account_id":20411,"name":"Julian","email":"julian.sy@att.com","username":"syjulian"},"change_message_id":"13a3d019a614eb36342e2a8af17d4715c9c86dfa","unresolved":false,"context_lines":[{"line_number":2263,"context_line":"                          instance\u003dinstance)"},{"line_number":2264,"context_line":"            self._notify_about_instance_usage(context, instance,"},{"line_number":2265,"context_line":"                                              \"delete.start\")"},{"line_number":2266,"context_line":"            compute_utils.notify_about_instance_action(context, instance,"},{"line_number":2267,"context_line":"                    self.host, action\u003dfields.NotificationAction.DELETE,"},{"line_number":2268,"context_line":"                    phase\u003dfields.NotificationPhase.START)"},{"line_number":2269,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"7aa08908_1659a035","line":2266,"updated":"2016-06-13 15:56:56.000000000","message":"i\u0027m not sure if this was already brought up.\n\nwould you be able to create method like _notify_about_instance_usage on line 1642( similar to the legacy one ) that wraps your \"compute_utils.notify_about_instance_action\" calls and use that instead?","commit_id":"74b5c1dba0a00f6de3e6464690fda6b326e6a285"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"150357c5a034766f9360d38b3156d4f06e34d8ab","unresolved":false,"context_lines":[{"line_number":2263,"context_line":"                          instance\u003dinstance)"},{"line_number":2264,"context_line":"            self._notify_about_instance_usage(context, instance,"},{"line_number":2265,"context_line":"                                              \"delete.start\")"},{"line_number":2266,"context_line":"            compute_utils.notify_about_instance_action(context, instance,"},{"line_number":2267,"context_line":"                    self.host, action\u003dfields.NotificationAction.DELETE,"},{"line_number":2268,"context_line":"                    phase\u003dfields.NotificationPhase.START)"},{"line_number":2269,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"7aa08908_9c13d564","line":2266,"in_reply_to":"7aa08908_1659a035","updated":"2016-06-14 08:13:50.000000000","message":"What is the goal you want to achieve with that wrapping? The code in 1642 just forward the call. I don\u0027t really see why we need that indirection. \n\nIf you suggest to have a single call for legacy and new notification then please see John\u0027s similar comment and my answer in this previous patch set:\nhttps://review.openstack.org/#/c/313654/21/nova/compute/manager.py","commit_id":"74b5c1dba0a00f6de3e6464690fda6b326e6a285"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"dcccea40029560b3e4bbd260d481df3a30dd3e7c","unresolved":false,"context_lines":[{"line_number":725,"context_line":"            bdm.destroy()"},{"line_number":726,"context_line":""},{"line_number":727,"context_line":"        self._update_resource_tracker(context, instance)"},{"line_number":728,"context_line":"        self._notify_about_instance_usage(context, instance, \"delete.end\","},{"line_number":729,"context_line":"                system_metadata\u003dsystem_meta)"},{"line_number":730,"context_line":"        compute_utils.notify_about_instance_action(context, instance,"},{"line_number":731,"context_line":"                self.host, action\u003dfields.NotificationAction.DELETE,"}],"source_content_type":"text/x-python","patch_set":37,"id":"3aaa91ec_e3aee22c","line":728,"updated":"2016-06-29 18:39:43.000000000","message":"Why can\u0027t we do the new versioned notification from the _notify_about_instance_usage method so we don\u0027t have to duplicate these? Like the private method could check to see if the action is \u0027delete.end\u0027 and handle appropriately, or map them somehow with like a partial function.","commit_id":"9d82c6a2fd5689492134dcd5fc76159af2ce9852"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0d2d41427decd9c5f4694b9cbce38cc91a7cc908","unresolved":false,"context_lines":[{"line_number":725,"context_line":"            bdm.destroy()"},{"line_number":726,"context_line":""},{"line_number":727,"context_line":"        self._update_resource_tracker(context, instance)"},{"line_number":728,"context_line":"        self._notify_about_instance_usage(context, instance, \"delete.end\","},{"line_number":729,"context_line":"                system_metadata\u003dsystem_meta)"},{"line_number":730,"context_line":"        compute_utils.notify_about_instance_action(context, instance,"},{"line_number":731,"context_line":"                self.host, action\u003dfields.NotificationAction.DELETE,"}],"source_content_type":"text/x-python","patch_set":37,"id":"3aaa91ec_e1d05721","line":728,"in_reply_to":"3aaa91ec_96ef45b0","updated":"2016-06-30 21:56:20.000000000","message":"We could ignore extra_info for the versioned notifications.\n\nI guess the single method could get kind of ugly with the mappings, but IMO I\u0027d rather have one method handle this stuff for both legacy and versioned notifications, than duplicate legacy and versioned notifiers both everywhere that we need to handle them.\n\nI won\u0027t hold this change up for it, but it\u0027s a future cleanup that I\u0027d like to see.","commit_id":"9d82c6a2fd5689492134dcd5fc76159af2ce9852"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1965e7328cbd01cd70735132a32c1c6922a066fb","unresolved":false,"context_lines":[{"line_number":725,"context_line":"            bdm.destroy()"},{"line_number":726,"context_line":""},{"line_number":727,"context_line":"        self._update_resource_tracker(context, instance)"},{"line_number":728,"context_line":"        self._notify_about_instance_usage(context, instance, \"delete.end\","},{"line_number":729,"context_line":"                system_metadata\u003dsystem_meta)"},{"line_number":730,"context_line":"        compute_utils.notify_about_instance_action(context, instance,"},{"line_number":731,"context_line":"                self.host, action\u003dfields.NotificationAction.DELETE,"}],"source_content_type":"text/x-python","patch_set":37,"id":"3aaa91ec_5865cede","line":728,"in_reply_to":"3aaa91ec_e1d05721","updated":"2016-07-01 07:02:56.000000000","message":"OK. I added a TODO on the wiki, and I will propose a refactor. This way we can argue based on code. :)","commit_id":"9d82c6a2fd5689492134dcd5fc76159af2ce9852"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a60f20e1a63ae86f08ed5375bf50d8f94fa52531","unresolved":false,"context_lines":[{"line_number":725,"context_line":"            bdm.destroy()"},{"line_number":726,"context_line":""},{"line_number":727,"context_line":"        self._update_resource_tracker(context, instance)"},{"line_number":728,"context_line":"        self._notify_about_instance_usage(context, instance, \"delete.end\","},{"line_number":729,"context_line":"                system_metadata\u003dsystem_meta)"},{"line_number":730,"context_line":"        compute_utils.notify_about_instance_action(context, instance,"},{"line_number":731,"context_line":"                self.host, action\u003dfields.NotificationAction.DELETE,"}],"source_content_type":"text/x-python","patch_set":37,"id":"3aaa91ec_96ef45b0","line":728,"in_reply_to":"3aaa91ec_e3aee22c","updated":"2016-06-30 07:26:47.000000000","message":"Most probably we can. But I don\u0027t like that direction for the following reasons:\n\n* I think this would actually lead to more logic to understand due to the mapping. I think eventually it will be more code as well.\n\n* the legacy _notify_about_instance_usage() has an extra_info param (see instance.create.start for usage example) that is basically an undefined part of the signature. I would like to avoid this in the future as this is against the goal of the transformation (i.e. to well define what we send).\n\nIf this is the only way you can accept this patch then I would do it as I want to progress but I wanted to reason about the","commit_id":"9d82c6a2fd5689492134dcd5fc76159af2ce9852"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"dcccea40029560b3e4bbd260d481df3a30dd3e7c","unresolved":false,"context_lines":[{"line_number":2258,"context_line":"                          instance\u003dinstance)"},{"line_number":2259,"context_line":"            self._notify_about_instance_usage(context, instance,"},{"line_number":2260,"context_line":"                                              \"delete.start\")"},{"line_number":2261,"context_line":"            compute_utils.notify_about_instance_action(context, instance,"},{"line_number":2262,"context_line":"                    self.host, action\u003dfields.NotificationAction.DELETE,"},{"line_number":2263,"context_line":"                    phase\u003dfields.NotificationPhase.START)"},{"line_number":2264,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"3aaa91ec_a33dfade","line":2261,"updated":"2016-06-29 18:39:43.000000000","message":"ditto, would have been nice to just do this stuff in _notify_about_instance_usage.","commit_id":"9d82c6a2fd5689492134dcd5fc76159af2ce9852"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a60f20e1a63ae86f08ed5375bf50d8f94fa52531","unresolved":false,"context_lines":[{"line_number":2258,"context_line":"                          instance\u003dinstance)"},{"line_number":2259,"context_line":"            self._notify_about_instance_usage(context, instance,"},{"line_number":2260,"context_line":"                                              \"delete.start\")"},{"line_number":2261,"context_line":"            compute_utils.notify_about_instance_action(context, instance,"},{"line_number":2262,"context_line":"                    self.host, action\u003dfields.NotificationAction.DELETE,"},{"line_number":2263,"context_line":"                    phase\u003dfields.NotificationPhase.START)"},{"line_number":2264,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"3aaa91ec_d62b8de9","line":2261,"in_reply_to":"3aaa91ec_a33dfade","updated":"2016-06-30 07:26:47.000000000","message":"see above","commit_id":"9d82c6a2fd5689492134dcd5fc76159af2ce9852"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b5b690f9ccc01f24b23af957c55802e623dd5b9b","unresolved":false,"context_lines":[{"line_number":726,"context_line":"            bdm.destroy()"},{"line_number":727,"context_line":""},{"line_number":728,"context_line":"        self._update_resource_tracker(context, instance)"},{"line_number":729,"context_line":"        self._notify_about_instance_usage(context, instance, \"delete.end\","},{"line_number":730,"context_line":"                system_metadata\u003dsystem_meta)"},{"line_number":731,"context_line":"        compute_utils.notify_about_instance_action(context, instance,"},{"line_number":732,"context_line":"                self.host, action\u003dfields.NotificationAction.DELETE,"},{"line_number":733,"context_line":"                phase\u003dfields.NotificationPhase.END)"},{"line_number":734,"context_line":"        self._clean_instance_console_tokens(context, instance)"},{"line_number":735,"context_line":"        self._delete_scheduler_instance_info(context, instance.uuid)"},{"line_number":736,"context_line":""}],"source_content_type":"text/x-python","patch_set":43,"id":"3aaa91ec_bc9314a2","line":733,"range":{"start_line":729,"start_character":8,"end_line":733,"end_character":51},"updated":"2016-06-30 21:59:27.000000000","message":"See reply in PS37, I\u0027d still like to consolidate these at some point, but it doesn\u0027t need to happen here.","commit_id":"998235da63d0b156cfc0d67602744ee629824e6f"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2486d84606830b8a4aa668e1590e8e02f930717d","unresolved":false,"context_lines":[{"line_number":726,"context_line":"            bdm.destroy()"},{"line_number":727,"context_line":""},{"line_number":728,"context_line":"        self._update_resource_tracker(context, instance)"},{"line_number":729,"context_line":"        self._notify_about_instance_usage(context, instance, \"delete.end\","},{"line_number":730,"context_line":"                system_metadata\u003dsystem_meta)"},{"line_number":731,"context_line":"        compute_utils.notify_about_instance_action(context, instance,"},{"line_number":732,"context_line":"                self.host, action\u003dfields.NotificationAction.DELETE,"},{"line_number":733,"context_line":"                phase\u003dfields.NotificationPhase.END)"},{"line_number":734,"context_line":"        self._clean_instance_console_tokens(context, instance)"},{"line_number":735,"context_line":"        self._delete_scheduler_instance_info(context, instance.uuid)"},{"line_number":736,"context_line":""}],"source_content_type":"text/x-python","patch_set":43,"id":"3aaa91ec_984e1636","line":733,"range":{"start_line":729,"start_character":8,"end_line":733,"end_character":51},"in_reply_to":"3aaa91ec_5c067086","updated":"2016-07-01 07:03:50.000000000","message":"added a TODO on to the wiki https://wiki.openstack.org/wiki/Nova/VersionedNotificationTransformation#Follow_up_tasks and will propose a refactor patch","commit_id":"998235da63d0b156cfc0d67602744ee629824e6f"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"56f768918e629200476a4944f9cebb5c75ece38e","unresolved":false,"context_lines":[{"line_number":726,"context_line":"            bdm.destroy()"},{"line_number":727,"context_line":""},{"line_number":728,"context_line":"        self._update_resource_tracker(context, instance)"},{"line_number":729,"context_line":"        self._notify_about_instance_usage(context, instance, \"delete.end\","},{"line_number":730,"context_line":"                system_metadata\u003dsystem_meta)"},{"line_number":731,"context_line":"        compute_utils.notify_about_instance_action(context, instance,"},{"line_number":732,"context_line":"                self.host, action\u003dfields.NotificationAction.DELETE,"},{"line_number":733,"context_line":"                phase\u003dfields.NotificationPhase.END)"},{"line_number":734,"context_line":"        self._clean_instance_console_tokens(context, instance)"},{"line_number":735,"context_line":"        self._delete_scheduler_instance_info(context, instance.uuid)"},{"line_number":736,"context_line":""}],"source_content_type":"text/x-python","patch_set":43,"id":"3aaa91ec_5c067086","line":733,"range":{"start_line":729,"start_character":8,"end_line":733,"end_character":51},"in_reply_to":"3aaa91ec_bc9314a2","updated":"2016-06-30 22:29:31.000000000","message":"Agreed.","commit_id":"998235da63d0b156cfc0d67602744ee629824e6f"}],"nova/compute/utils.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7d85843e53fed486b7f391336952e3852944edbe","unresolved":false,"context_lines":[{"line_number":340,"context_line":"                    object\u003d\u0027instance\u0027,"},{"line_number":341,"context_line":"                    action\u003daction,"},{"line_number":342,"context_line":"                    phase\u003dphase),"},{"line_number":343,"context_line":"            payload\u003dpayload).emit(context)"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"def notify_about_server_group_update(context, event_suffix, sg_payload):"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_8782e750","line":343,"range":{"start_line":343,"start_character":28,"end_line":343,"end_character":42},"updated":"2016-06-06 14:33:27.000000000","message":"hmm, so I changed this in a related patch, I find this sort of chaining really hard to read.\n\nIts not as bad here because its clearly a notification, and doesn\u0027t say exception.FooBar(...).emit(context).","commit_id":"f0f09e23afddb875c8b4a74398826f94689bddeb"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5b1aa4bd3a5cc68921f1e44988f7267f6eb66bae","unresolved":false,"context_lines":[{"line_number":340,"context_line":"                    object\u003d\u0027instance\u0027,"},{"line_number":341,"context_line":"                    action\u003daction,"},{"line_number":342,"context_line":"                    phase\u003dphase),"},{"line_number":343,"context_line":"            payload\u003dpayload).emit(context)"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"def notify_about_server_group_update(context, event_suffix, sg_payload):"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_982173a2","line":343,"range":{"start_line":343,"start_character":28,"end_line":343,"end_character":42},"in_reply_to":"7aa08908_8782e750","updated":"2016-06-07 15:48:18.000000000","message":"I agree that it is too dense. Done.","commit_id":"f0f09e23afddb875c8b4a74398826f94689bddeb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3dfe9ea032fcbdff6719492b532fb4ab7069e5b9","unresolved":false,"context_lines":[{"line_number":346,"context_line":"    flavor \u003d instance_notification.FlavorPayload(instance\u003dinstance)"},{"line_number":347,"context_line":"    payload \u003d instance_notification.InstanceActionPayload("},{"line_number":348,"context_line":"            instance\u003dinstance,"},{"line_number":349,"context_line":"            fault\u003dNone,"},{"line_number":350,"context_line":"            ip_addresses\u003dips,"},{"line_number":351,"context_line":"            flavor\u003dflavor)"},{"line_number":352,"context_line":"    notification \u003d instance_notification.InstanceActionNotification("}],"source_content_type":"text/x-python","patch_set":37,"id":"3aaa91ec_55e20930","line":349,"updated":"2016-06-29 19:00:13.000000000","message":"nit: would probably be good to add a TODO to handle this at some point for instance.delete.error etc, but I know it\u0027s noted in the commit message. A reminder in the code is good though.","commit_id":"9d82c6a2fd5689492134dcd5fc76159af2ce9852"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a60f20e1a63ae86f08ed5375bf50d8f94fa52531","unresolved":false,"context_lines":[{"line_number":346,"context_line":"    flavor \u003d instance_notification.FlavorPayload(instance\u003dinstance)"},{"line_number":347,"context_line":"    payload \u003d instance_notification.InstanceActionPayload("},{"line_number":348,"context_line":"            instance\u003dinstance,"},{"line_number":349,"context_line":"            fault\u003dNone,"},{"line_number":350,"context_line":"            ip_addresses\u003dips,"},{"line_number":351,"context_line":"            flavor\u003dflavor)"},{"line_number":352,"context_line":"    notification \u003d instance_notification.InstanceActionNotification("}],"source_content_type":"text/x-python","patch_set":37,"id":"3aaa91ec_e08403d4","line":349,"in_reply_to":"3aaa91ec_55e20930","updated":"2016-06-30 07:26:47.000000000","message":"Added a TODO. It is already in the pipe. See here https://review.openstack.org/#/c/328055/12/nova/compute/utils.py@391","commit_id":"9d82c6a2fd5689492134dcd5fc76159af2ce9852"}],"nova/notifications/objects/base.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5b1aa4bd3a5cc68921f1e44988f7267f6eb66bae","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def __init__(self, **kwargs):"},{"line_number":31,"context_line":"        super(NotificationObject, self).__init__(**kwargs)"},{"line_number":32,"context_line":"        # new object is created every time it is needed therefore the"},{"line_number":33,"context_line":"        # changes has no real meaning so let\u0027s drop them right away"},{"line_number":34,"context_line":"        self.obj_reset_changes(recursive\u003dFalse)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_b3d57eba","line":33,"range":{"start_line":32,"start_character":0,"end_line":33,"end_character":67},"updated":"2016-06-07 15:48:18.000000000","message":"This is hunglish, I have to reword it. :)","commit_id":"f0f09e23afddb875c8b4a74398826f94689bddeb"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"b693fb907864e9b05241a410bb08a5fe1c320f3a","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def __init__(self, **kwargs):"},{"line_number":31,"context_line":"        super(NotificationObject, self).__init__(**kwargs)"},{"line_number":32,"context_line":"        # new object is created every time it is needed therefore the"},{"line_number":33,"context_line":"        # changes has no real meaning so let\u0027s drop them right away"},{"line_number":34,"context_line":"        self.obj_reset_changes(recursive\u003dFalse)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_cd9845c3","line":33,"range":{"start_line":32,"start_character":0,"end_line":33,"end_character":67},"in_reply_to":"7aa08908_b3d57eba","updated":"2016-06-08 08:50:19.000000000","message":"Done","commit_id":"f0f09e23afddb875c8b4a74398826f94689bddeb"},{"author":{"_account_id":14762,"name":"Zhihai Song","email":"zhhsng@gmail.com","username":"ZhihaiSong"},"change_message_id":"212ca2a66d1d67add10d4243dde0b0afdc7aaa8d","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    # Version 1.0: Initial version"},{"line_number":40,"context_line":"    # Version 1.1: New valid actions values are added to the"},{"line_number":41,"context_line":"    #              NotificationActionField enum"},{"line_number":42,"context_line":"    # Version 1.1: DELETE value is added to the NotificationActionField enum"},{"line_number":43,"context_line":"    VERSION \u003d \u00271.2\u0027"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_7e1c88c1","line":42,"range":{"start_line":42,"start_character":14,"end_line":42,"end_character":18},"updated":"2016-06-07 03:30:10.000000000","message":"1.2","commit_id":"f0f09e23afddb875c8b4a74398826f94689bddeb"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"b693fb907864e9b05241a410bb08a5fe1c320f3a","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    # Version 1.0: Initial version"},{"line_number":40,"context_line":"    # Version 1.1: New valid actions values are added to the"},{"line_number":41,"context_line":"    #              NotificationActionField enum"},{"line_number":42,"context_line":"    # Version 1.1: DELETE value is added to the NotificationActionField enum"},{"line_number":43,"context_line":"    VERSION \u003d \u00271.2\u0027"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_4d01f504","line":42,"range":{"start_line":42,"start_character":14,"end_line":42,"end_character":18},"in_reply_to":"7aa08908_7e1c88c1","updated":"2016-06-08 08:50:19.000000000","message":"Done","commit_id":"f0f09e23afddb875c8b4a74398826f94689bddeb"},{"author":{"_account_id":11803,"name":"Ryan Rossiter","email":"rlrossit@us.ibm.com","username":"rlrossiter"},"change_message_id":"33d0da4ecd7d667bd536ad99ba8a836a60df1e50","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    def __init__(self, **kwargs):"},{"line_number":27,"context_line":"        super(NotificationObject, self).__init__(**kwargs)"},{"line_number":28,"context_line":"        # The notification objects are created on the fly when nova emits the"},{"line_number":29,"context_line":"        # notification. This causes that every object shows ever field as"},{"line_number":30,"context_line":"        # changed. We don\u0027t want to send this meaningless information so we"},{"line_number":31,"context_line":"        # reset the object after creation."},{"line_number":32,"context_line":"        self.obj_reset_changes(recursive\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":24,"id":"7aa08908_96ec492b","line":29,"range":{"start_line":29,"start_character":60,"end_line":29,"end_character":64},"updated":"2016-06-08 14:05:46.000000000","message":"I think you mean \"every\"","commit_id":"c611b3519fa0674bb4f1d77b13a8e2b645b59548"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e6716238d69a8c56ba9f24a0036cd3b57ff9136a","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    def __init__(self, **kwargs):"},{"line_number":27,"context_line":"        super(NotificationObject, self).__init__(**kwargs)"},{"line_number":28,"context_line":"        # The notification objects are created on the fly when nova emits the"},{"line_number":29,"context_line":"        # notification. This causes that every object shows ever field as"},{"line_number":30,"context_line":"        # changed. We don\u0027t want to send this meaningless information so we"},{"line_number":31,"context_line":"        # reset the object after creation."},{"line_number":32,"context_line":"        self.obj_reset_changes(recursive\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":24,"id":"7aa08908_2d325ba7","line":29,"range":{"start_line":29,"start_character":60,"end_line":29,"end_character":64},"in_reply_to":"7aa08908_96ec492b","updated":"2016-06-08 15:49:41.000000000","message":"Done","commit_id":"c611b3519fa0674bb4f1d77b13a8e2b645b59548"},{"author":{"_account_id":20158,"name":"Andy Hsiang","email":"yh418t@att.com","username":"yh418t"},"change_message_id":"a039d6166ba936e68ece296ef325462b4b795310","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    # Version 1.0: Initial version"},{"line_number":38,"context_line":"    # Version 1.1: New valid actions values are added to the"},{"line_number":39,"context_line":"    #              NotificationActionField enum"},{"line_number":40,"context_line":"    # Version 1.2: DELETE value is added to the NotificationActionField enum"},{"line_number":41,"context_line":"    VERSION \u003d \u00271.2\u0027"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":28,"id":"7aa08908_056c6fce","line":40,"updated":"2016-06-15 02:17:21.000000000","message":"Not sure if this is necessary, but since many of the notifications are being worked on in parallel, these version text will be conflicting. (i saw instance.shutdown and instance.pause both updated version to 1.3) maybe we can use the row index of the table on wiki where we picked up the transformation work? or perhaps update version 1.2 text to the format below, so others can just add the enum value?\n\n# version 1.2: following values are being added to the NotificationActionField enum\n#  DELETE\n#  PAUSE\n#  SHUTDOWN \n#  ...","commit_id":"74b5c1dba0a00f6de3e6464690fda6b326e6a285"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"dfc6fafa5bc991cfaa2383002697d4338602a567","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    # Version 1.0: Initial version"},{"line_number":38,"context_line":"    # Version 1.1: New valid actions values are added to the"},{"line_number":39,"context_line":"    #              NotificationActionField enum"},{"line_number":40,"context_line":"    # Version 1.2: DELETE value is added to the NotificationActionField enum"},{"line_number":41,"context_line":"    VERSION \u003d \u00271.2\u0027"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":28,"id":"7aa08908_b1eb1a7b","line":40,"in_reply_to":"7aa08908_056c6fce","updated":"2016-06-15 07:39:22.000000000","message":"Good point. This is a great source of merge conflict along with the definition of the NotificationActionField enum. \nUnfortunately the version number needs to be sequential so we cannot pre-allocate that to certain patches without defining the order of the merge of those patches. \nWhat we can do is that we add all the new enum values in a separate patch and then the transformation patches don\u0027t need to bump the version one by one causing conflict.","commit_id":"74b5c1dba0a00f6de3e6464690fda6b326e6a285"},{"author":{"_account_id":20411,"name":"Julian","email":"julian.sy@att.com","username":"syjulian"},"change_message_id":"5bb1f22dc8f2a62ce1b925216a4b0c2f90d7949e","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    # Version 1.0: Initial version"},{"line_number":38,"context_line":"    # Version 1.1: New valid actions values are added to the"},{"line_number":39,"context_line":"    #              NotificationActionField enum"},{"line_number":40,"context_line":"    # Version 1.2: DELETE value is added to the NotificationActionField enum"},{"line_number":41,"context_line":"    VERSION \u003d \u00271.2\u0027"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":28,"id":"7aa08908_bc6bca1e","line":40,"in_reply_to":"7aa08908_b1eb1a7b","updated":"2016-06-15 20:02:26.000000000","message":"That\u0027s a good idea","commit_id":"74b5c1dba0a00f6de3e6464690fda6b326e6a285"}],"nova/notifications/objects/instance.py":[{"author":{"_account_id":9775,"name":"Sudipta Biswas","email":"sbiswas7@in.ibm.com","username":"sudswas"},"change_message_id":"6f8cac82aea978e5a73930329cc354b397a057f4","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        \u0027state_description\u0027: (\u0027instance\u0027, \u0027task_state\u0027),"},{"line_number":54,"context_line":"        \u0027progress\u0027: (\u0027instance\u0027, \u0027progress\u0027),"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        \u0027metadata\u0027: (\u0027instance\u0027, \u0027metadata\u0027),"},{"line_number":57,"context_line":"    }"},{"line_number":58,"context_line":"    # Version 1.0: Initial version"},{"line_number":59,"context_line":"    VERSION \u003d \u00271.0\u0027"}],"source_content_type":"text/x-python","patch_set":18,"id":"9abb7d3a_7de6ac44","line":56,"updated":"2016-06-02 07:06:03.000000000","message":"Treat me as a newbie to notifications if i ask silly questions. This particular payload is missing some fields from the nova.instance object. This is because?","commit_id":"d539bb14b292b6ad95be096c083cbf623fa2b2a8"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"34eaa9bf0c103799cb1fc3f4109a0bdaf4ac1cd5","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        \u0027state_description\u0027: (\u0027instance\u0027, \u0027task_state\u0027),"},{"line_number":54,"context_line":"        \u0027progress\u0027: (\u0027instance\u0027, \u0027progress\u0027),"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        \u0027metadata\u0027: (\u0027instance\u0027, \u0027metadata\u0027),"},{"line_number":57,"context_line":"    }"},{"line_number":58,"context_line":"    # Version 1.0: Initial version"},{"line_number":59,"context_line":"    VERSION \u003d \u00271.0\u0027"}],"source_content_type":"text/x-python","patch_set":18,"id":"7aa08908_d2a3289d","line":56,"in_reply_to":"9abb7d3a_7de6ac44","updated":"2016-06-06 08:02:38.000000000","message":"The base of the notification is the legacy instance.delete notification. We tried transform it in a way to keep the information content of the notification as close to the legacy as possible.\nIf you feel something useful is missing then I suggest to point that out. and we can consider it here, or in a follow up patch.","commit_id":"d539bb14b292b6ad95be096c083cbf623fa2b2a8"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7d85843e53fed486b7f391336952e3852944edbe","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        \u0027node\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":69,"context_line":"        \u0027os_type\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":70,"context_line":"        \u0027architecture\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":71,"context_line":"        \u0027cell_name\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":72,"context_line":"        \u0027availability_zone\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        \u0027instance_type_id\u0027: fields.IntegerField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_673c1b94","line":71,"range":{"start_line":71,"start_character":9,"end_line":71,"end_character":55},"updated":"2016-06-06 14:33:27.000000000","message":"this doesn\u0027t work properly today, maybe drop it for now, until we get cells v2 sorted out?","commit_id":"f0f09e23afddb875c8b4a74398826f94689bddeb"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5b1aa4bd3a5cc68921f1e44988f7267f6eb66bae","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        \u0027node\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":69,"context_line":"        \u0027os_type\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":70,"context_line":"        \u0027architecture\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":71,"context_line":"        \u0027cell_name\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":72,"context_line":"        \u0027availability_zone\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        \u0027instance_type_id\u0027: fields.IntegerField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_524fd46a","line":71,"range":{"start_line":71,"start_character":9,"end_line":71,"end_character":55},"in_reply_to":"7aa08908_673c1b94","updated":"2016-06-07 15:48:18.000000000","message":"OK. Adding back later is easy.","commit_id":"f0f09e23afddb875c8b4a74398826f94689bddeb"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7d85843e53fed486b7f391336952e3852944edbe","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        \u0027cell_name\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":72,"context_line":"        \u0027availability_zone\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        \u0027instance_type_id\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":75,"context_line":"        \u0027memory_mb\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":76,"context_line":"        \u0027vcpus\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":77,"context_line":"        \u0027root_gb\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":78,"context_line":"        \u0027disk_gb\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":79,"context_line":"        \u0027ephemeral_gb\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":80,"context_line":"        \u0027image_ref\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        \u0027kernel_id\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_a7cf23af","line":79,"range":{"start_line":74,"start_character":0,"end_line":79,"end_character":59},"updated":"2016-06-06 14:33:27.000000000","message":"Maybe we should have a flavor payload instead?\n\nShould we also have some Block device mapping payload?","commit_id":"f0f09e23afddb875c8b4a74398826f94689bddeb"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5b1aa4bd3a5cc68921f1e44988f7267f6eb66bae","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        \u0027cell_name\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":72,"context_line":"        \u0027availability_zone\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        \u0027instance_type_id\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":75,"context_line":"        \u0027memory_mb\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":76,"context_line":"        \u0027vcpus\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":77,"context_line":"        \u0027root_gb\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":78,"context_line":"        \u0027disk_gb\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":79,"context_line":"        \u0027ephemeral_gb\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":80,"context_line":"        \u0027image_ref\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        \u0027kernel_id\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_92f13c04","line":79,"range":{"start_line":74,"start_character":0,"end_line":79,"end_character":59},"in_reply_to":"7aa08908_77c0377d","updated":"2016-06-07 15:48:18.000000000","message":"Options:\na) keep it this way and use the SCHEMA to copy the data from Instance to InstancePayload\nb) create a FlavorPayload subobject and add a SCHEMA there to copy this part of the data from Instance to FlavorPayload.\n\n#b) does not seems too hard. I will try to do it.","commit_id":"f0f09e23afddb875c8b4a74398826f94689bddeb"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"b693fb907864e9b05241a410bb08a5fe1c320f3a","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        \u0027cell_name\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":72,"context_line":"        \u0027availability_zone\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        \u0027instance_type_id\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":75,"context_line":"        \u0027memory_mb\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":76,"context_line":"        \u0027vcpus\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":77,"context_line":"        \u0027root_gb\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":78,"context_line":"        \u0027disk_gb\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":79,"context_line":"        \u0027ephemeral_gb\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":80,"context_line":"        \u0027image_ref\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        \u0027kernel_id\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_284d74c4","line":79,"range":{"start_line":74,"start_character":0,"end_line":79,"end_character":59},"in_reply_to":"7aa08908_92f13c04","updated":"2016-06-08 08:50:19.000000000","message":"I added the FlavorPayload. What should be in the BlockDevicePayload? I guess we don\u0027t have that info now in the current payload so that can be a nice addition later.","commit_id":"f0f09e23afddb875c8b4a74398826f94689bddeb"},{"author":{"_account_id":11803,"name":"Ryan Rossiter","email":"rlrossit@us.ibm.com","username":"rlrossiter"},"change_message_id":"93d5c36475e9abfea3c651bf28e8f839bcc69fdd","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        \u0027cell_name\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":72,"context_line":"        \u0027availability_zone\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        \u0027instance_type_id\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":75,"context_line":"        \u0027memory_mb\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":76,"context_line":"        \u0027vcpus\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":77,"context_line":"        \u0027root_gb\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":78,"context_line":"        \u0027disk_gb\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":79,"context_line":"        \u0027ephemeral_gb\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":80,"context_line":"        \u0027image_ref\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        \u0027kernel_id\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_77c0377d","line":79,"range":{"start_line":74,"start_character":0,"end_line":79,"end_character":59},"in_reply_to":"7aa08908_a7cf23af","updated":"2016-06-06 21:01:50.000000000","message":"I agree here, but that will make things hairy with the SCHEMA above.","commit_id":"f0f09e23afddb875c8b4a74398826f94689bddeb"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7d85843e53fed486b7f391336952e3852944edbe","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        \u0027terminated_at\u0027: fields.DateTimeField(nullable\u003dTrue),"},{"line_number":88,"context_line":"        \u0027deleted_at\u0027: fields.DateTimeField(nullable\u003dTrue),"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        \u0027state\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":91,"context_line":"        \u0027state_description\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":92,"context_line":"        \u0027progress\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_a7e28301","line":90,"range":{"start_line":90,"start_character":0,"end_line":90,"end_character":51},"updated":"2016-06-06 14:33:27.000000000","message":"I think that needs to be an enum.\n\nIts a bit odd not to have task_state, and power_state and state here.","commit_id":"f0f09e23afddb875c8b4a74398826f94689bddeb"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"b693fb907864e9b05241a410bb08a5fe1c320f3a","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        \u0027terminated_at\u0027: fields.DateTimeField(nullable\u003dTrue),"},{"line_number":88,"context_line":"        \u0027deleted_at\u0027: fields.DateTimeField(nullable\u003dTrue),"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        \u0027state\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":91,"context_line":"        \u0027state_description\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":92,"context_line":"        \u0027progress\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_6c6770b7","line":90,"range":{"start_line":90,"start_character":0,"end_line":90,"end_character":51},"in_reply_to":"7aa08908_a7e28301","updated":"2016-06-08 08:50:19.000000000","message":"Good idea. I added an InstanceState enum to fields. Unfortunately it duplicates the information with nova.compute.vm_states.py . However changing the type of the vm_state in the Instance object to this new enum field would be a different story. (I don\u0027t even sure that it can be handled with a minor bump on the Instance)\n\nAdded power_state and an InstancePowerState enum based on nova.compute.power_state. This has the same duplication issue as the InstanceState enum\n\nRenamed the state_description to task_state and added a InstanceTaskState enum based on nova.compute.task_states. This has the same duplication issue as the InstanceState enum","commit_id":"f0f09e23afddb875c8b4a74398826f94689bddeb"},{"author":{"_account_id":11803,"name":"Ryan Rossiter","email":"rlrossit@us.ibm.com","username":"rlrossiter"},"change_message_id":"93d5c36475e9abfea3c651bf28e8f839bcc69fdd","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        \u0027state_description\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":92,"context_line":"        \u0027progress\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        \u0027ip_addresses\u0027: fields.ListOfObjectsField(\u0027IpPayload\u0027),"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        \u0027metadata\u0027: fields.DictOfStringsField(),"},{"line_number":97,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_175f33e6","line":94,"range":{"start_line":94,"start_character":9,"end_line":94,"end_character":21},"updated":"2016-06-06 21:01:50.000000000","message":"So I see nothing in the SCHEMA above about ip_addresses... and I don\u0027t remember how we ever decided about doing the nested payload items.","commit_id":"f0f09e23afddb875c8b4a74398826f94689bddeb"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7d85843e53fed486b7f391336952e3852944edbe","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        \u0027state_description\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":92,"context_line":"        \u0027progress\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        \u0027ip_addresses\u0027: fields.ListOfObjectsField(\u0027IpPayload\u0027),"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        \u0027metadata\u0027: fields.DictOfStringsField(),"},{"line_number":97,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_27c69367","line":94,"updated":"2016-06-06 14:33:27.000000000","message":"hmm, I wonder if it should be a list of ports, each with ip addresses attached?","commit_id":"f0f09e23afddb875c8b4a74398826f94689bddeb"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5b1aa4bd3a5cc68921f1e44988f7267f6eb66bae","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        \u0027state_description\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":92,"context_line":"        \u0027progress\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        \u0027ip_addresses\u0027: fields.ListOfObjectsField(\u0027IpPayload\u0027),"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        \u0027metadata\u0027: fields.DictOfStringsField(),"},{"line_number":97,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_323328ad","line":94,"range":{"start_line":94,"start_character":9,"end_line":94,"end_character":21},"in_reply_to":"7aa08908_175f33e6","updated":"2016-06-07 15:48:18.000000000","message":"As the IpPayload contains calculated values we anyhow cannot use the SCHEMA as direct copy is not possible.","commit_id":"f0f09e23afddb875c8b4a74398826f94689bddeb"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"b693fb907864e9b05241a410bb08a5fe1c320f3a","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        \u0027state_description\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":92,"context_line":"        \u0027progress\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        \u0027ip_addresses\u0027: fields.ListOfObjectsField(\u0027IpPayload\u0027),"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        \u0027metadata\u0027: fields.DictOfStringsField(),"},{"line_number":97,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_8efa8c41","line":94,"in_reply_to":"7aa08908_27c69367","updated":"2016-06-08 08:50:19.000000000","message":"Do you suggest to rename it to PortPayload? The content is a list of ports with additional data like ipaddress, mac, etc.","commit_id":"f0f09e23afddb875c8b4a74398826f94689bddeb"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7d85843e53fed486b7f391336952e3852944edbe","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        \u0027ip_addresses\u0027: fields.ListOfObjectsField(\u0027IpPayload\u0027),"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        \u0027metadata\u0027: fields.DictOfStringsField(),"},{"line_number":97,"context_line":"    }"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def __init__(self, instance, fault, ip_addresses):"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_e7e48b0e","line":96,"range":{"start_line":96,"start_character":8,"end_line":96,"end_character":48},"updated":"2016-06-06 14:33:27.000000000","message":"maybe we should also have tags if we include metadata?","commit_id":"f0f09e23afddb875c8b4a74398826f94689bddeb"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"b693fb907864e9b05241a410bb08a5fe1c320f3a","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        \u0027ip_addresses\u0027: fields.ListOfObjectsField(\u0027IpPayload\u0027),"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        \u0027metadata\u0027: fields.DictOfStringsField(),"},{"line_number":97,"context_line":"    }"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def __init__(self, instance, fault, ip_addresses):"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_138087f6","line":96,"range":{"start_line":96,"start_character":8,"end_line":96,"end_character":48},"in_reply_to":"7aa08908_e7e48b0e","updated":"2016-06-08 08:50:19.000000000","message":"metadata was in the legacy notification tags wasn\u0027t, this is why we don\u0027t have tags here. It can be added. I just feel that this patch is getting bigger and bigger. Can we add this later? I know that means a version bump on the notification but somehow we have to limit the scope of this patch. What do you think?","commit_id":"f0f09e23afddb875c8b4a74398826f94689bddeb"},{"author":{"_account_id":11803,"name":"Ryan Rossiter","email":"rlrossit@us.ibm.com","username":"rlrossiter"},"change_message_id":"93d5c36475e9abfea3c651bf28e8f839bcc69fdd","unresolved":false,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"@nova_base.NovaObjectRegistry.register_notification"},{"line_number":123,"context_line":"class IpPayload(base.NotificationObject):"},{"line_number":124,"context_line":"    # Version 1.0: Initial version"},{"line_number":125,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":126,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_b768df88","line":123,"updated":"2016-06-06 21:01:50.000000000","message":"Shouldn\u0027t this have a SCHEMA?","commit_id":"f0f09e23afddb875c8b4a74398826f94689bddeb"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5b1aa4bd3a5cc68921f1e44988f7267f6eb66bae","unresolved":false,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"@nova_base.NovaObjectRegistry.register_notification"},{"line_number":123,"context_line":"class IpPayload(base.NotificationObject):"},{"line_number":124,"context_line":"    # Version 1.0: Initial version"},{"line_number":125,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":126,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_92b2dc04","line":123,"in_reply_to":"7aa08908_b768df88","updated":"2016-06-07 15:48:18.000000000","message":"there is no place from where we can copy the data directly, we will calculate the data and initialize the object via the __init__","commit_id":"f0f09e23afddb875c8b4a74398826f94689bddeb"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7d85843e53fed486b7f391336952e3852944edbe","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":126,"context_line":"    fields \u003d {"},{"line_number":127,"context_line":"        \u0027label\u0027: fields.StringField(),"},{"line_number":128,"context_line":"        \u0027vif_mac\u0027: fields.StringField(),"},{"line_number":129,"context_line":"        \u0027meta\u0027: fields.DictOfStringsField(),"},{"line_number":130,"context_line":"        \u0027port_uuid\u0027: fields.UUIDField(nullable\u003dTrue),"},{"line_number":131,"context_line":"        \u0027version\u0027: fields.IntegerField(),"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_07def76c","line":128,"updated":"2016-06-06 14:33:27.000000000","message":"do we already have a mac address type? Maybe this should just be mac, as its not always a VIF.","commit_id":"f0f09e23afddb875c8b4a74398826f94689bddeb"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"b693fb907864e9b05241a410bb08a5fe1c320f3a","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":126,"context_line":"    fields \u003d {"},{"line_number":127,"context_line":"        \u0027label\u0027: fields.StringField(),"},{"line_number":128,"context_line":"        \u0027vif_mac\u0027: fields.StringField(),"},{"line_number":129,"context_line":"        \u0027meta\u0027: fields.DictOfStringsField(),"},{"line_number":130,"context_line":"        \u0027port_uuid\u0027: fields.UUIDField(nullable\u003dTrue),"},{"line_number":131,"context_line":"        \u0027version\u0027: fields.IntegerField(),"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_53796fc7","line":128,"in_reply_to":"7aa08908_07def76c","updated":"2016-06-08 08:50:19.000000000","message":"Good point, changed the type and renamed the field.","commit_id":"f0f09e23afddb875c8b4a74398826f94689bddeb"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7d85843e53fed486b7f391336952e3852944edbe","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    fields \u003d {"},{"line_number":127,"context_line":"        \u0027label\u0027: fields.StringField(),"},{"line_number":128,"context_line":"        \u0027vif_mac\u0027: fields.StringField(),"},{"line_number":129,"context_line":"        \u0027meta\u0027: fields.DictOfStringsField(),"},{"line_number":130,"context_line":"        \u0027port_uuid\u0027: fields.UUIDField(nullable\u003dTrue),"},{"line_number":131,"context_line":"        \u0027version\u0027: fields.IntegerField(),"},{"line_number":132,"context_line":"        \u0027address\u0027: fields.IPV4AndV6AddressField(),"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_a7f8c3e6","line":129,"updated":"2016-06-06 14:33:27.000000000","message":"do we really need meta?","commit_id":"f0f09e23afddb875c8b4a74398826f94689bddeb"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5b1aa4bd3a5cc68921f1e44988f7267f6eb66bae","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    fields \u003d {"},{"line_number":127,"context_line":"        \u0027label\u0027: fields.StringField(),"},{"line_number":128,"context_line":"        \u0027vif_mac\u0027: fields.StringField(),"},{"line_number":129,"context_line":"        \u0027meta\u0027: fields.DictOfStringsField(),"},{"line_number":130,"context_line":"        \u0027port_uuid\u0027: fields.UUIDField(nullable\u003dTrue),"},{"line_number":131,"context_line":"        \u0027version\u0027: fields.IntegerField(),"},{"line_number":132,"context_line":"        \u0027address\u0027: fields.IPV4AndV6AddressField(),"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_72ae5099","line":129,"in_reply_to":"7aa08908_a7f8c3e6","updated":"2016-06-07 15:48:18.000000000","message":"It was in the legacy notification but I don\u0027t know if this is really needed or not.","commit_id":"f0f09e23afddb875c8b4a74398826f94689bddeb"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7d85843e53fed486b7f391336952e3852944edbe","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        \u0027label\u0027: fields.StringField(),"},{"line_number":128,"context_line":"        \u0027vif_mac\u0027: fields.StringField(),"},{"line_number":129,"context_line":"        \u0027meta\u0027: fields.DictOfStringsField(),"},{"line_number":130,"context_line":"        \u0027port_uuid\u0027: fields.UUIDField(nullable\u003dTrue),"},{"line_number":131,"context_line":"        \u0027version\u0027: fields.IntegerField(),"},{"line_number":132,"context_line":"        \u0027address\u0027: fields.IPV4AndV6AddressField(),"},{"line_number":133,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_e7a00b93","line":130,"updated":"2016-06-06 14:33:27.000000000","message":"should we include the user_device, or whatever we call it for the position of the vif?","commit_id":"f0f09e23afddb875c8b4a74398826f94689bddeb"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"b693fb907864e9b05241a410bb08a5fe1c320f3a","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        \u0027label\u0027: fields.StringField(),"},{"line_number":128,"context_line":"        \u0027vif_mac\u0027: fields.StringField(),"},{"line_number":129,"context_line":"        \u0027meta\u0027: fields.DictOfStringsField(),"},{"line_number":130,"context_line":"        \u0027port_uuid\u0027: fields.UUIDField(nullable\u003dTrue),"},{"line_number":131,"context_line":"        \u0027version\u0027: fields.IntegerField(),"},{"line_number":132,"context_line":"        \u0027address\u0027: fields.IPV4AndV6AddressField(),"},{"line_number":133,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_b3dff067","line":130,"in_reply_to":"7aa08908_e7a00b93","updated":"2016-06-08 08:50:19.000000000","message":"there is a devname in the VIF model, I added that as device_name. In the sample it looks like it is the name of the tap device. Is it what you need?","commit_id":"f0f09e23afddb875c8b4a74398826f94689bddeb"},{"author":{"_account_id":11803,"name":"Ryan Rossiter","email":"rlrossit@us.ibm.com","username":"rlrossiter"},"change_message_id":"33d0da4ecd7d667bd536ad99ba8a836a60df1e50","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def __init__(self, instance, fault, ip_addresses, flavor):"},{"line_number":90,"context_line":"        super(InstancePayload, self).__init__("},{"line_number":91,"context_line":"                fault\u003dfault,"},{"line_number":92,"context_line":"                ip_addresses\u003dip_addresses,"},{"line_number":93,"context_line":"                flavor\u003dflavor)"},{"line_number":94,"context_line":"        self.populate_schema(instance\u003dinstance)"}],"source_content_type":"text/x-python","patch_set":24,"id":"7aa08908_f352ff65","line":91,"range":{"start_line":91,"start_character":16,"end_line":91,"end_character":27},"updated":"2016-06-08 14:05:46.000000000","message":"why are you explicitly setting fault here? isn\u0027t that only on the InstanceActionPayload? Is it because it needs to get set on the subclass, and the way to do that is sending as a kwarg to super? I would just rather have InstancePayload take **kwargs then instead of having premonition of what its subclasses want.","commit_id":"c611b3519fa0674bb4f1d77b13a8e2b645b59548"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e6716238d69a8c56ba9f24a0036cd3b57ff9136a","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def __init__(self, instance, fault, ip_addresses, flavor):"},{"line_number":90,"context_line":"        super(InstancePayload, self).__init__("},{"line_number":91,"context_line":"                fault\u003dfault,"},{"line_number":92,"context_line":"                ip_addresses\u003dip_addresses,"},{"line_number":93,"context_line":"                flavor\u003dflavor)"},{"line_number":94,"context_line":"        self.populate_schema(instance\u003dinstance)"}],"source_content_type":"text/x-python","patch_set":24,"id":"7aa08908_adf64b8c","line":91,"range":{"start_line":91,"start_character":16,"end_line":91,"end_character":27},"in_reply_to":"7aa08908_f352ff65","updated":"2016-06-08 15:49:41.000000000","message":"Good catch. Replaced it with **kwargs Done.","commit_id":"c611b3519fa0674bb4f1d77b13a8e2b645b59548"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"53c09c88596d6abac1acee410f0b15e209a841bf","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        \u0027architecture\u0027: (\u0027instance\u0027, \u0027architecture\u0027),"},{"line_number":34,"context_line":"        \u0027availability_zone\u0027: (\u0027instance\u0027, \u0027availability_zone\u0027),"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"        \u0027image_ref\u0027: (\u0027instance\u0027, \u0027image_ref\u0027),"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        \u0027kernel_id\u0027: (\u0027instance\u0027, \u0027kernel_id\u0027),"},{"line_number":39,"context_line":"        \u0027ramdisk_id\u0027: (\u0027instance\u0027, \u0027ramdisk_id\u0027),"}],"source_content_type":"text/x-python","patch_set":25,"id":"7aa08908_71305508","line":36,"range":{"start_line":36,"start_character":9,"end_line":36,"end_character":18},"updated":"2016-06-10 08:34:51.000000000","message":"maybe image_id or image_uuid here?","commit_id":"32e03a2409b0b12c0349460576c5d453fc828c40"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fcd0c4f4dca10d36e670f0e35e4ec55517286e04","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        \u0027architecture\u0027: (\u0027instance\u0027, \u0027architecture\u0027),"},{"line_number":34,"context_line":"        \u0027availability_zone\u0027: (\u0027instance\u0027, \u0027availability_zone\u0027),"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"        \u0027image_ref\u0027: (\u0027instance\u0027, \u0027image_ref\u0027),"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        \u0027kernel_id\u0027: (\u0027instance\u0027, \u0027kernel_id\u0027),"},{"line_number":39,"context_line":"        \u0027ramdisk_id\u0027: (\u0027instance\u0027, \u0027ramdisk_id\u0027),"}],"source_content_type":"text/x-python","patch_set":25,"id":"7aa08908_6dd86e80","line":36,"range":{"start_line":36,"start_character":9,"end_line":36,"end_character":18},"in_reply_to":"7aa08908_71305508","updated":"2016-06-10 12:29:45.000000000","message":"Totally make sense.","commit_id":"32e03a2409b0b12c0349460576c5d453fc828c40"},{"author":{"_account_id":18335,"name":"Pushkar Umaranikar","email":"pushkar.umaranikar@intel.com","username":"pushkarumaranikar"},"change_message_id":"06137327e8cdc4841ca4897b8142b644f1e7e2ff","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        self.populate_schema(instance\u003dinstance)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"@base.notification_sample(\u0027instance-delete-start.json\u0027)"},{"line_number":153,"context_line":"@base.notification_sample(\u0027instance-delete-end.json\u0027)"},{"line_number":154,"context_line":"@nova_base.NovaObjectRegistry.register_notification"},{"line_number":155,"context_line":"class InstanceActionNotification(base.NotificationBase):"},{"line_number":156,"context_line":"    # Version 1.0: Initial version"}],"source_content_type":"text/x-python","patch_set":25,"id":"7aa08908_af6c2a37","line":153,"range":{"start_line":152,"start_character":0,"end_line":153,"end_character":53},"updated":"2016-06-09 22:02:22.000000000","message":"Are we going to add decorator of notification sample for every instance action (The easy ones that uses the same payload as instance.delete) ? In that case, there would be many class decorators.","commit_id":"32e03a2409b0b12c0349460576c5d453fc828c40"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fcd0c4f4dca10d36e670f0e35e4ec55517286e04","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        self.populate_schema(instance\u003dinstance)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"@base.notification_sample(\u0027instance-delete-start.json\u0027)"},{"line_number":153,"context_line":"@base.notification_sample(\u0027instance-delete-end.json\u0027)"},{"line_number":154,"context_line":"@nova_base.NovaObjectRegistry.register_notification"},{"line_number":155,"context_line":"class InstanceActionNotification(base.NotificationBase):"},{"line_number":156,"context_line":"    # Version 1.0: Initial version"}],"source_content_type":"text/x-python","patch_set":25,"id":"7aa08908_edebbe10","line":153,"range":{"start_line":152,"start_character":0,"end_line":153,"end_character":53},"in_reply_to":"7aa08908_7117b554","updated":"2016-06-10 12:29:45.000000000","message":"I agree with John here. I think if it takes the list it will use the same amount of code lines so I don\u0027t feel that it will help.\nStacking decorators might cause performance issues if it creates a long call chain due to wrapping the entity. However this particular decorator does not wrap the class it just modifies a fields of it and returns the same class object. So no stacking and no performance impact is expected.","commit_id":"32e03a2409b0b12c0349460576c5d453fc828c40"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"53c09c88596d6abac1acee410f0b15e209a841bf","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        self.populate_schema(instance\u003dinstance)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"@base.notification_sample(\u0027instance-delete-start.json\u0027)"},{"line_number":153,"context_line":"@base.notification_sample(\u0027instance-delete-end.json\u0027)"},{"line_number":154,"context_line":"@nova_base.NovaObjectRegistry.register_notification"},{"line_number":155,"context_line":"class InstanceActionNotification(base.NotificationBase):"},{"line_number":156,"context_line":"    # Version 1.0: Initial version"}],"source_content_type":"text/x-python","patch_set":25,"id":"7aa08908_7117b554","line":153,"range":{"start_line":152,"start_character":0,"end_line":153,"end_character":53},"in_reply_to":"7aa08908_af6c2a37","updated":"2016-06-10 08:34:51.000000000","message":"thats fine though I think, its nice and simple.\n\nWe can let it take a list if things get out of hand.","commit_id":"32e03a2409b0b12c0349460576c5d453fc828c40"},{"author":{"_account_id":14762,"name":"Zhihai Song","email":"zhhsng@gmail.com","username":"ZhihaiSong"},"change_message_id":"b4745c3759c7b9cfba0484e395cf643d0301c9d1","unresolved":false,"context_lines":[{"line_number":109,"context_line":""},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"@nova_base.NovaObjectRegistry.register_notification"},{"line_number":112,"context_line":"class IpPayload(base.NotificationObject):"},{"line_number":113,"context_line":"    # Version 1.0: Initial version"},{"line_number":114,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":115,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":27,"id":"7aa08908_e4e561a8","line":112,"range":{"start_line":112,"start_character":21,"end_line":112,"end_character":39},"updated":"2016-06-12 12:05:26.000000000","message":"should this be NotificationPayloadBase?","commit_id":"82c9d0383dff2371092187294e9f240abe31d512"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"46591a3ccf8166981826a80e60030e2d14cea5b9","unresolved":false,"context_lines":[{"line_number":109,"context_line":""},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"@nova_base.NovaObjectRegistry.register_notification"},{"line_number":112,"context_line":"class IpPayload(base.NotificationObject):"},{"line_number":113,"context_line":"    # Version 1.0: Initial version"},{"line_number":114,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":115,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":27,"id":"7aa08908_a7a21fac","line":112,"range":{"start_line":112,"start_character":21,"end_line":112,"end_character":39},"in_reply_to":"7aa08908_e4e561a8","updated":"2016-06-13 13:32:14.000000000","message":"Good question. The difference between NotificationObject and NotificationPayloadBase is that the later adds the populate_schema capability. IpPayload does not use schema population while FlavorPayload does use it. I think we don\u0027t need to move the IpPayload to the more specific base as we are not using the functionality of that specific base.","commit_id":"82c9d0383dff2371092187294e9f240abe31d512"},{"author":{"_account_id":11803,"name":"Ryan Rossiter","email":"rlrossit@us.ibm.com","username":"rlrossiter"},"change_message_id":"cbbd64a573913ae5d923cb40f5a622e190241cae","unresolved":false,"context_lines":[{"line_number":109,"context_line":""},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"@nova_base.NovaObjectRegistry.register_notification"},{"line_number":112,"context_line":"class IpPayload(base.NotificationObject):"},{"line_number":113,"context_line":"    # Version 1.0: Initial version"},{"line_number":114,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":115,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":29,"id":"7aa08908_0dc74665","line":112,"updated":"2016-06-15 21:13:47.000000000","message":"I think I agree with Zhihai\u0027s comment from before. Even though it isn\u0027t using populate_schema(), it\u0027s still a payload, so I think it should inherit from NotificationPayloadBase to put it in that family. That way if we ever want to add something to all payloads, it\u0027ll get added to this one too.","commit_id":"a60a8ea37cc440642c1b87990351f08d6d880726"},{"author":{"_account_id":14762,"name":"Zhihai Song","email":"zhhsng@gmail.com","username":"ZhihaiSong"},"change_message_id":"eaee07bce578c476ce0775afafc926fbc7cffff8","unresolved":false,"context_lines":[{"line_number":109,"context_line":""},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"@nova_base.NovaObjectRegistry.register_notification"},{"line_number":112,"context_line":"class IpPayload(base.NotificationObject):"},{"line_number":113,"context_line":"    # Version 1.0: Initial version"},{"line_number":114,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":115,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":29,"id":"7aa08908_2f2b0f96","line":112,"in_reply_to":"7aa08908_0dc74665","updated":"2016-06-16 03:19:02.000000000","message":"I thought it was a typo at first.\nMaybe for this patch, just leave it the way it is is better. If we need to add something to the payload, just do that in that patch.","commit_id":"a60a8ea37cc440642c1b87990351f08d6d880726"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"221e9e13fdc7283203e678d376be826acc8bf794","unresolved":false,"context_lines":[{"line_number":109,"context_line":""},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"@nova_base.NovaObjectRegistry.register_notification"},{"line_number":112,"context_line":"class IpPayload(base.NotificationObject):"},{"line_number":113,"context_line":"    # Version 1.0: Initial version"},{"line_number":114,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":115,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":29,"id":"7aa08908_b1e63dae","line":112,"in_reply_to":"7aa08908_2f2b0f96","updated":"2016-06-16 08:53:11.000000000","message":"OK, let\u0027s do it. I think it is matter of taste doing it now, or doing it when we actually need the functionality.","commit_id":"a60a8ea37cc440642c1b87990351f08d6d880726"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b4f51bc9cf76891ce3f2de6dbfee05f83cc608c4","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2016 OpenStack Foundation"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":5,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":37,"id":"3aaa91ec_f8416c64","line":2,"range":{"start_line":1,"start_character":2,"end_line":2,"end_character":22},"updated":"2016-06-29 19:32:10.000000000","message":"don\u0027t think we actually need this, and you aren\u0027t using it in the new test file.","commit_id":"9d82c6a2fd5689492134dcd5fc76159af2ce9852"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a60f20e1a63ae86f08ed5375bf50d8f94fa52531","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2016 OpenStack Foundation"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":5,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":37,"id":"3aaa91ec_a0367b00","line":2,"range":{"start_line":1,"start_character":2,"end_line":2,"end_character":22},"in_reply_to":"3aaa91ec_f8416c64","updated":"2016-06-30 07:26:47.000000000","message":"Yeah, copy-paste. Done.","commit_id":"9d82c6a2fd5689492134dcd5fc76159af2ce9852"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d25fd2f96ab8ca346e2e405833ca56f1b52901f7","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        \u0027terminated_at\u0027: fields.DateTimeField(nullable\u003dTrue),"},{"line_number":77,"context_line":"        \u0027deleted_at\u0027: fields.DateTimeField(nullable\u003dTrue),"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        \u0027state\u0027: fields.InstanceStateField(nullable\u003dTrue),"},{"line_number":80,"context_line":"        \u0027power_state\u0027: fields.InstancePowerStateField(nullable\u003dTrue),"},{"line_number":81,"context_line":"        \u0027task_state\u0027: fields.InstanceTaskStateField(nullable\u003dTrue),"},{"line_number":82,"context_line":"        \u0027progress\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        \u0027ip_addresses\u0027: fields.ListOfObjectsField(\u0027IpPayload\u0027),"}],"source_content_type":"text/x-python","patch_set":37,"id":"3aaa91ec_98ef881d","line":81,"range":{"start_line":79,"start_character":8,"end_line":81,"end_character":67},"updated":"2016-06-29 19:06:20.000000000","message":"It\u0027s cool these are enums now, but we could run into a problem if a new vm_state/task_state/power_state is introduced and used in the Instance object, and if it\u0027s not mapped into the enum because then we\u0027d get a ValueError since it\u0027s not in the list. I guess if the enum fields are going to be using the enums from the proper modules that define those constants than it shouldn\u0027t be a problem.","commit_id":"9d82c6a2fd5689492134dcd5fc76159af2ce9852"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0d2d41427decd9c5f4694b9cbce38cc91a7cc908","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        \u0027terminated_at\u0027: fields.DateTimeField(nullable\u003dTrue),"},{"line_number":77,"context_line":"        \u0027deleted_at\u0027: fields.DateTimeField(nullable\u003dTrue),"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        \u0027state\u0027: fields.InstanceStateField(nullable\u003dTrue),"},{"line_number":80,"context_line":"        \u0027power_state\u0027: fields.InstancePowerStateField(nullable\u003dTrue),"},{"line_number":81,"context_line":"        \u0027task_state\u0027: fields.InstanceTaskStateField(nullable\u003dTrue),"},{"line_number":82,"context_line":"        \u0027progress\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        \u0027ip_addresses\u0027: fields.ListOfObjectsField(\u0027IpPayload\u0027),"}],"source_content_type":"text/x-python","patch_set":37,"id":"3aaa91ec_fc447c47","line":81,"range":{"start_line":79,"start_character":8,"end_line":81,"end_character":67},"in_reply_to":"3aaa91ec_802c1fad","updated":"2016-06-30 21:56:20.000000000","message":"Cool. Long-term we\u0027ll want to use the same enum fields in the Instance object, but that\u0027s going to be something further out.","commit_id":"9d82c6a2fd5689492134dcd5fc76159af2ce9852"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a60f20e1a63ae86f08ed5375bf50d8f94fa52531","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        \u0027terminated_at\u0027: fields.DateTimeField(nullable\u003dTrue),"},{"line_number":77,"context_line":"        \u0027deleted_at\u0027: fields.DateTimeField(nullable\u003dTrue),"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        \u0027state\u0027: fields.InstanceStateField(nullable\u003dTrue),"},{"line_number":80,"context_line":"        \u0027power_state\u0027: fields.InstancePowerStateField(nullable\u003dTrue),"},{"line_number":81,"context_line":"        \u0027task_state\u0027: fields.InstanceTaskStateField(nullable\u003dTrue),"},{"line_number":82,"context_line":"        \u0027progress\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        \u0027ip_addresses\u0027: fields.ListOfObjectsField(\u0027IpPayload\u0027),"}],"source_content_type":"text/x-python","patch_set":37,"id":"3aaa91ec_802c1fad","line":81,"range":{"start_line":79,"start_character":8,"end_line":81,"end_character":67},"in_reply_to":"3aaa91ec_84c281e7","updated":"2016-06-30 07:26:47.000000000","message":"As Ryan stated we agreed weeks ago to fix it in a follow up.","commit_id":"9d82c6a2fd5689492134dcd5fc76159af2ce9852"},{"author":{"_account_id":11803,"name":"Ryan Rossiter","email":"rlrossit@us.ibm.com","username":"rlrossiter"},"change_message_id":"6877f877ca83a0a14c0b18ae97454ced25f4c966","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        \u0027terminated_at\u0027: fields.DateTimeField(nullable\u003dTrue),"},{"line_number":77,"context_line":"        \u0027deleted_at\u0027: fields.DateTimeField(nullable\u003dTrue),"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        \u0027state\u0027: fields.InstanceStateField(nullable\u003dTrue),"},{"line_number":80,"context_line":"        \u0027power_state\u0027: fields.InstancePowerStateField(nullable\u003dTrue),"},{"line_number":81,"context_line":"        \u0027task_state\u0027: fields.InstanceTaskStateField(nullable\u003dTrue),"},{"line_number":82,"context_line":"        \u0027progress\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        \u0027ip_addresses\u0027: fields.ListOfObjectsField(\u0027IpPayload\u0027),"}],"source_content_type":"text/x-python","patch_set":37,"id":"3aaa91ec_84c281e7","line":81,"range":{"start_line":79,"start_character":8,"end_line":81,"end_character":67},"in_reply_to":"3aaa91ec_98ef881d","updated":"2016-06-29 20:53:25.000000000","message":"If I\u0027m understanding your concern correctly, this is handled in a follow-up patch that I put up that converts the vm/task/power_state modules to now use these enums. https://review.openstack.org/#/c/335066","commit_id":"9d82c6a2fd5689492134dcd5fc76159af2ce9852"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3dfe9ea032fcbdff6719492b532fb4ab7069e5b9","unresolved":false,"context_lines":[{"line_number":137,"context_line":"    }"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    fields \u003d {"},{"line_number":140,"context_line":"        \u0027instance_type_id\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":141,"context_line":"        \u0027memory_mb\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":142,"context_line":"        \u0027vcpus\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":143,"context_line":"        \u0027root_gb\u0027: fields.IntegerField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":37,"id":"3aaa91ec_35565d5c","line":140,"updated":"2016-06-29 19:00:13.000000000","message":"I\u0027m not sure that we want to expose the id value from the database entry, that caused some issues when migrating flavors to the API database. I think flavorid is what we\u0027d want, and that\u0027s what\u0027s returned from the REST API. I guess we don\u0027t have that on the instance object though, so you\u0027d need something like instance.flavor.flavorid, which I\u0027m not sure you can do?","commit_id":"9d82c6a2fd5689492134dcd5fc76159af2ce9852"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"baa686139f5f34906a9127ea9c1e4d103bc8944c","unresolved":false,"context_lines":[{"line_number":137,"context_line":"    }"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    fields \u003d {"},{"line_number":140,"context_line":"        \u0027instance_type_id\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":141,"context_line":"        \u0027memory_mb\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":142,"context_line":"        \u0027vcpus\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":143,"context_line":"        \u0027root_gb\u0027: fields.IntegerField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":37,"id":"3aaa91ec_4ba8ac77","line":140,"in_reply_to":"3aaa91ec_35565d5c","updated":"2016-06-29 19:39:32.000000000","message":"Right. Please do not expose internal implementation detail, of which the \u0027id\u0027 field in the db is one.","commit_id":"9d82c6a2fd5689492134dcd5fc76159af2ce9852"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a60f20e1a63ae86f08ed5375bf50d8f94fa52531","unresolved":false,"context_lines":[{"line_number":137,"context_line":"    }"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    fields \u003d {"},{"line_number":140,"context_line":"        \u0027instance_type_id\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":141,"context_line":"        \u0027memory_mb\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":142,"context_line":"        \u0027vcpus\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":143,"context_line":"        \u0027root_gb\u0027: fields.IntegerField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":37,"id":"3aaa91ec_9bb6503c","line":140,"in_reply_to":"3aaa91ec_4ba8ac77","updated":"2016-06-30 07:26:47.000000000","message":"OK I replaced it. My intention was not to expose db id, I was confused by the many ids we have.","commit_id":"9d82c6a2fd5689492134dcd5fc76159af2ce9852"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0d2d41427decd9c5f4694b9cbce38cc91a7cc908","unresolved":false,"context_lines":[{"line_number":137,"context_line":"    }"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    fields \u003d {"},{"line_number":140,"context_line":"        \u0027instance_type_id\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":141,"context_line":"        \u0027memory_mb\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":142,"context_line":"        \u0027vcpus\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":143,"context_line":"        \u0027root_gb\u0027: fields.IntegerField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":37,"id":"3aaa91ec_fc5bdc1f","line":140,"in_reply_to":"3aaa91ec_9bb6503c","updated":"2016-06-30 21:56:20.000000000","message":"Yeah, it\u0027s definitely confusing, which is why we don\u0027t want to make the same mistake when we have an opportunity to do something new.","commit_id":"9d82c6a2fd5689492134dcd5fc76159af2ce9852"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7f7fc067c4c7043a5368a0fae7c88e703b0ea68a","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    SCHEMA \u003d {"},{"line_number":129,"context_line":"        \u0027flavor_id\u0027: (\u0027flavor\u0027, \u0027flavorid\u0027),"},{"line_number":130,"context_line":"        \u0027memory_mb\u0027: (\u0027instance\u0027, \u0027memory_mb\u0027),"},{"line_number":131,"context_line":"        \u0027vcpus\u0027: (\u0027instance\u0027, \u0027vcpus\u0027),"},{"line_number":132,"context_line":"        \u0027root_gb\u0027: (\u0027instance\u0027, \u0027root_gb\u0027),"}],"source_content_type":"text/x-python","patch_set":41,"id":"3aaa91ec_fa7e5917","line":129,"range":{"start_line":129,"start_character":9,"end_line":129,"end_character":18},"updated":"2016-06-30 13:32:44.000000000","message":"I\u0027d probably call this flavorid to avoid confusion with flavor.id. We had some confusion about naming stuff like this in the online data migration for flavors to the API DB, but there is a naming convention used here:\n\nhttps://github.com/openstack/nova/blob/master/nova/objects/flavor.py#L588-591\n\nflavorid \u003d flavor.flavorid\nflavor_id \u003d flavor.id","commit_id":"3fc5af5f1f82ffbbf75e40f45945a346663a2399"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"239b3ba8955e69d5930e50ff785cacd6d3247006","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    SCHEMA \u003d {"},{"line_number":129,"context_line":"        \u0027flavor_id\u0027: (\u0027flavor\u0027, \u0027flavorid\u0027),"},{"line_number":130,"context_line":"        \u0027memory_mb\u0027: (\u0027instance\u0027, \u0027memory_mb\u0027),"},{"line_number":131,"context_line":"        \u0027vcpus\u0027: (\u0027instance\u0027, \u0027vcpus\u0027),"},{"line_number":132,"context_line":"        \u0027root_gb\u0027: (\u0027instance\u0027, \u0027root_gb\u0027),"}],"source_content_type":"text/x-python","patch_set":41,"id":"3aaa91ec_a3366c4e","line":129,"range":{"start_line":129,"start_character":9,"end_line":129,"end_character":18},"in_reply_to":"3aaa91ec_5ae20dd6","updated":"2016-06-30 14:26:34.000000000","message":"Done","commit_id":"3fc5af5f1f82ffbbf75e40f45945a346663a2399"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a974d53a40f281bb0a36e3e123f68b8dee64060e","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    SCHEMA \u003d {"},{"line_number":129,"context_line":"        \u0027flavor_id\u0027: (\u0027flavor\u0027, \u0027flavorid\u0027),"},{"line_number":130,"context_line":"        \u0027memory_mb\u0027: (\u0027instance\u0027, \u0027memory_mb\u0027),"},{"line_number":131,"context_line":"        \u0027vcpus\u0027: (\u0027instance\u0027, \u0027vcpus\u0027),"},{"line_number":132,"context_line":"        \u0027root_gb\u0027: (\u0027instance\u0027, \u0027root_gb\u0027),"}],"source_content_type":"text/x-python","patch_set":41,"id":"3aaa91ec_5ae20dd6","line":129,"range":{"start_line":129,"start_character":9,"end_line":129,"end_character":18},"in_reply_to":"3aaa91ec_fa7e5917","updated":"2016-06-30 13:33:59.000000000","message":"Yep. It\u0027s super confusing but I think that\u0027s the best we can do.","commit_id":"3fc5af5f1f82ffbbf75e40f45945a346663a2399"}],"nova/objects/fields.py":[{"author":{"_account_id":11803,"name":"Ryan Rossiter","email":"rlrossit@us.ibm.com","username":"rlrossiter"},"change_message_id":"93d5c36475e9abfea3c651bf28e8f839bcc69fdd","unresolved":false,"context_lines":[{"line_number":588,"context_line":"    EXCEPTION \u003d \u0027exception\u0027"},{"line_number":589,"context_line":"    DELETE \u003d \u0027delete\u0027"},{"line_number":590,"context_line":""},{"line_number":591,"context_line":"    ALL \u003d (UPDATE, EXCEPTION, DELETE)"},{"line_number":592,"context_line":""},{"line_number":593,"context_line":"    def __init__(self):"},{"line_number":594,"context_line":"        super(NotificationAction, self).__init__("}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_d71beb19","line":591,"updated":"2016-06-06 21:01:50.000000000","message":"I guess I don\u0027t know how I feel about constantly adding new things to these enums... I mean I know we don\u0027t have to worry about backport and whatnot, but these enums are only versioned based on the fact that objects that use them are versioned. Not really anything bad to say here, just pointing it out.","commit_id":"f0f09e23afddb875c8b4a74398826f94689bddeb"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5b1aa4bd3a5cc68921f1e44988f7267f6eb66bae","unresolved":false,"context_lines":[{"line_number":588,"context_line":"    EXCEPTION \u003d \u0027exception\u0027"},{"line_number":589,"context_line":"    DELETE \u003d \u0027delete\u0027"},{"line_number":590,"context_line":""},{"line_number":591,"context_line":"    ALL \u003d (UPDATE, EXCEPTION, DELETE)"},{"line_number":592,"context_line":""},{"line_number":593,"context_line":"    def __init__(self):"},{"line_number":594,"context_line":"        super(NotificationAction, self).__init__("}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_9842130f","line":591,"in_reply_to":"7aa08908_d71beb19","updated":"2016-06-07 15:48:18.000000000","message":"I think it is a nice idea to list the actions we support. It is somehow strange that only this basic field version on the content of the field while the other basic fields (e.g. Int, String) doesn\u0027t. Honestly, I would like to keep an enum to list the actions but I don\u0027t know what to do with the versioning impact (i.e need of bumping the EventType every time).","commit_id":"f0f09e23afddb875c8b4a74398826f94689bddeb"},{"author":{"_account_id":11803,"name":"Ryan Rossiter","email":"rlrossit@us.ibm.com","username":"rlrossiter"},"change_message_id":"33d0da4ecd7d667bd536ad99ba8a836a60df1e50","unresolved":false,"context_lines":[{"line_number":610,"context_line":"class InstanceState(Enum):"},{"line_number":611,"context_line":"    # TODO(gibi): this is currently a copy of nova.compute.vm_states, remove"},{"line_number":612,"context_line":"    # the duplication"},{"line_number":613,"context_line":"    ACTIVE \u003d \u0027active\u0027  # VM is running"},{"line_number":614,"context_line":"    BUILDING \u003d \u0027building\u0027  # VM only exists in DB"},{"line_number":615,"context_line":"    PAUSED \u003d \u0027paused\u0027"},{"line_number":616,"context_line":"    SUSPENDED \u003d \u0027suspended\u0027  # VM is suspended to disk."}],"source_content_type":"text/x-python","patch_set":24,"id":"7aa08908_73c28fea","line":613,"range":{"start_line":613,"start_character":23,"end_line":613,"end_character":38},"updated":"2016-06-08 14:05:46.000000000","message":"(see below) we don\u0027t really need any of these comments. They\u0027re more for vm_states.py","commit_id":"c611b3519fa0674bb4f1d77b13a8e2b645b59548"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e6716238d69a8c56ba9f24a0036cd3b57ff9136a","unresolved":false,"context_lines":[{"line_number":610,"context_line":"class InstanceState(Enum):"},{"line_number":611,"context_line":"    # TODO(gibi): this is currently a copy of nova.compute.vm_states, remove"},{"line_number":612,"context_line":"    # the duplication"},{"line_number":613,"context_line":"    ACTIVE \u003d \u0027active\u0027  # VM is running"},{"line_number":614,"context_line":"    BUILDING \u003d \u0027building\u0027  # VM only exists in DB"},{"line_number":615,"context_line":"    PAUSED \u003d \u0027paused\u0027"},{"line_number":616,"context_line":"    SUSPENDED \u003d \u0027suspended\u0027  # VM is suspended to disk."}],"source_content_type":"text/x-python","patch_set":24,"id":"7aa08908_b844cb49","line":613,"range":{"start_line":613,"start_character":23,"end_line":613,"end_character":38},"in_reply_to":"7aa08908_73c28fea","updated":"2016-06-08 15:49:41.000000000","message":"Done","commit_id":"c611b3519fa0674bb4f1d77b13a8e2b645b59548"},{"author":{"_account_id":11803,"name":"Ryan Rossiter","email":"rlrossit@us.ibm.com","username":"rlrossiter"},"change_message_id":"33d0da4ecd7d667bd536ad99ba8a836a60df1e50","unresolved":false,"context_lines":[{"line_number":642,"context_line":"    # TODO(gibi): this is currently a copy of nova.compute.task_states, remove"},{"line_number":643,"context_line":"    # the duplication"},{"line_number":644,"context_line":""},{"line_number":645,"context_line":"    # possible task states during create()"},{"line_number":646,"context_line":"    SCHEDULING \u003d \u0027scheduling\u0027"},{"line_number":647,"context_line":"    BLOCK_DEVICE_MAPPING \u003d \u0027block_device_mapping\u0027"},{"line_number":648,"context_line":"    NETWORKING \u003d \u0027networking\u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"7aa08908_e034e34a","line":645,"updated":"2016-06-08 14:05:46.000000000","message":"to compress this as much as possible, I don\u0027t think you need all of these comments/empty spaces in here. The enum doesn\u0027t (or shouldn\u0027t) care about the possible state transitions, so we\u0027ll leave those comments in the task_states module.","commit_id":"c611b3519fa0674bb4f1d77b13a8e2b645b59548"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e6716238d69a8c56ba9f24a0036cd3b57ff9136a","unresolved":false,"context_lines":[{"line_number":642,"context_line":"    # TODO(gibi): this is currently a copy of nova.compute.task_states, remove"},{"line_number":643,"context_line":"    # the duplication"},{"line_number":644,"context_line":""},{"line_number":645,"context_line":"    # possible task states during create()"},{"line_number":646,"context_line":"    SCHEDULING \u003d \u0027scheduling\u0027"},{"line_number":647,"context_line":"    BLOCK_DEVICE_MAPPING \u003d \u0027block_device_mapping\u0027"},{"line_number":648,"context_line":"    NETWORKING \u003d \u0027networking\u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"7aa08908_38773ba1","line":645,"in_reply_to":"7aa08908_e034e34a","updated":"2016-06-08 15:49:41.000000000","message":"Done","commit_id":"c611b3519fa0674bb4f1d77b13a8e2b645b59548"},{"author":{"_account_id":11803,"name":"Ryan Rossiter","email":"rlrossit@us.ibm.com","username":"rlrossiter"},"change_message_id":"33d0da4ecd7d667bd536ad99ba8a836a60df1e50","unresolved":false,"context_lines":[{"line_number":732,"context_line":"    # possible task states during unshelve()"},{"line_number":733,"context_line":"    UNSHELVING \u003d \u0027unshelving\u0027"},{"line_number":734,"context_line":""},{"line_number":735,"context_line":"    ALL \u003d (SCHEDULING, BLOCK_DEVICE_MAPPING, NETWORKING, SPAWNING,"},{"line_number":736,"context_line":"           IMAGE_SNAPSHOT, IMAGE_SNAPSHOT_PENDING, IMAGE_PENDING_UPLOAD,"},{"line_number":737,"context_line":"           IMAGE_UPLOADING, IMAGE_BACKUP, UPDATING_PASSWORD, RESIZE_PREP,"},{"line_number":738,"context_line":"           RESIZE_MIGRATING, RESIZE_MIGRATED, RESIZE_FINISH, RESIZE_REVERTING,"}],"source_content_type":"text/x-python","patch_set":24,"id":"7aa08908_001f6f08","line":735,"updated":"2016-06-08 14:05:46.000000000","message":"there sure are a lot of these.","commit_id":"c611b3519fa0674bb4f1d77b13a8e2b645b59548"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e6716238d69a8c56ba9f24a0036cd3b57ff9136a","unresolved":false,"context_lines":[{"line_number":732,"context_line":"    # possible task states during unshelve()"},{"line_number":733,"context_line":"    UNSHELVING \u003d \u0027unshelving\u0027"},{"line_number":734,"context_line":""},{"line_number":735,"context_line":"    ALL \u003d (SCHEDULING, BLOCK_DEVICE_MAPPING, NETWORKING, SPAWNING,"},{"line_number":736,"context_line":"           IMAGE_SNAPSHOT, IMAGE_SNAPSHOT_PENDING, IMAGE_PENDING_UPLOAD,"},{"line_number":737,"context_line":"           IMAGE_UPLOADING, IMAGE_BACKUP, UPDATING_PASSWORD, RESIZE_PREP,"},{"line_number":738,"context_line":"           RESIZE_MIGRATING, RESIZE_MIGRATED, RESIZE_FINISH, RESIZE_REVERTING,"}],"source_content_type":"text/x-python","patch_set":24,"id":"7aa08908_d8fd57b2","line":735,"in_reply_to":"7aa08908_001f6f08","updated":"2016-06-08 15:49:41.000000000","message":"I share your pain. I\u0027m thankful that you volunteered to push a followup patch to ease it a bit.","commit_id":"c611b3519fa0674bb4f1d77b13a8e2b645b59548"},{"author":{"_account_id":11803,"name":"Ryan Rossiter","email":"rlrossit@us.ibm.com","username":"rlrossiter"},"change_message_id":"33d0da4ecd7d667bd536ad99ba8a836a60df1e50","unresolved":false,"context_lines":[{"line_number":760,"context_line":"    CRASHED \u003d \u0027crashed\u0027"},{"line_number":761,"context_line":"    SUSPENDED \u003d \u0027suspended\u0027"},{"line_number":762,"context_line":""},{"line_number":763,"context_line":"    VALUE_MAP \u003d {"},{"line_number":764,"context_line":"        0x00: NOSTATE,"},{"line_number":765,"context_line":"        0x01: RUNNING,"},{"line_number":766,"context_line":"        0x03: PAUSED,"}],"source_content_type":"text/x-python","patch_set":24,"id":"7aa08908_c011e705","line":763,"updated":"2016-06-08 14:05:46.000000000","message":"Boy this stuff sure is awkward... but it looks like you handled it properly.","commit_id":"c611b3519fa0674bb4f1d77b13a8e2b645b59548"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e6716238d69a8c56ba9f24a0036cd3b57ff9136a","unresolved":false,"context_lines":[{"line_number":760,"context_line":"    CRASHED \u003d \u0027crashed\u0027"},{"line_number":761,"context_line":"    SUSPENDED \u003d \u0027suspended\u0027"},{"line_number":762,"context_line":""},{"line_number":763,"context_line":"    VALUE_MAP \u003d {"},{"line_number":764,"context_line":"        0x00: NOSTATE,"},{"line_number":765,"context_line":"        0x01: RUNNING,"},{"line_number":766,"context_line":"        0x03: PAUSED,"}],"source_content_type":"text/x-python","patch_set":24,"id":"7aa08908_98cc6f8a","line":763,"in_reply_to":"7aa08908_c011e705","updated":"2016-06-08 15:49:41.000000000","message":"It was necessary to be able to coerce the Instance.power_state int value into this enum used in the instance.\u003caction\u003e notifications.","commit_id":"c611b3519fa0674bb4f1d77b13a8e2b645b59548"},{"author":{"_account_id":11803,"name":"Ryan Rossiter","email":"rlrossit@us.ibm.com","username":"rlrossiter"},"change_message_id":"cbbd64a573913ae5d923cb40f5a622e190241cae","unresolved":false,"context_lines":[{"line_number":610,"context_line":"class InstanceState(Enum):"},{"line_number":611,"context_line":"    # TODO(gibi): this is currently a copy of nova.compute.vm_states, remove"},{"line_number":612,"context_line":"    # the duplication"},{"line_number":613,"context_line":"    ACTIVE \u003d \u0027active\u0027"},{"line_number":614,"context_line":"    BUILDING \u003d \u0027building\u0027"},{"line_number":615,"context_line":"    PAUSED \u003d \u0027paused\u0027"},{"line_number":616,"context_line":"    SUSPENDED \u003d \u0027suspended\u0027"}],"source_content_type":"text/x-python","patch_set":29,"id":"7aa08908_4d24aeb1","line":613,"updated":"2016-06-15 21:13:47.000000000","message":"This is much easier on the eyes! Or, at least, less terrible on the eyes :)","commit_id":"a60a8ea37cc440642c1b87990351f08d6d880726"},{"author":{"_account_id":14762,"name":"Zhihai Song","email":"zhhsng@gmail.com","username":"ZhihaiSong"},"change_message_id":"eaee07bce578c476ce0775afafc926fbc7cffff8","unresolved":false,"context_lines":[{"line_number":621,"context_line":"    DELETED \u003d \u0027deleted\u0027"},{"line_number":622,"context_line":"    ERROR \u003d \u0027error\u0027"},{"line_number":623,"context_line":"    SHELVED \u003d \u0027shelved\u0027"},{"line_number":624,"context_line":"    SHELVED_OFFLOADED \u003d \u0027shelved_offloaded\u0027"},{"line_number":625,"context_line":""},{"line_number":626,"context_line":"    ALL \u003d (ACTIVE, BUILDING, PAUSED, SUSPENDED, STOPPED, RESCUED, RESIZED,"},{"line_number":627,"context_line":"           SOFT_DELETED, DELETED, ERROR, SHELVED, SHELVED_OFFLOADED)"}],"source_content_type":"text/x-python","patch_set":29,"id":"7aa08908_6f3a379a","line":624,"range":{"start_line":624,"start_character":23,"end_line":624,"end_character":43},"updated":"2016-06-16 03:19:02.000000000","message":"i think it is better use a \u0027-\u0027 as in line 620","commit_id":"a60a8ea37cc440642c1b87990351f08d6d880726"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"221e9e13fdc7283203e678d376be826acc8bf794","unresolved":false,"context_lines":[{"line_number":621,"context_line":"    DELETED \u003d \u0027deleted\u0027"},{"line_number":622,"context_line":"    ERROR \u003d \u0027error\u0027"},{"line_number":623,"context_line":"    SHELVED \u003d \u0027shelved\u0027"},{"line_number":624,"context_line":"    SHELVED_OFFLOADED \u003d \u0027shelved_offloaded\u0027"},{"line_number":625,"context_line":""},{"line_number":626,"context_line":"    ALL \u003d (ACTIVE, BUILDING, PAUSED, SUSPENDED, STOPPED, RESCUED, RESIZED,"},{"line_number":627,"context_line":"           SOFT_DELETED, DELETED, ERROR, SHELVED, SHELVED_OFFLOADED)"}],"source_content_type":"text/x-python","patch_set":29,"id":"7aa08908_362ec3a5","line":624,"range":{"start_line":624,"start_character":23,"end_line":624,"end_character":43},"in_reply_to":"7aa08908_6f3a379a","updated":"2016-06-16 08:53:11.000000000","message":"I cannot change that, it is an unfortunate copy from the already existing nova.compute.vm_states values use in multiple places in the code. Ryan volunteered to remove the duplication in a follow up patch.","commit_id":"a60a8ea37cc440642c1b87990351f08d6d880726"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"8c7631954e1f202a272170af3464d4bd2b96e2ca","unresolved":false,"context_lines":[{"line_number":621,"context_line":"    DELETED \u003d \u0027deleted\u0027"},{"line_number":622,"context_line":"    ERROR \u003d \u0027error\u0027"},{"line_number":623,"context_line":"    SHELVED \u003d \u0027shelved\u0027"},{"line_number":624,"context_line":"    SHELVED_OFFLOADED \u003d \u0027shelved_offloaded\u0027"},{"line_number":625,"context_line":""},{"line_number":626,"context_line":"    ALL \u003d (ACTIVE, BUILDING, PAUSED, SUSPENDED, STOPPED, RESCUED, RESIZED,"},{"line_number":627,"context_line":"           SOFT_DELETED, DELETED, ERROR, SHELVED, SHELVED_OFFLOADED)"}],"source_content_type":"text/x-python","patch_set":35,"id":"3aaa91ec_e8933359","line":624,"updated":"2016-06-27 09:18:54.000000000","message":"should we add \"unknown\" so we have a way to backport versions in the future?","commit_id":"b2bf5debf6c1489f949378a9ca7e9f7276df8593"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"448397e3fbb375cc353bdf09698c86d04cb24c1c","unresolved":false,"context_lines":[{"line_number":621,"context_line":"    DELETED \u003d \u0027deleted\u0027"},{"line_number":622,"context_line":"    ERROR \u003d \u0027error\u0027"},{"line_number":623,"context_line":"    SHELVED \u003d \u0027shelved\u0027"},{"line_number":624,"context_line":"    SHELVED_OFFLOADED \u003d \u0027shelved_offloaded\u0027"},{"line_number":625,"context_line":""},{"line_number":626,"context_line":"    ALL \u003d (ACTIVE, BUILDING, PAUSED, SUSPENDED, STOPPED, RESCUED, RESIZED,"},{"line_number":627,"context_line":"           SOFT_DELETED, DELETED, ERROR, SHELVED, SHELVED_OFFLOADED)"}],"source_content_type":"text/x-python","patch_set":35,"id":"3aaa91ec_0059fd8d","line":624,"in_reply_to":"3aaa91ec_e8933359","updated":"2016-06-27 11:19:04.000000000","message":"Actually I am confused, we don\u0027t need to back port here.\n\nIf we get out of sync with the code, and raise exceptions, thats a bug we need to fix by dealing with the above TODO, I feel.","commit_id":"b2bf5debf6c1489f949378a9ca7e9f7276df8593"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"8c7631954e1f202a272170af3464d4bd2b96e2ca","unresolved":false,"context_lines":[{"line_number":675,"context_line":"    SHELVING_IMAGE_PENDING_UPLOAD \u003d \u0027shelving_image_pending_upload\u0027"},{"line_number":676,"context_line":"    SHELVING_IMAGE_UPLOADING \u003d \u0027shelving_image_uploading\u0027"},{"line_number":677,"context_line":"    SHELVING_OFFLOADING \u003d \u0027shelving_offloading\u0027"},{"line_number":678,"context_line":"    UNSHELVING \u003d \u0027unshelving\u0027"},{"line_number":679,"context_line":""},{"line_number":680,"context_line":"    ALL \u003d (SCHEDULING, BLOCK_DEVICE_MAPPING, NETWORKING, SPAWNING,"},{"line_number":681,"context_line":"           IMAGE_SNAPSHOT, IMAGE_SNAPSHOT_PENDING, IMAGE_PENDING_UPLOAD,"}],"source_content_type":"text/x-python","patch_set":35,"id":"3aaa91ec_a89beb64","line":678,"updated":"2016-06-27 09:18:54.000000000","message":"as above, unknown maybe?","commit_id":"b2bf5debf6c1489f949378a9ca7e9f7276df8593"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"8c7631954e1f202a272170af3464d4bd2b96e2ca","unresolved":false,"context_lines":[{"line_number":702,"context_line":"    PAUSED \u003d \u0027paused\u0027"},{"line_number":703,"context_line":"    SHUTDOWN \u003d \u0027shutdown\u0027"},{"line_number":704,"context_line":"    CRASHED \u003d \u0027crashed\u0027"},{"line_number":705,"context_line":"    SUSPENDED \u003d \u0027suspended\u0027"},{"line_number":706,"context_line":""},{"line_number":707,"context_line":"    VALUE_MAP \u003d {"},{"line_number":708,"context_line":"        0x00: NOSTATE,"}],"source_content_type":"text/x-python","patch_set":35,"id":"3aaa91ec_08a79faa","line":705,"updated":"2016-06-27 09:18:54.000000000","message":"as above, unknown maybe?","commit_id":"b2bf5debf6c1489f949378a9ca7e9f7276df8593"}],"nova/tests/functional/integrated_helpers.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b4f51bc9cf76891ce3f2de6dbfee05f83cc608c4","unresolved":false,"context_lines":[{"line_number":244,"context_line":"        server \u003d {}"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"        if image_uuid:"},{"line_number":247,"context_line":"            image \u003d api.get_image(image_id\u003dimage_uuid)"},{"line_number":248,"context_line":"            image_href \u003d \u0027http://fake.server/%s\u0027 % image[\u0027id\u0027]"},{"line_number":249,"context_line":"        else:"},{"line_number":250,"context_line":"            image \u003d api.get_images()[0]"},{"line_number":251,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"3aaa91ec_b8dec40e","line":248,"range":{"start_line":247,"start_character":12,"end_line":248,"end_character":62},"updated":"2016-06-29 19:32:10.000000000","message":"This seems redundant, unless image[\u0027id\u0027] is an int. But I think it\u0027s a uuid given:\n\nhttps://github.com/openstack/nova/blob/master/nova/compute/api.py#L772","commit_id":"9d82c6a2fd5689492134dcd5fc76159af2ce9852"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a60f20e1a63ae86f08ed5375bf50d8f94fa52531","unresolved":false,"context_lines":[{"line_number":244,"context_line":"        server \u003d {}"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"        if image_uuid:"},{"line_number":247,"context_line":"            image \u003d api.get_image(image_id\u003dimage_uuid)"},{"line_number":248,"context_line":"            image_href \u003d \u0027http://fake.server/%s\u0027 % image[\u0027id\u0027]"},{"line_number":249,"context_line":"        else:"},{"line_number":250,"context_line":"            image \u003d api.get_images()[0]"},{"line_number":251,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"3aaa91ec_5b7d081b","line":248,"range":{"start_line":247,"start_character":12,"end_line":248,"end_character":62},"in_reply_to":"3aaa91ec_b8dec40e","updated":"2016-06-30 07:26:47.000000000","message":"Done","commit_id":"9d82c6a2fd5689492134dcd5fc76159af2ce9852"}],"nova/tests/functional/notification_sample_tests/notification_sample_base.py":[{"author":{"_account_id":14762,"name":"Zhihai Song","email":"zhhsng@gmail.com","username":"ZhihaiSong"},"change_message_id":"eaee07bce578c476ce0775afafc926fbc7cffff8","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        return server"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    def _boot_a_server(self, expected_status\u003d\u0027ACTIVE\u0027, extra_params\u003dNone):"},{"line_number":151,"context_line":"        server \u003d self._build_minimal_create_server_request(\u0027some-server\u0027)"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        if extra_params:"}],"source_content_type":"text/x-python","patch_set":29,"id":"7aa08908_4f6bfb85","line":150,"range":{"start_line":150,"start_character":45,"end_line":150,"end_character":53},"updated":"2016-06-16 03:19:02.000000000","message":"is there a enum for this ?","commit_id":"a60a8ea37cc440642c1b87990351f08d6d880726"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"221e9e13fdc7283203e678d376be826acc8bf794","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        return server"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    def _boot_a_server(self, expected_status\u003d\u0027ACTIVE\u0027, extra_params\u003dNone):"},{"line_number":151,"context_line":"        server \u003d self._build_minimal_create_server_request(\u0027some-server\u0027)"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        if extra_params:"}],"source_content_type":"text/x-python","patch_set":29,"id":"7aa08908_d16dc99a","line":150,"range":{"start_line":150,"start_character":45,"end_line":150,"end_character":53},"in_reply_to":"7aa08908_4f6bfb85","updated":"2016-06-16 08:53:11.000000000","message":"The funny thing is that there isn\u0027t. Here we are talking to nova via it\u0027s REST API and the values returned are not defined in a single enum in the nova code base. \nThe vm_states module has similar values but in lower case but I\u0027m not sure reusing that would be future proof as that values are not directly used to generate the API response we are processing here.","commit_id":"a60a8ea37cc440642c1b87990351f08d6d880726"},{"author":{"_account_id":14762,"name":"Zhihai Song","email":"zhhsng@gmail.com","username":"ZhihaiSong"},"change_message_id":"eaee07bce578c476ce0775afafc926fbc7cffff8","unresolved":false,"context_lines":[{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    def _wait_until_deleted(self, server):"},{"line_number":185,"context_line":"        try:"},{"line_number":186,"context_line":"            for i in range(40):"},{"line_number":187,"context_line":"                server \u003d self.api.get_server(server[\u0027id\u0027])"},{"line_number":188,"context_line":"                if server[\u0027status\u0027] \u003d\u003d \u0027ERROR\u0027:"},{"line_number":189,"context_line":"                    self.fail(\u0027Server went to error state instead of\u0027"}],"source_content_type":"text/x-python","patch_set":29,"id":"7aa08908_cf808bfa","line":186,"range":{"start_line":186,"start_character":11,"end_line":186,"end_character":31},"updated":"2016-06-16 03:19:02.000000000","message":"What if the server status didn\u0027t change in 40 loops?\nBesides, i think it is better to check if the status turn into \u0027deleted\u0027, then jump out of the loop, it should save us some time.","commit_id":"a60a8ea37cc440642c1b87990351f08d6d880726"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"221e9e13fdc7283203e678d376be826acc8bf794","unresolved":false,"context_lines":[{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    def _wait_until_deleted(self, server):"},{"line_number":185,"context_line":"        try:"},{"line_number":186,"context_line":"            for i in range(40):"},{"line_number":187,"context_line":"                server \u003d self.api.get_server(server[\u0027id\u0027])"},{"line_number":188,"context_line":"                if server[\u0027status\u0027] \u003d\u003d \u0027ERROR\u0027:"},{"line_number":189,"context_line":"                    self.fail(\u0027Server went to error state instead of\u0027"}],"source_content_type":"text/x-python","patch_set":29,"id":"7aa08908_91aea196","line":186,"range":{"start_line":186,"start_character":11,"end_line":186,"end_character":31},"in_reply_to":"7aa08908_cf808bfa","updated":"2016-06-16 08:53:11.000000000","message":"If the instance is deleted that means the get_server() will return NotFoundException and in that case we exit the loop so we exit as early as possible. \n\nIf the server is failed to delete but it goes to ERROR state then we exit as well because the self.fail will throw an exception.\n\nIf the server stuck in DELETING then we wait about 20 seconds then we shall fail as well. This is missing, I will fix this.","commit_id":"a60a8ea37cc440642c1b87990351f08d6d880726"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"e1980cf6e3e0a4d2251733e8140652c27c9c5a8c","unresolved":false,"context_lines":[{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        self.assertJsonEqual(sample_obj, notification)"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    def _wait_for_state_change(self, server, expected_status, max_retries\u003d10):"},{"line_number":136,"context_line":"        retry_count \u003d 0"},{"line_number":137,"context_line":"        while True:"},{"line_number":138,"context_line":"            server \u003d self.admin_api.get_server(server[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":35,"id":"3aaa91ec_20aeb92d","line":135,"updated":"2016-06-27 11:21:35.000000000","message":"Nit: I do feel like I have seen this all before, but I can\u0027t find those helpers right now.","commit_id":"b2bf5debf6c1489f949378a9ca7e9f7276df8593"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"ed73a32f8b88d1568484c173dbf07effafc31344","unresolved":false,"context_lines":[{"line_number":100,"context_line":"            else:"},{"line_number":101,"context_line":"                obj[\u0027nova_object.data\u0027][key.split(\u0027.\u0027)[-1]] \u003d value"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    def _verify_notification(self, sample_file_name, replacements\u003dNone,"},{"line_number":104,"context_line":"                             actual\u003dNone):"},{"line_number":105,"context_line":"        \"\"\"Assert if the generated notification matches with the stored sample"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"3aaa91ec_81db7a7b","line":103,"updated":"2016-06-30 09:47:10.000000000","message":"snap, /me needs to change his glasses.","commit_id":"3fc5af5f1f82ffbbf75e40f45945a346663a2399"}],"nova/tests/functional/notification_sample_tests/test_instance.py":[{"author":{"_account_id":11803,"name":"Ryan Rossiter","email":"rlrossit@us.ibm.com","username":"rlrossiter"},"change_message_id":"93d5c36475e9abfea3c651bf28e8f839bcc69fdd","unresolved":false,"context_lines":[{"line_number":27,"context_line":"CONF \u003d cfg.CONF"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class NeutronFixture(fixtures.Fixture):"},{"line_number":31,"context_line":"    \"\"\"A fixture to boot instances with neutron ports\"\"\""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    # the default project_id in OsaAPIFixtures"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_57b1bbe0","line":30,"updated":"2016-06-06 21:01:50.000000000","message":"This all seems a little heavy for testing notifications on create/delete, no? I guess if it works, I\u0027m fine with it, but this definitely needs to be frameworked out so it isn\u0027t so complex.","commit_id":"f0f09e23afddb875c8b4a74398826f94689bddeb"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5b1aa4bd3a5cc68921f1e44988f7267f6eb66bae","unresolved":false,"context_lines":[{"line_number":27,"context_line":"CONF \u003d cfg.CONF"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class NeutronFixture(fixtures.Fixture):"},{"line_number":31,"context_line":"    \"\"\"A fixture to boot instances with neutron ports\"\"\""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    # the default project_id in OsaAPIFixtures"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aa08908_187903f7","line":30,"in_reply_to":"7aa08908_57b1bbe0","updated":"2016-06-07 15:48:18.000000000","message":"I\u0027d like to have notification sample test where we have IpPayload filled. To have that I either mock the neutron interface (as here) or play with the instance info_cache. I think the later would be less expressive and it would go against the functional testing pattern we have established.\n\nWhat do you mean by frameworking out? I can definitely move the NeutronFixture to a separate file but that does not feel like an answer to your problem.\nThis is now a static, canned neutron response definition, I can try to add some configurability to the Fixture but that would be premature as this is enough for the current test.","commit_id":"f0f09e23afddb875c8b4a74398826f94689bddeb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b4f51bc9cf76891ce3f2de6dbfee05f83cc608c4","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from nova.tests.unit import fake_notifier"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class NeutronFixture(fixtures.Fixture):"},{"line_number":21,"context_line":"    \"\"\"A fixture to boot instances with neutron ports\"\"\""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    # the default project_id in OsaAPIFixtures"}],"source_content_type":"text/x-python","patch_set":37,"id":"3aaa91ec_eb54f8fe","line":20,"updated":"2016-06-29 19:32:10.000000000","message":"This should probably live in nova.tests.fixtures.","commit_id":"9d82c6a2fd5689492134dcd5fc76159af2ce9852"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0d2d41427decd9c5f4694b9cbce38cc91a7cc908","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from nova.tests.unit import fake_notifier"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class NeutronFixture(fixtures.Fixture):"},{"line_number":21,"context_line":"    \"\"\"A fixture to boot instances with neutron ports\"\"\""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    # the default project_id in OsaAPIFixtures"}],"source_content_type":"text/x-python","patch_set":37,"id":"3aaa91ec_dcb1c048","line":20,"in_reply_to":"3aaa91ec_3b3d9c2b","updated":"2016-06-30 21:56:20.000000000","message":"Cool. Honestly it\u0027s something we\u0027ve needed for a long time because the functional tests run with the network API stub which is really just stubs of nova-network, so we don\u0027t functionally test the nova API with neutron.","commit_id":"9d82c6a2fd5689492134dcd5fc76159af2ce9852"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a60f20e1a63ae86f08ed5375bf50d8f94fa52531","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from nova.tests.unit import fake_notifier"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class NeutronFixture(fixtures.Fixture):"},{"line_number":21,"context_line":"    \"\"\"A fixture to boot instances with neutron ports\"\"\""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    # the default project_id in OsaAPIFixtures"}],"source_content_type":"text/x-python","patch_set":37,"id":"3aaa91ec_3b3d9c2b","line":20,"in_reply_to":"3aaa91ec_eb54f8fe","updated":"2016-06-30 07:26:47.000000000","message":"It is only used in this test file at the moment, but your are probably right. I moved it.","commit_id":"9d82c6a2fd5689492134dcd5fc76159af2ce9852"}],"nova/tests/unit/compute/test_compute_utils.py":[{"author":{"_account_id":20411,"name":"Julian","email":"julian.sy@att.com","username":"syjulian"},"change_message_id":"7ef06f77f2585517371a3f38ac65ea291776ccf6","unresolved":false,"context_lines":[{"line_number":514,"context_line":"                                          uuids.fake_image_ref)"},{"line_number":515,"context_line":"        self.assertEqual(payload[\u0027image_ref_url\u0027], image_ref_url)"},{"line_number":516,"context_line":""},{"line_number":517,"context_line":"    def test_notify_instance_action_deleted_instance(self):"},{"line_number":518,"context_line":"        instance \u003d create_instance(self.context)"},{"line_number":519,"context_line":""},{"line_number":520,"context_line":"        compute_utils.notify_about_instance_action("}],"source_content_type":"text/x-python","patch_set":18,"id":"9abb7d3a_0ebe27ff","line":517,"updated":"2016-06-02 16:29:26.000000000","message":"should the test be more generic since the method isn\u0027t only used for delete instance?","commit_id":"d539bb14b292b6ad95be096c083cbf623fa2b2a8"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"34eaa9bf0c103799cb1fc3f4109a0bdaf4ac1cd5","unresolved":false,"context_lines":[{"line_number":514,"context_line":"                                          uuids.fake_image_ref)"},{"line_number":515,"context_line":"        self.assertEqual(payload[\u0027image_ref_url\u0027], image_ref_url)"},{"line_number":516,"context_line":""},{"line_number":517,"context_line":"    def test_notify_instance_action_deleted_instance(self):"},{"line_number":518,"context_line":"        instance \u003d create_instance(self.context)"},{"line_number":519,"context_line":""},{"line_number":520,"context_line":"        compute_utils.notify_about_instance_action("}],"source_content_type":"text/x-python","patch_set":18,"id":"7aa08908_92b080df","line":517,"in_reply_to":"9abb7d3a_0ebe27ff","updated":"2016-06-06 08:02:38.000000000","message":"Good point. I can make the test name generic. However I still have to use an event type that has already exist as the NotificationAction enum has a fixed set of valid values.","commit_id":"d539bb14b292b6ad95be096c083cbf623fa2b2a8"}],"nova/tests/unit/objects/test_objects.py":[{"author":{"_account_id":20411,"name":"Julian","email":"julian.sy@att.com","username":"syjulian"},"change_message_id":"05ef493778aab658f9b05e514bcf774685c161d8","unresolved":false,"context_lines":[{"line_number":1120,"context_line":"    \u0027EC2InstanceMapping\u0027: \u00271.0-a4556eb5c5e94c045fe84f49cf71644f\u0027,"},{"line_number":1121,"context_line":"    \u0027EC2SnapshotMapping\u0027: \u00271.0-47e7ddabe1af966dce0cfd0ed6cd7cd1\u0027,"},{"line_number":1122,"context_line":"    \u0027EC2VolumeMapping\u0027: \u00271.0-5b713751d6f97bad620f3378a521020d\u0027,"},{"line_number":1123,"context_line":"    \u0027EventType\u0027: \u00271.2-b81c9f80d9344a24df0b1ecce376b515\u0027,"},{"line_number":1124,"context_line":"    \u0027ExceptionNotification\u0027: \u00271.0-a73147b93b520ff0061865849d3dfa56\u0027,"},{"line_number":1125,"context_line":"    \u0027ExceptionPayload\u0027: \u00271.0-4516ae282a55fe2fd5c754967ee6248b\u0027,"},{"line_number":1126,"context_line":"    \u0027FixedIP\u0027: \u00271.14-53e1c10b539f1a82fe83b1af4720efae\u0027,"}],"source_content_type":"text/x-python","patch_set":28,"id":"7aa08908_08a6510e","line":1123,"updated":"2016-06-14 20:51:47.000000000","message":"newbie question. what are these values?","commit_id":"74b5c1dba0a00f6de3e6464690fda6b326e6a285"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"dfc6fafa5bc991cfaa2383002697d4338602a567","unresolved":false,"context_lines":[{"line_number":1120,"context_line":"    \u0027EC2InstanceMapping\u0027: \u00271.0-a4556eb5c5e94c045fe84f49cf71644f\u0027,"},{"line_number":1121,"context_line":"    \u0027EC2SnapshotMapping\u0027: \u00271.0-47e7ddabe1af966dce0cfd0ed6cd7cd1\u0027,"},{"line_number":1122,"context_line":"    \u0027EC2VolumeMapping\u0027: \u00271.0-5b713751d6f97bad620f3378a521020d\u0027,"},{"line_number":1123,"context_line":"    \u0027EventType\u0027: \u00271.2-b81c9f80d9344a24df0b1ecce376b515\u0027,"},{"line_number":1124,"context_line":"    \u0027ExceptionNotification\u0027: \u00271.0-a73147b93b520ff0061865849d3dfa56\u0027,"},{"line_number":1125,"context_line":"    \u0027ExceptionPayload\u0027: \u00271.0-4516ae282a55fe2fd5c754967ee6248b\u0027,"},{"line_number":1126,"context_line":"    \u0027FixedIP\u0027: \u00271.14-53e1c10b539f1a82fe83b1af4720efae\u0027,"}],"source_content_type":"text/x-python","patch_set":28,"id":"7aa08908_d184e60c","line":1123,"in_reply_to":"7aa08908_08a6510e","updated":"2016-06-15 07:39:22.000000000","message":"Versioned objects has a version attached. The version needs to be bumped in certain cases, for example when you add a new field or change the type of a field. Nova has a test case (Line 1224)  where we try to assert that the version is bumped properly in these cases. To do that we store the hash of all the information that contributes to the version of an object along with the version per object type. So this line means EventType has a version 1.2 and the hash of the information is b81c9... During the test we recalculate the hash and if that is different from the stored one we ask the user to check the version of the object as he might changed something that cause that the version needs to be bumped.","commit_id":"74b5c1dba0a00f6de3e6464690fda6b326e6a285"}]}
