)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5622f03b90fc41d15d863fd3d6cba2bf42046a47","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Alex Szarka \u003cxavvior@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2017-06-20 18:34:49 +0200"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[WIP]Transform instance-live_migration_abort notification"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I27608f60dd5f8458e476286c6991c47dba7852b1"},{"line_number":10,"context_line":"Implements: bp versioned-notification-transformation-pike"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"5f201791_a5839304","line":7,"range":{"start_line":7,"start_character":1,"end_line":7,"end_character":4},"updated":"2017-06-21 09:13:14.000000000","message":"you can drop the WIP as this patch is closing to completion","commit_id":"6d6c2c485e43f80127adfc6ce3dbfe2e50c584f5"}],"doc/notification_samples/instance-live_migration_abort-end.json":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"d99be9c20cd7b24ee20d4f9c3ef53faca570d975","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        },"},{"line_number":76,"context_line":"        \"nova_object.name\":\"InstanceActionPayload\","},{"line_number":77,"context_line":"        \"nova_object.namespace\":\"nova\","},{"line_number":78,"context_line":"        \"nova_object.version\":\"1.3\""},{"line_number":79,"context_line":"    },"},{"line_number":80,"context_line":"    \"priority\":\"INFO\","},{"line_number":81,"context_line":"    \"publisher_id\":\"nova-compute:compute\""}],"source_content_type":"application/json","patch_set":26,"id":"ff346bd7_1b17f2ef","line":78,"updated":"2017-07-26 09:16:56.000000000","message":"Needs a rebase as InstanceActionPayload is already on version 1.4 which adds the block_devices key to the payload","commit_id":"51069b874d6860d465f59df3c4fe486f277371a3"}],"nova/tests/functional/api/client.py":[{"author":{"_account_id":18602,"name":"Gábor Antal","email":"antal@inf.u-szeged.hu","username":"antal"},"change_message_id":"3c727ba0ec636d9b470b6f8d8a4b94e614afbe5e","unresolved":false,"context_lines":[{"line_number":321,"context_line":"        return self.api_delete(\u0027/os-volumes/%s\u0027 % volume_id)"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"    def abort_live_migration(self, server_id, migration_id):"},{"line_number":324,"context_line":"        return self.api_delete(\u0027/servers/%s/migrations/%s\u0027 %"},{"line_number":325,"context_line":"                               (server_id, migration_id))"},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"    def get_active_migrations(self, server_id):"},{"line_number":328,"context_line":"        return self.api_get(\u0027/servers/%s/migrations\u0027 %"}],"source_content_type":"text/x-python","patch_set":23,"id":"3f1d235d_2d4dc5c3","line":325,"range":{"start_line":324,"start_character":60,"end_line":325,"end_character":57},"updated":"2017-07-04 11:35:41.000000000","message":"I think here we can also move this code up.","commit_id":"b81d76611013c4ddc0b2d4f5adde13a8f6a3c7ee"},{"author":{"_account_id":18602,"name":"Gábor Antal","email":"antal@inf.u-szeged.hu","username":"antal"},"change_message_id":"3c727ba0ec636d9b470b6f8d8a4b94e614afbe5e","unresolved":false,"context_lines":[{"line_number":326,"context_line":""},{"line_number":327,"context_line":"    def get_active_migrations(self, server_id):"},{"line_number":328,"context_line":"        return self.api_get(\u0027/servers/%s/migrations\u0027 %"},{"line_number":329,"context_line":"                            (server_id)).body[\u0027migrations\u0027]"},{"line_number":330,"context_line":""},{"line_number":331,"context_line":"    def get_snapshot(self, snap_id):"},{"line_number":332,"context_line":"        return self.api_get(\u0027/os-snapshots/%s\u0027 % snap_id).body[\u0027snapshot\u0027]"}],"source_content_type":"text/x-python","patch_set":23,"id":"3f1d235d_edc8ed22","line":329,"range":{"start_line":329,"start_character":28,"end_line":329,"end_character":59},"updated":"2017-07-04 11:35:41.000000000","message":"ditto","commit_id":"b81d76611013c4ddc0b2d4f5adde13a8f6a3c7ee"}],"nova/tests/functional/notification_sample_tests/notification_sample_base.py":[{"author":{"_account_id":18602,"name":"Gábor Antal","email":"antal@inf.u-szeged.hu","username":"antal"},"change_message_id":"050cbea056a07bad1bac0d5001b9695255f96114","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def setUp(self):"},{"line_number":57,"context_line":"        super(NotificationSampleTestBase, self).setUp()"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        api_fixture \u003d self.useFixture(nova_fixtures.OSAPIFixture("},{"line_number":60,"context_line":"                api_version\u003d\u0027v2.1\u0027))"},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_e56ce3d1","side":"PARENT","line":58,"updated":"2017-01-18 16:47:38.000000000","message":"This change seems irrelevant.","commit_id":"3f0b023825bc5f4c54ad8b74b658954684175678"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bec4381dd5da160557757ba0e5180d7cbeaba1dd","unresolved":false,"context_lines":[{"line_number":255,"context_line":"            retries +\u003d 1"},{"line_number":256,"context_line":"            migrations \u003d self.admin_api.get_active_migrations(server[\u0027id\u0027])"},{"line_number":257,"context_line":"            if (len(migrations) \u003e 0 and"},{"line_number":258,"context_line":"                    migrations[0][\u0027status\u0027] not in [\u0027queued\u0027, \u0027preparing\u0027]):"},{"line_number":259,"context_line":"                return migrations"},{"line_number":260,"context_line":"            if retries \u003d\u003d max_retries:"},{"line_number":261,"context_line":"                self.fail(\u0027The migration table left empty.\u0027)"}],"source_content_type":"text/x-python","patch_set":32,"id":"3f4b6375_e3f41a5d","line":258,"updated":"2017-11-06 15:11:10.000000000","message":"Can you explain why this line needed to change, please?","commit_id":"b4b61240f7d2da655ee6d61d18bc1e9cc39a4699"},{"author":{"_account_id":17685,"name":"Elod Illes","email":"elod.illes@est.tech","username":"elod.illes"},"change_message_id":"74418e8a26782e24db465c67d102f20bc8388eb2","unresolved":false,"context_lines":[{"line_number":255,"context_line":"            retries +\u003d 1"},{"line_number":256,"context_line":"            migrations \u003d self.admin_api.get_active_migrations(server[\u0027id\u0027])"},{"line_number":257,"context_line":"            if (len(migrations) \u003e 0 and"},{"line_number":258,"context_line":"                    migrations[0][\u0027status\u0027] not in [\u0027queued\u0027, \u0027preparing\u0027]):"},{"line_number":259,"context_line":"                return migrations"},{"line_number":260,"context_line":"            if retries \u003d\u003d max_retries:"},{"line_number":261,"context_line":"                self.fail(\u0027The migration table left empty.\u0027)"}],"source_content_type":"text/x-python","patch_set":32,"id":"3f4b6375_ee3e3e89","line":258,"in_reply_to":"3f4b6375_e3f41a5d","updated":"2017-11-06 17:48:20.000000000","message":"The live-migration status changes are in the following order:\nqueued -\u003e preparing -\u003e running ...\nSo if we just check for the !\u003d \u0027preparing\u0027 it could happen that we return in the \u0027queued\u0027 state, and the self.admin_api.delete_migration call fails because meanwhile the migration reached \u0027preparing\u0027 state:\n\n\"Migration 2 state of instance xxxx is preparing. Cannot abort live migration while the migration is in this state.\"\n\n(Which was the case during I ran the tests :))","commit_id":"b4b61240f7d2da655ee6d61d18bc1e9cc39a4699"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"3c316a32a6869ddd446633ea450088db97373a48","unresolved":false,"context_lines":[{"line_number":255,"context_line":"            retries +\u003d 1"},{"line_number":256,"context_line":"            migrations \u003d self.admin_api.get_active_migrations(server[\u0027id\u0027])"},{"line_number":257,"context_line":"            if (len(migrations) \u003e 0 and"},{"line_number":258,"context_line":"                    migrations[0][\u0027status\u0027] not in [\u0027queued\u0027, \u0027preparing\u0027]):"},{"line_number":259,"context_line":"                return migrations"},{"line_number":260,"context_line":"            if retries \u003d\u003d max_retries:"},{"line_number":261,"context_line":"                self.fail(\u0027The migration table left empty.\u0027)"}],"source_content_type":"text/x-python","patch_set":32,"id":"3f4b6375_89e34405","line":258,"in_reply_to":"3f4b6375_ee3e3e89","updated":"2017-11-06 18:36:08.000000000","message":"got it. thanks for the explanation! :)","commit_id":"b4b61240f7d2da655ee6d61d18bc1e9cc39a4699"}],"nova/tests/functional/notification_sample_tests/test_instance.py":[{"author":{"_account_id":18602,"name":"Gábor Antal","email":"antal@inf.u-szeged.hu","username":"antal"},"change_message_id":"050cbea056a07bad1bac0d5001b9695255f96114","unresolved":false,"context_lines":[{"line_number":541,"context_line":"            actual\u003dfake_notifier.VERSIONED_NOTIFICATIONS[1])"},{"line_number":542,"context_line":""},{"line_number":543,"context_line":"    def _test_live_migration_abort(self, server):"},{"line_number":544,"context_line":"        self.api.microversion \u003d api_version_request._MAX_API_VERSION"},{"line_number":545,"context_line":"        self.admin_api.microversion \u003d api_version_request._MAX_API_VERSION"},{"line_number":546,"context_line":""},{"line_number":547,"context_line":"        #Trying to create new host. maybe with aggregate?"},{"line_number":548,"context_line":"        \"\"\"aggregate \u003d self.admin_api.api_post(\u0027/os-aggregates\u0027, {"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_d24faf8f","line":545,"range":{"start_line":544,"start_character":0,"end_line":545,"end_character":74},"updated":"2017-01-18 16:47:38.000000000","message":"They should be something like this:\n\n    self.api.microversion \u003d \\\n        api_version_request.max_api_version().get_string()\n    self.admin_api.microversion \u003d \\\n        api_version_request.max_api_version().get_string()\n\nYou can see this at [1].\n\nAlso, at [2], I introduced a method called \"_reset_api_microversions\", which resets the microversion you modified at the start of the method. You should also restore them to their original state after the test.\n\n[1]: https://github.com/openstack/nova/blob/120bdee5523637ab97b2525c578801dedca3538a/nova/tests/functional/api_sample_tests/test_versions.py#L26\n[2]: https://review.openstack.org/#/c/396225","commit_id":"6c51834f5a1dceccd2a9e8be3d3bc612508eacae"},{"author":{"_account_id":21239,"name":"Alex Szarka","email":"szarka@inf.u-szeged.hu","username":"xavvior"},"change_message_id":"ce7817353b74b41945f2e45d494a496d46416d4c","unresolved":false,"context_lines":[{"line_number":544,"context_line":"        self.api.microversion \u003d api_version_request._MAX_API_VERSION"},{"line_number":545,"context_line":"        self.admin_api.microversion \u003d api_version_request._MAX_API_VERSION"},{"line_number":546,"context_line":""},{"line_number":547,"context_line":"        #Trying to create new host. maybe with aggregate?"},{"line_number":548,"context_line":"        \"\"\"aggregate \u003d self.admin_api.api_post(\u0027/os-aggregates\u0027, {"},{"line_number":549,"context_line":"            \"aggregate\":"},{"line_number":550,"context_line":"            {"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_6872314b","line":547,"range":{"start_line":547,"start_character":8,"end_line":547,"end_character":57},"updated":"2017-01-16 01:57:44.000000000","message":"labeling","commit_id":"6c51834f5a1dceccd2a9e8be3d3bc612508eacae"},{"author":{"_account_id":21239,"name":"Alex Szarka","email":"szarka@inf.u-szeged.hu","username":"xavvior"},"change_message_id":"ce7817353b74b41945f2e45d494a496d46416d4c","unresolved":false,"context_lines":[{"line_number":562,"context_line":""},{"line_number":563,"context_line":"        post \u003d {"},{"line_number":564,"context_line":"            \"os-migrateLive\": {"},{"line_number":565,"context_line":"                # The compute host should replace (and create) with a new host"},{"line_number":566,"context_line":"                # Maybe because of this return with empty array the migration list api call."},{"line_number":567,"context_line":"                \"host\": \u0027compute\u0027,"},{"line_number":568,"context_line":"                \"block_migration\": True,"},{"line_number":569,"context_line":"                \"force\": True"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_888f5d22","line":566,"range":{"start_line":565,"start_character":0,"end_line":566,"end_character":92},"updated":"2017-01-16 01:57:44.000000000","message":"ditto","commit_id":"6c51834f5a1dceccd2a9e8be3d3bc612508eacae"},{"author":{"_account_id":21239,"name":"Alex Szarka","email":"szarka@inf.u-szeged.hu","username":"xavvior"},"change_message_id":"ce7817353b74b41945f2e45d494a496d46416d4c","unresolved":false,"context_lines":[{"line_number":573,"context_line":"        print server"},{"line_number":574,"context_line":"        data \u003d []"},{"line_number":575,"context_line":""},{"line_number":576,"context_line":"        # The get_active_migrations api call returned with empty array."},{"line_number":577,"context_line":"        # But why??"},{"line_number":578,"context_line":"        \"\"\"while True:"},{"line_number":579,"context_line":"            data \u003d self.admin_api.get_active_migrations(server[\u0027uuid\u0027])"},{"line_number":580,"context_line":"            if data !\u003d []:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_08a44da4","line":577,"range":{"start_line":576,"start_character":0,"end_line":577,"end_character":19},"updated":"2017-01-16 01:57:44.000000000","message":"ditto","commit_id":"6c51834f5a1dceccd2a9e8be3d3bc612508eacae"},{"author":{"_account_id":21239,"name":"Alex Szarka","email":"szarka@inf.u-szeged.hu","username":"xavvior"},"change_message_id":"ce7817353b74b41945f2e45d494a496d46416d4c","unresolved":false,"context_lines":[{"line_number":582,"context_line":"                break\"\"\""},{"line_number":583,"context_line":"        #self._wait_for_state_change(self.admin_api, server, \u0027MIGRATING\u0027)"},{"line_number":584,"context_line":""},{"line_number":585,"context_line":"        #I can\u0027t call this api-call while i dont know the migrating uuid"},{"line_number":586,"context_line":"        #But the migrating table is empty"},{"line_number":587,"context_line":""},{"line_number":588,"context_line":"        #self.admin_api.abort_live_migration(server[\u0027id\u0027], 0)"},{"line_number":589,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7a3c09a3_289f4951","line":586,"range":{"start_line":585,"start_character":2,"end_line":586,"end_character":41},"updated":"2017-01-16 01:57:44.000000000","message":"ditto","commit_id":"6c51834f5a1dceccd2a9e8be3d3bc612508eacae"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"14982af612edf92a272de49c07f71691959984c5","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from nova import context"},{"line_number":18,"context_line":"from nova import exception"},{"line_number":19,"context_line":"from nova.api.openstack import api_version_request"},{"line_number":20,"context_line":"from nova.tests import fixtures"},{"line_number":21,"context_line":"from nova.tests.functional.notification_sample_tests \\"},{"line_number":22,"context_line":"    import notification_sample_base"}],"source_content_type":"text/x-python","patch_set":6,"id":"dfeb2761_782657ba","line":19,"range":{"start_line":19,"start_character":0,"end_line":19,"end_character":50},"updated":"2017-03-31 05:10:17.000000000","message":"It should be moved to line 17.","commit_id":"8daf0ca5db4f4944df57e750e0da788f433cb4bd"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"14982af612edf92a272de49c07f71691959984c5","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from nova.tests.functional.notification_sample_tests \\"},{"line_number":22,"context_line":"    import notification_sample_base"},{"line_number":23,"context_line":"from nova.tests.unit import fake_notifier"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class TestInstanceNotificationMigrationSample("},{"line_number":26,"context_line":"    notification_sample_base.NotificationSampleTestBase):"},{"line_number":27,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"dfeb2761_b82cdf99","line":24,"updated":"2017-03-31 05:10:17.000000000","message":"Add one blank line.","commit_id":"8daf0ca5db4f4944df57e750e0da788f433cb4bd"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"14982af612edf92a272de49c07f71691959984c5","unresolved":false,"context_lines":[{"line_number":49,"context_line":"                \"force\": True"},{"line_number":50,"context_line":"            }"},{"line_number":51,"context_line":"        }"},{"line_number":52,"context_line":"        print server"},{"line_number":53,"context_line":"        self.admin_api.post_server_action(server[\u0027id\u0027], post)"},{"line_number":54,"context_line":"        print self.admin_api.api_get(\"/servers/%s/migrations\" % server[\u0027id\u0027])"},{"line_number":55,"context_line":"        self._wait_for_state_change(self.api, server, \u0027MIGRATING\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"dfeb2761_754ae280","line":52,"range":{"start_line":52,"start_character":0,"end_line":52,"end_character":20},"updated":"2017-03-31 05:10:17.000000000","message":"It should be removed.","commit_id":"8daf0ca5db4f4944df57e750e0da788f433cb4bd"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"14982af612edf92a272de49c07f71691959984c5","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        }"},{"line_number":52,"context_line":"        print server"},{"line_number":53,"context_line":"        self.admin_api.post_server_action(server[\u0027id\u0027], post)"},{"line_number":54,"context_line":"        print self.admin_api.api_get(\"/servers/%s/migrations\" % server[\u0027id\u0027])"},{"line_number":55,"context_line":"        self._wait_for_state_change(self.api, server, \u0027MIGRATING\u0027)"},{"line_number":56,"context_line":"        print self.admin_api.api_get(\"/servers/%s/migrations\" % server[\u0027id\u0027])"},{"line_number":57,"context_line":"        self._wait_for_state_change(self.api, server, \u0027ACTIVE\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"dfeb2761_555fde40","line":54,"range":{"start_line":54,"start_character":8,"end_line":54,"end_character":14},"updated":"2017-03-31 05:10:17.000000000","message":"ditto","commit_id":"8daf0ca5db4f4944df57e750e0da788f433cb4bd"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"14982af612edf92a272de49c07f71691959984c5","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        self.admin_api.post_server_action(server[\u0027id\u0027], post)"},{"line_number":54,"context_line":"        print self.admin_api.api_get(\"/servers/%s/migrations\" % server[\u0027id\u0027])"},{"line_number":55,"context_line":"        self._wait_for_state_change(self.api, server, \u0027MIGRATING\u0027)"},{"line_number":56,"context_line":"        print self.admin_api.api_get(\"/servers/%s/migrations\" % server[\u0027id\u0027])"},{"line_number":57,"context_line":"        self._wait_for_state_change(self.api, server, \u0027ACTIVE\u0027)"},{"line_number":58,"context_line":"        print self.admin_api.api_get(\"/servers/%s/migrations\" % server[\u0027id\u0027])"},{"line_number":59,"context_line":"        # The get_active_migrations api call returned with empty array."}],"source_content_type":"text/x-python","patch_set":6,"id":"dfeb2761_f555d21e","line":56,"range":{"start_line":56,"start_character":8,"end_line":56,"end_character":14},"updated":"2017-03-31 05:10:17.000000000","message":"ditto","commit_id":"8daf0ca5db4f4944df57e750e0da788f433cb4bd"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"14982af612edf92a272de49c07f71691959984c5","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        self._wait_for_state_change(self.api, server, \u0027MIGRATING\u0027)"},{"line_number":56,"context_line":"        print self.admin_api.api_get(\"/servers/%s/migrations\" % server[\u0027id\u0027])"},{"line_number":57,"context_line":"        self._wait_for_state_change(self.api, server, \u0027ACTIVE\u0027)"},{"line_number":58,"context_line":"        print self.admin_api.api_get(\"/servers/%s/migrations\" % server[\u0027id\u0027])"},{"line_number":59,"context_line":"        # The get_active_migrations api call returned with empty array."},{"line_number":60,"context_line":"        # But why??"},{"line_number":61,"context_line":"        # self._wait_for_state_change(self.admin_api, server, \u0027MIGRATING\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"dfeb2761_d5308e0a","line":58,"range":{"start_line":58,"start_character":8,"end_line":58,"end_character":14},"updated":"2017-03-31 05:10:17.000000000","message":"ditto","commit_id":"8daf0ca5db4f4944df57e750e0da788f433cb4bd"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"14982af612edf92a272de49c07f71691959984c5","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        # self.admin_api.abort_live_migration(server[\u0027id\u0027], 0)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        # self._wait_for_state_change(self.admin_api, server, \u0027ACTIVE\u0027)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"class TestInstanceNotificationSample("},{"line_number":71,"context_line":"        notification_sample_base.NotificationSampleTestBase):"}],"source_content_type":"text/x-python","patch_set":6,"id":"dfeb2761_753f82d6","line":68,"updated":"2017-03-31 05:10:17.000000000","message":"Some verification should be added.\n\nself._verify_notification(...","commit_id":"8daf0ca5db4f4944df57e750e0da788f433cb4bd"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"14982af612edf92a272de49c07f71691959984c5","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        # self.admin_api.abort_live_migration(server[\u0027id\u0027], 0)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        # self._wait_for_state_change(self.admin_api, server, \u0027ACTIVE\u0027)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"class TestInstanceNotificationSample("},{"line_number":71,"context_line":"        notification_sample_base.NotificationSampleTestBase):"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"dfeb2761_d827a3b6","line":69,"updated":"2017-03-31 05:10:17.000000000","message":"Add one blank line.","commit_id":"8daf0ca5db4f4944df57e750e0da788f433cb4bd"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"596f5e2cb0cab8467594b417f20ae9c62b5e8872","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        self.admin_api.microversion \u003d api_version_request._MAX_API_VERSION"},{"line_number":98,"context_line":"        self.compute2 \u003d self.start_service(\u0027compute\u0027, host\u003d\u0027compute2\u0027)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def test_live_migration_abort(self):"},{"line_number":101,"context_line":"        server \u003d self._boot_a_server("},{"line_number":102,"context_line":"            extra_params\u003d{\u0027networks\u0027: [{\u0027port\u0027: self.neutron.port_1[\u0027id\u0027]}]})"},{"line_number":103,"context_line":"        fake_notifier.reset()"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f231b9d_ea6ae8b0","line":100,"updated":"2017-06-15 16:16:49.000000000","message":"You can move this test to the TestInstanceNotificationSampleWithMultipleCompute class. That sets up two computes properly so you can migrate between them easily and don\u0027t have to repeat the test setup code.","commit_id":"bc8407e8ba17cfb1c6e7ab1836d081a24b8c79bc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"596f5e2cb0cab8467594b417f20ae9c62b5e8872","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        self.admin_api.post_server_action(server[\u0027id\u0027], post)"},{"line_number":116,"context_line":"        print self.admin_api.api_get(\"/servers/%s/migrations\" % server[\u0027id\u0027])"},{"line_number":117,"context_line":"        self._wait_for_state_change(self.api, server, \u0027MIGRATING\u0027)"},{"line_number":118,"context_line":"        print self.admin_api.api_get(\"/servers/%s/migrations\" % server[\u0027id\u0027])"},{"line_number":119,"context_line":"        self._wait_for_state_change(self.api, server, \u0027ACTIVE\u0027)"},{"line_number":120,"context_line":"        print self.admin_api.api_get(\"/servers/%s/migrations\" % server[\u0027id\u0027])"},{"line_number":121,"context_line":"        # The get_active_migrations api call returned with empty array."}],"source_content_type":"text/x-python","patch_set":8,"id":"7f231b9d_2a5460fd","line":118,"updated":"2017-06-15 16:16:49.000000000","message":"You don\u0027t get a migration record here because the test is too fast. \nthe sequence in nova is to set the instance state first then create the migration record. \nI added two seconds sleep to fake virt driver\u0027s live_migration() method and added a second sleep before the migration get here. Then I will get the migration record properly. \n\nI think the direct sleep is not the best solution for that but basically you can mock/fake the fake virt driver live_migrate call and add some extra sleep call in that. Then here you have to poll the nova API until the migration record appears.","commit_id":"bc8407e8ba17cfb1c6e7ab1836d081a24b8c79bc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5622f03b90fc41d15d863fd3d6cba2bf42046a47","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        self.admin_api.post_server_action(server[\u0027id\u0027], post)"},{"line_number":92,"context_line":"        self._wait_for_state_change(self.api, server, \u0027MIGRATING\u0027)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        \"\"\"We need synchronize the migration table (it should not be empty)"},{"line_number":95,"context_line":"        and the server status (it should be in \u0027migrating\u0027 status). These"},{"line_number":96,"context_line":"        conditions are met for a really short of time. The migration table is"},{"line_number":97,"context_line":"        empty when the server switches to \u0027migrating\u0027 status. We need to send"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f201791_8545371a","line":94,"range":{"start_line":94,"start_character":14,"end_line":94,"end_character":30},"updated":"2017-06-21 09:13:14.000000000","message":"nit:s/need synchronize/need to synchronize/","commit_id":"6d6c2c485e43f80127adfc6ce3dbfe2e50c584f5"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5622f03b90fc41d15d863fd3d6cba2bf42046a47","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        conditions are met for a really short of time. The migration table is"},{"line_number":97,"context_line":"        empty when the server switches to \u0027migrating\u0027 status. We need to send"},{"line_number":98,"context_line":"        the abort request exactly when these conditions are met."},{"line_number":99,"context_line":"        \"\"\""},{"line_number":100,"context_line":"        retry_count \u003d 0"},{"line_number":101,"context_line":"        while True:"},{"line_number":102,"context_line":"            retry_count +\u003d 1"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f201791_65cfbb7f","line":99,"updated":"2017-06-21 09:13:14.000000000","message":"It is party because nova.virt.fake.FakeDriver.live_migration() call does nothing time consuming while in realty that will take time. If the current polling is stable enough then it is OK as is. However if the below solution is not stable on the gate then we might need to add some delay into the fake virt driver.","commit_id":"6d6c2c485e43f80127adfc6ce3dbfe2e50c584f5"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5622f03b90fc41d15d863fd3d6cba2bf42046a47","unresolved":false,"context_lines":[{"line_number":108,"context_line":"                                                    migration[\u0027id\u0027])"},{"line_number":109,"context_line":"                break"},{"line_number":110,"context_line":"            if retry_count \u003d\u003d 100:"},{"line_number":111,"context_line":"                # 100 retri count is equal with 1 sec"},{"line_number":112,"context_line":"                self.fail(\u0027The conditions have not been met within the \u0027,"},{"line_number":113,"context_line":"                          \u0027specified time. The migrating table is empty or \u0027"},{"line_number":114,"context_line":"                          \u0027the server status is not in migrating status.\u0027)"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f201791_a55953ff","line":111,"range":{"start_line":111,"start_character":22,"end_line":111,"end_character":27},"updated":"2017-06-21 09:13:14.000000000","message":"nit:retry","commit_id":"6d6c2c485e43f80127adfc6ce3dbfe2e50c584f5"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5622f03b90fc41d15d863fd3d6cba2bf42046a47","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                break"},{"line_number":110,"context_line":"            if retry_count \u003d\u003d 100:"},{"line_number":111,"context_line":"                # 100 retri count is equal with 1 sec"},{"line_number":112,"context_line":"                self.fail(\u0027The conditions have not been met within the \u0027,"},{"line_number":113,"context_line":"                          \u0027specified time. The migrating table is empty or \u0027"},{"line_number":114,"context_line":"                          \u0027the server status is not in migrating status.\u0027)"},{"line_number":115,"context_line":"            time.sleep(.01)"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f201791_65733b82","line":112,"range":{"start_line":112,"start_character":21,"end_line":112,"end_character":25},"updated":"2017-06-21 09:13:14.000000000","message":"dump the migration table and the server status to the error message to see which problem caused the failure","commit_id":"6d6c2c485e43f80127adfc6ce3dbfe2e50c584f5"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"e85b7b539a15fc2c8b992db262ce7412374aefee","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        }"},{"line_number":90,"context_line":"        self.admin_api.post_server_action(server[\u0027id\u0027], post)"},{"line_number":91,"context_line":"        self._wait_for_state_change(self.api, server, \u0027MIGRATING\u0027)"},{"line_number":92,"context_line":"        time.sleep(1)"},{"line_number":93,"context_line":"        migrations \u003d self.admin_api.get_active_migrations(server[\u0027id\u0027])"},{"line_number":94,"context_line":"        self.admin_api.abort_live_migration(server[\u0027id\u0027], migrations[0][\u0027id\u0027])"},{"line_number":95,"context_line":"        self._wait_for_notification(\u0027instance.live_migration_abort.start\u0027)"}],"source_content_type":"text/x-python","patch_set":20,"id":"5f201791_b2d472ea","line":92,"updated":"2017-06-26 16:28:57.000000000","message":"If we\u0027re waiting for the server to go into MIGRATING task state, why do we need to time.sleep(1) here?","commit_id":"e37ddac3be0b520cdeb039c93df46256738fc8ea"},{"author":{"_account_id":21239,"name":"Alex Szarka","email":"szarka@inf.u-szeged.hu","username":"xavvior"},"change_message_id":"c10e559caa3a25838154f90d6d227cfd1a645410","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        }"},{"line_number":90,"context_line":"        self.admin_api.post_server_action(server[\u0027id\u0027], post)"},{"line_number":91,"context_line":"        self._wait_for_state_change(self.api, server, \u0027MIGRATING\u0027)"},{"line_number":92,"context_line":"        time.sleep(1)"},{"line_number":93,"context_line":"        migrations \u003d self.admin_api.get_active_migrations(server[\u0027id\u0027])"},{"line_number":94,"context_line":"        self.admin_api.abort_live_migration(server[\u0027id\u0027], migrations[0][\u0027id\u0027])"},{"line_number":95,"context_line":"        self._wait_for_notification(\u0027instance.live_migration_abort.start\u0027)"}],"source_content_type":"text/x-python","patch_set":20,"id":"5f201791_5cb2b14a","line":92,"in_reply_to":"5f201791_b2d472ea","updated":"2017-06-27 13:21:27.000000000","message":"We need synchronize the migration table (it should not be empty) and the server status (it should be in \u0027migrating\u0027 status). These conditions are met for a really short of time. The migration table is empty when the server switches to \u0027migrating\u0027 status, so we need timing the things. \n\nFirst need sleep the live_migration api call, that have be time for abort, and we need sleep here (in line), because the migrating table is empty, when switched into \u0027migrating\u0027 status the server.","commit_id":"e37ddac3be0b520cdeb039c93df46256738fc8ea"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"de9143720c36a54a3066a06857c8834a4c2a6901","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    @mock.patch(\u0027nova.virt.fake.FakeDriver.live_migration\u0027)"},{"line_number":83,"context_line":"    def _test_live_migration_abort(self, server, mock_migration):"},{"line_number":84,"context_line":"        def _live_migration_delay(context, instance, dest,"},{"line_number":85,"context_line":"                       post_method, recover_method, block_migration\u003dFalse,"},{"line_number":86,"context_line":"                       migrate_data\u003dNone):"},{"line_number":87,"context_line":"            time.sleep(2)  # make time for abort"}],"source_content_type":"text/x-python","patch_set":23,"id":"3f1d235d_4de5a108","line":84,"updated":"2017-07-04 11:25:23.000000000","message":"+1","commit_id":"b81d76611013c4ddc0b2d4f5adde13a8f6a3c7ee"},{"author":{"_account_id":18602,"name":"Gábor Antal","email":"antal@inf.u-szeged.hu","username":"antal"},"change_message_id":"3c727ba0ec636d9b470b6f8d8a4b94e614afbe5e","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    @mock.patch(\u0027nova.virt.fake.FakeDriver.live_migration\u0027)"},{"line_number":83,"context_line":"    def _test_live_migration_abort(self, server, mock_migration):"},{"line_number":84,"context_line":"        def _live_migration_delay(context, instance, dest,"},{"line_number":85,"context_line":"                       post_method, recover_method, block_migration\u003dFalse,"},{"line_number":86,"context_line":"                       migrate_data\u003dNone):"},{"line_number":87,"context_line":"            time.sleep(2)  # make time for abort"}],"source_content_type":"text/x-python","patch_set":23,"id":"3f1d235d_ed646d24","line":84,"range":{"start_line":84,"start_character":12,"end_line":84,"end_character":33},"updated":"2017-07-04 11:35:41.000000000","message":"I think it would be less confusing if we name it something like \"_delayed_live_migration\" or \"_live_migration_delayed\", as it now suggests that \"this delays the live migration somehow\", but it is completely override the live_migration method.","commit_id":"b81d76611013c4ddc0b2d4f5adde13a8f6a3c7ee"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"de9143720c36a54a3066a06857c8834a4c2a6901","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        }"},{"line_number":100,"context_line":"        self.admin_api.post_server_action(server[\u0027id\u0027], post)"},{"line_number":101,"context_line":"        self._wait_for_state_change(self.api, server, \u0027MIGRATING\u0027)"},{"line_number":102,"context_line":"        time.sleep(1)  # make time for migrating table filling"},{"line_number":103,"context_line":"        migrations \u003d self.admin_api.get_active_migrations(server[\u0027id\u0027])"},{"line_number":104,"context_line":"        self.admin_api.abort_live_migration(server[\u0027id\u0027], migrations[0][\u0027id\u0027])"},{"line_number":105,"context_line":"        self._wait_for_notification(\u0027instance.live_migration_abort.start\u0027)"}],"source_content_type":"text/x-python","patch_set":23,"id":"3f1d235d_8d2a9929","line":102,"updated":"2017-07-04 11:25:23.000000000","message":"Instead of sleeping here we can poll self.admin_api.get_active_migrations(server[\u0027id\u0027]) to see when the migration appears in the output. That could speed up the test a bit I guess.","commit_id":"b81d76611013c4ddc0b2d4f5adde13a8f6a3c7ee"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"d99be9c20cd7b24ee20d4f9c3ef53faca570d975","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        self.admin_api.post_server_action(server[\u0027id\u0027], post)"},{"line_number":109,"context_line":"        self._wait_for_state_change(self.api, server, \u0027MIGRATING\u0027)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        migrations \u003d None"},{"line_number":112,"context_line":"        retries \u003d 0"},{"line_number":113,"context_line":"        while retries \u003c 20:"},{"line_number":114,"context_line":"            retries +\u003d 1"},{"line_number":115,"context_line":"            migrations \u003d self.admin_api.get_active_migrations(server[\u0027id\u0027])"},{"line_number":116,"context_line":"            if len(migrations) \u003e 0 and migrations[0][\u0027status\u0027] !\u003d \u0027preparing\u0027:"},{"line_number":117,"context_line":"                break"},{"line_number":118,"context_line":"            if retries \u003d\u003d 20:"},{"line_number":119,"context_line":"                self.fail(\u0027The migration table left empty.\u0027)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        self.admin_api.abort_live_migration(server[\u0027id\u0027], migrations[0][\u0027id\u0027])"},{"line_number":122,"context_line":"        self._wait_for_notification(\u0027instance.live_migration_abort.start\u0027)"}],"source_content_type":"text/x-python","patch_set":26,"id":"ff346bd7_5b469a23","line":119,"range":{"start_line":111,"start_character":1,"end_line":119,"end_character":60},"updated":"2017-07-26 09:16:56.000000000","message":"use the util function from https://review.openstack.org/#/c/486537 instead","commit_id":"51069b874d6860d465f59df3c4fe486f277371a3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"76820e60cc33aed9416bedcfc5eef20a57a3b1e5","unresolved":false,"context_lines":[{"line_number":10,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import mock"},{"line_number":14,"context_line":"import time"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from nova import context"},{"line_number":17,"context_line":"from nova import exception"}],"source_content_type":"text/x-python","patch_set":31,"id":"3f4b6375_e80ab987","line":14,"range":{"start_line":13,"start_character":0,"end_line":14,"end_character":11},"updated":"2017-11-06 14:33:13.000000000","message":"It feels like an unnecessary change","commit_id":"f23ad2d3709869f99ee4033c6a35caf14371fee1"},{"author":{"_account_id":17685,"name":"Elod Illes","email":"elod.illes@est.tech","username":"elod.illes"},"change_message_id":"64226509d9790f5c8f8b9dc9da486ef0a173bb13","unresolved":false,"context_lines":[{"line_number":10,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import mock"},{"line_number":14,"context_line":"import time"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from nova import context"},{"line_number":17,"context_line":"from nova import exception"}],"source_content_type":"text/x-python","patch_set":31,"id":"3f4b6375_63694a23","line":14,"range":{"start_line":13,"start_character":0,"end_line":14,"end_character":11},"in_reply_to":"3f4b6375_e80ab987","updated":"2017-11-06 15:07:03.000000000","message":"Done","commit_id":"f23ad2d3709869f99ee4033c6a35caf14371fee1"}],"nova/virt/fake.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"e85b7b539a15fc2c8b992db262ce7412374aefee","unresolved":false,"context_lines":[{"line_number":481,"context_line":"    def live_migration(self, context, instance, dest,"},{"line_number":482,"context_line":"                       post_method, recover_method, block_migration\u003dFalse,"},{"line_number":483,"context_line":"                       migrate_data\u003dNone):"},{"line_number":484,"context_line":"        time.sleep(2)  # make time for abort"},{"line_number":485,"context_line":"        post_method(context, instance, dest, block_migration,"},{"line_number":486,"context_line":"                    migrate_data)"},{"line_number":487,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":20,"id":"5f201791_52e75ead","line":484,"updated":"2017-06-26 16:28:57.000000000","message":"err... no :)\n\nThis isn\u0027t the way that we should be handling this. If you need a way to trigger the live migration action to wait a bit for the abort test cases, then I\u0027d prefer to see us mock out the fake\u0027s live_migration() method and add in a time.sleep(1) just for the test cases that need to emulate a longer live migration.\n\nOtherwise, every test case that hits the live_migration() function will add 2 seconds to their runtime for no reason at all.","commit_id":"e37ddac3be0b520cdeb039c93df46256738fc8ea"},{"author":{"_account_id":21239,"name":"Alex Szarka","email":"szarka@inf.u-szeged.hu","username":"xavvior"},"change_message_id":"c10e559caa3a25838154f90d6d227cfd1a645410","unresolved":false,"context_lines":[{"line_number":481,"context_line":"    def live_migration(self, context, instance, dest,"},{"line_number":482,"context_line":"                       post_method, recover_method, block_migration\u003dFalse,"},{"line_number":483,"context_line":"                       migrate_data\u003dNone):"},{"line_number":484,"context_line":"        time.sleep(2)  # make time for abort"},{"line_number":485,"context_line":"        post_method(context, instance, dest, block_migration,"},{"line_number":486,"context_line":"                    migrate_data)"},{"line_number":487,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":20,"id":"5f201791_dccda1b7","line":484,"in_reply_to":"5f201791_52e75ead","updated":"2017-06-27 13:21:27.000000000","message":"Okay, im looking for another solution for this problem!","commit_id":"e37ddac3be0b520cdeb039c93df46256738fc8ea"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"de9143720c36a54a3066a06857c8834a4c2a6901","unresolved":false,"context_lines":[{"line_number":483,"context_line":"                       post_method, recover_method, block_migration\u003dFalse,"},{"line_number":484,"context_line":"                       migrate_data\u003dNone):"},{"line_number":485,"context_line":"        post_method(context, instance, dest, block_migration,"},{"line_number":486,"context_line":"                    migrate_data)"},{"line_number":487,"context_line":"        return"},{"line_number":488,"context_line":""},{"line_number":489,"context_line":"    def live_migration_force_complete(self, instance):"}],"source_content_type":"text/x-python","patch_set":23,"id":"3f1d235d_ed06adce","line":486,"updated":"2017-07-04 11:25:23.000000000","message":"nit: while the indent looks stupid in the original I think we don\u0027t have to fix that in this patch set","commit_id":"b81d76611013c4ddc0b2d4f5adde13a8f6a3c7ee"},{"author":{"_account_id":18602,"name":"Gábor Antal","email":"antal@inf.u-szeged.hu","username":"antal"},"change_message_id":"3c727ba0ec636d9b470b6f8d8a4b94e614afbe5e","unresolved":false,"context_lines":[{"line_number":483,"context_line":"                       post_method, recover_method, block_migration\u003dFalse,"},{"line_number":484,"context_line":"                       migrate_data\u003dNone):"},{"line_number":485,"context_line":"        post_method(context, instance, dest, block_migration,"},{"line_number":486,"context_line":"                    migrate_data)"},{"line_number":487,"context_line":"        return"},{"line_number":488,"context_line":""},{"line_number":489,"context_line":"    def live_migration_force_complete(self, instance):"}],"source_content_type":"text/x-python","patch_set":23,"id":"3f1d235d_2d74a5fd","line":486,"in_reply_to":"3f1d235d_ed06adce","updated":"2017-07-04 11:35:41.000000000","message":"+1","commit_id":"b81d76611013c4ddc0b2d4f5adde13a8f6a3c7ee"}]}
