)]}'
{"doc/notification_samples/instance-volume_swap-error.json":[{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"58d71f76f3a6f3e97b96e510ab59cd70ff418040","unresolved":false,"context_lines":[{"line_number":9,"context_line":"            \"display_name\": \"some-server\","},{"line_number":10,"context_line":"            \"fault\": {"},{"line_number":11,"context_line":"                \"nova_object.data\": {"},{"line_number":12,"context_line":"                    \"exception\": \"TypeError\","},{"line_number":13,"context_line":"                    \"exception_message\": \"\u0027tuple\u0027 object does not support item assignment\","},{"line_number":14,"context_line":"                    \"function_name\": \"_init_volume_connection\","},{"line_number":15,"context_line":"                    \"module_name\": \"nova.compute.manager\""}],"source_content_type":"application/json","patch_set":22,"id":"fa6399be_a36acf18","line":12,"range":{"start_line":12,"start_character":34,"end_line":12,"end_character":43},"updated":"2016-10-11 12:11:14.000000000","message":"Here","commit_id":"5b9e8f6e52a069f55c2f8db410720290cb718aff"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"58d71f76f3a6f3e97b96e510ab59cd70ff418040","unresolved":false,"context_lines":[{"line_number":10,"context_line":"            \"fault\": {"},{"line_number":11,"context_line":"                \"nova_object.data\": {"},{"line_number":12,"context_line":"                    \"exception\": \"TypeError\","},{"line_number":13,"context_line":"                    \"exception_message\": \"\u0027tuple\u0027 object does not support item assignment\","},{"line_number":14,"context_line":"                    \"function_name\": \"_init_volume_connection\","},{"line_number":15,"context_line":"                    \"module_name\": \"nova.compute.manager\""},{"line_number":16,"context_line":"                },"}],"source_content_type":"application/json","patch_set":22,"id":"fa6399be_e374c7fe","line":13,"range":{"start_line":13,"start_character":42,"end_line":13,"end_character":90},"updated":"2016-10-11 12:11:14.000000000","message":"Here","commit_id":"5b9e8f6e52a069f55c2f8db410720290cb718aff"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4848b3b01866a48cbb82067320eda6c252c4b9bd","unresolved":false,"context_lines":[{"line_number":9,"context_line":"            \"display_name\": \"some-server\","},{"line_number":10,"context_line":"            \"fault\": {"},{"line_number":11,"context_line":"                \"nova_object.data\": {"},{"line_number":12,"context_line":"                    \"exception\": \"TypeError\","},{"line_number":13,"context_line":"                    \"exception_message\": \"\u0027tuple\u0027 object does not support item assignment\","},{"line_number":14,"context_line":"                    \"function_name\": \"_init_volume_connection\","},{"line_number":15,"context_line":"                    \"module_name\": \"nova.compute.manager\""},{"line_number":16,"context_line":"                },"}],"source_content_type":"application/json","patch_set":23,"id":"fa6399be_ebad7532","line":13,"range":{"start_line":12,"start_character":20,"end_line":13,"end_character":91},"updated":"2016-10-11 14:53:07.000000000","message":"As noted in the previous patch set, I think we should use something a bit more realistic for this, like a volume not found error.","commit_id":"4a2c2e8290a5522d6ae7e56d959a8643eca63c96"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"b2cd3d660a17077d47964bfec964d874cd662ba3","unresolved":false,"context_lines":[{"line_number":9,"context_line":"            \"display_name\": \"some-server\","},{"line_number":10,"context_line":"            \"fault\": {"},{"line_number":11,"context_line":"                \"nova_object.data\": {"},{"line_number":12,"context_line":"                    \"exception\": \"TypeError\","},{"line_number":13,"context_line":"                    \"exception_message\": \"\u0027tuple\u0027 object does not support item assignment\","},{"line_number":14,"context_line":"                    \"function_name\": \"_init_volume_connection\","},{"line_number":15,"context_line":"                    \"module_name\": \"nova.compute.manager\""},{"line_number":16,"context_line":"                },"}],"source_content_type":"application/json","patch_set":23,"id":"fa6399be_335f95e6","line":13,"range":{"start_line":12,"start_character":20,"end_line":13,"end_character":91},"in_reply_to":"fa6399be_ebad7532","updated":"2016-10-13 05:54:08.000000000","message":"Please check my comment in nova/tests/functional/notification_sample_tests/test_instance.py .","commit_id":"4a2c2e8290a5522d6ae7e56d959a8643eca63c96"}],"nova/compute/manager.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"33915387e01d4132caa53789e0c06b67962f1c9c","unresolved":false,"context_lines":[{"line_number":4773,"context_line":"                fields.NotificationAction.VOLUME_SWAP,"},{"line_number":4774,"context_line":"                fields.NotificationPhase.ERROR,"},{"line_number":4775,"context_line":"                old_volume_id, new_volume_id, ex)"},{"line_number":4776,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":4777,"context_line":"                if new_cinfo:"},{"line_number":4778,"context_line":"                    msg \u003d _LE(\"Failed to swap volume %(old_volume_id)s \""},{"line_number":4779,"context_line":"                              \"for %(new_volume_id)s\")"}],"source_content_type":"text/x-python","patch_set":11,"id":"3aaa91ec_d83b2c37","line":4776,"updated":"2016-06-28 11:02:40.000000000","message":"This should come first, to avoid any failed re-raises.","commit_id":"f4d8649339bdbc2a5fcd316bf0471f92840853b5"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"174583e778cad6015afeb2ffcdfb50ceb09b7fdf","unresolved":false,"context_lines":[{"line_number":4773,"context_line":"                fields.NotificationAction.VOLUME_SWAP,"},{"line_number":4774,"context_line":"                fields.NotificationPhase.ERROR,"},{"line_number":4775,"context_line":"                old_volume_id, new_volume_id, ex)"},{"line_number":4776,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":4777,"context_line":"                if new_cinfo:"},{"line_number":4778,"context_line":"                    msg \u003d _LE(\"Failed to swap volume %(old_volume_id)s \""},{"line_number":4779,"context_line":"                              \"for %(new_volume_id)s\")"}],"source_content_type":"text/x-python","patch_set":11,"id":"3aaa91ec_2a41330c","line":4776,"in_reply_to":"3aaa91ec_d83b2c37","updated":"2016-06-28 12:16:29.000000000","message":"Done","commit_id":"f4d8649339bdbc2a5fcd316bf0471f92840853b5"}],"nova/compute/utils.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0113f98094e0b88f09052af4619ff4d7c388c40c","unresolved":false,"context_lines":[{"line_number":388,"context_line":""},{"line_number":389,"context_line":"    flavor \u003d instance_notification.FlavorPayload(instance\u003dinstance)"},{"line_number":390,"context_line":""},{"line_number":391,"context_line":"    if phase \u003d\u003d fields.NotificationPhase.ERROR:"},{"line_number":392,"context_line":"        priority \u003d fields.NotificationPriority.ERROR"},{"line_number":393,"context_line":"        fault \u003d notification_exception.ExceptionPayload.from_exception("},{"line_number":394,"context_line":"            exception)"}],"source_content_type":"text/x-python","patch_set":22,"id":"1a95cdbc_7facf98b","line":391,"range":{"start_line":391,"start_character":7,"end_line":391,"end_character":46},"updated":"2016-10-10 16:39:37.000000000","message":"Like on line 311, I\u0027d probably just check \"if exception\" here, regardless of the phase, since if an exception is provided it\u0027s a fault regardless of phase.","commit_id":"5b9e8f6e52a069f55c2f8db410720290cb718aff"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"58d71f76f3a6f3e97b96e510ab59cd70ff418040","unresolved":false,"context_lines":[{"line_number":388,"context_line":""},{"line_number":389,"context_line":"    flavor \u003d instance_notification.FlavorPayload(instance\u003dinstance)"},{"line_number":390,"context_line":""},{"line_number":391,"context_line":"    if phase \u003d\u003d fields.NotificationPhase.ERROR:"},{"line_number":392,"context_line":"        priority \u003d fields.NotificationPriority.ERROR"},{"line_number":393,"context_line":"        fault \u003d notification_exception.ExceptionPayload.from_exception("},{"line_number":394,"context_line":"            exception)"}],"source_content_type":"text/x-python","patch_set":22,"id":"fa6399be_6849768b","line":391,"range":{"start_line":391,"start_character":7,"end_line":391,"end_character":46},"in_reply_to":"1a95cdbc_7facf98b","updated":"2016-10-11 12:11:14.000000000","message":"Done","commit_id":"5b9e8f6e52a069f55c2f8db410720290cb718aff"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0113f98094e0b88f09052af4619ff4d7c388c40c","unresolved":false,"context_lines":[{"line_number":391,"context_line":"    if phase \u003d\u003d fields.NotificationPhase.ERROR:"},{"line_number":392,"context_line":"        priority \u003d fields.NotificationPriority.ERROR"},{"line_number":393,"context_line":"        fault \u003d notification_exception.ExceptionPayload.from_exception("},{"line_number":394,"context_line":"            exception)"},{"line_number":395,"context_line":"    else:"},{"line_number":396,"context_line":"        priority \u003d fields.NotificationPriority.INFO"},{"line_number":397,"context_line":"        fault \u003d None"}],"source_content_type":"text/x-python","patch_set":22,"id":"1a95cdbc_9fd545e6","line":394,"range":{"start_line":394,"start_character":12,"end_line":394,"end_character":21},"updated":"2016-10-10 16:39:37.000000000","message":"Also, I could pass \"phase \u003d\u003d fields.NotificationPhase.ERROR\" above but not have provided an exception kwarg, and this would blow up.","commit_id":"5b9e8f6e52a069f55c2f8db410720290cb718aff"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"58d71f76f3a6f3e97b96e510ab59cd70ff418040","unresolved":false,"context_lines":[{"line_number":391,"context_line":"    if phase \u003d\u003d fields.NotificationPhase.ERROR:"},{"line_number":392,"context_line":"        priority \u003d fields.NotificationPriority.ERROR"},{"line_number":393,"context_line":"        fault \u003d notification_exception.ExceptionPayload.from_exception("},{"line_number":394,"context_line":"            exception)"},{"line_number":395,"context_line":"    else:"},{"line_number":396,"context_line":"        priority \u003d fields.NotificationPriority.INFO"},{"line_number":397,"context_line":"        fault \u003d None"}],"source_content_type":"text/x-python","patch_set":22,"id":"fa6399be_c858c259","line":394,"range":{"start_line":394,"start_character":12,"end_line":394,"end_character":21},"in_reply_to":"1a95cdbc_9fd545e6","updated":"2016-10-11 12:11:14.000000000","message":"Done","commit_id":"5b9e8f6e52a069f55c2f8db410720290cb718aff"}],"nova/tests/fixtures.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0113f98094e0b88f09052af4619ff4d7c388c40c","unresolved":false,"context_lines":[{"line_number":800,"context_line":""},{"line_number":801,"context_line":"    SWAP_VOL \u003d \u0027a07f71dc-8151-4e7d-a0cc-cd24a3f11113\u0027"},{"line_number":802,"context_line":"    SWAP_NEW_VOL \u003d \u0027227cc671-f30b-4488-96fd-7d0bf13648d8\u0027"},{"line_number":803,"context_line":"    SWAP_ERR_VOL \u003d \u0027828419fa-3efb-4533-b458-4267ca5fe9b1\u0027"},{"line_number":804,"context_line":"    SWAP_ERR_NEW_VOL \u003d \u00279c6d9c2d-7a8f-4c80-938d-3bf062b8d489\u0027"},{"line_number":805,"context_line":""},{"line_number":806,"context_line":"    def __init__(self, test):"},{"line_number":807,"context_line":"        super(CinderFixture, self).__init__()"}],"source_content_type":"text/x-python","patch_set":22,"id":"1a95cdbc_bf14c19f","line":804,"range":{"start_line":803,"start_character":4,"end_line":804,"end_character":61},"updated":"2016-10-10 16:39:37.000000000","message":"Why do we need different volume IDs? The fixture should be able to work for multiple different tests without different unique fixtures controlling the state. I guess you might need SWAP_ERR_NEW_VOL for faking out the exception in fake_initialize_connection, but I don\u0027t see the need for SWAP_ERR_VOL or swap_volume_instance_error_uuid.","commit_id":"5b9e8f6e52a069f55c2f8db410720290cb718aff"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"58d71f76f3a6f3e97b96e510ab59cd70ff418040","unresolved":false,"context_lines":[{"line_number":800,"context_line":""},{"line_number":801,"context_line":"    SWAP_VOL \u003d \u0027a07f71dc-8151-4e7d-a0cc-cd24a3f11113\u0027"},{"line_number":802,"context_line":"    SWAP_NEW_VOL \u003d \u0027227cc671-f30b-4488-96fd-7d0bf13648d8\u0027"},{"line_number":803,"context_line":"    SWAP_ERR_VOL \u003d \u0027828419fa-3efb-4533-b458-4267ca5fe9b1\u0027"},{"line_number":804,"context_line":"    SWAP_ERR_NEW_VOL \u003d \u00279c6d9c2d-7a8f-4c80-938d-3bf062b8d489\u0027"},{"line_number":805,"context_line":""},{"line_number":806,"context_line":"    def __init__(self, test):"},{"line_number":807,"context_line":"        super(CinderFixture, self).__init__()"}],"source_content_type":"text/x-python","patch_set":22,"id":"fa6399be_59172651","line":804,"range":{"start_line":803,"start_character":4,"end_line":804,"end_character":61},"in_reply_to":"1a95cdbc_bf14c19f","updated":"2016-10-11 12:11:14.000000000","message":"Test methods of the same class are executed in parallel.\nSo \u0027test_volume_swap_server\u0027 and \u0027test_volume_swap_server_with_error\u0027 may be executed in parallel. There is \u0027self._boot_a_server\u0027 in each method, so they have different servers(different UUIDs).\n(The server\u0027s UUID is utilized in line 836.)\nTherefore both \u0027swap_volume_instance_uuid\u0027 and \u0027swap_volume_instance_error_uuid\u0027 are needed.\nAnd SWAP_ERR_VOL is needed in order to decide which server\u0027s UUID (\u0027swap_volume_instance_uuid\u0027 or \u0027swap_volume_instance_error_uuid\u0027) should be returned in cinder\u0027s get(get a volume) API response.","commit_id":"5b9e8f6e52a069f55c2f8db410720290cb718aff"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0113f98094e0b88f09052af4619ff4d7c388c40c","unresolved":false,"context_lines":[{"line_number":807,"context_line":"        super(CinderFixture, self).__init__()"},{"line_number":808,"context_line":"        self.test \u003d test"},{"line_number":809,"context_line":"        self.swap_volume_instance_uuid \u003d None"},{"line_number":810,"context_line":"        self.swap_volume_instance_error_uuid \u003d None"},{"line_number":811,"context_line":""},{"line_number":812,"context_line":"    def setUp(self):"},{"line_number":813,"context_line":"        super(CinderFixture, self).setUp()"}],"source_content_type":"text/x-python","patch_set":22,"id":"1a95cdbc_9fec65bc","line":810,"updated":"2016-10-10 16:39:37.000000000","message":"Why do we need this? The fixture should be per-test case, so handling state like this per test is pretty gross.","commit_id":"5b9e8f6e52a069f55c2f8db410720290cb718aff"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"58d71f76f3a6f3e97b96e510ab59cd70ff418040","unresolved":false,"context_lines":[{"line_number":807,"context_line":"        super(CinderFixture, self).__init__()"},{"line_number":808,"context_line":"        self.test \u003d test"},{"line_number":809,"context_line":"        self.swap_volume_instance_uuid \u003d None"},{"line_number":810,"context_line":"        self.swap_volume_instance_error_uuid \u003d None"},{"line_number":811,"context_line":""},{"line_number":812,"context_line":"    def setUp(self):"},{"line_number":813,"context_line":"        super(CinderFixture, self).setUp()"}],"source_content_type":"text/x-python","patch_set":22,"id":"fa6399be_54b52bcb","line":810,"in_reply_to":"1a95cdbc_9fec65bc","updated":"2016-10-11 12:11:14.000000000","message":"See my comment in line 804.","commit_id":"5b9e8f6e52a069f55c2f8db410720290cb718aff"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"58d71f76f3a6f3e97b96e510ab59cd70ff418040","unresolved":false,"context_lines":[{"line_number":833,"context_line":"                    volume.update({"},{"line_number":834,"context_line":"                        \u0027status\u0027: \u0027in-use\u0027,"},{"line_number":835,"context_line":"                        \u0027attachments\u0027: {"},{"line_number":836,"context_line":"                            instance_uuid: {"},{"line_number":837,"context_line":"                                \u0027mountpoint\u0027: \u0027/dev/vdb\u0027,"},{"line_number":838,"context_line":"                                \u0027attachment_id\u0027: volume_id"},{"line_number":839,"context_line":"                            }"}],"source_content_type":"text/x-python","patch_set":22,"id":"fa6399be_54f8cbe5","line":836,"range":{"start_line":836,"start_character":28,"end_line":836,"end_character":41},"updated":"2016-10-11 12:11:14.000000000","message":"Here","commit_id":"5b9e8f6e52a069f55c2f8db410720290cb718aff"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0113f98094e0b88f09052af4619ff4d7c388c40c","unresolved":false,"context_lines":[{"line_number":852,"context_line":""},{"line_number":853,"context_line":"        def fake_initialize_connection(self, context, volume_id, connector):"},{"line_number":854,"context_line":"            if volume_id \u003d\u003d CinderFixture.SWAP_ERR_NEW_VOL:"},{"line_number":855,"context_line":"                # Return a tuple in order to raise an exception."},{"line_number":856,"context_line":"                return ()"},{"line_number":857,"context_line":"            return {}"},{"line_number":858,"context_line":""},{"line_number":859,"context_line":"        def fake_migrate_volume_completion(self, context, old_volume_id,"}],"source_content_type":"text/x-python","patch_set":22,"id":"1a95cdbc_ff58098c","line":856,"range":{"start_line":855,"start_character":16,"end_line":856,"end_character":25},"updated":"2016-10-10 16:39:37.000000000","message":"Why not just raise a real exception? Use nova.test.TestingException for example.","commit_id":"5b9e8f6e52a069f55c2f8db410720290cb718aff"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"58d71f76f3a6f3e97b96e510ab59cd70ff418040","unresolved":false,"context_lines":[{"line_number":852,"context_line":""},{"line_number":853,"context_line":"        def fake_initialize_connection(self, context, volume_id, connector):"},{"line_number":854,"context_line":"            if volume_id \u003d\u003d CinderFixture.SWAP_ERR_NEW_VOL:"},{"line_number":855,"context_line":"                # Return a tuple in order to raise an exception."},{"line_number":856,"context_line":"                return ()"},{"line_number":857,"context_line":"            return {}"},{"line_number":858,"context_line":""},{"line_number":859,"context_line":"        def fake_migrate_volume_completion(self, context, old_volume_id,"}],"source_content_type":"text/x-python","patch_set":22,"id":"fa6399be_9ee4440e","line":856,"range":{"start_line":855,"start_character":16,"end_line":856,"end_character":25},"in_reply_to":"1a95cdbc_ff58098c","updated":"2016-10-11 12:11:14.000000000","message":"If TestingException is used, it will be included in sample file(instance-volume_swap-error.json).\nIMO, it is not proper for the notification sample.","commit_id":"5b9e8f6e52a069f55c2f8db410720290cb718aff"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"47340946cef31caea698fec6bf6335850309d424","unresolved":false,"context_lines":[{"line_number":852,"context_line":""},{"line_number":853,"context_line":"        def fake_initialize_connection(self, context, volume_id, connector):"},{"line_number":854,"context_line":"            if volume_id \u003d\u003d CinderFixture.SWAP_ERR_NEW_VOL:"},{"line_number":855,"context_line":"                # Return a tuple in order to raise an exception."},{"line_number":856,"context_line":"                return ()"},{"line_number":857,"context_line":"            return {}"},{"line_number":858,"context_line":""},{"line_number":859,"context_line":"        def fake_migrate_volume_completion(self, context, old_volume_id,"}],"source_content_type":"text/x-python","patch_set":22,"id":"fa6399be_45ee508c","line":856,"range":{"start_line":855,"start_character":16,"end_line":856,"end_character":25},"in_reply_to":"fa6399be_9ee4440e","updated":"2016-10-11 14:18:06.000000000","message":"OK, then maybe a real cinder exception that you could get from initialize_connection would be better, like VolumeNotFound or something, or fake a connection failure to the volume REST API. It\u0027s not a huge deal either way to me, it just seems a bit strange to codify a coding error into the sample.\n\nI\u0027d use cinder_exception.NotFound here:\n\nhttps://github.com/openstack/nova/blob/63b781d63ba9f147a665f82a24bf583ddedbab84/nova/volume/cinder.py#L211\n\nThat will result in a VolumeNotFound error being passed back to the compute manager and that\u0027s what would go into the volume_swap.error notification.","commit_id":"5b9e8f6e52a069f55c2f8db410720290cb718aff"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0113f98094e0b88f09052af4619ff4d7c388c40c","unresolved":false,"context_lines":[{"line_number":861,"context_line":"            return {\u0027save_volume_id\u0027: new_volume_id}"},{"line_number":862,"context_line":""},{"line_number":863,"context_line":"        def fake_unreserve_volume(self_api, context, volume_id):"},{"line_number":864,"context_line":"            self.swap_error \u003d True"},{"line_number":865,"context_line":""},{"line_number":866,"context_line":"        self.test.stub_out(\u0027nova.volume.cinder.API.attach\u0027,"},{"line_number":867,"context_line":"                           lambda *args, **kwargs: None)"}],"source_content_type":"text/x-python","patch_set":22,"id":"1a95cdbc_ffe649ae","line":864,"range":{"start_line":864,"start_character":17,"end_line":864,"end_character":27},"updated":"2016-10-10 16:39:37.000000000","message":"You should probably initialize this to None in __init__ so you don\u0027t hit an AttributeError when accessing it on the fixture in a test.","commit_id":"5b9e8f6e52a069f55c2f8db410720290cb718aff"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"58d71f76f3a6f3e97b96e510ab59cd70ff418040","unresolved":false,"context_lines":[{"line_number":861,"context_line":"            return {\u0027save_volume_id\u0027: new_volume_id}"},{"line_number":862,"context_line":""},{"line_number":863,"context_line":"        def fake_unreserve_volume(self_api, context, volume_id):"},{"line_number":864,"context_line":"            self.swap_error \u003d True"},{"line_number":865,"context_line":""},{"line_number":866,"context_line":"        self.test.stub_out(\u0027nova.volume.cinder.API.attach\u0027,"},{"line_number":867,"context_line":"                           lambda *args, **kwargs: None)"}],"source_content_type":"text/x-python","patch_set":22,"id":"fa6399be_fe5f0073","line":864,"range":{"start_line":864,"start_character":17,"end_line":864,"end_character":27},"in_reply_to":"1a95cdbc_ffe649ae","updated":"2016-10-11 12:11:14.000000000","message":"In nova/tests/functional/notification_sample_tests/test_instance.py, we cannot know whether an exception occurred or not by APIs.\nSo \u0027unreserve_volume\u0027 is stub out and cinder fixture\u0027s \u0027swap_error\u0027 variable is turned to True when an exception occurs.\nThen checking its value, we can know that an exception occurred. (After it, check notifications in functional tests.)","commit_id":"5b9e8f6e52a069f55c2f8db410720290cb718aff"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4848b3b01866a48cbb82067320eda6c252c4b9bd","unresolved":false,"context_lines":[{"line_number":853,"context_line":""},{"line_number":854,"context_line":"        def fake_initialize_connection(self, context, volume_id, connector):"},{"line_number":855,"context_line":"            if volume_id \u003d\u003d CinderFixture.SWAP_ERR_NEW_VOL:"},{"line_number":856,"context_line":"                # Return a tuple in order to raise an exception."},{"line_number":857,"context_line":"                return ()"},{"line_number":858,"context_line":"            return {}"},{"line_number":859,"context_line":""},{"line_number":860,"context_line":"        def fake_migrate_volume_completion(self, context, old_volume_id,"}],"source_content_type":"text/x-python","patch_set":23,"id":"fa6399be_3d1df473","line":857,"range":{"start_line":856,"start_character":16,"end_line":857,"end_character":25},"updated":"2016-10-11 14:53:07.000000000","message":"I think we should raise a cinderclient volume not found exception here to make this more realistic.","commit_id":"4a2c2e8290a5522d6ae7e56d959a8643eca63c96"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"b2cd3d660a17077d47964bfec964d874cd662ba3","unresolved":false,"context_lines":[{"line_number":853,"context_line":""},{"line_number":854,"context_line":"        def fake_initialize_connection(self, context, volume_id, connector):"},{"line_number":855,"context_line":"            if volume_id \u003d\u003d CinderFixture.SWAP_ERR_NEW_VOL:"},{"line_number":856,"context_line":"                # Return a tuple in order to raise an exception."},{"line_number":857,"context_line":"                return ()"},{"line_number":858,"context_line":"            return {}"},{"line_number":859,"context_line":""},{"line_number":860,"context_line":"        def fake_migrate_volume_completion(self, context, old_volume_id,"}],"source_content_type":"text/x-python","patch_set":23,"id":"fa6399be_d3c0197f","line":857,"range":{"start_line":856,"start_character":16,"end_line":857,"end_character":25},"in_reply_to":"fa6399be_3d1df473","updated":"2016-10-13 05:54:08.000000000","message":"If an exception(e.g. cinderclient.exceptions.ClientException or nova.exception.VolumeNotFound) is raised here, \u0027function_name\u0027 becomes \u0027fake_initialize_connection\u0027 and \u0027module_name\u0027 becomes \u0027nova.tests.fixtures\u0027 in the sample file.\nIMO, it is not adequate.","commit_id":"4a2c2e8290a5522d6ae7e56d959a8643eca63c96"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4848b3b01866a48cbb82067320eda6c252c4b9bd","unresolved":false,"context_lines":[{"line_number":862,"context_line":"            return {\u0027save_volume_id\u0027: new_volume_id}"},{"line_number":863,"context_line":""},{"line_number":864,"context_line":"        def fake_unreserve_volume(self_api, context, volume_id):"},{"line_number":865,"context_line":"            self.swap_error \u003d True"},{"line_number":866,"context_line":""},{"line_number":867,"context_line":"        self.test.stub_out(\u0027nova.volume.cinder.API.attach\u0027,"},{"line_number":868,"context_line":"                           lambda *args, **kwargs: None)"}],"source_content_type":"text/x-python","patch_set":23,"id":"fa6399be_c065ebe1","line":865,"updated":"2016-10-11 14:53:07.000000000","message":"Might want to add a comment here about what this is used for, i.e. signaling that swap_volume has encountered the error from initialize_connection and is working on rolling back the reservation on SWAP_ERR_NEW_VOL. You might even want to assert that volume_id \u003d\u003d SWAP_ERR_NEW_VOL.","commit_id":"4a2c2e8290a5522d6ae7e56d959a8643eca63c96"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"b2cd3d660a17077d47964bfec964d874cd662ba3","unresolved":false,"context_lines":[{"line_number":862,"context_line":"            return {\u0027save_volume_id\u0027: new_volume_id}"},{"line_number":863,"context_line":""},{"line_number":864,"context_line":"        def fake_unreserve_volume(self_api, context, volume_id):"},{"line_number":865,"context_line":"            self.swap_error \u003d True"},{"line_number":866,"context_line":""},{"line_number":867,"context_line":"        self.test.stub_out(\u0027nova.volume.cinder.API.attach\u0027,"},{"line_number":868,"context_line":"                           lambda *args, **kwargs: None)"}],"source_content_type":"text/x-python","patch_set":23,"id":"fa6399be_218d7e7b","line":865,"in_reply_to":"fa6399be_c065ebe1","updated":"2016-10-13 05:54:08.000000000","message":"Done","commit_id":"4a2c2e8290a5522d6ae7e56d959a8643eca63c96"}],"nova/tests/functional/notification_sample_tests/test_instance.py":[{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"58d71f76f3a6f3e97b96e510ab59cd70ff418040","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _wait_until_swap_volume_error(self):"},{"line_number":43,"context_line":"        for i in range(50):"},{"line_number":44,"context_line":"            if self.cinder.swap_error:"},{"line_number":45,"context_line":"                return"},{"line_number":46,"context_line":"            time.sleep(0.5)"},{"line_number":47,"context_line":"        self.fail(\"Volume swap error didn\u0027t occur.\")"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"fa6399be_dee23c9f","line":45,"range":{"start_line":44,"start_character":0,"end_line":45,"end_character":22},"updated":"2016-10-11 12:11:14.000000000","message":"Cinder fixture\u0027s \u0027swap_error\u0027 is checked here.\nAt first, it is False. If it becomes True, we can know an exception occurred.","commit_id":"5b9e8f6e52a069f55c2f8db410720290cb718aff"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"47340946cef31caea698fec6bf6335850309d424","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _wait_until_swap_volume_error(self):"},{"line_number":43,"context_line":"        for i in range(50):"},{"line_number":44,"context_line":"            if self.cinder.swap_error:"},{"line_number":45,"context_line":"                return"},{"line_number":46,"context_line":"            time.sleep(0.5)"},{"line_number":47,"context_line":"        self.fail(\"Volume swap error didn\u0027t occur.\")"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"fa6399be_654fd492","line":45,"range":{"start_line":44,"start_character":0,"end_line":45,"end_character":22},"in_reply_to":"fa6399be_dee23c9f","updated":"2016-10-11 14:18:06.000000000","message":"Sure, I\u0027m just saying, default it to False in __init__ of the CinderFixture, to avoid an AttributeError.","commit_id":"5b9e8f6e52a069f55c2f8db410720290cb718aff"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0113f98094e0b88f09052af4619ff4d7c388c40c","unresolved":false,"context_lines":[{"line_number":406,"context_line":"            actual\u003dfake_notifier.VERSIONED_NOTIFICATIONS[1])"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"    def test_volume_swap_server_with_error(self):"},{"line_number":409,"context_line":"        self.cinder.swap_error \u003d False"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"        server \u003d self._boot_a_server("},{"line_number":412,"context_line":"            extra_params\u003d{\u0027networks\u0027: [{\u0027port\u0027: self.neutron.port_1[\u0027id\u0027]}]})"}],"source_content_type":"text/x-python","patch_set":22,"id":"1a95cdbc_5f873db4","line":409,"updated":"2016-10-10 16:39:37.000000000","message":"This should be in the __init__ of the fixture, the test shouldn\u0027t have to know about these internals.","commit_id":"5b9e8f6e52a069f55c2f8db410720290cb718aff"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"58d71f76f3a6f3e97b96e510ab59cd70ff418040","unresolved":false,"context_lines":[{"line_number":406,"context_line":"            actual\u003dfake_notifier.VERSIONED_NOTIFICATIONS[1])"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"    def test_volume_swap_server_with_error(self):"},{"line_number":409,"context_line":"        self.cinder.swap_error \u003d False"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"        server \u003d self._boot_a_server("},{"line_number":412,"context_line":"            extra_params\u003d{\u0027networks\u0027: [{\u0027port\u0027: self.neutron.port_1[\u0027id\u0027]}]})"}],"source_content_type":"text/x-python","patch_set":22,"id":"fa6399be_63bb5773","line":409,"in_reply_to":"1a95cdbc_5f873db4","updated":"2016-10-11 12:11:14.000000000","message":"Done","commit_id":"5b9e8f6e52a069f55c2f8db410720290cb718aff"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0113f98094e0b88f09052af4619ff4d7c388c40c","unresolved":false,"context_lines":[{"line_number":426,"context_line":"        self._verify_notification("},{"line_number":427,"context_line":"            \u0027instance-volume_swap-start\u0027,"},{"line_number":428,"context_line":"            replacements\u003d{"},{"line_number":429,"context_line":"                \u0027new_volume_id\u0027: self.cinder.SWAP_ERR_NEW_VOL,"},{"line_number":430,"context_line":"                \u0027old_volume_id\u0027: self.cinder.SWAP_ERR_VOL,"},{"line_number":431,"context_line":"                \u0027reservation_id\u0027: server[\u0027reservation_id\u0027],"},{"line_number":432,"context_line":"                \u0027uuid\u0027: server[\u0027id\u0027]},"},{"line_number":433,"context_line":"            actual\u003dfake_notifier.VERSIONED_NOTIFICATIONS[0])"}],"source_content_type":"text/x-python","patch_set":22,"id":"1a95cdbc_bf4cc19e","line":430,"range":{"start_line":429,"start_character":16,"end_line":430,"end_character":58},"updated":"2016-10-10 16:39:37.000000000","message":"Why are these replacements needed in this test but not in test_volume_swap_server above? The sample for this test is using those new SWAP_ERR_* variables right?","commit_id":"5b9e8f6e52a069f55c2f8db410720290cb718aff"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"58d71f76f3a6f3e97b96e510ab59cd70ff418040","unresolved":false,"context_lines":[{"line_number":426,"context_line":"        self._verify_notification("},{"line_number":427,"context_line":"            \u0027instance-volume_swap-start\u0027,"},{"line_number":428,"context_line":"            replacements\u003d{"},{"line_number":429,"context_line":"                \u0027new_volume_id\u0027: self.cinder.SWAP_ERR_NEW_VOL,"},{"line_number":430,"context_line":"                \u0027old_volume_id\u0027: self.cinder.SWAP_ERR_VOL,"},{"line_number":431,"context_line":"                \u0027reservation_id\u0027: server[\u0027reservation_id\u0027],"},{"line_number":432,"context_line":"                \u0027uuid\u0027: server[\u0027id\u0027]},"},{"line_number":433,"context_line":"            actual\u003dfake_notifier.VERSIONED_NOTIFICATIONS[0])"}],"source_content_type":"text/x-python","patch_set":22,"id":"fa6399be_fecf00b1","line":430,"range":{"start_line":429,"start_character":16,"end_line":430,"end_character":58},"in_reply_to":"1a95cdbc_bf4cc19e","updated":"2016-10-11 12:11:14.000000000","message":"\u003e The sample for this test is using those new SWAP_ERR_* variables right?\n\nYes.","commit_id":"5b9e8f6e52a069f55c2f8db410720290cb718aff"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4848b3b01866a48cbb82067320eda6c252c4b9bd","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class TestInstanceNotificationSample("},{"line_number":22,"context_line":"        notification_sample_base.NotificationSampleTestBase):"},{"line_number":23,"context_line":"    EVENT_TYPE_SWAP_VOL_START \u003d \u0027instance-volume_swap-start\u0027"},{"line_number":24,"context_line":"    EVENT_TYPE_SWAP_VOL_END \u003d \u0027instance-volume_swap-end\u0027"},{"line_number":25,"context_line":"    EVENT_TYPE_SWAP_VOL_ERROR \u003d \u0027instance-volume_swap-error\u0027"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def setUp(self):"},{"line_number":28,"context_line":"        self.flags(use_neutron\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":23,"id":"fa6399be_a0963792","line":25,"range":{"start_line":23,"start_character":4,"end_line":25,"end_character":60},"updated":"2016-10-11 14:53:07.000000000","message":"As noted in the change below this one, I\u0027d prefer these to be module-level constants, or just hard-coded inline in the test.","commit_id":"4a2c2e8290a5522d6ae7e56d959a8643eca63c96"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"b2cd3d660a17077d47964bfec964d874cd662ba3","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class TestInstanceNotificationSample("},{"line_number":22,"context_line":"        notification_sample_base.NotificationSampleTestBase):"},{"line_number":23,"context_line":"    EVENT_TYPE_SWAP_VOL_START \u003d \u0027instance-volume_swap-start\u0027"},{"line_number":24,"context_line":"    EVENT_TYPE_SWAP_VOL_END \u003d \u0027instance-volume_swap-end\u0027"},{"line_number":25,"context_line":"    EVENT_TYPE_SWAP_VOL_ERROR \u003d \u0027instance-volume_swap-error\u0027"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def setUp(self):"},{"line_number":28,"context_line":"        self.flags(use_neutron\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":23,"id":"fa6399be_21b65e3d","line":25,"range":{"start_line":23,"start_character":4,"end_line":25,"end_character":60},"in_reply_to":"fa6399be_a0963792","updated":"2016-10-13 05:54:08.000000000","message":"Done","commit_id":"4a2c2e8290a5522d6ae7e56d959a8643eca63c96"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4848b3b01866a48cbb82067320eda6c252c4b9bd","unresolved":false,"context_lines":[{"line_number":47,"context_line":"            if self.cinder.swap_error:"},{"line_number":48,"context_line":"                return"},{"line_number":49,"context_line":"            time.sleep(0.5)"},{"line_number":50,"context_line":"        self.fail(\"Volume swap error didn\u0027t occur.\")"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def test_instance_action(self):"},{"line_number":53,"context_line":"        # A single test case is used to test most of the instance action"}],"source_content_type":"text/x-python","patch_set":23,"id":"fa6399be_a04b972a","line":50,"range":{"start_line":50,"start_character":19,"end_line":50,"end_character":50},"updated":"2016-10-11 14:53:07.000000000","message":"nit: \"Timed out waiting for volume swap error to occur.\"","commit_id":"4a2c2e8290a5522d6ae7e56d959a8643eca63c96"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"b2cd3d660a17077d47964bfec964d874cd662ba3","unresolved":false,"context_lines":[{"line_number":47,"context_line":"            if self.cinder.swap_error:"},{"line_number":48,"context_line":"                return"},{"line_number":49,"context_line":"            time.sleep(0.5)"},{"line_number":50,"context_line":"        self.fail(\"Volume swap error didn\u0027t occur.\")"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def test_instance_action(self):"},{"line_number":53,"context_line":"        # A single test case is used to test most of the instance action"}],"source_content_type":"text/x-python","patch_set":23,"id":"fa6399be_c142023e","line":50,"range":{"start_line":50,"start_character":19,"end_line":50,"end_character":50},"in_reply_to":"fa6399be_a04b972a","updated":"2016-10-13 05:54:08.000000000","message":"Done","commit_id":"4a2c2e8290a5522d6ae7e56d959a8643eca63c96"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4848b3b01866a48cbb82067320eda6c252c4b9bd","unresolved":false,"context_lines":[{"line_number":427,"context_line":"        self._verify_notification("},{"line_number":428,"context_line":"            self.EVENT_TYPE_SWAP_VOL_START,"},{"line_number":429,"context_line":"            replacements\u003d{"},{"line_number":430,"context_line":"                \u0027new_volume_id\u0027: self.cinder.SWAP_ERR_NEW_VOL,"},{"line_number":431,"context_line":"                \u0027old_volume_id\u0027: self.cinder.SWAP_ERR_OLD_VOL,"},{"line_number":432,"context_line":"                \u0027reservation_id\u0027: server[\u0027reservation_id\u0027],"},{"line_number":433,"context_line":"                \u0027uuid\u0027: server[\u0027id\u0027]},"},{"line_number":434,"context_line":"            actual\u003dfake_notifier.VERSIONED_NOTIFICATIONS[0])"}],"source_content_type":"text/x-python","patch_set":23,"id":"fa6399be_e06caf9e","line":431,"range":{"start_line":430,"start_character":16,"end_line":431,"end_character":62},"updated":"2016-10-11 14:53:07.000000000","message":"I\u0027m still not sure why you need to do these replacements as the same uuids are hard-coded into the sample already.","commit_id":"4a2c2e8290a5522d6ae7e56d959a8643eca63c96"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"b2cd3d660a17077d47964bfec964d874cd662ba3","unresolved":false,"context_lines":[{"line_number":427,"context_line":"        self._verify_notification("},{"line_number":428,"context_line":"            self.EVENT_TYPE_SWAP_VOL_START,"},{"line_number":429,"context_line":"            replacements\u003d{"},{"line_number":430,"context_line":"                \u0027new_volume_id\u0027: self.cinder.SWAP_ERR_NEW_VOL,"},{"line_number":431,"context_line":"                \u0027old_volume_id\u0027: self.cinder.SWAP_ERR_OLD_VOL,"},{"line_number":432,"context_line":"                \u0027reservation_id\u0027: server[\u0027reservation_id\u0027],"},{"line_number":433,"context_line":"                \u0027uuid\u0027: server[\u0027id\u0027]},"},{"line_number":434,"context_line":"            actual\u003dfake_notifier.VERSIONED_NOTIFICATIONS[0])"}],"source_content_type":"text/x-python","patch_set":23,"id":"fa6399be_e147061b","line":431,"range":{"start_line":430,"start_character":16,"end_line":431,"end_character":62},"in_reply_to":"fa6399be_e06caf9e","updated":"2016-10-13 05:54:08.000000000","message":"The instance-volume_swap-start.json is used in both test_volume_swap_server and test_volume_swap_server_with_error.\n\nThe volume IDs which is used in test_volume_swap_server are hard-coded in the sample file. In test_volume_swap_server_with_error, different volume IDs are used for changing(controling) fixture\u0027s behavior.\n\nSo these replacements are required.","commit_id":"4a2c2e8290a5522d6ae7e56d959a8643eca63c96"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9f9c3d2fe76c07f8202e2971d5471bff968ff04f","unresolved":false,"context_lines":[{"line_number":427,"context_line":"        self._verify_notification("},{"line_number":428,"context_line":"            self.EVENT_TYPE_SWAP_VOL_START,"},{"line_number":429,"context_line":"            replacements\u003d{"},{"line_number":430,"context_line":"                \u0027new_volume_id\u0027: self.cinder.SWAP_ERR_NEW_VOL,"},{"line_number":431,"context_line":"                \u0027old_volume_id\u0027: self.cinder.SWAP_ERR_OLD_VOL,"},{"line_number":432,"context_line":"                \u0027reservation_id\u0027: server[\u0027reservation_id\u0027],"},{"line_number":433,"context_line":"                \u0027uuid\u0027: server[\u0027id\u0027]},"},{"line_number":434,"context_line":"            actual\u003dfake_notifier.VERSIONED_NOTIFICATIONS[0])"}],"source_content_type":"text/x-python","patch_set":23,"id":"fa6399be_297c2beb","line":431,"range":{"start_line":430,"start_character":16,"end_line":431,"end_character":62},"in_reply_to":"fa6399be_e147061b","updated":"2016-10-14 21:05:49.000000000","message":"Ah OK good point.","commit_id":"4a2c2e8290a5522d6ae7e56d959a8643eca63c96"}],"nova/tests/unit/compute/test_compute_mgr.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0113f98094e0b88f09052af4619ff4d7c388c40c","unresolved":false,"context_lines":[{"line_number":1869,"context_line":"            fields.NotificationAction.VOLUME_SWAP,"},{"line_number":1870,"context_line":"            fields.NotificationPhase.ERROR,"},{"line_number":1871,"context_line":"            old_volume_id, new_volume_id,"},{"line_number":1872,"context_line":"            test.MatchType(AttributeError))"},{"line_number":1873,"context_line":""},{"line_number":1874,"context_line":"        mock_notify.reset_mock()"},{"line_number":1875,"context_line":"        volumes[old_volume_id][\u0027status\u0027] \u003d \u0027detaching\u0027"}],"source_content_type":"text/x-python","patch_set":22,"id":"1a95cdbc_7f2eb9a5","line":1872,"range":{"start_line":1872,"start_character":27,"end_line":1872,"end_character":41},"updated":"2016-10-10 16:39:37.000000000","message":"Use nova.test.TestingException.","commit_id":"5b9e8f6e52a069f55c2f8db410720290cb718aff"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"58d71f76f3a6f3e97b96e510ab59cd70ff418040","unresolved":false,"context_lines":[{"line_number":1869,"context_line":"            fields.NotificationAction.VOLUME_SWAP,"},{"line_number":1870,"context_line":"            fields.NotificationPhase.ERROR,"},{"line_number":1871,"context_line":"            old_volume_id, new_volume_id,"},{"line_number":1872,"context_line":"            test.MatchType(AttributeError))"},{"line_number":1873,"context_line":""},{"line_number":1874,"context_line":"        mock_notify.reset_mock()"},{"line_number":1875,"context_line":"        volumes[old_volume_id][\u0027status\u0027] \u003d \u0027detaching\u0027"}],"source_content_type":"text/x-python","patch_set":22,"id":"fa6399be_e3e2079f","line":1872,"range":{"start_line":1872,"start_character":27,"end_line":1872,"end_character":41},"in_reply_to":"1a95cdbc_7f2eb9a5","updated":"2016-10-11 12:11:14.000000000","message":"If TestingException is used, it will be included in sample file(instance-volume_swap-error.json).\nIMO, it is not proper for the notification sample.","commit_id":"5b9e8f6e52a069f55c2f8db410720290cb718aff"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"47340946cef31caea698fec6bf6335850309d424","unresolved":false,"context_lines":[{"line_number":1869,"context_line":"            fields.NotificationAction.VOLUME_SWAP,"},{"line_number":1870,"context_line":"            fields.NotificationPhase.ERROR,"},{"line_number":1871,"context_line":"            old_volume_id, new_volume_id,"},{"line_number":1872,"context_line":"            test.MatchType(AttributeError))"},{"line_number":1873,"context_line":""},{"line_number":1874,"context_line":"        mock_notify.reset_mock()"},{"line_number":1875,"context_line":"        volumes[old_volume_id][\u0027status\u0027] \u003d \u0027detaching\u0027"}],"source_content_type":"text/x-python","patch_set":22,"id":"fa6399be_0530d800","line":1872,"range":{"start_line":1872,"start_character":27,"end_line":1872,"end_character":41},"in_reply_to":"fa6399be_e3e2079f","updated":"2016-10-11 14:18:06.000000000","message":"OK, as noted earlier, I\u0027d prefer to see a more realistic error then, like something that cinderclient would raise back to us and rely on a coding error in initialize_connection, like how about cinder_exception.NotFound here?\n\nhttps://github.com/openstack/nova/blob/63b781d63ba9f147a665f82a24bf583ddedbab84/nova/volume/cinder.py#L211","commit_id":"5b9e8f6e52a069f55c2f8db410720290cb718aff"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0113f98094e0b88f09052af4619ff4d7c388c40c","unresolved":false,"context_lines":[{"line_number":1896,"context_line":"            fields.NotificationAction.VOLUME_SWAP,"},{"line_number":1897,"context_line":"            fields.NotificationPhase.ERROR,"},{"line_number":1898,"context_line":"            old_volume_id, new_volume_id,"},{"line_number":1899,"context_line":"            test.MatchType(AttributeError))"},{"line_number":1900,"context_line":""},{"line_number":1901,"context_line":"    @mock.patch(\u0027nova.compute.utils.notify_about_volume_swap\u0027)"},{"line_number":1902,"context_line":"    @mock.patch(\u0027nova.db.block_device_mapping_get_by_instance_and_volume_id\u0027)"}],"source_content_type":"text/x-python","patch_set":22,"id":"1a95cdbc_1f14d54a","line":1899,"range":{"start_line":1899,"start_character":27,"end_line":1899,"end_character":41},"updated":"2016-10-10 16:39:37.000000000","message":"ditto","commit_id":"5b9e8f6e52a069f55c2f8db410720290cb718aff"}],"nova/tests/unit/compute/test_compute_utils.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0113f98094e0b88f09052af4619ff4d7c388c40c","unresolved":false,"context_lines":[{"line_number":593,"context_line":""},{"line_number":594,"context_line":"        for attr in (\u0027display_name\u0027, \u0027created_at\u0027, \u0027launched_at\u0027,"},{"line_number":595,"context_line":"                     \u0027state\u0027, \u0027task_state\u0027):"},{"line_number":596,"context_line":"            self.assertIn(attr, payload, \"Key %s not in payload\" % attr)"},{"line_number":597,"context_line":""},{"line_number":598,"context_line":"        self.assertEqual(uuids.fake_image_ref, payload[\u0027image_uuid\u0027])"},{"line_number":599,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"1a95cdbc_220b3a25","line":596,"range":{"start_line":596,"start_character":41,"end_line":596,"end_character":71},"updated":"2016-10-10 16:39:37.000000000","message":"We don\u0027t need this, it just muddles the error message.","commit_id":"5b9e8f6e52a069f55c2f8db410720290cb718aff"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"58d71f76f3a6f3e97b96e510ab59cd70ff418040","unresolved":false,"context_lines":[{"line_number":593,"context_line":""},{"line_number":594,"context_line":"        for attr in (\u0027display_name\u0027, \u0027created_at\u0027, \u0027launched_at\u0027,"},{"line_number":595,"context_line":"                     \u0027state\u0027, \u0027task_state\u0027):"},{"line_number":596,"context_line":"            self.assertIn(attr, payload, \"Key %s not in payload\" % attr)"},{"line_number":597,"context_line":""},{"line_number":598,"context_line":"        self.assertEqual(uuids.fake_image_ref, payload[\u0027image_uuid\u0027])"},{"line_number":599,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"fa6399be_281dbe73","line":596,"range":{"start_line":596,"start_character":41,"end_line":596,"end_character":71},"in_reply_to":"1a95cdbc_220b3a25","updated":"2016-10-11 12:11:14.000000000","message":"Done","commit_id":"5b9e8f6e52a069f55c2f8db410720290cb718aff"}],"releasenotes/notes/add-swap-volume-notifications-bb7e14230fccfd6e.yaml":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0113f98094e0b88f09052af4619ff4d7c388c40c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - The following versioned swap volume notifications have been added"},{"line_number":4,"context_line":"    in the compute manager."},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    \u0027instance.volume_swap.start\u0027"}],"source_content_type":"text/x-yaml","patch_set":22,"id":"1a95cdbc_22225aa3","line":3,"range":{"start_line":3,"start_character":2,"end_line":3,"end_character":4},"updated":"2016-10-10 16:39:37.000000000","message":"You\u0027ll want to do this for ReST format:\n\n  - |\n    The following versioned swap volume notifications...\n\nSee how it doesn\u0027t render properly without that:\n\nhttp://docs-draft.openstack.org/55/328055/22/check/gate-nova-releasenotes/66683d6//releasenotes/build/html/unreleased.html#new-features","commit_id":"5b9e8f6e52a069f55c2f8db410720290cb718aff"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"58d71f76f3a6f3e97b96e510ab59cd70ff418040","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - The following versioned swap volume notifications have been added"},{"line_number":4,"context_line":"    in the compute manager."},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    \u0027instance.volume_swap.start\u0027"}],"source_content_type":"text/x-yaml","patch_set":22,"id":"fa6399be_e803c60d","line":3,"range":{"start_line":3,"start_character":2,"end_line":3,"end_character":4},"in_reply_to":"1a95cdbc_22225aa3","updated":"2016-10-11 12:11:14.000000000","message":"Done","commit_id":"5b9e8f6e52a069f55c2f8db410720290cb718aff"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0113f98094e0b88f09052af4619ff4d7c388c40c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - The following versioned swap volume notifications have been added"},{"line_number":4,"context_line":"    in the compute manager."},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    \u0027instance.volume_swap.start\u0027"},{"line_number":7,"context_line":"    \u0027instance.volume_swap.end\u0027"}],"source_content_type":"text/x-yaml","patch_set":22,"id":"1a95cdbc_6238e2d3","line":4,"range":{"start_line":4,"start_character":26,"end_line":4,"end_character":27},"updated":"2016-10-10 16:39:37.000000000","message":":","commit_id":"5b9e8f6e52a069f55c2f8db410720290cb718aff"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"58d71f76f3a6f3e97b96e510ab59cd70ff418040","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - The following versioned swap volume notifications have been added"},{"line_number":4,"context_line":"    in the compute manager."},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    \u0027instance.volume_swap.start\u0027"},{"line_number":7,"context_line":"    \u0027instance.volume_swap.end\u0027"}],"source_content_type":"text/x-yaml","patch_set":22,"id":"fa6399be_03fffb01","line":4,"range":{"start_line":4,"start_character":26,"end_line":4,"end_character":27},"in_reply_to":"1a95cdbc_6238e2d3","updated":"2016-10-11 12:11:14.000000000","message":"Done","commit_id":"5b9e8f6e52a069f55c2f8db410720290cb718aff"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0113f98094e0b88f09052af4619ff4d7c388c40c","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - The following versioned swap volume notifications have been added"},{"line_number":4,"context_line":"    in the compute manager."},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    \u0027instance.volume_swap.start\u0027"},{"line_number":7,"context_line":"    \u0027instance.volume_swap.end\u0027"},{"line_number":8,"context_line":"    \u0027instance.volume_swap.error\u0027"}],"source_content_type":"text/x-yaml","patch_set":22,"id":"1a95cdbc_6211c251","line":8,"range":{"start_line":6,"start_character":4,"end_line":8,"end_character":32},"updated":"2016-10-10 16:39:37.000000000","message":"Make this a bulleted list. Also, it seems we should have this release note in the bottom change for start/end, and then just update it with error in this change.","commit_id":"5b9e8f6e52a069f55c2f8db410720290cb718aff"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"58d71f76f3a6f3e97b96e510ab59cd70ff418040","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - The following versioned swap volume notifications have been added"},{"line_number":4,"context_line":"    in the compute manager."},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    \u0027instance.volume_swap.start\u0027"},{"line_number":7,"context_line":"    \u0027instance.volume_swap.end\u0027"},{"line_number":8,"context_line":"    \u0027instance.volume_swap.error\u0027"}],"source_content_type":"text/x-yaml","patch_set":22,"id":"fa6399be_83130b5c","line":8,"range":{"start_line":6,"start_character":4,"end_line":8,"end_character":32},"in_reply_to":"1a95cdbc_6211c251","updated":"2016-10-11 12:11:14.000000000","message":"Done","commit_id":"5b9e8f6e52a069f55c2f8db410720290cb718aff"}]}
