)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"b2fc6be3c0dad820bf7bdf7e9d7b0e96d38639a6","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch adds bdm related data to InstancePayload. As loading BDM"},{"line_number":10,"context_line":"can be expensive a new configuration flag \u0027bdms_in_notifications\u0027 is"},{"line_number":11,"context_line":"introduced. If this is set to true (as by default) then the instance"},{"line_number":12,"context_line":"notifications will contain \u0027null\u0027 value in block_devices field."},{"line_number":13,"context_line":"If this configuration flag is set to true then the block devices will"},{"line_number":14,"context_line":"be loaded from the db and will be included in the notification payload."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":30,"id":"5f201791_ebc7e811","line":11,"range":{"start_line":11,"start_character":30,"end_line":11,"end_character":34},"updated":"2017-06-22 15:58:36.000000000","message":"False, right?","commit_id":"b27dfbf20567b48b1c226ec88d1a9241e0daff83"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"74e58a72ec551c738d02b8134da9f0cc74ef184d","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch adds bdm related data to InstancePayload. As loading BDM"},{"line_number":10,"context_line":"can be expensive a new configuration flag \u0027bdms_in_notifications\u0027 is"},{"line_number":11,"context_line":"introduced. If this is set to true (as by default) then the instance"},{"line_number":12,"context_line":"notifications will contain \u0027null\u0027 value in block_devices field."},{"line_number":13,"context_line":"If this configuration flag is set to true then the block devices will"},{"line_number":14,"context_line":"be loaded from the db and will be included in the notification payload."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":30,"id":"3f1d235d_4f82ae51","line":11,"range":{"start_line":11,"start_character":30,"end_line":11,"end_character":34},"in_reply_to":"5f201791_ebc7e811","updated":"2017-06-29 11:07:12.000000000","message":"right. Done.","commit_id":"b27dfbf20567b48b1c226ec88d1a9241e0daff83"}],"doc/notification_samples/instance-delete-start.json":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fc6138b129a582f7b2744df8b64e62a8ddd237e3","unresolved":false,"context_lines":[{"line_number":5,"context_line":"            \"architecture\":\"x86_64\","},{"line_number":6,"context_line":"            \"availability_zone\": \"nova\","},{"line_number":7,"context_line":"            \"block_devices\": [{"},{"line_number":8,"context_line":"                \"nova_object.data\": {"},{"line_number":9,"context_line":"                    \"boot_index\": null,"},{"line_number":10,"context_line":"                    \"delete_on_termination\": false,"},{"line_number":11,"context_line":"                    \"type\": \"volume\","},{"line_number":12,"context_line":"                    \"tag\": null,"},{"line_number":13,"context_line":"                    \"volume_id\": \"a07f71dc-8151-4e7d-a0cc-cd24a3f11113\""},{"line_number":14,"context_line":"                },"},{"line_number":15,"context_line":"                \"nova_object.name\": \"BlockDevicePayload\","},{"line_number":16,"context_line":"                \"nova_object.namespace\": \"nova\","},{"line_number":17,"context_line":"                \"nova_object.version\": \"1.0\""}],"source_content_type":"application/json","patch_set":36,"id":"3f1d235d_c5930f5c","line":14,"range":{"start_line":8,"start_character":16,"end_line":14,"end_character":18},"updated":"2017-07-10 18:37:07.000000000","message":"Was it intentional to not include the device_name in this payload? We return the device_name in the os-volume_attachments API:\n\nhttps://developer.openstack.org/api-ref/compute/?expanded\u003dshow-server-details-detail,list-volume-attachments-for-an-instance-detail#list-volume-attachments-for-an-instance","commit_id":"95ddc60a026770ba490e27234778aed7b6457667"}],"doc/notification_samples/instance-rebuild-end.json":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"dea259f94f29990b141acaa6ae3d80c629361980","unresolved":false,"context_lines":[{"line_number":82,"context_line":"            \"progress\": 0,"},{"line_number":83,"context_line":"            \"task_state\": null"},{"line_number":84,"context_line":"        },"},{"line_number":85,"context_line":"        \"nova_object.name\": \"InstanceActionPayload\""},{"line_number":86,"context_line":"    },"},{"line_number":87,"context_line":"    \"priority\": \"INFO\""},{"line_number":88,"context_line":"}"}],"source_content_type":"application/json","patch_set":39,"id":"1f1a1f67_45760cdb","line":85,"updated":"2017-07-12 16:03:44.000000000","message":"I\u0027d certainly appreciate in a follow-up change having the object version defined here instead of above but that\u0027s just a nit :-)","commit_id":"1928ec5606491de95abba8791b1d7b888690dd3c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"79c41a9b6a2da1267c6a4610d9ba345860382faa","unresolved":false,"context_lines":[{"line_number":82,"context_line":"            \"progress\": 0,"},{"line_number":83,"context_line":"            \"task_state\": null"},{"line_number":84,"context_line":"        },"},{"line_number":85,"context_line":"        \"nova_object.name\": \"InstanceActionPayload\""},{"line_number":86,"context_line":"    },"},{"line_number":87,"context_line":"    \"priority\": \"INFO\""},{"line_number":88,"context_line":"}"}],"source_content_type":"application/json","patch_set":39,"id":"1f1a1f67_8bb79387","line":85,"in_reply_to":"1f1a1f67_45760cdb","updated":"2017-07-12 16:07:09.000000000","message":"There are multiple patches in the pipe to help with this. \n1) style checking for the sample files: https://review.openstack.org/#/c/443677/\n2) deduplicate the sample files https://review.openstack.org/#/q/topic:refactor-notification-samples\n\nSooner or later the pain will go away. :)","commit_id":"1928ec5606491de95abba8791b1d7b888690dd3c"}],"doc/notification_samples/instance-volume_detach-end.json":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fc6138b129a582f7b2744df8b64e62a8ddd237e3","unresolved":false,"context_lines":[{"line_number":4,"context_line":"        \"nova_object.data\": {"},{"line_number":5,"context_line":"            \"architecture\": \"x86_64\","},{"line_number":6,"context_line":"            \"availability_zone\": \"nova\","},{"line_number":7,"context_line":"            \"block_devices\": [{"},{"line_number":8,"context_line":"                \"nova_object.data\": {"},{"line_number":9,"context_line":"                    \"boot_index\": null,"},{"line_number":10,"context_line":"                    \"delete_on_termination\": false,"},{"line_number":11,"context_line":"                    \"type\": \"volume\","},{"line_number":12,"context_line":"                    \"tag\": null,"},{"line_number":13,"context_line":"                    \"volume_id\": \"a07f71dc-8151-4e7d-a0cc-cd24a3f11113\""},{"line_number":14,"context_line":"                },"},{"line_number":15,"context_line":"                \"nova_object.name\": \"BlockDevicePayload\","},{"line_number":16,"context_line":"                \"nova_object.namespace\": \"nova\","},{"line_number":17,"context_line":"                \"nova_object.version\": \"1.0\""},{"line_number":18,"context_line":"            }],"},{"line_number":19,"context_line":"            \"created_at\": \"2012-10-29T13:42:11Z\","},{"line_number":20,"context_line":"            \"deleted_at\": null,"},{"line_number":21,"context_line":"            \"display_name\": \"some-server\","}],"source_content_type":"application/json","patch_set":36,"id":"3f1d235d_c5a1cf97","line":18,"range":{"start_line":7,"start_character":12,"end_line":18,"end_character":15},"updated":"2017-07-10 18:37:07.000000000","message":"Is it just me or is it a bit weird that we\u0027d have BDMs listed here even after it\u0027s detached?","commit_id":"95ddc60a026770ba490e27234778aed7b6457667"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"626525c8daf9ca5b3452a7d8cd938a9afbe470f4","unresolved":false,"context_lines":[{"line_number":4,"context_line":"        \"nova_object.data\": {"},{"line_number":5,"context_line":"            \"architecture\": \"x86_64\","},{"line_number":6,"context_line":"            \"availability_zone\": \"nova\","},{"line_number":7,"context_line":"            \"block_devices\": [{"},{"line_number":8,"context_line":"                \"nova_object.data\": {"},{"line_number":9,"context_line":"                    \"boot_index\": null,"},{"line_number":10,"context_line":"                    \"delete_on_termination\": false,"},{"line_number":11,"context_line":"                    \"type\": \"volume\","},{"line_number":12,"context_line":"                    \"tag\": null,"},{"line_number":13,"context_line":"                    \"volume_id\": \"a07f71dc-8151-4e7d-a0cc-cd24a3f11113\""},{"line_number":14,"context_line":"                },"},{"line_number":15,"context_line":"                \"nova_object.name\": \"BlockDevicePayload\","},{"line_number":16,"context_line":"                \"nova_object.namespace\": \"nova\","},{"line_number":17,"context_line":"                \"nova_object.version\": \"1.0\""},{"line_number":18,"context_line":"            }],"},{"line_number":19,"context_line":"            \"created_at\": \"2012-10-29T13:42:11Z\","},{"line_number":20,"context_line":"            \"deleted_at\": null,"},{"line_number":21,"context_line":"            \"display_name\": \"some-server\","}],"source_content_type":"application/json","patch_set":36,"id":"3f1d235d_fddb297a","line":18,"range":{"start_line":7,"start_character":12,"end_line":18,"end_character":15},"in_reply_to":"3f1d235d_80c4e541","updated":"2017-07-11 15:04:21.000000000","message":"Yeah, I can move the notification sending under the bdm.destroy() if you wish but I that should be done in a separate patch","commit_id":"95ddc60a026770ba490e27234778aed7b6457667"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9d945a85e0f2016b15f46ce296ec43daed15eab0","unresolved":false,"context_lines":[{"line_number":4,"context_line":"        \"nova_object.data\": {"},{"line_number":5,"context_line":"            \"architecture\": \"x86_64\","},{"line_number":6,"context_line":"            \"availability_zone\": \"nova\","},{"line_number":7,"context_line":"            \"block_devices\": [{"},{"line_number":8,"context_line":"                \"nova_object.data\": {"},{"line_number":9,"context_line":"                    \"boot_index\": null,"},{"line_number":10,"context_line":"                    \"delete_on_termination\": false,"},{"line_number":11,"context_line":"                    \"type\": \"volume\","},{"line_number":12,"context_line":"                    \"tag\": null,"},{"line_number":13,"context_line":"                    \"volume_id\": \"a07f71dc-8151-4e7d-a0cc-cd24a3f11113\""},{"line_number":14,"context_line":"                },"},{"line_number":15,"context_line":"                \"nova_object.name\": \"BlockDevicePayload\","},{"line_number":16,"context_line":"                \"nova_object.namespace\": \"nova\","},{"line_number":17,"context_line":"                \"nova_object.version\": \"1.0\""},{"line_number":18,"context_line":"            }],"},{"line_number":19,"context_line":"            \"created_at\": \"2012-10-29T13:42:11Z\","},{"line_number":20,"context_line":"            \"deleted_at\": null,"},{"line_number":21,"context_line":"            \"display_name\": \"some-server\","}],"source_content_type":"application/json","patch_set":36,"id":"3f1d235d_80c4e541","line":18,"range":{"start_line":7,"start_character":12,"end_line":18,"end_character":15},"in_reply_to":"3f1d235d_c5a1cf97","updated":"2017-07-10 18:38:19.000000000","message":"Oh I see, we send the notification before deleting the BDM record:\n\nhttps://github.com/openstack/nova/blob/dcea3ff68793a28cd546805ebcb2c0ae6c9b684d/nova/compute/manager.py#L4966","commit_id":"95ddc60a026770ba490e27234778aed7b6457667"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b2f429bf84e37b9fda6ac95e9d33e4d1b3ac8394","unresolved":false,"context_lines":[{"line_number":4,"context_line":"        \"nova_object.data\": {"},{"line_number":5,"context_line":"            \"architecture\": \"x86_64\","},{"line_number":6,"context_line":"            \"availability_zone\": \"nova\","},{"line_number":7,"context_line":"            \"block_devices\": [{"},{"line_number":8,"context_line":"                \"nova_object.data\": {"},{"line_number":9,"context_line":"                    \"boot_index\": null,"},{"line_number":10,"context_line":"                    \"delete_on_termination\": false,"},{"line_number":11,"context_line":"                    \"type\": \"volume\","},{"line_number":12,"context_line":"                    \"tag\": null,"},{"line_number":13,"context_line":"                    \"volume_id\": \"a07f71dc-8151-4e7d-a0cc-cd24a3f11113\""},{"line_number":14,"context_line":"                },"},{"line_number":15,"context_line":"                \"nova_object.name\": \"BlockDevicePayload\","},{"line_number":16,"context_line":"                \"nova_object.namespace\": \"nova\","},{"line_number":17,"context_line":"                \"nova_object.version\": \"1.0\""},{"line_number":18,"context_line":"            }],"},{"line_number":19,"context_line":"            \"created_at\": \"2012-10-29T13:42:11Z\","},{"line_number":20,"context_line":"            \"deleted_at\": null,"},{"line_number":21,"context_line":"            \"display_name\": \"some-server\","}],"source_content_type":"application/json","patch_set":36,"id":"3f1d235d_b41c9c6a","line":18,"range":{"start_line":7,"start_character":12,"end_line":18,"end_character":15},"in_reply_to":"3f1d235d_fddb297a","updated":"2017-07-11 17:28:08.000000000","message":"Agree it\u0027s a separate patch if we care to change this.","commit_id":"95ddc60a026770ba490e27234778aed7b6457667"}],"nova/compute/utils.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"db5b61dba48d47a02236c36b99710730f0026fa0","unresolved":false,"context_lines":[{"line_number":208,"context_line":"    return bdms.root_bdm()"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"def _get_bdms(context, instance):"},{"line_number":212,"context_line":"    if isinstance(instance, objects.Instance):"},{"line_number":213,"context_line":"        uuid \u003d instance.uuid"},{"line_number":214,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":9,"id":"ffe62b97_da1037ab","line":211,"updated":"2017-03-28 09:20:36.000000000","message":"This looks like a duplicate. You have the same function in nova.notifications.base .","commit_id":"10c359a6ec95f29189260612bb06e425a570aead"},{"author":{"_account_id":18337,"name":"Sujitha","email":"sujitha.neti@intel.com","username":"Sujitha"},"change_message_id":"cfc3280f99ab3c9044ed77b5a6e15b6849bd5e71","unresolved":false,"context_lines":[{"line_number":208,"context_line":"    return bdms.root_bdm()"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"def _get_bdms(context, instance):"},{"line_number":212,"context_line":"    if isinstance(instance, objects.Instance):"},{"line_number":213,"context_line":"        uuid \u003d instance.uuid"},{"line_number":214,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":9,"id":"dfeb2761_0daef42d","line":211,"in_reply_to":"ffe62b97_da1037ab","updated":"2017-03-30 22:23:46.000000000","message":"Removed and added it to nova/objects/instance.py","commit_id":"10c359a6ec95f29189260612bb06e425a570aead"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"865be1724298e69484bef76e159e86346b6de66c","unresolved":false,"context_lines":[{"line_number":214,"context_line":"    else:"},{"line_number":215,"context_line":"        uuid \u003d instance[\u0027uuid\u0027]"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    return objects.BlockDeviceMappingList.get_by_instance_uuid("},{"line_number":218,"context_line":"                context, uuid)"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"ffe62b97_7fba216e","line":217,"updated":"2017-03-28 17:40:07.000000000","message":"This means that in every instance notification we do an extra db query to load the BDM. This could lead to increased db load. It would be nice to know how big this problem is. \n\nIn the bp there was discussion about a config option to include BDM or not. That could be a solution. \nThe parallel work on short circuiting notifications https://review.openstack.org/#/c/428260/ only solves this problem if the whole versioned notification interface is turned off. But the problem remains if the user wants to get notifications but doesn\u0027t need the BDM therefore she doesn\u0027t want to pay the price of the extra db query here.\n\nI think it would not be a big effort to add a new config options and if that is set then include BDMs and if not set then set the InstancePayload.block_devices to null. But would be good to hear other\u0027s opinion about this.","commit_id":"10c359a6ec95f29189260612bb06e425a570aead"},{"author":{"_account_id":18337,"name":"Sujitha","email":"sujitha.neti@intel.com","username":"Sujitha"},"change_message_id":"cfc3280f99ab3c9044ed77b5a6e15b6849bd5e71","unresolved":false,"context_lines":[{"line_number":214,"context_line":"    else:"},{"line_number":215,"context_line":"        uuid \u003d instance[\u0027uuid\u0027]"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    return objects.BlockDeviceMappingList.get_by_instance_uuid("},{"line_number":218,"context_line":"                context, uuid)"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"dfeb2761_cd7c8cb7","line":217,"in_reply_to":"ffe62b97_7fba216e","updated":"2017-03-30 22:23:46.000000000","message":"yes.lets wait for other\u0027s opinions","commit_id":"10c359a6ec95f29189260612bb06e425a570aead"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"db5b61dba48d47a02236c36b99710730f0026fa0","unresolved":false,"context_lines":[{"line_number":423,"context_line":"    flavor \u003d flavor_notification.FlavorPayload(instance.flavor)"},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"    fault, priority \u003d _get_fault_and_priority_from_exc(exception)"},{"line_number":426,"context_line":"    bdms \u003d instance_notification.BlockDevicePayload.from_instance(bdms)"},{"line_number":427,"context_line":""},{"line_number":428,"context_line":"    payload \u003d instance_notification.InstanceActionVolumeSwapPayload("},{"line_number":429,"context_line":"        instance\u003dinstance,"}],"source_content_type":"text/x-python","patch_set":9,"id":"ffe62b97_7a748bfe","line":426,"updated":"2017-03-28 09:20:36.000000000","message":"I think there is a repeated pattern here. First the code calls _get_bdms and then calls BlockDevicePayload.from_instance and then pass that to the notifications.\n\nI think we can remove some of the duplicates by moving the _get_bdms calls into the from_instance call.","commit_id":"10c359a6ec95f29189260612bb06e425a570aead"},{"author":{"_account_id":18337,"name":"Sujitha","email":"sujitha.neti@intel.com","username":"Sujitha"},"change_message_id":"cfc3280f99ab3c9044ed77b5a6e15b6849bd5e71","unresolved":false,"context_lines":[{"line_number":423,"context_line":"    flavor \u003d flavor_notification.FlavorPayload(instance.flavor)"},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"    fault, priority \u003d _get_fault_and_priority_from_exc(exception)"},{"line_number":426,"context_line":"    bdms \u003d instance_notification.BlockDevicePayload.from_instance(bdms)"},{"line_number":427,"context_line":""},{"line_number":428,"context_line":"    payload \u003d instance_notification.InstanceActionVolumeSwapPayload("},{"line_number":429,"context_line":"        instance\u003dinstance,"}],"source_content_type":"text/x-python","patch_set":9,"id":"dfeb2761_4d4abc80","line":426,"in_reply_to":"ffe62b97_7a748bfe","updated":"2017-03-30 22:23:46.000000000","message":"Done","commit_id":"10c359a6ec95f29189260612bb06e425a570aead"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fb75ce92c6345fdbb8a43a6f47a70c72461b9c92","unresolved":false,"context_lines":[{"line_number":339,"context_line":"    return fault, priority"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"def notify_about_instance_action(context, instance, host, action, phase\u003dNone,"},{"line_number":343,"context_line":"                                 binary\u003d\u0027nova-compute\u0027, exception\u003dNone):"},{"line_number":344,"context_line":"    \"\"\"Send versioned notification about the action made on the instance"},{"line_number":345,"context_line":"    :param instance: the instance which the action performed on"}],"source_content_type":"text/x-python","patch_set":12,"id":"dfeb2761_e067b3e8","line":342,"updated":"2017-04-05 11:34:16.000000000","message":"I suggest to add an @if_notification_enabled decorator as the BDM db lookup shall be avoided if we know that the actual notification will never be emitted to the message bus.","commit_id":"5a42c3e5e9100d28ad2c4fe9e5bc779a57c1c46c"},{"author":{"_account_id":18337,"name":"Sujitha","email":"sujitha.neti@intel.com","username":"Sujitha"},"change_message_id":"2bc4f166118dc314fd3d86bac8e0b37c8714893e","unresolved":false,"context_lines":[{"line_number":339,"context_line":"    return fault, priority"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"def notify_about_instance_action(context, instance, host, action, phase\u003dNone,"},{"line_number":343,"context_line":"                                 binary\u003d\u0027nova-compute\u0027, exception\u003dNone):"},{"line_number":344,"context_line":"    \"\"\"Send versioned notification about the action made on the instance"},{"line_number":345,"context_line":"    :param instance: the instance which the action performed on"}],"source_content_type":"text/x-python","patch_set":12,"id":"bff0334d_9260cf34","line":342,"in_reply_to":"dfeb2761_e067b3e8","updated":"2017-04-06 00:19:45.000000000","message":"Done","commit_id":"5a42c3e5e9100d28ad2c4fe9e5bc779a57c1c46c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fb75ce92c6345fdbb8a43a6f47a70c72461b9c92","unresolved":false,"context_lines":[{"line_number":369,"context_line":"    notification.emit(context)"},{"line_number":370,"context_line":""},{"line_number":371,"context_line":""},{"line_number":372,"context_line":"def notify_about_volume_swap(context, instance, host, action, phase,"},{"line_number":373,"context_line":"                             old_volume_id, new_volume_id, exception\u003dNone):"},{"line_number":374,"context_line":"    \"\"\"Send versioned notification about the volume swap action"},{"line_number":375,"context_line":"       on the instance"}],"source_content_type":"text/x-python","patch_set":12,"id":"dfeb2761_60a163f8","line":372,"updated":"2017-04-05 11:34:16.000000000","message":"ditto","commit_id":"5a42c3e5e9100d28ad2c4fe9e5bc779a57c1c46c"},{"author":{"_account_id":18337,"name":"Sujitha","email":"sujitha.neti@intel.com","username":"Sujitha"},"change_message_id":"2bc4f166118dc314fd3d86bac8e0b37c8714893e","unresolved":false,"context_lines":[{"line_number":369,"context_line":"    notification.emit(context)"},{"line_number":370,"context_line":""},{"line_number":371,"context_line":""},{"line_number":372,"context_line":"def notify_about_volume_swap(context, instance, host, action, phase,"},{"line_number":373,"context_line":"                             old_volume_id, new_volume_id, exception\u003dNone):"},{"line_number":374,"context_line":"    \"\"\"Send versioned notification about the volume swap action"},{"line_number":375,"context_line":"       on the instance"}],"source_content_type":"text/x-python","patch_set":12,"id":"bff0334d_52524769","line":372,"in_reply_to":"dfeb2761_60a163f8","updated":"2017-04-06 00:19:45.000000000","message":"Done","commit_id":"5a42c3e5e9100d28ad2c4fe9e5bc779a57c1c46c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"026540ea9f5b9a276850c287f6bee1e504d0ea2c","unresolved":false,"context_lines":[{"line_number":339,"context_line":"    return fault, priority"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"@rpc.if_notifications_enabled"},{"line_number":343,"context_line":"def notify_about_instance_action(context, instance, host, action, phase\u003dNone,"},{"line_number":344,"context_line":"                                 binary\u003d\u0027nova-compute\u0027, exception\u003dNone):"},{"line_number":345,"context_line":"    \"\"\"Send versioned notification about the action made on the instance"}],"source_content_type":"text/x-python","patch_set":23,"id":"ff0f0b1f_0e8eb0cf","line":342,"range":{"start_line":342,"start_character":0,"end_line":342,"end_character":29},"updated":"2017-05-19 13:54:12.000000000","message":"Could you tell me why this is now needed?","commit_id":"8a8418f1c35809af09a63d770adc16130be2464c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"85adeab06d17138d5822723a32a6cbb3a9e167bb","unresolved":false,"context_lines":[{"line_number":339,"context_line":"    return fault, priority"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"@rpc.if_notifications_enabled"},{"line_number":343,"context_line":"def notify_about_instance_action(context, instance, host, action, phase\u003dNone,"},{"line_number":344,"context_line":"                                 binary\u003d\u0027nova-compute\u0027, exception\u003dNone):"},{"line_number":345,"context_line":"    \"\"\"Send versioned notification about the action made on the instance"}],"source_content_type":"text/x-python","patch_set":23,"id":"bf091321_e47cf8b6","line":342,"range":{"start_line":342,"start_character":0,"end_line":342,"end_character":29},"in_reply_to":"df140735_ad1f396a","updated":"2017-06-08 09:33:45.000000000","message":"I updated the commit message to mention this.","commit_id":"8a8418f1c35809af09a63d770adc16130be2464c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"dff1d4763cf4b9d9b0ed5e0ff434fb743a6b1001","unresolved":false,"context_lines":[{"line_number":339,"context_line":"    return fault, priority"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"@rpc.if_notifications_enabled"},{"line_number":343,"context_line":"def notify_about_instance_action(context, instance, host, action, phase\u003dNone,"},{"line_number":344,"context_line":"                                 binary\u003d\u0027nova-compute\u0027, exception\u003dNone):"},{"line_number":345,"context_line":"    \"\"\"Send versioned notification about the action made on the instance"}],"source_content_type":"text/x-python","patch_set":23,"id":"df140735_ad1f396a","line":342,"range":{"start_line":342,"start_character":0,"end_line":342,"end_character":29},"in_reply_to":"ff0f0b1f_0e8eb0cf","updated":"2017-06-05 21:27:20.000000000","message":"It\u0027s so we don\u0027t go lazy-loading a bunch of BDMs from the database round trip through conductor if we\u0027re ultimately not going to be sending notifications (they aren\u0027t enabled). I asked for this to avoid unnecessarily loading things that we aren\u0027t going to send. It should probably be called out in the commit message.\n\nWe could/should also consider doing this in a separate change because I\u0027m going to be asking for it here also:\n\nhttps://review.openstack.org/#/c/459923/21/nova/notifications/base.py@220","commit_id":"8a8418f1c35809af09a63d770adc16130be2464c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"b2fc6be3c0dad820bf7bdf7e9d7b0e96d38639a6","unresolved":false,"context_lines":[{"line_number":338,"context_line":"    return fault, priority"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"@rpc.if_notifications_enabled"},{"line_number":342,"context_line":"def notify_about_instance_action(context, instance, host, action, phase\u003dNone,"},{"line_number":343,"context_line":"                                 binary\u003d\u0027nova-compute\u0027, exception\u003dNone):"},{"line_number":344,"context_line":"    \"\"\"Send versioned notification about the action made on the instance"}],"source_content_type":"text/x-python","patch_set":30,"id":"5f201791_8b5f5471","line":341,"range":{"start_line":341,"start_character":0,"end_line":341,"end_character":29},"updated":"2017-06-22 15:58:36.000000000","message":"What\u0027s going on here?","commit_id":"b27dfbf20567b48b1c226ec88d1a9241e0daff83"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1fa092cf1b8ee47b669586550a19f5b30fbbade9","unresolved":false,"context_lines":[{"line_number":338,"context_line":"    return fault, priority"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"@rpc.if_notifications_enabled"},{"line_number":342,"context_line":"def notify_about_instance_action(context, instance, host, action, phase\u003dNone,"},{"line_number":343,"context_line":"                                 binary\u003d\u0027nova-compute\u0027, exception\u003dNone):"},{"line_number":344,"context_line":"    \"\"\"Send versioned notification about the action made on the instance"}],"source_content_type":"text/x-python","patch_set":30,"id":"3f1d235d_384f9abe","line":341,"range":{"start_line":341,"start_character":0,"end_line":341,"end_character":29},"in_reply_to":"3f1d235d_400ddb35","updated":"2017-06-30 07:31:33.000000000","message":"The last sentence of the commit message is there for this reason, but I see that this needs a bit more description so I added one extra sentence after it.","commit_id":"b27dfbf20567b48b1c226ec88d1a9241e0daff83"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8b2cb005faa9fca4a528a8b6cf5cd682173d695d","unresolved":false,"context_lines":[{"line_number":338,"context_line":"    return fault, priority"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"@rpc.if_notifications_enabled"},{"line_number":342,"context_line":"def notify_about_instance_action(context, instance, host, action, phase\u003dNone,"},{"line_number":343,"context_line":"                                 binary\u003d\u0027nova-compute\u0027, exception\u003dNone):"},{"line_number":344,"context_line":"    \"\"\"Send versioned notification about the action made on the instance"}],"source_content_type":"text/x-python","patch_set":30,"id":"3f1d235d_400ddb35","line":341,"range":{"start_line":341,"start_character":0,"end_line":341,"end_character":29},"in_reply_to":"3f1d235d_ef497a60","updated":"2017-06-29 12:50:32.000000000","message":"Ah, well at least I\u0027m consistent.\n\nIt should probably be a separate commit, but if not could you stick that in the commit message?","commit_id":"b27dfbf20567b48b1c226ec88d1a9241e0daff83"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"d5f0120c9d83896de8e3411478278c6a6ac72645","unresolved":false,"context_lines":[{"line_number":338,"context_line":"    return fault, priority"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"@rpc.if_notifications_enabled"},{"line_number":342,"context_line":"def notify_about_instance_action(context, instance, host, action, phase\u003dNone,"},{"line_number":343,"context_line":"                                 binary\u003d\u0027nova-compute\u0027, exception\u003dNone):"},{"line_number":344,"context_line":"    \"\"\"Send versioned notification about the action made on the instance"}],"source_content_type":"text/x-python","patch_set":30,"id":"3f1d235d_ef497a60","line":341,"range":{"start_line":341,"start_character":0,"end_line":341,"end_character":29},"in_reply_to":"5f201791_8b5f5471","updated":"2017-06-29 11:06:04.000000000","message":"We already discussed this during the review here https://review.openstack.org/#/c/448779/23/nova/compute/utils.py@342\n\nBasically it is a shortcut not generate the data of a notification if it will not be sent out.\n\nDo you suggest to do this in a separate patch?","commit_id":"b27dfbf20567b48b1c226ec88d1a9241e0daff83"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fc6138b129a582f7b2744df8b64e62a8ddd237e3","unresolved":false,"context_lines":[{"line_number":425,"context_line":"    notification.emit(context)"},{"line_number":426,"context_line":""},{"line_number":427,"context_line":""},{"line_number":428,"context_line":"def notify_about_keypair_action(context, keypair, action, phase):"},{"line_number":429,"context_line":"    \"\"\"Send versioned notification about the keypair action on the instance"},{"line_number":430,"context_line":""},{"line_number":431,"context_line":"    :param context: the request context"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_25bc03ba","line":428,"updated":"2017-07-10 18:37:07.000000000","message":"I know you didn\u0027t decorate this with @rpc.if_notifications_enabled because this notification doesn\u0027t have BDMs in it, but it\u0027s kind of weird to decorate some but not the others.\n\nIt seems we should have a separate patch before this one that adds BDMs to the payloads which adds these decorators to all versioned notification methods in here, rather than just the one that deal with BDMs.","commit_id":"95ddc60a026770ba490e27234778aed7b6457667"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"626525c8daf9ca5b3452a7d8cd938a9afbe470f4","unresolved":false,"context_lines":[{"line_number":425,"context_line":"    notification.emit(context)"},{"line_number":426,"context_line":""},{"line_number":427,"context_line":""},{"line_number":428,"context_line":"def notify_about_keypair_action(context, keypair, action, phase):"},{"line_number":429,"context_line":"    \"\"\"Send versioned notification about the keypair action on the instance"},{"line_number":430,"context_line":""},{"line_number":431,"context_line":"    :param context: the request context"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_82197489","line":428,"in_reply_to":"3f1d235d_25bc03ba","updated":"2017-07-11 15:04:21.000000000","message":"OK. created a separate patch to add the decorator to every versioned notification method","commit_id":"95ddc60a026770ba490e27234778aed7b6457667"}],"nova/conf/notifications.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fc6138b129a582f7b2744df8b64e62a8ddd237e3","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        \u0027bdms_in_notifications\u0027,"},{"line_number":122,"context_line":"        default\u003dFalse,"},{"line_number":123,"context_line":"        help\u003d\"\"\""},{"line_number":124,"context_line":"If enabled, include block device information in the versioned notification"},{"line_number":125,"context_line":"payload."},{"line_number":126,"context_line":"\"\"\")"},{"line_number":127,"context_line":"]"},{"line_number":128,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_e5ea8baa","line":125,"range":{"start_line":124,"start_character":0,"end_line":125,"end_character":8},"updated":"2017-07-10 18:37:07.000000000","message":"Should we mention that this is disabled by default because it can incur some overhead on the system since the information may need to be loaded from the database?\n\nI\u0027m trying to think of this from an operator point of view and answer the question, \"should I enable this? what is the downside if I do?\"","commit_id":"95ddc60a026770ba490e27234778aed7b6457667"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"626525c8daf9ca5b3452a7d8cd938a9afbe470f4","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        \u0027bdms_in_notifications\u0027,"},{"line_number":122,"context_line":"        default\u003dFalse,"},{"line_number":123,"context_line":"        help\u003d\"\"\""},{"line_number":124,"context_line":"If enabled, include block device information in the versioned notification"},{"line_number":125,"context_line":"payload."},{"line_number":126,"context_line":"\"\"\")"},{"line_number":127,"context_line":"]"},{"line_number":128,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_fdf7a9d3","line":125,"range":{"start_line":124,"start_character":0,"end_line":125,"end_character":8},"in_reply_to":"3f1d235d_e5ea8baa","updated":"2017-07-11 15:04:21.000000000","message":"Good point. Done.","commit_id":"95ddc60a026770ba490e27234778aed7b6457667"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4b222ede2143bd18444fdcf4f8456109fc0aa79c","unresolved":false,"context_lines":[{"line_number":124,"context_line":"If enabled, include block device information in the versioned notification"},{"line_number":125,"context_line":"payload. Sending block device information is disabled by default as providing"},{"line_number":126,"context_line":"that information can incur some overhead on the system since the information"},{"line_number":127,"context_line":"may need to be loaded from the database."},{"line_number":128,"context_line":"\"\"\")"},{"line_number":129,"context_line":"]"},{"line_number":130,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"1f1a1f67_6121fd9f","line":127,"range":{"start_line":127,"start_character":0,"end_line":127,"end_character":40},"updated":"2017-07-12 14:40:06.000000000","message":"I just realized that with the way this is written, we will *always* query the database for the BDMs since instance.get_bdms() has to do that query.\n\nI think when we originally talked about this, I thought if we had a BlockDeviceMappingList in scope, like during \u0027instance.create\u0027, that we\u0027d use that list so we didn\u0027t need to read the BDMs from the database. Then the only time we\u0027d pull from the database was if we didn\u0027t have BDMs in scope, like during \u0027pause.start\u0027 for example.\n\nI don\u0027t know how easy it would be at this point to change any of that, and since it\u0027s all internal maybe it\u0027s something we could do in a follow up change to optimize things.\n\nI was thinking something like where the compute manager _build_and_run_instance method calls compute_utils.notify_about_instance_create and we have the BlockDeviceMappingList right there, couldn\u0027t we use that to create the BDM payload and set it on the InstanceCreatePayload?","commit_id":"9e2cbc5de3bc7a2c228ca4d3d3014ffa4f88b4b0"}],"nova/notifications/base.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fb75ce92c6345fdbb8a43a6f47a70c72461b9c92","unresolved":false,"context_lines":[{"line_number":261,"context_line":"    return binary"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"@rpc.if_notifications_enabled"},{"line_number":265,"context_line":"def _send_versioned_instance_update(context, instance, payload, host, service):"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"    state_update \u003d instance_notification.InstanceStateUpdatePayload("}],"source_content_type":"text/x-python","patch_set":12,"id":"dfeb2761_20a7db0d","line":264,"updated":"2017-04-05 11:34:16.000000000","message":"Here we have the decorator already. Good :)","commit_id":"5a42c3e5e9100d28ad2c4fe9e5bc779a57c1c46c"}],"nova/notifications/objects/instance.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0c61f281fbb0c66b73f00f9a10218416c24cd0f3","unresolved":false,"context_lines":[{"line_number":284,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"    SCHEMA \u003d {"},{"line_number":287,"context_line":"        \u0027destination_type\u0027: (\u0027bdm\u0027, \u0027destination_type\u0027),"},{"line_number":288,"context_line":"        \u0027boot_index\u0027: (\u0027bdm\u0027, \u0027boot_index\u0027),"},{"line_number":289,"context_line":"        \u0027delete_on_termination\u0027: (\u0027bdm\u0027, \u0027delete_on_termination\u0027),"},{"line_number":290,"context_line":"        \u0027volume_id\u0027: (\u0027bdm\u0027, \u0027volume_id\u0027) ,"}],"source_content_type":"text/x-python","patch_set":5,"id":"ffe62b97_76505cd5","line":287,"range":{"start_line":287,"start_character":9,"end_line":287,"end_character":25},"updated":"2017-03-27 09:50:22.000000000","message":"I think we agreed at some point that is is OK to simply call this \u0027type\u0027","commit_id":"9b76ffddf6cebbad2c0f6347645a9913d799da7b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0c61f281fbb0c66b73f00f9a10218416c24cd0f3","unresolved":false,"context_lines":[{"line_number":292,"context_line":"    }"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":"    fields \u003d {"},{"line_number":295,"context_line":"        \u0027destination_type\u0027: fields.BlockDeviceDestinationTypeField(nullable\u003dTrue),"},{"line_number":296,"context_line":"        \u0027boot_index\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":297,"context_line":"        \u0027delete_on_termination\u0027: fields.BooleanField(default\u003dFalse),"},{"line_number":298,"context_line":"        \u0027volume_id\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":5,"id":"ffe62b97_d6f968c8","line":295,"range":{"start_line":295,"start_character":67,"end_line":295,"end_character":80},"updated":"2017-03-27 09:50:22.000000000","message":"Is there any case when this data is not available for a device?","commit_id":"9b76ffddf6cebbad2c0f6347645a9913d799da7b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0c61f281fbb0c66b73f00f9a10218416c24cd0f3","unresolved":false,"context_lines":[{"line_number":292,"context_line":"    }"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":"    fields \u003d {"},{"line_number":295,"context_line":"        \u0027destination_type\u0027: fields.BlockDeviceDestinationTypeField(nullable\u003dTrue),"},{"line_number":296,"context_line":"        \u0027boot_index\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":297,"context_line":"        \u0027delete_on_termination\u0027: fields.BooleanField(default\u003dFalse),"},{"line_number":298,"context_line":"        \u0027volume_id\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":5,"id":"ffe62b97_76697c89","line":295,"range":{"start_line":295,"start_character":9,"end_line":295,"end_character":25},"updated":"2017-03-27 09:50:22.000000000","message":"ditto","commit_id":"9b76ffddf6cebbad2c0f6347645a9913d799da7b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0c61f281fbb0c66b73f00f9a10218416c24cd0f3","unresolved":false,"context_lines":[{"line_number":293,"context_line":""},{"line_number":294,"context_line":"    fields \u003d {"},{"line_number":295,"context_line":"        \u0027destination_type\u0027: fields.BlockDeviceDestinationTypeField(nullable\u003dTrue),"},{"line_number":296,"context_line":"        \u0027boot_index\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":297,"context_line":"        \u0027delete_on_termination\u0027: fields.BooleanField(default\u003dFalse),"},{"line_number":298,"context_line":"        \u0027volume_id\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":299,"context_line":"        \u0027tag\u0027: fields.StringField(nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ffe62b97_562f983e","line":296,"range":{"start_line":296,"start_character":42,"end_line":296,"end_character":55},"updated":"2017-03-27 09:50:22.000000000","message":"same question as for destination_type","commit_id":"9b76ffddf6cebbad2c0f6347645a9913d799da7b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0c61f281fbb0c66b73f00f9a10218416c24cd0f3","unresolved":false,"context_lines":[{"line_number":311,"context_line":"        bdms \u003d []"},{"line_number":312,"context_line":"        if instance_bdms is not None:"},{"line_number":313,"context_line":"            for bdm in instance_bdms:"},{"line_number":314,"context_line":"                if bdm.volume_id is not None:"},{"line_number":315,"context_line":"                    bdms.append(cls(bdm))"},{"line_number":316,"context_line":"        return bdms"},{"line_number":317,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ffe62b97_76c5fc5a","line":314,"updated":"2017-03-27 09:50:22.000000000","message":"if we already filtering on bdm\u0027s with not None volume_id then I guess we can make the volume_id field of the payload non nullable as well.","commit_id":"9b76ffddf6cebbad2c0f6347645a9913d799da7b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"db5b61dba48d47a02236c36b99710730f0026fa0","unresolved":false,"context_lines":[{"line_number":127,"context_line":"    }"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    def __init__(self, instance, fault, ip_addresses, block_devices,"},{"line_number":130,"context_line":"                  flavor, **kwargs):"},{"line_number":131,"context_line":"        super(InstanceActionPayload, self).__init__("},{"line_number":132,"context_line":"                instance\u003dinstance,"},{"line_number":133,"context_line":"                fault\u003dfault,"}],"source_content_type":"text/x-python","patch_set":9,"id":"ffe62b97_da3dd7dd","line":130,"range":{"start_line":130,"start_character":17,"end_line":130,"end_character":18},"updated":"2017-03-28 09:20:36.000000000","message":"nit: indentation","commit_id":"10c359a6ec95f29189260612bb06e425a570aead"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"db5b61dba48d47a02236c36b99710730f0026fa0","unresolved":false,"context_lines":[{"line_number":181,"context_line":"    }"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    def __init__(self, instance, flavor, ip_addresses, block_devices,"},{"line_number":184,"context_line":"        state_update, audit_period, bandwidth, old_display_name):"},{"line_number":185,"context_line":"        super(InstanceUpdatePayload, self).__init__("},{"line_number":186,"context_line":"                instance\u003dinstance,"},{"line_number":187,"context_line":"                flavor\u003dflavor,"}],"source_content_type":"text/x-python","patch_set":9,"id":"ffe62b97_5a29c798","line":184,"range":{"start_line":184,"start_character":0,"end_line":184,"end_character":8},"updated":"2017-03-28 09:20:36.000000000","message":"nit: indentation","commit_id":"10c359a6ec95f29189260612bb06e425a570aead"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"db5b61dba48d47a02236c36b99710730f0026fa0","unresolved":false,"context_lines":[{"line_number":297,"context_line":"        \u0027delete_on_termination\u0027: fields.BooleanField(default\u003dFalse),"},{"line_number":298,"context_line":"        \u0027volume_id\u0027: fields.StringField(),"},{"line_number":299,"context_line":"        \u0027tag\u0027: fields.StringField(nullable\u003dTrue)"},{"line_number":300,"context_line":"    }"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"    def __init__(self, bdm, **kwargs):"},{"line_number":303,"context_line":"        super(BlockDevicePayload, self).__init__(**kwargs)"}],"source_content_type":"text/x-python","patch_set":9,"id":"ffe62b97_356294af","line":300,"updated":"2017-03-28 09:20:36.000000000","message":"Is there cases when boot_index or type can be None/null?","commit_id":"10c359a6ec95f29189260612bb06e425a570aead"},{"author":{"_account_id":18337,"name":"Sujitha","email":"sujitha.neti@intel.com","username":"Sujitha"},"change_message_id":"cfc3280f99ab3c9044ed77b5a6e15b6849bd5e71","unresolved":false,"context_lines":[{"line_number":297,"context_line":"        \u0027delete_on_termination\u0027: fields.BooleanField(default\u003dFalse),"},{"line_number":298,"context_line":"        \u0027volume_id\u0027: fields.StringField(),"},{"line_number":299,"context_line":"        \u0027tag\u0027: fields.StringField(nullable\u003dTrue)"},{"line_number":300,"context_line":"    }"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"    def __init__(self, bdm, **kwargs):"},{"line_number":303,"context_line":"        super(BlockDevicePayload, self).__init__(**kwargs)"}],"source_content_type":"text/x-python","patch_set":9,"id":"dfeb2761_e0b7573a","line":300,"in_reply_to":"ffe62b97_356294af","updated":"2017-03-30 22:23:46.000000000","message":"boot_index can be None for non-bootable devices.  destination_type only can be only local or volume. But I followed the schema for BlockDeviceMapping object here.\n\nhttps://github.com/openstack/nova/blob/master/nova/objects/block_device.py#L68","commit_id":"10c359a6ec95f29189260612bb06e425a570aead"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"db5b61dba48d47a02236c36b99710730f0026fa0","unresolved":false,"context_lines":[{"line_number":299,"context_line":"        \u0027tag\u0027: fields.StringField(nullable\u003dTrue)"},{"line_number":300,"context_line":"    }"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"    def __init__(self, bdm, **kwargs):"},{"line_number":303,"context_line":"        super(BlockDevicePayload, self).__init__(**kwargs)"},{"line_number":304,"context_line":"        self.populate_schema(bdm\u003dbdm)"},{"line_number":305,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"ffe62b97_b56ea42c","line":302,"range":{"start_line":302,"start_character":30,"end_line":302,"end_character":36},"updated":"2017-03-28 09:20:36.000000000","message":"I think this param is not used and therefore unnecessary","commit_id":"10c359a6ec95f29189260612bb06e425a570aead"},{"author":{"_account_id":18337,"name":"Sujitha","email":"sujitha.neti@intel.com","username":"Sujitha"},"change_message_id":"cfc3280f99ab3c9044ed77b5a6e15b6849bd5e71","unresolved":false,"context_lines":[{"line_number":299,"context_line":"        \u0027tag\u0027: fields.StringField(nullable\u003dTrue)"},{"line_number":300,"context_line":"    }"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"    def __init__(self, bdm, **kwargs):"},{"line_number":303,"context_line":"        super(BlockDevicePayload, self).__init__(**kwargs)"},{"line_number":304,"context_line":"        self.populate_schema(bdm\u003dbdm)"},{"line_number":305,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"dfeb2761_c0b45338","line":302,"range":{"start_line":302,"start_character":30,"end_line":302,"end_character":36},"in_reply_to":"ffe62b97_b56ea42c","updated":"2017-03-30 22:23:46.000000000","message":"Done","commit_id":"10c359a6ec95f29189260612bb06e425a570aead"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"db5b61dba48d47a02236c36b99710730f0026fa0","unresolved":false,"context_lines":[{"line_number":304,"context_line":"        self.populate_schema(bdm\u003dbdm)"},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"    @classmethod"},{"line_number":307,"context_line":"    def from_instance(cls, instance_bdms):"},{"line_number":308,"context_line":"        \"\"\"Returns a list of BlockDevicePayload object based on the passed"},{"line_number":309,"context_line":"        bdms."},{"line_number":310,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"ffe62b97_75a93c22","line":307,"updated":"2017-03-28 09:20:36.000000000","message":"The naming of the function suggest that this classmethod would take an instance and return a single BlockDevicePayload. However it takes a list of BlockDeviceMapping objects and returns list of BlockDevicPayload objects. \n\nAs I suggested in another comment some of the duplications can be removed if we move the _get_bdms calls into this function. However now feel that it would be even better if we __init__ of the InstancePayload.\nYou can check my refactoring effort here https://review.openstack.org/#/c/418488/5/nova/notifications/objects/instance.py to see an example about my thinking.","commit_id":"10c359a6ec95f29189260612bb06e425a570aead"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"d6f3ab8463d670a34aedc061a5294a663ec57516","unresolved":false,"context_lines":[{"line_number":304,"context_line":"        self.populate_schema(bdm\u003dbdm)"},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"    @classmethod"},{"line_number":307,"context_line":"    def from_instance(cls, instance_bdms):"},{"line_number":308,"context_line":"        \"\"\"Returns a list of BlockDevicePayload object based on the passed"},{"line_number":309,"context_line":"        bdms."},{"line_number":310,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"dfeb2761_25739f4f","line":307,"in_reply_to":"dfeb2761_20c53f8f","updated":"2017-04-04 11:49:07.000000000","message":"I don\u0027t see how this uses the context method you mentioned. However I can live with the solution in PS11 so no worries.","commit_id":"10c359a6ec95f29189260612bb06e425a570aead"},{"author":{"_account_id":18337,"name":"Sujitha","email":"sujitha.neti@intel.com","username":"Sujitha"},"change_message_id":"d636904d5c5b21f6a9aebc2f18d85a7cc9715f84","unresolved":false,"context_lines":[{"line_number":304,"context_line":"        self.populate_schema(bdm\u003dbdm)"},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"    @classmethod"},{"line_number":307,"context_line":"    def from_instance(cls, instance_bdms):"},{"line_number":308,"context_line":"        \"\"\"Returns a list of BlockDevicePayload object based on the passed"},{"line_number":309,"context_line":"        bdms."},{"line_number":310,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"dfeb2761_e9a220fc","line":307,"in_reply_to":"dfeb2761_25739f4f","updated":"2017-04-04 18:11:13.000000000","message":"get_bdms_for_instance needs context object. So if it is used in __init__, context should be passed to InstancePayload. To avoid that, this approach sends context object to from_instance.","commit_id":"10c359a6ec95f29189260612bb06e425a570aead"},{"author":{"_account_id":18337,"name":"Sujitha","email":"sujitha.neti@intel.com","username":"Sujitha"},"change_message_id":"cfc3280f99ab3c9044ed77b5a6e15b6849bd5e71","unresolved":false,"context_lines":[{"line_number":304,"context_line":"        self.populate_schema(bdm\u003dbdm)"},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"    @classmethod"},{"line_number":307,"context_line":"    def from_instance(cls, instance_bdms):"},{"line_number":308,"context_line":"        \"\"\"Returns a list of BlockDevicePayload object based on the passed"},{"line_number":309,"context_line":"        bdms."},{"line_number":310,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"dfeb2761_20c53f8f","line":307,"in_reply_to":"ffe62b97_75a93c22","updated":"2017-03-30 22:23:46.000000000","message":"This can\u0027t be moved to __init__ method as we need context object from calling method. Alternative is to pass context object to InstancePayload which I don\u0027t think is the right way.","commit_id":"10c359a6ec95f29189260612bb06e425a570aead"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"efcd26b3cea2f1625b92c27096f76f430428035c","unresolved":false,"context_lines":[{"line_number":286,"context_line":"        \u0027type\u0027: fields.BlockDeviceDestinationTypeField(nullable\u003dTrue),"},{"line_number":287,"context_line":"        \u0027boot_index\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":288,"context_line":"        \u0027delete_on_termination\u0027: fields.BooleanField(default\u003dFalse),"},{"line_number":289,"context_line":"        \u0027volume_id\u0027: fields.StringField(),"},{"line_number":290,"context_line":"        \u0027tag\u0027: fields.StringField(nullable\u003dTrue)"},{"line_number":291,"context_line":"    }"},{"line_number":292,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"dfeb2761_34cb4154","line":289,"range":{"start_line":289,"start_character":28,"end_line":289,"end_character":39},"updated":"2017-03-31 01:22:50.000000000","message":"It should be \u0027UUIDField\u0027.","commit_id":"485d68d127d2602f4ba22fa172ca09de7785dec9"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"6fba458892d63f48fa5f672d304c07c5c981a4f2","unresolved":false,"context_lines":[{"line_number":286,"context_line":"        \u0027type\u0027: fields.BlockDeviceDestinationTypeField(nullable\u003dTrue),"},{"line_number":287,"context_line":"        \u0027boot_index\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":288,"context_line":"        \u0027delete_on_termination\u0027: fields.BooleanField(default\u003dFalse),"},{"line_number":289,"context_line":"        \u0027volume_id\u0027: fields.StringField(),"},{"line_number":290,"context_line":"        \u0027tag\u0027: fields.StringField(nullable\u003dTrue)"},{"line_number":291,"context_line":"    }"},{"line_number":292,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"dfeb2761_459223a0","line":289,"range":{"start_line":289,"start_character":28,"end_line":289,"end_character":39},"in_reply_to":"dfeb2761_34cb4154","updated":"2017-04-04 11:49:45.000000000","message":"+1","commit_id":"485d68d127d2602f4ba22fa172ca09de7785dec9"},{"author":{"_account_id":18337,"name":"Sujitha","email":"sujitha.neti@intel.com","username":"Sujitha"},"change_message_id":"3bc81ba36efa9cc2848afaf387c1ffea1fbcd726","unresolved":false,"context_lines":[{"line_number":286,"context_line":"        \u0027type\u0027: fields.BlockDeviceDestinationTypeField(nullable\u003dTrue),"},{"line_number":287,"context_line":"        \u0027boot_index\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":288,"context_line":"        \u0027delete_on_termination\u0027: fields.BooleanField(default\u003dFalse),"},{"line_number":289,"context_line":"        \u0027volume_id\u0027: fields.StringField(),"},{"line_number":290,"context_line":"        \u0027tag\u0027: fields.StringField(nullable\u003dTrue)"},{"line_number":291,"context_line":"    }"},{"line_number":292,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"dfeb2761_3f30399f","line":289,"range":{"start_line":289,"start_character":28,"end_line":289,"end_character":39},"in_reply_to":"dfeb2761_459223a0","updated":"2017-04-04 18:11:25.000000000","message":"right..I will change this.","commit_id":"485d68d127d2602f4ba22fa172ca09de7785dec9"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0b6513f9f7f7fd9a9c2800b6eea7ec0f5006b8b6","unresolved":false,"context_lines":[{"line_number":296,"context_line":""},{"line_number":297,"context_line":"    @classmethod"},{"line_number":298,"context_line":"    def from_instance(cls, context, instance):"},{"line_number":299,"context_line":"        \"\"\"Returns a list of BlockDevicePayload object based on the passed"},{"line_number":300,"context_line":"        bdms."},{"line_number":301,"context_line":"        \"\"\""},{"line_number":302,"context_line":"        instance_bdms \u003d instance.get_bdms_for_instance(context)"}],"source_content_type":"text/x-python","patch_set":12,"id":"dfeb2761_6c8ba21e","line":299,"range":{"start_line":299,"start_character":48,"end_line":299,"end_character":54},"updated":"2017-04-05 11:12:00.000000000","message":"nit:s/object/objects/","commit_id":"5a42c3e5e9100d28ad2c4fe9e5bc779a57c1c46c"},{"author":{"_account_id":18337,"name":"Sujitha","email":"sujitha.neti@intel.com","username":"Sujitha"},"change_message_id":"2bc4f166118dc314fd3d86bac8e0b37c8714893e","unresolved":false,"context_lines":[{"line_number":296,"context_line":""},{"line_number":297,"context_line":"    @classmethod"},{"line_number":298,"context_line":"    def from_instance(cls, context, instance):"},{"line_number":299,"context_line":"        \"\"\"Returns a list of BlockDevicePayload object based on the passed"},{"line_number":300,"context_line":"        bdms."},{"line_number":301,"context_line":"        \"\"\""},{"line_number":302,"context_line":"        instance_bdms \u003d instance.get_bdms_for_instance(context)"}],"source_content_type":"text/x-python","patch_set":12,"id":"bff0334d_121effb9","line":299,"range":{"start_line":299,"start_character":48,"end_line":299,"end_character":54},"in_reply_to":"dfeb2761_6c8ba21e","updated":"2017-04-06 00:19:45.000000000","message":"Done","commit_id":"5a42c3e5e9100d28ad2c4fe9e5bc779a57c1c46c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0b6513f9f7f7fd9a9c2800b6eea7ec0f5006b8b6","unresolved":false,"context_lines":[{"line_number":299,"context_line":"        \"\"\"Returns a list of BlockDevicePayload object based on the passed"},{"line_number":300,"context_line":"        bdms."},{"line_number":301,"context_line":"        \"\"\""},{"line_number":302,"context_line":"        instance_bdms \u003d instance.get_bdms_for_instance(context)"},{"line_number":303,"context_line":"        bdms \u003d []"},{"line_number":304,"context_line":"        if instance_bdms is not None:"},{"line_number":305,"context_line":"            for bdm in instance_bdms:"}],"source_content_type":"text/x-python","patch_set":12,"id":"dfeb2761_2c435a6e","line":302,"updated":"2017-04-05 11:12:00.000000000","message":"So on the IRC meeting[1] we agreed that this DB query will only be done based on a nova.conf flag. \n\nCould you add such a flag to the notifications section of the nova.conf with a simple boolean value? As agreed it would be turned off by default. I think the name proposed by Matt \u0027bdms_in_notifications\u0027 is OK.\n\nIf the bdms_in_notifications is False then the notification payload shall contain \"block_devices\": null to signal that the information is missing.\n\nAlso it would be good to add a reno release notes to the patch that describes the new config option.\n\n\n[1] http://eavesdrop.openstack.org/meetings/nova_notification/2017/nova_notification.2017-04-04-17.00.log.html#l-15","commit_id":"5a42c3e5e9100d28ad2c4fe9e5bc779a57c1c46c"},{"author":{"_account_id":18337,"name":"Sujitha","email":"sujitha.neti@intel.com","username":"Sujitha"},"change_message_id":"2bc4f166118dc314fd3d86bac8e0b37c8714893e","unresolved":false,"context_lines":[{"line_number":299,"context_line":"        \"\"\"Returns a list of BlockDevicePayload object based on the passed"},{"line_number":300,"context_line":"        bdms."},{"line_number":301,"context_line":"        \"\"\""},{"line_number":302,"context_line":"        instance_bdms \u003d instance.get_bdms_for_instance(context)"},{"line_number":303,"context_line":"        bdms \u003d []"},{"line_number":304,"context_line":"        if instance_bdms is not None:"},{"line_number":305,"context_line":"            for bdm in instance_bdms:"}],"source_content_type":"text/x-python","patch_set":12,"id":"bff0334d_12739f17","line":302,"in_reply_to":"dfeb2761_2c435a6e","updated":"2017-04-06 00:19:45.000000000","message":"We can\u0027t return null as block_devices is a list of objects fields. So will return an empty list.","commit_id":"5a42c3e5e9100d28ad2c4fe9e5bc779a57c1c46c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"220114cebbebfda135fb2fc5e483377a6b495b2b","unresolved":false,"context_lines":[{"line_number":304,"context_line":"        bdms."},{"line_number":305,"context_line":"        \"\"\""},{"line_number":306,"context_line":"        if not CONF.notifications.bdms_in_notifications:"},{"line_number":307,"context_line":"            return []"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"        instance_bdms \u003d instance.get_bdms_for_instance(context)"},{"line_number":310,"context_line":"        bdms \u003d []"}],"source_content_type":"text/x-python","patch_set":13,"id":"bff0334d_4b1e0dbb","line":307,"updated":"2017-04-06 08:20:24.000000000","message":"The problem with empty list is that it means different thing. There is a case when an instance has no BDM and there is a case when the instance has BDMs but the bdms_in_notifications it False the consumer should be able to differentiate between these two.\nI think you can set the block_devices field in L98 to nullable\u003dTrue and then you can return None here","commit_id":"a2e18931c14459d5fd1c821adaba4da51628e353"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"b2fc6be3c0dad820bf7bdf7e9d7b0e96d38639a6","unresolved":false,"context_lines":[{"line_number":335,"context_line":"        \"\"\"Returns a list of BlockDevicePayload objects based on the passed"},{"line_number":336,"context_line":"        bdms."},{"line_number":337,"context_line":"        \"\"\""},{"line_number":338,"context_line":"        if not CONF.notifications.bdms_in_notifications:"},{"line_number":339,"context_line":"            return None"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"        instance_bdms \u003d instance.get_bdms_for_instance()"},{"line_number":342,"context_line":"        bdms \u003d []"}],"source_content_type":"text/x-python","patch_set":30,"id":"5f201791_6b04f84a","line":339,"range":{"start_line":338,"start_character":0,"end_line":339,"end_character":23},"updated":"2017-06-22 15:58:36.000000000","message":"Hmm, so I thought notifications were considered part of the API and we can\u0027t disable parts of the API because that breaks compatibility between different providers. Why is this different?","commit_id":"b27dfbf20567b48b1c226ec88d1a9241e0daff83"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"81be058c24a86251c88fe33a82b1c4b1fbc4d82b","unresolved":false,"context_lines":[{"line_number":335,"context_line":"        \"\"\"Returns a list of BlockDevicePayload objects based on the passed"},{"line_number":336,"context_line":"        bdms."},{"line_number":337,"context_line":"        \"\"\""},{"line_number":338,"context_line":"        if not CONF.notifications.bdms_in_notifications:"},{"line_number":339,"context_line":"            return None"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"        instance_bdms \u003d instance.get_bdms_for_instance()"},{"line_number":342,"context_line":"        bdms \u003d []"}],"source_content_type":"text/x-python","patch_set":30,"id":"3f1d235d_6cd571b9","line":339,"range":{"start_line":338,"start_character":0,"end_line":339,"end_character":23},"in_reply_to":"3f1d235d_af4ca276","updated":"2017-06-29 14:32:21.000000000","message":"Notifications are strictly internal to the deployment, and other internal services consume them, like telemetry, mistral, searchlight, etc. They aren\u0027t exposed to the end user of the cloud since they are emitted on an internal RPC bus. The alternative would be defining the list of notifications that we need to pass BDMs but that list gets pretty hard to define, so let\u0027s just stick with config for now.","commit_id":"b27dfbf20567b48b1c226ec88d1a9241e0daff83"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"90db065efcec93a06ed8bda43331fa87cc089593","unresolved":false,"context_lines":[{"line_number":335,"context_line":"        \"\"\"Returns a list of BlockDevicePayload objects based on the passed"},{"line_number":336,"context_line":"        bdms."},{"line_number":337,"context_line":"        \"\"\""},{"line_number":338,"context_line":"        if not CONF.notifications.bdms_in_notifications:"},{"line_number":339,"context_line":"            return None"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"        instance_bdms \u003d instance.get_bdms_for_instance()"},{"line_number":342,"context_line":"        bdms \u003d []"}],"source_content_type":"text/x-python","patch_set":30,"id":"3f1d235d_2cd779c2","line":339,"range":{"start_line":338,"start_character":0,"end_line":339,"end_character":23},"in_reply_to":"3f1d235d_af4ca276","updated":"2017-06-29 14:32:28.000000000","message":"We discussed it on the weekly nova meeting [1] and agreed that the config option is the way forward.\n\n[1] http://eavesdrop.openstack.org/meetings/nova/2017/nova.2017-06-29-14.00.log.html#l-152","commit_id":"b27dfbf20567b48b1c226ec88d1a9241e0daff83"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"d5f0120c9d83896de8e3411478278c6a6ac72645","unresolved":false,"context_lines":[{"line_number":335,"context_line":"        \"\"\"Returns a list of BlockDevicePayload objects based on the passed"},{"line_number":336,"context_line":"        bdms."},{"line_number":337,"context_line":"        \"\"\""},{"line_number":338,"context_line":"        if not CONF.notifications.bdms_in_notifications:"},{"line_number":339,"context_line":"            return None"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"        instance_bdms \u003d instance.get_bdms_for_instance()"},{"line_number":342,"context_line":"        bdms \u003d []"}],"source_content_type":"text/x-python","patch_set":30,"id":"3f1d235d_af4ca276","line":339,"range":{"start_line":338,"start_character":0,"end_line":339,"end_character":23},"in_reply_to":"5f201791_6b04f84a","updated":"2017-06-29 11:06:04.000000000","message":"The original discussion happened in the bp https://blueprints.launchpad.net/nova/+spec/additional-notification-fields-for-searchlight . Matt suggested to make loading and sending the BDM in the notification configurable as it needs an extra db query. \n\nThe structure of the API is not changed by the configuration change. So the client can still parse the result in both cases. What changes that the block_devices field in the notification will have null value instead of containing a list of BlockDevicePayloads.","commit_id":"b27dfbf20567b48b1c226ec88d1a9241e0daff83"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fc6138b129a582f7b2744df8b64e62a8ddd237e3","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        \u0027ip_addresses\u0027: fields.ListOfObjectsField(\u0027IpPayload\u0027),"},{"line_number":100,"context_line":"        \u0027block_devices\u0027: fields.ListOfObjectsField(\u0027BlockDevicePayload\u0027,"},{"line_number":101,"context_line":"                          nullable\u003dTrue),"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        \u0027metadata\u0027: fields.DictOfStringsField(),"},{"line_number":104,"context_line":"        \u0027locked\u0027: fields.BooleanField(),"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_a5cc9361","line":101,"range":{"start_line":101,"start_character":26,"end_line":101,"end_character":39},"updated":"2017-07-10 18:37:07.000000000","message":"nit: alignment, either 1 tab in or align with \u0027BlockDevicePayload\u0027 above.","commit_id":"95ddc60a026770ba490e27234778aed7b6457667"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"626525c8daf9ca5b3452a7d8cd938a9afbe470f4","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        \u0027ip_addresses\u0027: fields.ListOfObjectsField(\u0027IpPayload\u0027),"},{"line_number":100,"context_line":"        \u0027block_devices\u0027: fields.ListOfObjectsField(\u0027BlockDevicePayload\u0027,"},{"line_number":101,"context_line":"                          nullable\u003dTrue),"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        \u0027metadata\u0027: fields.DictOfStringsField(),"},{"line_number":104,"context_line":"        \u0027locked\u0027: fields.BooleanField(),"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_fd20c94b","line":101,"range":{"start_line":101,"start_character":26,"end_line":101,"end_character":39},"in_reply_to":"3f1d235d_a5cc9361","updated":"2017-07-11 15:04:21.000000000","message":"I blame pycharm. :) Done.","commit_id":"95ddc60a026770ba490e27234778aed7b6457667"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fc6138b129a582f7b2744df8b64e62a8ddd237e3","unresolved":false,"context_lines":[{"line_number":122,"context_line":"    # Version 1.1: locked and display_description added to InstancePayload"},{"line_number":123,"context_line":"    # Version 1.2: Added auto_disk_config field to InstancePayload"},{"line_number":124,"context_line":"    # Version 1.3: Added key_name field to InstancePayload"},{"line_number":125,"context_line":"    # Version 1.3: Add keypairs field"},{"line_number":126,"context_line":"    # Version 1.4: Add BDM related data"},{"line_number":127,"context_line":"    VERSION \u003d \u00271.4\u0027"},{"line_number":128,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_85d99723","line":125,"range":{"start_line":125,"start_character":4,"end_line":125,"end_character":37},"updated":"2017-07-10 18:37:07.000000000","message":"This is a rebase mistake, yes?","commit_id":"95ddc60a026770ba490e27234778aed7b6457667"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"626525c8daf9ca5b3452a7d8cd938a9afbe470f4","unresolved":false,"context_lines":[{"line_number":122,"context_line":"    # Version 1.1: locked and display_description added to InstancePayload"},{"line_number":123,"context_line":"    # Version 1.2: Added auto_disk_config field to InstancePayload"},{"line_number":124,"context_line":"    # Version 1.3: Added key_name field to InstancePayload"},{"line_number":125,"context_line":"    # Version 1.3: Add keypairs field"},{"line_number":126,"context_line":"    # Version 1.4: Add BDM related data"},{"line_number":127,"context_line":"    VERSION \u003d \u00271.4\u0027"},{"line_number":128,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_bdeff1e7","line":125,"range":{"start_line":125,"start_character":4,"end_line":125,"end_character":37},"in_reply_to":"3f1d235d_85d99723","updated":"2017-07-11 15:04:21.000000000","message":"Yes. At some point we changed the plans with keypairs and only added key_name to the generic InstanceActionPayload.","commit_id":"95ddc60a026770ba490e27234778aed7b6457667"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fc6138b129a582f7b2744df8b64e62a8ddd237e3","unresolved":false,"context_lines":[{"line_number":166,"context_line":"        \u0027new_volume_id\u0027: fields.UUIDField(),"},{"line_number":167,"context_line":"    }"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    def __init__(self, instance, fault,"},{"line_number":170,"context_line":"                 old_volume_id, new_volume_id):"},{"line_number":171,"context_line":"        super(InstanceActionVolumeSwapPayload, self).__init__("},{"line_number":172,"context_line":"                instance\u003dinstance,"},{"line_number":173,"context_line":"                fault\u003dfault)"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_65d67bf4","line":170,"range":{"start_line":169,"start_character":4,"end_line":170,"end_character":47},"updated":"2017-07-10 18:37:07.000000000","message":"Unrelated change.","commit_id":"95ddc60a026770ba490e27234778aed7b6457667"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"626525c8daf9ca5b3452a7d8cd938a9afbe470f4","unresolved":false,"context_lines":[{"line_number":166,"context_line":"        \u0027new_volume_id\u0027: fields.UUIDField(),"},{"line_number":167,"context_line":"    }"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    def __init__(self, instance, fault,"},{"line_number":170,"context_line":"                 old_volume_id, new_volume_id):"},{"line_number":171,"context_line":"        super(InstanceActionVolumeSwapPayload, self).__init__("},{"line_number":172,"context_line":"                instance\u003dinstance,"},{"line_number":173,"context_line":"                fault\u003dfault)"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_5dbe9dd4","line":170,"range":{"start_line":169,"start_character":4,"end_line":170,"end_character":47},"in_reply_to":"3f1d235d_65d67bf4","updated":"2017-07-11 15:04:21.000000000","message":"Done","commit_id":"95ddc60a026770ba490e27234778aed7b6457667"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fc6138b129a582f7b2744df8b64e62a8ddd237e3","unresolved":false,"context_lines":[{"line_number":318,"context_line":"        \u0027tag\u0027: (\u0027bdm\u0027, \u0027tag\u0027)"},{"line_number":319,"context_line":"    }"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"    fields \u003d {"},{"line_number":322,"context_line":"        \u0027type\u0027: fields.BlockDeviceDestinationTypeField(nullable\u003dTrue),"},{"line_number":323,"context_line":"        \u0027boot_index\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":324,"context_line":"        \u0027delete_on_termination\u0027: fields.BooleanField(default\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_c03f7db3","line":321,"updated":"2017-07-10 18:37:07.000000000","message":"How about the device_name? That shows up in the API when listing volume attachments for a server:\n\nhttps://developer.openstack.org/api-ref/compute/?expanded\u003dshow-server-details-detail,show-a-detail-of-a-volume-attachment-detail,list-volume-attachments-for-an-instance-detail#list-volume-attachments-for-an-instance\n\nAnd showing details for a specific volume attachment:\n\nhttps://developer.openstack.org/api-ref/compute/?expanded\u003dshow-server-details-detail,show-a-detail-of-a-volume-attachment-detail,list-volume-attachments-for-an-instance-detail#show-a-detail-of-a-volume-attachment\n\nAren\u0027t we trying to model the REST API behavior with the versioned notifications?\n\nGranted, I\u0027d like to remove the device name from the REST API:\n\nhttps://review.openstack.org/#/c/452546/\n\nBut that\u0027s not likely to happen anytime soon.","commit_id":"95ddc60a026770ba490e27234778aed7b6457667"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"626525c8daf9ca5b3452a7d8cd938a9afbe470f4","unresolved":false,"context_lines":[{"line_number":318,"context_line":"        \u0027tag\u0027: (\u0027bdm\u0027, \u0027tag\u0027)"},{"line_number":319,"context_line":"    }"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"    fields \u003d {"},{"line_number":322,"context_line":"        \u0027type\u0027: fields.BlockDeviceDestinationTypeField(nullable\u003dTrue),"},{"line_number":323,"context_line":"        \u0027boot_index\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":324,"context_line":"        \u0027delete_on_termination\u0027: fields.BooleanField(default\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_fd68c9ba","line":321,"in_reply_to":"3f1d235d_c03f7db3","updated":"2017-07-11 15:04:21.000000000","message":"Yeah the intention was to not add it as we want to remove it from the REST API as well. I was not aware of the fact that we cannot really remove it from the REST API. I added device_name to the payload","commit_id":"95ddc60a026770ba490e27234778aed7b6457667"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fc6138b129a582f7b2744df8b64e62a8ddd237e3","unresolved":false,"context_lines":[{"line_number":319,"context_line":"    }"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"    fields \u003d {"},{"line_number":322,"context_line":"        \u0027type\u0027: fields.BlockDeviceDestinationTypeField(nullable\u003dTrue),"},{"line_number":323,"context_line":"        \u0027boot_index\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":324,"context_line":"        \u0027delete_on_termination\u0027: fields.BooleanField(default\u003dFalse),"},{"line_number":325,"context_line":"        \u0027volume_id\u0027: fields.UUIDField(),"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_452a5fe7","line":322,"updated":"2017-07-10 18:37:07.000000000","message":"So this can be \u0027volume\u0027 or \u0027local\u0027. If it\u0027s \u0027local\u0027 then there won\u0027t be a volume_id, so that field would have to be nullable\u003dTrue.\n\nHowever, we shouldn\u0027t even put \u0027local\u0027 BDMs in the notification if we\u0027re trying to mimic the REST API, since that filters on BDMs with a volume_id:\n\nhttps://github.com/openstack/nova/blob/dcea3ff68793a28cd546805ebcb2c0ae6c9b684d/nova/api/openstack/compute/volumes.py#L278\n\nSo I say we filter on bdm.volume_id (or BlockDeviceMapping.is_volume), and remove the \u0027type\u0027 field since it\u0027s just confusing.","commit_id":"95ddc60a026770ba490e27234778aed7b6457667"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"626525c8daf9ca5b3452a7d8cd938a9afbe470f4","unresolved":false,"context_lines":[{"line_number":319,"context_line":"    }"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"    fields \u003d {"},{"line_number":322,"context_line":"        \u0027type\u0027: fields.BlockDeviceDestinationTypeField(nullable\u003dTrue),"},{"line_number":323,"context_line":"        \u0027boot_index\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":324,"context_line":"        \u0027delete_on_termination\u0027: fields.BooleanField(default\u003dFalse),"},{"line_number":325,"context_line":"        \u0027volume_id\u0027: fields.UUIDField(),"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_5d869d67","line":322,"in_reply_to":"3f1d235d_452a5fe7","updated":"2017-07-11 15:04:21.000000000","message":"Done","commit_id":"95ddc60a026770ba490e27234778aed7b6457667"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fc6138b129a582f7b2744df8b64e62a8ddd237e3","unresolved":false,"context_lines":[{"line_number":342,"context_line":"        bdms \u003d []"},{"line_number":343,"context_line":"        if instance_bdms is not None:"},{"line_number":344,"context_line":"            for bdm in instance_bdms:"},{"line_number":345,"context_line":"                if bdm.volume_id is not None:"},{"line_number":346,"context_line":"                    bdms.append(cls(bdm))"},{"line_number":347,"context_line":"        return bdms"},{"line_number":348,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_c0689dbb","line":345,"range":{"start_line":345,"start_character":16,"end_line":345,"end_character":45},"updated":"2017-07-10 18:37:07.000000000","message":"Yeah so here is where we ware filtering on the volume_id, so we should just remove the \u0027type\u0027 field since the type is only ever going to be \u0027volume\u0027.","commit_id":"95ddc60a026770ba490e27234778aed7b6457667"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"626525c8daf9ca5b3452a7d8cd938a9afbe470f4","unresolved":false,"context_lines":[{"line_number":342,"context_line":"        bdms \u003d []"},{"line_number":343,"context_line":"        if instance_bdms is not None:"},{"line_number":344,"context_line":"            for bdm in instance_bdms:"},{"line_number":345,"context_line":"                if bdm.volume_id is not None:"},{"line_number":346,"context_line":"                    bdms.append(cls(bdm))"},{"line_number":347,"context_line":"        return bdms"},{"line_number":348,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_7d839957","line":345,"range":{"start_line":345,"start_character":16,"end_line":345,"end_character":45},"in_reply_to":"3f1d235d_c0689dbb","updated":"2017-07-11 15:04:21.000000000","message":"OK, I removed the type.","commit_id":"95ddc60a026770ba490e27234778aed7b6457667"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4b222ede2143bd18444fdcf4f8456109fc0aa79c","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        network_info \u003d instance.get_network_info()"},{"line_number":111,"context_line":"        self.ip_addresses \u003d IpPayload.from_network_info(network_info)"},{"line_number":112,"context_line":"        self.flavor \u003d flavor_payload.FlavorPayload(flavor\u003dinstance.flavor)"},{"line_number":113,"context_line":"        self.block_devices \u003d BlockDevicePayload.from_instance(instance)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        self.populate_schema(instance\u003dinstance)"},{"line_number":116,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"1f1a1f67_01d92982","line":113,"range":{"start_line":113,"start_character":8,"end_line":113,"end_character":71},"updated":"2017-07-12 14:40:06.000000000","message":"Going back to what I said in the config options module, but if we could pass existing in-scope BlockDeviceMappingList into the creation of the InstancePayload, then we wouldn\u0027t need to load it up from the database everytime for every notification. The config option helps since it\u0027s disabled by default, and we could probably do that optimization in a later change, or in Queens, but it\u0027d be good to think about the implications of that to see if there is anything blocking us from doing that later.","commit_id":"9e2cbc5de3bc7a2c228ca4d3d3014ffa4f88b4b0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e81052e9509c149649b03a3f779a8b54667f39f3","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        network_info \u003d instance.get_network_info()"},{"line_number":111,"context_line":"        self.ip_addresses \u003d IpPayload.from_network_info(network_info)"},{"line_number":112,"context_line":"        self.flavor \u003d flavor_payload.FlavorPayload(flavor\u003dinstance.flavor)"},{"line_number":113,"context_line":"        self.block_devices \u003d BlockDevicePayload.from_instance(instance)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        self.populate_schema(instance\u003dinstance)"},{"line_number":116,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"1f1a1f67_417161e0","line":113,"range":{"start_line":113,"start_character":8,"end_line":113,"end_character":71},"in_reply_to":"1f1a1f67_01d92982","updated":"2017-07-12 15:04:20.000000000","message":"As we discussed in IRC. This can be done and I will work on it in a separate patch. Added a TODO not to forget","commit_id":"9e2cbc5de3bc7a2c228ca4d3d3014ffa4f88b4b0"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"dea259f94f29990b141acaa6ae3d80c629361980","unresolved":false,"context_lines":[{"line_number":345,"context_line":"            for bdm in instance_bdms:"},{"line_number":346,"context_line":"                if bdm.volume_id is not None:"},{"line_number":347,"context_line":"                    bdms.append(cls(bdm))"},{"line_number":348,"context_line":"        return bdms"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":""},{"line_number":351,"context_line":"@nova_base.NovaObjectRegistry.register_notification"}],"source_content_type":"text/x-python","patch_set":39,"id":"1f1a1f67_c85fd1e3","line":348,"updated":"2017-07-12 16:03:44.000000000","message":"all good.","commit_id":"1928ec5606491de95abba8791b1d7b888690dd3c"}],"nova/objects/instance.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"fc64735429abacc7fa8307630abdb88849e03d3c","unresolved":false,"context_lines":[{"line_number":1162,"context_line":"            return network_model.NetworkInfo.hydrate([])"},{"line_number":1163,"context_line":"        return self.info_cache.network_info"},{"line_number":1164,"context_line":""},{"line_number":1165,"context_line":"    def get_bdms_for_instance(self):"},{"line_number":1166,"context_line":"        return objects.BlockDeviceMappingList.get_by_instance_uuid("},{"line_number":1167,"context_line":"            self._context, self.uuid)"},{"line_number":1168,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"3f1d235d_0aefe184","line":1165,"range":{"start_line":1165,"start_character":8,"end_line":1165,"end_character":29},"updated":"2017-06-30 10:04:33.000000000","message":"nit: \u0027get_bdms\u0027 (or \u0027bdms\u0027 with the property decorator) would probably be a more appropriate name for this, given that it\u0027s a property on the Instance object","commit_id":"1ad7ac72e7efe28f86b95a562641d64a8b251b49"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a099c96ea0efac8883cb91400519eefdb72e10bb","unresolved":false,"context_lines":[{"line_number":1162,"context_line":"            return network_model.NetworkInfo.hydrate([])"},{"line_number":1163,"context_line":"        return self.info_cache.network_info"},{"line_number":1164,"context_line":""},{"line_number":1165,"context_line":"    def get_bdms_for_instance(self):"},{"line_number":1166,"context_line":"        return objects.BlockDeviceMappingList.get_by_instance_uuid("},{"line_number":1167,"context_line":"            self._context, self.uuid)"},{"line_number":1168,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"3f1d235d_f2087692","line":1165,"range":{"start_line":1165,"start_character":8,"end_line":1165,"end_character":29},"in_reply_to":"3f1d235d_0aefe184","updated":"2017-07-06 12:08:51.000000000","message":"Done","commit_id":"1ad7ac72e7efe28f86b95a562641d64a8b251b49"}],"nova/tests/fixtures.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fc6138b129a582f7b2744df8b64e62a8ddd237e3","unresolved":false,"context_lines":[{"line_number":1339,"context_line":"                        volumes.remove(volume_id)"},{"line_number":1340,"context_line":"                        break"},{"line_number":1341,"context_line":""},{"line_number":1342,"context_line":"        self.test.stub_out(\u0027nova.volume.cinder.API.detach\u0027, fake_detach)"},{"line_number":1343,"context_line":""},{"line_number":1344,"context_line":"        self.test.stub_out(\u0027nova.volume.cinder.API.begin_detaching\u0027,"},{"line_number":1345,"context_line":"                           lambda *args, **kwargs: None)"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_00f21507","side":"PARENT","line":1342,"range":{"start_line":1342,"start_character":8,"end_line":1342,"end_character":72},"updated":"2017-07-10 18:37:07.000000000","message":"Why do we need to redo this with a lambda function? Shouldn\u0027t this still work?","commit_id":"bae0deb1378e8d19148b030c0799021835e3f10e"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"626525c8daf9ca5b3452a7d8cd938a9afbe470f4","unresolved":false,"context_lines":[{"line_number":1339,"context_line":"                        volumes.remove(volume_id)"},{"line_number":1340,"context_line":"                        break"},{"line_number":1341,"context_line":""},{"line_number":1342,"context_line":"        self.test.stub_out(\u0027nova.volume.cinder.API.detach\u0027, fake_detach)"},{"line_number":1343,"context_line":""},{"line_number":1344,"context_line":"        self.test.stub_out(\u0027nova.volume.cinder.API.begin_detaching\u0027,"},{"line_number":1345,"context_line":"                           lambda *args, **kwargs: None)"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_75dccd45","side":"PARENT","line":1342,"range":{"start_line":1342,"start_character":8,"end_line":1342,"end_character":72},"in_reply_to":"3f1d235d_00f21507","updated":"2017-07-11 15:04:21.000000000","message":"It should. When I made the fake_detach accessible for the test cases I removed the unnecessary params. But now I added back.","commit_id":"bae0deb1378e8d19148b030c0799021835e3f10e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"63bdad8c0f8b0930a446a2a798acf2ff22663c03","unresolved":false,"context_lines":[{"line_number":1267,"context_line":"                        },"},{"line_number":1268,"context_line":"                        \u0027attach_status\u0027: \u0027attached\u0027"},{"line_number":1269,"context_line":"                    })"},{"line_number":1270,"context_line":"                return volume"},{"line_number":1271,"context_line":""},{"line_number":1272,"context_line":"            # Check to see if the volume is attached."},{"line_number":1273,"context_line":"            for instance_uuid, volumes in self.attachments.items():"}],"source_content_type":"text/x-python","patch_set":38,"id":"1f1a1f67_011ec90b","side":"PARENT","line":1270,"updated":"2017-07-12 14:45:14.000000000","message":"Why remove this? The volume variable would just be overwritten below.","commit_id":"62e904bce55ffe7eedf1bbc53de15e95c799925d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e81052e9509c149649b03a3f779a8b54667f39f3","unresolved":false,"context_lines":[{"line_number":1267,"context_line":"                        },"},{"line_number":1268,"context_line":"                        \u0027attach_status\u0027: \u0027attached\u0027"},{"line_number":1269,"context_line":"                    })"},{"line_number":1270,"context_line":"                return volume"},{"line_number":1271,"context_line":""},{"line_number":1272,"context_line":"            # Check to see if the volume is attached."},{"line_number":1273,"context_line":"            for instance_uuid, volumes in self.attachments.items():"}],"source_content_type":"text/x-python","patch_set":38,"id":"1f1a1f67_e1918df3","side":"PARENT","line":1270,"in_reply_to":"1f1a1f67_011ec90b","updated":"2017-07-12 15:04:20.000000000","message":"this is a bit messy. I have to make sure that the volume has in proper state to avoid the need of the explicit detach call in the test. However setting the state also used to swap error situations. I didn\u0027t want to blow up the swap volume test in this patch. So I added just a small change to set the volume state for the unshelve case. After your comment I was able to limit this change even more to handle the swap error case with a return here but update the state in any other case","commit_id":"62e904bce55ffe7eedf1bbc53de15e95c799925d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"63bdad8c0f8b0930a446a2a798acf2ff22663c03","unresolved":false,"context_lines":[{"line_number":1340,"context_line":"                        break"},{"line_number":1341,"context_line":""},{"line_number":1342,"context_line":"        self.test.stub_out(\u0027nova.volume.cinder.API.detach\u0027, fake_detach)"},{"line_number":1343,"context_line":""},{"line_number":1344,"context_line":"        self.test.stub_out(\u0027nova.volume.cinder.API.begin_detaching\u0027,"},{"line_number":1345,"context_line":"                           lambda *args, **kwargs: None)"},{"line_number":1346,"context_line":"        self.test.stub_out(\u0027nova.volume.cinder.API.check_attach\u0027,"}],"source_content_type":"text/x-python","patch_set":38,"id":"1f1a1f67_81c09952","side":"PARENT","line":1343,"updated":"2017-07-12 14:45:14.000000000","message":"nit: unrelated","commit_id":"62e904bce55ffe7eedf1bbc53de15e95c799925d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e81052e9509c149649b03a3f779a8b54667f39f3","unresolved":false,"context_lines":[{"line_number":1340,"context_line":"                        break"},{"line_number":1341,"context_line":""},{"line_number":1342,"context_line":"        self.test.stub_out(\u0027nova.volume.cinder.API.detach\u0027, fake_detach)"},{"line_number":1343,"context_line":""},{"line_number":1344,"context_line":"        self.test.stub_out(\u0027nova.volume.cinder.API.begin_detaching\u0027,"},{"line_number":1345,"context_line":"                           lambda *args, **kwargs: None)"},{"line_number":1346,"context_line":"        self.test.stub_out(\u0027nova.volume.cinder.API.check_attach\u0027,"}],"source_content_type":"text/x-python","patch_set":38,"id":"1f1a1f67_81c2d9e8","side":"PARENT","line":1343,"in_reply_to":"1f1a1f67_81c09952","updated":"2017-07-12 15:04:20.000000000","message":"Done","commit_id":"62e904bce55ffe7eedf1bbc53de15e95c799925d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"42e73bfa770ca7f78ffe417a3038b67eb73093aa","unresolved":false,"context_lines":[{"line_number":1267,"context_line":"                        },"},{"line_number":1268,"context_line":"                        \u0027attach_status\u0027: \u0027attached\u0027"},{"line_number":1269,"context_line":"                    })"},{"line_number":1270,"context_line":"                    return volume"},{"line_number":1271,"context_line":""},{"line_number":1272,"context_line":"            # Check to see if the volume is attached."},{"line_number":1273,"context_line":"            for instance_uuid, volumes in self.attachments.items():"}],"source_content_type":"text/x-python","patch_set":39,"id":"1f1a1f67_65ba28df","line":1270,"updated":"2017-07-12 15:10:35.000000000","message":"Note to other reviewers, I guess this is intentional, otherwise the volumes in the swap volume tests don\u0027t have the proper status, and the new code below is making sure the attached status is correct based on which attachments we\u0027re tracking.","commit_id":"1928ec5606491de95abba8791b1d7b888690dd3c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ccad8d57562424fd42a73af19fa7079e017e7591","unresolved":false,"context_lines":[{"line_number":1267,"context_line":"                        },"},{"line_number":1268,"context_line":"                        \u0027attach_status\u0027: \u0027attached\u0027"},{"line_number":1269,"context_line":"                    })"},{"line_number":1270,"context_line":"                    return volume"},{"line_number":1271,"context_line":""},{"line_number":1272,"context_line":"            # Check to see if the volume is attached."},{"line_number":1273,"context_line":"            for instance_uuid, volumes in self.attachments.items():"}],"source_content_type":"text/x-python","patch_set":39,"id":"1f1a1f67_a58e002c","line":1270,"in_reply_to":"1f1a1f67_65ba28df","updated":"2017-07-12 15:11:19.000000000","message":"A todo or note in here would be useful if you respin.","commit_id":"1928ec5606491de95abba8791b1d7b888690dd3c"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"dea259f94f29990b141acaa6ae3d80c629361980","unresolved":false,"context_lines":[{"line_number":1267,"context_line":"                        },"},{"line_number":1268,"context_line":"                        \u0027attach_status\u0027: \u0027attached\u0027"},{"line_number":1269,"context_line":"                    })"},{"line_number":1270,"context_line":"                    return volume"},{"line_number":1271,"context_line":""},{"line_number":1272,"context_line":"            # Check to see if the volume is attached."},{"line_number":1273,"context_line":"            for instance_uuid, volumes in self.attachments.items():"}],"source_content_type":"text/x-python","patch_set":39,"id":"1f1a1f67_e8696d8b","line":1270,"in_reply_to":"1f1a1f67_a58e002c","updated":"2017-07-12 16:03:44.000000000","message":"Yup, noted and I agree.","commit_id":"1928ec5606491de95abba8791b1d7b888690dd3c"}],"nova/tests/functional/notification_sample_tests/test_instance.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"db5b61dba48d47a02236c36b99710730f0026fa0","unresolved":false,"context_lines":[{"line_number":160,"context_line":""},{"line_number":161,"context_line":"        server \u003d self._boot_a_server("},{"line_number":162,"context_line":"            extra_params\u003d{\u0027networks\u0027: [{\u0027port\u0027: self.neutron.port_1[\u0027id\u0027]}]})"},{"line_number":163,"context_line":"        self._attach_volume_to_server(server, self.cinder.SWAP_OLD_VOL)"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        instance_updates \u003d self._wait_for_notifications(\u0027instance.update\u0027, 7)"},{"line_number":166,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"ffe62b97_8745b345","line":163,"updated":"2017-03-28 09:20:36.000000000","message":"I would add the volume during the boot instead of after it as it results in a better instance.update test. During boot at some point the block device will be attached to the instance and that would show up in some instance.update notification.\n\nThe extra attach/detach case can be / will be covered anyhow when we transform the instance.volume_attach and instance.volume_detach notifications.","commit_id":"10c359a6ec95f29189260612bb06e425a570aead"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"d6f3ab8463d670a34aedc061a5294a663ec57516","unresolved":false,"context_lines":[{"line_number":160,"context_line":""},{"line_number":161,"context_line":"        server \u003d self._boot_a_server("},{"line_number":162,"context_line":"            extra_params\u003d{\u0027networks\u0027: [{\u0027port\u0027: self.neutron.port_1[\u0027id\u0027]}]})"},{"line_number":163,"context_line":"        self._attach_volume_to_server(server, self.cinder.SWAP_OLD_VOL)"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        instance_updates \u003d self._wait_for_notifications(\u0027instance.update\u0027, 7)"},{"line_number":166,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"dfeb2761_d1bf15ce","line":163,"in_reply_to":"dfeb2761_00e35b07","updated":"2017-04-04 11:49:07.000000000","message":"As far as I understand the nova api allows specifying block devices in the POST /servers request body [1] with the \u0027block_device_mapping_v2\u0027 key.\n\nCan we use that to add this volume to the instance? I don\u0027t see any limitation about the volume need to be being bootable. That would seem to wrong as we still provide an image to boot from. \n\n[1]https://developer.openstack.org/api-ref/compute/?expanded\u003dcreate-server-detail","commit_id":"10c359a6ec95f29189260612bb06e425a570aead"},{"author":{"_account_id":18337,"name":"Sujitha","email":"sujitha.neti@intel.com","username":"Sujitha"},"change_message_id":"d636904d5c5b21f6a9aebc2f18d85a7cc9715f84","unresolved":false,"context_lines":[{"line_number":160,"context_line":""},{"line_number":161,"context_line":"        server \u003d self._boot_a_server("},{"line_number":162,"context_line":"            extra_params\u003d{\u0027networks\u0027: [{\u0027port\u0027: self.neutron.port_1[\u0027id\u0027]}]})"},{"line_number":163,"context_line":"        self._attach_volume_to_server(server, self.cinder.SWAP_OLD_VOL)"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        instance_updates \u003d self._wait_for_notifications(\u0027instance.update\u0027, 7)"},{"line_number":166,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"dfeb2761_69aa9071","line":163,"in_reply_to":"dfeb2761_d1bf15ce","updated":"2017-04-04 18:11:13.000000000","message":"We can attach volume using block_device_mapping_v2 key. But atleast one BDM should be bootable. This is the code where it checks if atleast one boot_index is 0. If not an exception is thrown.\n\nhttps://github.com/openstack/nova/blob/master/nova/compute/api.py#L1377\n\nhttp://lists.openstack.org/pipermail/openstack-dev/2015-March/059332.html\n\nAs per our discussion in notifications meeting, lets go with attaching volume after boot.","commit_id":"10c359a6ec95f29189260612bb06e425a570aead"},{"author":{"_account_id":18337,"name":"Sujitha","email":"sujitha.neti@intel.com","username":"Sujitha"},"change_message_id":"cfc3280f99ab3c9044ed77b5a6e15b6849bd5e71","unresolved":false,"context_lines":[{"line_number":160,"context_line":""},{"line_number":161,"context_line":"        server \u003d self._boot_a_server("},{"line_number":162,"context_line":"            extra_params\u003d{\u0027networks\u0027: [{\u0027port\u0027: self.neutron.port_1[\u0027id\u0027]}]})"},{"line_number":163,"context_line":"        self._attach_volume_to_server(server, self.cinder.SWAP_OLD_VOL)"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        instance_updates \u003d self._wait_for_notifications(\u0027instance.update\u0027, 7)"},{"line_number":166,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"dfeb2761_00e35b07","line":163,"in_reply_to":"ffe62b97_8745b345","updated":"2017-03-30 22:23:46.000000000","message":"Adding a non bootable volume during boot requires adding atleast one bdm with boot_index 0. Should we try to attach a bootable volume instead? Figuring out how to do this.","commit_id":"10c359a6ec95f29189260612bb06e425a570aead"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"db5b61dba48d47a02236c36b99710730f0026fa0","unresolved":false,"context_lines":[{"line_number":630,"context_line":""},{"line_number":631,"context_line":"        server \u003d self._boot_a_server("},{"line_number":632,"context_line":"            extra_params\u003d{\u0027networks\u0027: [{\u0027port\u0027: self.neutron.port_1[\u0027id\u0027]}]})"},{"line_number":633,"context_line":"        self._attach_volume_to_server(server, self.cinder.SWAP_OLD_VOL)"},{"line_number":634,"context_line":""},{"line_number":635,"context_line":"        fake_notifier.reset()"},{"line_number":636,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"ffe62b97_e7991fc4","line":633,"updated":"2017-03-28 09:20:36.000000000","message":"If we want to include some bdm in our samples, which seems a good idea to me, then I suggest add the device during the boot (in the _boot_a_server) so it become generic for every test case.","commit_id":"10c359a6ec95f29189260612bb06e425a570aead"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"6fba458892d63f48fa5f672d304c07c5c981a4f2","unresolved":false,"context_lines":[{"line_number":773,"context_line":"                        \u0027Unexpected number of versioned notifications. \u0027"},{"line_number":774,"context_line":"                        \u0027Expected at least 4, got: %s\u0027 %"},{"line_number":775,"context_line":"                        len(fake_notifier.VERSIONED_NOTIFICATIONS))"},{"line_number":776,"context_line":"        block_devices \u003d [{"},{"line_number":777,"context_line":"                \"nova_object.data\": {"},{"line_number":778,"context_line":"                    \"boot_index\": None,"},{"line_number":779,"context_line":"                    \"delete_on_termination\": False,"},{"line_number":780,"context_line":"                    \"type\": \"volume\","},{"line_number":781,"context_line":"                    \"tag\": None,"},{"line_number":782,"context_line":"                    \"volume_id\": self.cinder.SWAP_ERR_OLD_VOL"},{"line_number":783,"context_line":"                },"},{"line_number":784,"context_line":"                \"nova_object.name\": \"BlockDevicePayload\","},{"line_number":785,"context_line":"                \"nova_object.namespace\": \"nova\","},{"line_number":786,"context_line":"                \"nova_object.version\": \"1.0\""},{"line_number":787,"context_line":"            }]"},{"line_number":788,"context_line":"        self._verify_notification("},{"line_number":789,"context_line":"            \u0027instance-volume_swap-start\u0027,"},{"line_number":790,"context_line":"            replacements\u003d{"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfeb2761_e53137a4","line":787,"range":{"start_line":776,"start_character":0,"end_line":787,"end_character":14},"updated":"2017-04-04 11:49:45.000000000","message":"Can we add this to the sample file directly?","commit_id":"485d68d127d2602f4ba22fa172ca09de7785dec9"},{"author":{"_account_id":18337,"name":"Sujitha","email":"sujitha.neti@intel.com","username":"Sujitha"},"change_message_id":"3bc81ba36efa9cc2848afaf387c1ffea1fbcd726","unresolved":false,"context_lines":[{"line_number":773,"context_line":"                        \u0027Unexpected number of versioned notifications. \u0027"},{"line_number":774,"context_line":"                        \u0027Expected at least 4, got: %s\u0027 %"},{"line_number":775,"context_line":"                        len(fake_notifier.VERSIONED_NOTIFICATIONS))"},{"line_number":776,"context_line":"        block_devices \u003d [{"},{"line_number":777,"context_line":"                \"nova_object.data\": {"},{"line_number":778,"context_line":"                    \"boot_index\": None,"},{"line_number":779,"context_line":"                    \"delete_on_termination\": False,"},{"line_number":780,"context_line":"                    \"type\": \"volume\","},{"line_number":781,"context_line":"                    \"tag\": None,"},{"line_number":782,"context_line":"                    \"volume_id\": self.cinder.SWAP_ERR_OLD_VOL"},{"line_number":783,"context_line":"                },"},{"line_number":784,"context_line":"                \"nova_object.name\": \"BlockDevicePayload\","},{"line_number":785,"context_line":"                \"nova_object.namespace\": \"nova\","},{"line_number":786,"context_line":"                \"nova_object.version\": \"1.0\""},{"line_number":787,"context_line":"            }]"},{"line_number":788,"context_line":"        self._verify_notification("},{"line_number":789,"context_line":"            \u0027instance-volume_swap-start\u0027,"},{"line_number":790,"context_line":"            replacements\u003d{"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfeb2761_df438d12","line":787,"range":{"start_line":776,"start_character":0,"end_line":787,"end_character":14},"in_reply_to":"dfeb2761_e53137a4","updated":"2017-04-04 18:11:25.000000000","message":"Other tests also validate this instance-volume_swap-start notification. Volume attached is different for those tests. So this replaces the block_devices in the sample file.","commit_id":"485d68d127d2602f4ba22fa172ca09de7785dec9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fc6138b129a582f7b2744df8b64e62a8ddd237e3","unresolved":false,"context_lines":[{"line_number":450,"context_line":"        post \u003d {\u0027unshelve\u0027: None}"},{"line_number":451,"context_line":"        self.api.post_server_action(server[\u0027id\u0027], post)"},{"line_number":452,"context_line":""},{"line_number":453,"context_line":"    def _reset_volume_attachment_after_shelve_offload(self, instance_uuid):"},{"line_number":454,"context_line":"        # Note(gibi): a real virt driver would detach the volume during offload"},{"line_number":455,"context_line":"        # but the fake virt driver doesn\u0027t. Also fake virt driver doesn\u0027t know"},{"line_number":456,"context_line":"        # about the cinder fixture used in the test to do so. Therefore to be"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_2064f1b8","line":453,"updated":"2017-07-10 18:37:07.000000000","message":"I\u0027m a little bit confused about this, since the driver doesn\u0027t delete the bdm, the compute manager does after the virt driver does the detach:\n\nhttps://github.com/openstack/nova/blob/dcea3ff68793a28cd546805ebcb2c0ae6c9b684d/nova/compute/manager.py#L4975","commit_id":"95ddc60a026770ba490e27234778aed7b6457667"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"626525c8daf9ca5b3452a7d8cd938a9afbe470f4","unresolved":false,"context_lines":[{"line_number":450,"context_line":"        post \u003d {\u0027unshelve\u0027: None}"},{"line_number":451,"context_line":"        self.api.post_server_action(server[\u0027id\u0027], post)"},{"line_number":452,"context_line":""},{"line_number":453,"context_line":"    def _reset_volume_attachment_after_shelve_offload(self, instance_uuid):"},{"line_number":454,"context_line":"        # Note(gibi): a real virt driver would detach the volume during offload"},{"line_number":455,"context_line":"        # but the fake virt driver doesn\u0027t. Also fake virt driver doesn\u0027t know"},{"line_number":456,"context_line":"        # about the cinder fixture used in the test to do so. Therefore to be"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_447241af","line":453,"in_reply_to":"3f1d235d_2064f1b8","updated":"2017-07-11 15:04:21.000000000","message":"After I\u0027m trying to unshelve a shelve-offloaded instance in the test I got InvalidInput: Invalid input received: Volume a07f71dc-8151-4e7d-a0cc-cd24a3f11113 is already attached to instance 99eb6166-ccd0-47d9-ab30-443cfdde71b9 [1]\n\nFrom this I deduced that shelve offload supposed to detach the volume but it didn\u0027t do that in the functional test env. Then I worked around the problem with this function. I will look into this in more detail.\n\n[1]http://paste.openstack.org/show/615031/","commit_id":"95ddc60a026770ba490e27234778aed7b6457667"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"ab4430824cc98c4d0e65f3f9690219b5048b191e","unresolved":false,"context_lines":[{"line_number":450,"context_line":"        post \u003d {\u0027unshelve\u0027: None}"},{"line_number":451,"context_line":"        self.api.post_server_action(server[\u0027id\u0027], post)"},{"line_number":452,"context_line":""},{"line_number":453,"context_line":"    def _reset_volume_attachment_after_shelve_offload(self, instance_uuid):"},{"line_number":454,"context_line":"        # Note(gibi): a real virt driver would detach the volume during offload"},{"line_number":455,"context_line":"        # but the fake virt driver doesn\u0027t. Also fake virt driver doesn\u0027t know"},{"line_number":456,"context_line":"        # about the cinder fixture used in the test to do so. Therefore to be"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_4692424d","line":453,"in_reply_to":"3f1d235d_447241af","updated":"2017-07-11 16:33:21.000000000","message":"So playing with devstack showed that shelve-offload did not detach the bdm. So the question then why unshelve try to attach it again and fails in the functional env.","commit_id":"95ddc60a026770ba490e27234778aed7b6457667"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"982b69cdf81c6eb618d5a06535f33785a7762c66","unresolved":false,"context_lines":[{"line_number":450,"context_line":"        post \u003d {\u0027unshelve\u0027: None}"},{"line_number":451,"context_line":"        self.api.post_server_action(server[\u0027id\u0027], post)"},{"line_number":452,"context_line":""},{"line_number":453,"context_line":"    def _reset_volume_attachment_after_shelve_offload(self, instance_uuid):"},{"line_number":454,"context_line":"        # Note(gibi): a real virt driver would detach the volume during offload"},{"line_number":455,"context_line":"        # but the fake virt driver doesn\u0027t. Also fake virt driver doesn\u0027t know"},{"line_number":456,"context_line":"        # about the cinder fixture used in the test to do so. Therefore to be"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_499ed5b8","line":453,"in_reply_to":"3f1d235d_4692424d","updated":"2017-07-11 16:55:01.000000000","message":"OK so the difference is in the attach behavior between devstack and functional. the virt/block_device attach() function checks the state of the volume before it tries to attach it and in devstack in case of unshelving the status is  \u0027attached\u0027 therefore it won\u0027t try to attach again. In functional env the fake virt driver somehow returns \u0027detached\u0027 as a state and therefore there will be an attach towards the cinder stub that is smart enough to reject it. So the fake virt driver needs to be made smarter.","commit_id":"95ddc60a026770ba490e27234778aed7b6457667"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8b31707fd6b1bb671464cb9a4fb632d1d4822b1c","unresolved":false,"context_lines":[{"line_number":450,"context_line":"        post \u003d {\u0027unshelve\u0027: None}"},{"line_number":451,"context_line":"        self.api.post_server_action(server[\u0027id\u0027], post)"},{"line_number":452,"context_line":""},{"line_number":453,"context_line":"    def _reset_volume_attachment_after_shelve_offload(self, instance_uuid):"},{"line_number":454,"context_line":"        # Note(gibi): a real virt driver would detach the volume during offload"},{"line_number":455,"context_line":"        # but the fake virt driver doesn\u0027t. Also fake virt driver doesn\u0027t know"},{"line_number":456,"context_line":"        # about the cinder fixture used in the test to do so. Therefore to be"}],"source_content_type":"text/x-python","patch_set":36,"id":"1f1a1f67_b962b7d7","line":453,"in_reply_to":"3f1d235d_499ed5b8","updated":"2017-07-12 08:51:23.000000000","message":"I managed to make the cinder fake smart enough to remove this explicit detach.","commit_id":"95ddc60a026770ba490e27234778aed7b6457667"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fc6138b129a582f7b2744df8b64e62a8ddd237e3","unresolved":false,"context_lines":[{"line_number":451,"context_line":"        self.api.post_server_action(server[\u0027id\u0027], post)"},{"line_number":452,"context_line":""},{"line_number":453,"context_line":"    def _reset_volume_attachment_after_shelve_offload(self, instance_uuid):"},{"line_number":454,"context_line":"        # Note(gibi): a real virt driver would detach the volume during offload"},{"line_number":455,"context_line":"        # but the fake virt driver doesn\u0027t. Also fake virt driver doesn\u0027t know"},{"line_number":456,"context_line":"        # about the cinder fixture used in the test to do so. Therefore to be"},{"line_number":457,"context_line":"        # able to attach the volume again during unshelve the test has to"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_a0c12183","line":454,"range":{"start_line":454,"start_character":10,"end_line":454,"end_character":14},"updated":"2017-07-10 18:37:07.000000000","message":"NOTE","commit_id":"95ddc60a026770ba490e27234778aed7b6457667"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"626525c8daf9ca5b3452a7d8cd938a9afbe470f4","unresolved":false,"context_lines":[{"line_number":451,"context_line":"        self.api.post_server_action(server[\u0027id\u0027], post)"},{"line_number":452,"context_line":""},{"line_number":453,"context_line":"    def _reset_volume_attachment_after_shelve_offload(self, instance_uuid):"},{"line_number":454,"context_line":"        # Note(gibi): a real virt driver would detach the volume during offload"},{"line_number":455,"context_line":"        # but the fake virt driver doesn\u0027t. Also fake virt driver doesn\u0027t know"},{"line_number":456,"context_line":"        # about the cinder fixture used in the test to do so. Therefore to be"},{"line_number":457,"context_line":"        # able to attach the volume again during unshelve the test has to"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_3dff6168","line":454,"range":{"start_line":454,"start_character":10,"end_line":454,"end_character":14},"in_reply_to":"3f1d235d_a0c12183","updated":"2017-07-11 15:04:21.000000000","message":"Done","commit_id":"95ddc60a026770ba490e27234778aed7b6457667"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fc6138b129a582f7b2744df8b64e62a8ddd237e3","unresolved":false,"context_lines":[{"line_number":884,"context_line":"        # 7. compute.exception"},{"line_number":885,"context_line":"        self.assertLessEqual(7, len(fake_notifier.VERSIONED_NOTIFICATIONS))"},{"line_number":886,"context_line":"        block_devices \u003d [{"},{"line_number":887,"context_line":"                \"nova_object.data\": {"},{"line_number":888,"context_line":"                    \"boot_index\": None,"},{"line_number":889,"context_line":"                    \"delete_on_termination\": False,"},{"line_number":890,"context_line":"                    \"type\": \"volume\","},{"line_number":891,"context_line":"                    \"tag\": None,"},{"line_number":892,"context_line":"                    \"volume_id\": self.cinder.SWAP_ERR_OLD_VOL"},{"line_number":893,"context_line":"                },"},{"line_number":894,"context_line":"                \"nova_object.name\": \"BlockDevicePayload\","},{"line_number":895,"context_line":"                \"nova_object.namespace\": \"nova\","},{"line_number":896,"context_line":"                \"nova_object.version\": \"1.0\""},{"line_number":897,"context_line":"            }]"},{"line_number":898,"context_line":"        self._verify_notification("},{"line_number":899,"context_line":"            \u0027instance-volume_swap-start\u0027,"},{"line_number":900,"context_line":"            replacements\u003d{"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_200991dc","line":897,"range":{"start_line":887,"start_character":0,"end_line":897,"end_character":14},"updated":"2017-07-10 18:37:07.000000000","message":"nit: this is 1 tab too many","commit_id":"95ddc60a026770ba490e27234778aed7b6457667"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"626525c8daf9ca5b3452a7d8cd938a9afbe470f4","unresolved":false,"context_lines":[{"line_number":884,"context_line":"        # 7. compute.exception"},{"line_number":885,"context_line":"        self.assertLessEqual(7, len(fake_notifier.VERSIONED_NOTIFICATIONS))"},{"line_number":886,"context_line":"        block_devices \u003d [{"},{"line_number":887,"context_line":"                \"nova_object.data\": {"},{"line_number":888,"context_line":"                    \"boot_index\": None,"},{"line_number":889,"context_line":"                    \"delete_on_termination\": False,"},{"line_number":890,"context_line":"                    \"type\": \"volume\","},{"line_number":891,"context_line":"                    \"tag\": None,"},{"line_number":892,"context_line":"                    \"volume_id\": self.cinder.SWAP_ERR_OLD_VOL"},{"line_number":893,"context_line":"                },"},{"line_number":894,"context_line":"                \"nova_object.name\": \"BlockDevicePayload\","},{"line_number":895,"context_line":"                \"nova_object.namespace\": \"nova\","},{"line_number":896,"context_line":"                \"nova_object.version\": \"1.0\""},{"line_number":897,"context_line":"            }]"},{"line_number":898,"context_line":"        self._verify_notification("},{"line_number":899,"context_line":"            \u0027instance-volume_swap-start\u0027,"},{"line_number":900,"context_line":"            replacements\u003d{"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_9ded55b9","line":897,"range":{"start_line":887,"start_character":0,"end_line":897,"end_character":14},"in_reply_to":"3f1d235d_200991dc","updated":"2017-07-11 15:04:21.000000000","message":"Done","commit_id":"95ddc60a026770ba490e27234778aed7b6457667"}],"nova/tests/unit/compute/test_compute_mgr.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"db5b61dba48d47a02236c36b99710730f0026fa0","unresolved":false,"context_lines":[{"line_number":3041,"context_line":"    @mock.patch.object(manager.ComputeManager, \u0027_set_migration_status\u0027)"},{"line_number":3042,"context_line":"    @mock.patch.object(manager.ComputeManager,"},{"line_number":3043,"context_line":"                       \u0027_do_rebuild_instance_with_claim\u0027)"},{"line_number":3044,"context_line":"    @mock.patch.object(compute_utils, \u0027notify_about_instance_action\u0027)"},{"line_number":3045,"context_line":"    @mock.patch.object(manager.ComputeManager, \u0027_notify_about_instance_usage\u0027)"},{"line_number":3046,"context_line":"    def _test_rebuild_ex(self, instance, exc, mock_notify_about_instance_usage,"},{"line_number":3047,"context_line":"                         mock_notify, mock_rebuild, mock_set):"}],"source_content_type":"text/x-python","patch_set":9,"id":"ffe62b97_27f14702","line":3044,"updated":"2017-03-28 09:20:36.000000000","message":"What is the reason behind this change?","commit_id":"10c359a6ec95f29189260612bb06e425a570aead"},{"author":{"_account_id":18337,"name":"Sujitha","email":"sujitha.neti@intel.com","username":"Sujitha"},"change_message_id":"d636904d5c5b21f6a9aebc2f18d85a7cc9715f84","unresolved":false,"context_lines":[{"line_number":3041,"context_line":"    @mock.patch.object(manager.ComputeManager, \u0027_set_migration_status\u0027)"},{"line_number":3042,"context_line":"    @mock.patch.object(manager.ComputeManager,"},{"line_number":3043,"context_line":"                       \u0027_do_rebuild_instance_with_claim\u0027)"},{"line_number":3044,"context_line":"    @mock.patch.object(compute_utils, \u0027notify_about_instance_action\u0027)"},{"line_number":3045,"context_line":"    @mock.patch.object(manager.ComputeManager, \u0027_notify_about_instance_usage\u0027)"},{"line_number":3046,"context_line":"    def _test_rebuild_ex(self, instance, exc, mock_notify_about_instance_usage,"},{"line_number":3047,"context_line":"                         mock_notify, mock_rebuild, mock_set):"}],"source_content_type":"text/x-python","patch_set":9,"id":"dfeb2761_bf96894b","line":3044,"in_reply_to":"dfeb2761_312f61a2","updated":"2017-04-04 18:11:13.000000000","message":"ohh..ya..this is not needed.. Added this for some other tests. And I might  have changed this for consistency by mistake. I will change this.","commit_id":"10c359a6ec95f29189260612bb06e425a570aead"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"d6f3ab8463d670a34aedc061a5294a663ec57516","unresolved":false,"context_lines":[{"line_number":3041,"context_line":"    @mock.patch.object(manager.ComputeManager, \u0027_set_migration_status\u0027)"},{"line_number":3042,"context_line":"    @mock.patch.object(manager.ComputeManager,"},{"line_number":3043,"context_line":"                       \u0027_do_rebuild_instance_with_claim\u0027)"},{"line_number":3044,"context_line":"    @mock.patch.object(compute_utils, \u0027notify_about_instance_action\u0027)"},{"line_number":3045,"context_line":"    @mock.patch.object(manager.ComputeManager, \u0027_notify_about_instance_usage\u0027)"},{"line_number":3046,"context_line":"    def _test_rebuild_ex(self, instance, exc, mock_notify_about_instance_usage,"},{"line_number":3047,"context_line":"                         mock_notify, mock_rebuild, mock_set):"}],"source_content_type":"text/x-python","patch_set":9,"id":"dfeb2761_312f61a2","line":3044,"in_reply_to":"dfeb2761_e0c87775","updated":"2017-04-04 11:49:07.000000000","message":"This was mocked before just differently. You changed the mocking from mock.patch to mock.patch.object. Why?","commit_id":"10c359a6ec95f29189260612bb06e425a570aead"},{"author":{"_account_id":18337,"name":"Sujitha","email":"sujitha.neti@intel.com","username":"Sujitha"},"change_message_id":"cfc3280f99ab3c9044ed77b5a6e15b6849bd5e71","unresolved":false,"context_lines":[{"line_number":3041,"context_line":"    @mock.patch.object(manager.ComputeManager, \u0027_set_migration_status\u0027)"},{"line_number":3042,"context_line":"    @mock.patch.object(manager.ComputeManager,"},{"line_number":3043,"context_line":"                       \u0027_do_rebuild_instance_with_claim\u0027)"},{"line_number":3044,"context_line":"    @mock.patch.object(compute_utils, \u0027notify_about_instance_action\u0027)"},{"line_number":3045,"context_line":"    @mock.patch.object(manager.ComputeManager, \u0027_notify_about_instance_usage\u0027)"},{"line_number":3046,"context_line":"    def _test_rebuild_ex(self, instance, exc, mock_notify_about_instance_usage,"},{"line_number":3047,"context_line":"                         mock_notify, mock_rebuild, mock_set):"}],"source_content_type":"text/x-python","patch_set":9,"id":"dfeb2761_e0c87775","line":3044,"in_reply_to":"ffe62b97_27f14702","updated":"2017-03-30 22:23:46.000000000","message":"rebuild action calls notify_about_instance_action. With BDM added to notifications, it tries to fetch BDM info from DB if this is not mocked.","commit_id":"10c359a6ec95f29189260612bb06e425a570aead"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"db5b61dba48d47a02236c36b99710730f0026fa0","unresolved":false,"context_lines":[{"line_number":3651,"context_line":"    @mock.patch.object(compute_utils, \u0027notify_about_instance_action\u0027)"},{"line_number":3652,"context_line":"    @mock.patch.object(manager.ComputeManager, \u0027_notify_about_instance_usage\u0027)"},{"line_number":3653,"context_line":"    def test_rescheduled_exception_with_non_ascii_exception(self, mock_notify,"},{"line_number":3654,"context_line":"      mock_notify_action, mock_save, mock_spawn, mock_build, mock_shutdown):"},{"line_number":3655,"context_line":"        exc \u003d exception.NovaException(u\u0027s\\xe9quence\u0027)"},{"line_number":3656,"context_line":""},{"line_number":3657,"context_line":"        mock_build.return_value \u003d self.network_info"}],"source_content_type":"text/x-python","patch_set":9,"id":"ffe62b97_470c4bec","line":3654,"range":{"start_line":3654,"start_character":0,"end_line":3654,"end_character":6},"updated":"2017-03-28 09:20:36.000000000","message":"indentation","commit_id":"10c359a6ec95f29189260612bb06e425a570aead"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"db5b61dba48d47a02236c36b99710730f0026fa0","unresolved":false,"context_lines":[{"line_number":3677,"context_line":"                mock.call(self.context, self.instance, \u0027fake-mini\u0027,"},{"line_number":3678,"context_line":"                          action\u003d\u0027create\u0027, phase\u003d\u0027start\u0027),"},{"line_number":3679,"context_line":"                mock.call(self.context, self.instance, \u0027fake-mini\u0027,"},{"line_number":3680,"context_line":"                          action\u003d\u0027create\u0027, phase\u003d\u0027error\u0027, exception\u003dexc)])"},{"line_number":3681,"context_line":"        mock_build.assert_called_once_with(self.context, self.instance,"},{"line_number":3682,"context_line":"            self.requested_networks, self.security_groups)"},{"line_number":3683,"context_line":"        mock_shutdown.assert_called_once_with(self.context, self.instance,"}],"source_content_type":"text/x-python","patch_set":9,"id":"ffe62b97_c7a17b96","line":3680,"updated":"2017-03-28 09:20:36.000000000","message":"How does the test changes in this file relates to the goal of the commit?","commit_id":"10c359a6ec95f29189260612bb06e425a570aead"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"d6f3ab8463d670a34aedc061a5294a663ec57516","unresolved":false,"context_lines":[{"line_number":3677,"context_line":"                mock.call(self.context, self.instance, \u0027fake-mini\u0027,"},{"line_number":3678,"context_line":"                          action\u003d\u0027create\u0027, phase\u003d\u0027start\u0027),"},{"line_number":3679,"context_line":"                mock.call(self.context, self.instance, \u0027fake-mini\u0027,"},{"line_number":3680,"context_line":"                          action\u003d\u0027create\u0027, phase\u003d\u0027error\u0027, exception\u003dexc)])"},{"line_number":3681,"context_line":"        mock_build.assert_called_once_with(self.context, self.instance,"},{"line_number":3682,"context_line":"            self.requested_networks, self.security_groups)"},{"line_number":3683,"context_line":"        mock_shutdown.assert_called_once_with(self.context, self.instance,"}],"source_content_type":"text/x-python","patch_set":9,"id":"dfeb2761_d1539416","line":3680,"in_reply_to":"dfeb2761_4088431e","updated":"2017-04-04 11:49:07.000000000","message":"I see. This seems OK based on that.","commit_id":"10c359a6ec95f29189260612bb06e425a570aead"},{"author":{"_account_id":18337,"name":"Sujitha","email":"sujitha.neti@intel.com","username":"Sujitha"},"change_message_id":"cfc3280f99ab3c9044ed77b5a6e15b6849bd5e71","unresolved":false,"context_lines":[{"line_number":3677,"context_line":"                mock.call(self.context, self.instance, \u0027fake-mini\u0027,"},{"line_number":3678,"context_line":"                          action\u003d\u0027create\u0027, phase\u003d\u0027start\u0027),"},{"line_number":3679,"context_line":"                mock.call(self.context, self.instance, \u0027fake-mini\u0027,"},{"line_number":3680,"context_line":"                          action\u003d\u0027create\u0027, phase\u003d\u0027error\u0027, exception\u003dexc)])"},{"line_number":3681,"context_line":"        mock_build.assert_called_once_with(self.context, self.instance,"},{"line_number":3682,"context_line":"            self.requested_networks, self.security_groups)"},{"line_number":3683,"context_line":"        mock_shutdown.assert_called_once_with(self.context, self.instance,"}],"source_content_type":"text/x-python","patch_set":9,"id":"dfeb2761_4088431e","line":3680,"in_reply_to":"ffe62b97_c7a17b96","updated":"2017-03-30 22:23:46.000000000","message":"Explained above. to avoid fetching bdm info from DB this has to be mocked.","commit_id":"10c359a6ec95f29189260612bb06e425a570aead"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"d6f3ab8463d670a34aedc061a5294a663ec57516","unresolved":false,"context_lines":[{"line_number":4602,"context_line":"                self.context, mock.sentinel.instance,"},{"line_number":4603,"context_line":"                requested_networks\u003drequested_networks)"},{"line_number":4604,"context_line":""},{"line_number":4605,"context_line":"    @mock.patch.object(compute_utils, \u0027notify_about_instance_action\u0027)"},{"line_number":4606,"context_line":"    @mock.patch.object(manager.ComputeManager, \u0027_instance_update\u0027)"},{"line_number":4607,"context_line":"    def test_launched_at_in_create_end_notification(self,"},{"line_number":4608,"context_line":"            mock_instance_update, mock_notify_instance_action):"}],"source_content_type":"text/x-python","patch_set":9,"id":"dfeb2761_11b33c4f","line":4605,"updated":"2017-04-04 11:49:07.000000000","message":"similarly you changed mock.path to mock.patch.object but as far as I understand this should not change any behavior","commit_id":"10c359a6ec95f29189260612bb06e425a570aead"}],"nova/tests/unit/notifications/objects/test_notification.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fc6138b129a582f7b2744df8b64e62a8ddd237e3","unresolved":false,"context_lines":[{"line_number":541,"context_line":"    def test_payload_contains_volume_bdms_if_requested(self):"},{"line_number":542,"context_line":"        self.flags(bdms_in_notifications\u003d\u0027True\u0027, group\u003d\u0027notifications\u0027)"},{"line_number":543,"context_line":"        context \u003d mock.Mock()"},{"line_number":544,"context_line":"        instance \u003d mock.Mock()"},{"line_number":545,"context_line":"        image_bdm \u003d objects.BlockDeviceMapping("},{"line_number":546,"context_line":"            **{\u0027context\u0027: context, \u0027source_type\u0027: \u0027image\u0027,"},{"line_number":547,"context_line":"               \u0027destination_type\u0027: \u0027local\u0027,"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_80c86574","line":544,"range":{"start_line":544,"start_character":8,"end_line":544,"end_character":30},"updated":"2017-07-10 18:37:07.000000000","message":"See below, I\u0027d prefer that we use real objects so we at least get AttributeErrors if calling a method that does not exist. Then mock out the methods on the real object as appropriate.","commit_id":"95ddc60a026770ba490e27234778aed7b6457667"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"626525c8daf9ca5b3452a7d8cd938a9afbe470f4","unresolved":false,"context_lines":[{"line_number":541,"context_line":"    def test_payload_contains_volume_bdms_if_requested(self):"},{"line_number":542,"context_line":"        self.flags(bdms_in_notifications\u003d\u0027True\u0027, group\u003d\u0027notifications\u0027)"},{"line_number":543,"context_line":"        context \u003d mock.Mock()"},{"line_number":544,"context_line":"        instance \u003d mock.Mock()"},{"line_number":545,"context_line":"        image_bdm \u003d objects.BlockDeviceMapping("},{"line_number":546,"context_line":"            **{\u0027context\u0027: context, \u0027source_type\u0027: \u0027image\u0027,"},{"line_number":547,"context_line":"               \u0027destination_type\u0027: \u0027local\u0027,"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_3fa74e0e","line":544,"range":{"start_line":544,"start_character":8,"end_line":544,"end_character":30},"in_reply_to":"3f1d235d_80c86574","updated":"2017-07-11 15:04:21.000000000","message":"Done","commit_id":"95ddc60a026770ba490e27234778aed7b6457667"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fc6138b129a582f7b2744df8b64e62a8ddd237e3","unresolved":false,"context_lines":[{"line_number":579,"context_line":"        bmds \u003d instance_notification.BlockDevicePayload.from_instance("},{"line_number":580,"context_line":"            instance)"},{"line_number":581,"context_line":"        self.assertIsNone(bmds)"},{"line_number":582,"context_line":"        self.assertFalse(instance.get_bdms_for_instance.called)"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_20c07150","line":582,"range":{"start_line":582,"start_character":25,"end_line":582,"end_character":62},"updated":"2017-07-10 18:37:07.000000000","message":"This is always going to be False because the method is actually called \"get_bdms\". So this test is broken. Please use a real Instance object and then mock out the get_bdms method with a NonCallableMock to make sure it fails if called.:\n\nhttps://docs.python.org/3/library/unittest.mock.html#unittest.mock.NonCallableMock","commit_id":"95ddc60a026770ba490e27234778aed7b6457667"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"626525c8daf9ca5b3452a7d8cd938a9afbe470f4","unresolved":false,"context_lines":[{"line_number":579,"context_line":"        bmds \u003d instance_notification.BlockDevicePayload.from_instance("},{"line_number":580,"context_line":"            instance)"},{"line_number":581,"context_line":"        self.assertIsNone(bmds)"},{"line_number":582,"context_line":"        self.assertFalse(instance.get_bdms_for_instance.called)"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f1d235d_7fc94623","line":582,"range":{"start_line":582,"start_character":25,"end_line":582,"end_character":62},"in_reply_to":"3f1d235d_20c07150","updated":"2017-07-11 15:04:21.000000000","message":"Thanks for catching this. Done.","commit_id":"95ddc60a026770ba490e27234778aed7b6457667"}]}
