)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9df2fce07564469c6901b26dabbd52a7ba5d60d1","unresolved":false,"context_lines":[{"line_number":14,"context_line":"already handled by nova conductor as there are paths"},{"line_number":15,"context_line":"this exception may bubble up."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Probably introduced by Ibcb896b2eef673bce23491161ff394bcc87aa541"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Related-Bug: #1557585"},{"line_number":20,"context_line":"Change-Id: Icacd3cbe065ee8598e5e5f03bd73463b95ed2f75"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"1af94dfe_5ae9bd13","line":17,"updated":"2016-03-16 19:20:32.000000000","message":"I\u0027m not really understanding the link here.","commit_id":"7bc11f136a133742dd76efc5d9ff66848428fd87"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"91b3b207cb7d0be607113f27e75f1d6355895da5","unresolved":false,"context_lines":[{"line_number":14,"context_line":"already handled by nova conductor as there are paths"},{"line_number":15,"context_line":"this exception may bubble up."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Probably introduced by Ibcb896b2eef673bce23491161ff394bcc87aa541"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Related-Bug: #1557585"},{"line_number":20,"context_line":"Change-Id: Icacd3cbe065ee8598e5e5f03bd73463b95ed2f75"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"1af94dfe_68801c47","line":17,"in_reply_to":"1af94dfe_5ae9bd13","updated":"2016-03-17 09:21:20.000000000","message":"I\u0027ll remove the reference; but the suspicion is that the old [still wrong] code was working due to the NovaObjectDictCompat, which was removed in that referenced change.","commit_id":"7bc11f136a133742dd76efc5d9ff66848428fd87"}],"nova/tests/unit/virt/xenapi/test_vmops.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"aaa6e65f4f9c445796d9f0fd31f547d30538661f","unresolved":false,"context_lines":[{"line_number":1354,"context_line":"        self.assertEqual({\u0027value\u0027: \u0027fake_migrate_data\u0027},"},{"line_number":1355,"context_line":"                         migrate_data_ret.migrate_send_data)"},{"line_number":1356,"context_line":""},{"line_number":1357,"context_line":"    @mock.patch.object(vmops.objects.AggregateList, \u0027get_by_host\u0027)"},{"line_number":1358,"context_line":"    def test_get_host_uuid_from_aggregate_no_aggr(self, mock_get_by_host):"},{"line_number":1359,"context_line":"        mock_get_by_host.return_vaule \u003d []"},{"line_number":1360,"context_line":"        context \u003d \"ctx\""}],"source_content_type":"text/x-python","patch_set":4,"id":"1af94dfe_7547831d","line":1357,"updated":"2016-03-16 14:21:29.000000000","message":"should be object.AggregateList, just import objects here.","commit_id":"c0302e5152e9fc3c62d7696a9e4852d74eed6cc7"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"aaa6e65f4f9c445796d9f0fd31f547d30538661f","unresolved":false,"context_lines":[{"line_number":1378,"context_line":"            \u0027hosts\u0027: [\u0027foo\u0027, \u0027bar\u0027],"},{"line_number":1379,"context_line":"            \u0027metadata\u0027: {\u0027host1\u0027: \u0027host2\u0027},"},{"line_number":1380,"context_line":"        }"},{"line_number":1381,"context_line":"        mock_get_by_host.return_vaule \u003d [fake_aggregate]"},{"line_number":1382,"context_line":""},{"line_number":1383,"context_line":"        self.assertRaises(exception.MigrationPreCheckError,"},{"line_number":1384,"context_line":"                          self.vmops._get_host_uuid_from_aggregate,"}],"source_content_type":"text/x-python","patch_set":4,"id":"1af94dfe_35e17bff","line":1381,"updated":"2016-03-16 14:21:29.000000000","message":"Can\u0027t we just create an aggregate object here, and add it to a list? This seems too fake.","commit_id":"c0302e5152e9fc3c62d7696a9e4852d74eed6cc7"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"6024755c7e7851ede8f6f372a8b898974d1ee77c","unresolved":false,"context_lines":[{"line_number":1356,"context_line":""},{"line_number":1357,"context_line":"    @mock.patch.object(vmops.objects.AggregateList, \u0027get_by_host\u0027)"},{"line_number":1358,"context_line":"    def test_get_host_uuid_from_aggregate_no_aggr(self, mock_get_by_host):"},{"line_number":1359,"context_line":"        mock_get_by_host.return_vaule \u003d []"},{"line_number":1360,"context_line":"        context \u003d \"ctx\""},{"line_number":1361,"context_line":"        hostname \u003d \"other_host\""},{"line_number":1362,"context_line":"        self.assertRaises(exception.MigrationPreCheckError,"}],"source_content_type":"text/x-python","patch_set":7,"id":"1af94dfe_84e3f532","line":1359,"updated":"2016-03-16 17:27:36.000000000","message":"return_value is misspelled. Not sure how this could be validating the thing you want, other than maybe it just failing because of the mock return default.","commit_id":"a8248854cc6745bf0c7753ad435f43468b8fd200"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"6024755c7e7851ede8f6f372a8b898974d1ee77c","unresolved":false,"context_lines":[{"line_number":1378,"context_line":"            \u0027hosts\u0027: [\u0027foo\u0027, \u0027bar\u0027],"},{"line_number":1379,"context_line":"            \u0027metadata\u0027: {\u0027host1\u0027: \u0027host2\u0027},"},{"line_number":1380,"context_line":"        }"},{"line_number":1381,"context_line":"        mock_get_by_host.return_vaule \u003d [fake_aggregate]"},{"line_number":1382,"context_line":""},{"line_number":1383,"context_line":"        self.assertRaises(exception.MigrationPreCheckError,"},{"line_number":1384,"context_line":"                          self.vmops._get_host_uuid_from_aggregate,"}],"source_content_type":"text/x-python","patch_set":7,"id":"1af94dfe_04f7e5f5","line":1381,"updated":"2016-03-16 17:27:36.000000000","message":"wrong here too.","commit_id":"a8248854cc6745bf0c7753ad435f43468b8fd200"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"dedd08edaa2a71f7353215dba675e082e41e9793","unresolved":false,"context_lines":[{"line_number":1354,"context_line":""},{"line_number":1355,"context_line":"    @mock.patch.object(vmops.objects.AggregateList, \u0027get_by_host\u0027)"},{"line_number":1356,"context_line":"    def test_get_host_uuid_from_aggregate_no_aggr(self, mock_get_by_host):"},{"line_number":1357,"context_line":"        mock_get_by_host.return_value \u003d []"},{"line_number":1358,"context_line":"        context \u003d \"ctx\""},{"line_number":1359,"context_line":"        hostname \u003d \"other_host\""},{"line_number":1360,"context_line":"        self.assertRaises(exception.MigrationPreCheckError,"}],"source_content_type":"text/x-python","patch_set":8,"id":"1af94dfe_8b677924","line":1357,"updated":"2016-03-16 20:30:17.000000000","message":"Erm, shouldn\u0027t the above return an objects.AggregateList(objects\u003d[])?","commit_id":"7bc11f136a133742dd76efc5d9ff66848428fd87"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"91b3b207cb7d0be607113f27e75f1d6355895da5","unresolved":false,"context_lines":[{"line_number":1354,"context_line":""},{"line_number":1355,"context_line":"    @mock.patch.object(vmops.objects.AggregateList, \u0027get_by_host\u0027)"},{"line_number":1356,"context_line":"    def test_get_host_uuid_from_aggregate_no_aggr(self, mock_get_by_host):"},{"line_number":1357,"context_line":"        mock_get_by_host.return_value \u003d []"},{"line_number":1358,"context_line":"        context \u003d \"ctx\""},{"line_number":1359,"context_line":"        hostname \u003d \"other_host\""},{"line_number":1360,"context_line":"        self.assertRaises(exception.MigrationPreCheckError,"}],"source_content_type":"text/x-python","patch_set":8,"id":"1af94dfe_48756096","line":1357,"in_reply_to":"1af94dfe_8b677924","updated":"2016-03-17 09:21:20.000000000","message":"Done","commit_id":"7bc11f136a133742dd76efc5d9ff66848428fd87"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f685e9f06df402737ee940d74e0049dc65673a2d","unresolved":false,"context_lines":[{"line_number":1354,"context_line":""},{"line_number":1355,"context_line":"    @mock.patch.object(vmops.objects.AggregateList, \u0027get_by_host\u0027)"},{"line_number":1356,"context_line":"    def test_get_host_uuid_from_aggregate_no_aggr(self, mock_get_by_host):"},{"line_number":1357,"context_line":"        mock_get_by_host.return_value \u003d []"},{"line_number":1358,"context_line":"        context \u003d \"ctx\""},{"line_number":1359,"context_line":"        hostname \u003d \"other_host\""},{"line_number":1360,"context_line":"        self.assertRaises(exception.MigrationPreCheckError,"}],"source_content_type":"text/x-python","patch_set":8,"id":"1af94dfe_f9d24eff","line":1357,"in_reply_to":"1af94dfe_8b677924","updated":"2016-03-17 00:04:16.000000000","message":"FWIW, I think we have quite a few unit tests that do something similar.","commit_id":"7bc11f136a133742dd76efc5d9ff66848428fd87"}],"nova/virt/xenapi/vmops.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"31eaed7555e223a69efc234b662c1cc9896e956e","unresolved":false,"context_lines":[{"line_number":2206,"context_line":"            # TODO(eilqiao): There is still one case that block_migration is"},{"line_number":2207,"context_line":"            # passed from admin user, so we need this check until"},{"line_number":2208,"context_line":"            # block_migration flag is removed from API"},{"line_number":2209,"context_line":"            self._ensure_host_in_aggregate(ctxt, src)"},{"line_number":2210,"context_line":"            # TODO(johngarbutt) we currently assume"},{"line_number":2211,"context_line":"            # instance is on a SR shared with other destination"},{"line_number":2212,"context_line":"            # block migration work will be able to resolve this"}],"source_content_type":"text/x-python","patch_set":2,"id":"1af94dfe_5c5a7951","line":2209,"updated":"2016-03-16 12:30:03.000000000","message":"Bit worried about a new exception being raised from here, we should probably just use the MigrationPreCheckError one for both?","commit_id":"fba6b905d293342d53a938c3cf8e793ddad440bf"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"aaa6e65f4f9c445796d9f0fd31f547d30538661f","unresolved":false,"context_lines":[{"line_number":2109,"context_line":"            if len(aggregate_list) \u003d\u003d 0 or aggregate_list[0] \u003d\u003d None:"},{"line_number":2110,"context_line":"                raise exception.MigrationPreCheckError(reason\u003dreason)"},{"line_number":2111,"context_line":""},{"line_number":2112,"context_line":"            return aggregate_list[0].metadata[hostname]"},{"line_number":2113,"context_line":"        except KeyError:"},{"line_number":2114,"context_line":"            raise exception.MigrationPreCheckError(reason\u003dreason)"},{"line_number":2115,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1af94dfe_f5d3935d","line":2112,"updated":"2016-03-16 14:21:29.000000000","message":"I think we want to not have just a large try clause, its odd here now.","commit_id":"c0302e5152e9fc3c62d7696a9e4852d74eed6cc7"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a23bd09ae75a35aeb152cd172e53bb0b18ffe8fb","unresolved":false,"context_lines":[{"line_number":2105,"context_line":""},{"line_number":2106,"context_line":"        reason \u003d _(\u0027Destination host:%s must be in the same \u0027"},{"line_number":2107,"context_line":"                   \u0027aggregate as the source server\u0027) % hostname"},{"line_number":2108,"context_line":"        if len(aggregate_list) \u003d\u003d 0 or aggregate_list[0] is None:"},{"line_number":2109,"context_line":"            raise exception.MigrationPreCheckError(reason\u003dreason)"},{"line_number":2110,"context_line":"        if hostname not in aggregate_list[0].metadata:"},{"line_number":2111,"context_line":"            raise exception.MigrationPreCheckError(reason\u003dreason)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1af94dfe_d9f689f8","line":2108,"updated":"2016-03-16 16:17:06.000000000","message":"I don\u0027t see how this is possible. The list comes is made by obj_make_list() in objects.base, which only ever adds an actual instance of the item class, as far as I can tell.\n\nIs this being added because of a bad unit test perhaps?","commit_id":"af6ca3a5b3da470d722131fc2685d620414c6d5e"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"85b59532dfb7adb1bb408102aca1e642a44a7615","unresolved":false,"context_lines":[{"line_number":2105,"context_line":""},{"line_number":2106,"context_line":"        reason \u003d _(\u0027Destination host:%s must be in the same \u0027"},{"line_number":2107,"context_line":"                   \u0027aggregate as the source server\u0027) % hostname"},{"line_number":2108,"context_line":"        if len(aggregate_list) \u003d\u003d 0 or aggregate_list[0] is None:"},{"line_number":2109,"context_line":"            raise exception.MigrationPreCheckError(reason\u003dreason)"},{"line_number":2110,"context_line":"        if hostname not in aggregate_list[0].metadata:"},{"line_number":2111,"context_line":"            raise exception.MigrationPreCheckError(reason\u003dreason)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1af94dfe_042405ad","line":2108,"in_reply_to":"1af94dfe_149f1851","updated":"2016-03-16 17:25:45.000000000","message":"Done","commit_id":"af6ca3a5b3da470d722131fc2685d620414c6d5e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"545e235b4448032e66df7ec7d7eb55685fac558c","unresolved":false,"context_lines":[{"line_number":2105,"context_line":""},{"line_number":2106,"context_line":"        reason \u003d _(\u0027Destination host:%s must be in the same \u0027"},{"line_number":2107,"context_line":"                   \u0027aggregate as the source server\u0027) % hostname"},{"line_number":2108,"context_line":"        if len(aggregate_list) \u003d\u003d 0 or aggregate_list[0] is None:"},{"line_number":2109,"context_line":"            raise exception.MigrationPreCheckError(reason\u003dreason)"},{"line_number":2110,"context_line":"        if hostname not in aggregate_list[0].metadata:"},{"line_number":2111,"context_line":"            raise exception.MigrationPreCheckError(reason\u003dreason)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1af94dfe_149f1851","line":2108,"in_reply_to":"1af94dfe_d4f650f8","updated":"2016-03-16 16:32:29.000000000","message":"Ah, I see, but yeah I don\u0027t think that is possible. Perhaps that is a holdover from pre-objectification where we were doing a get() from a dict or something. Either way, should be removed.","commit_id":"af6ca3a5b3da470d722131fc2685d620414c6d5e"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"46103ac4e857ebb8bf857c28136cde078b945e97","unresolved":false,"context_lines":[{"line_number":2105,"context_line":""},{"line_number":2106,"context_line":"        reason \u003d _(\u0027Destination host:%s must be in the same \u0027"},{"line_number":2107,"context_line":"                   \u0027aggregate as the source server\u0027) % hostname"},{"line_number":2108,"context_line":"        if len(aggregate_list) \u003d\u003d 0 or aggregate_list[0] is None:"},{"line_number":2109,"context_line":"            raise exception.MigrationPreCheckError(reason\u003dreason)"},{"line_number":2110,"context_line":"        if hostname not in aggregate_list[0].metadata:"},{"line_number":2111,"context_line":"            raise exception.MigrationPreCheckError(reason\u003dreason)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1af94dfe_d4f650f8","line":2108,"in_reply_to":"1af94dfe_d9f689f8","updated":"2016-03-16 16:28:54.000000000","message":"I was trying to be very explicit and copy the previous code where we were getting an IndexError (i.e. [0] didn\u0027t exist).\nThe old code could get [0] and then check for it being None.\n\nIf the second check is not possible, I will remove it and fix the UT.","commit_id":"af6ca3a5b3da470d722131fc2685d620414c6d5e"},{"author":{"_account_id":11803,"name":"Ryan Rossiter","email":"rlrossit@us.ibm.com","username":"rlrossiter"},"change_message_id":"31bb186c83dd8eab3d089af9350b13b442768d72","unresolved":false,"context_lines":[{"line_number":2106,"context_line":"        reason \u003d _(\u0027Destination host:%s must be in the same \u0027"},{"line_number":2107,"context_line":"                   \u0027aggregate as the source server\u0027) % hostname"},{"line_number":2108,"context_line":"        if len(aggregate_list) \u003d\u003d 0:"},{"line_number":2109,"context_line":"            raise exception.MigrationPreCheckError(reason\u003dreason)"},{"line_number":2110,"context_line":"        if hostname not in aggregate_list[0].metadata:"},{"line_number":2111,"context_line":"            raise exception.MigrationPreCheckError(reason\u003dreason)"},{"line_number":2112,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1af94dfe_7ad47946","line":2109,"updated":"2016-03-16 19:19:02.000000000","message":"Should this be raising exception.AggregateHostNotFound(host\u003dCONF.host) in order to maintain what it was doing before? I would think that exception would be more accurate if there are no aggregates found for that host. Or by the looks of the reason message, that was incorrect before...","commit_id":"7bc11f136a133742dd76efc5d9ff66848428fd87"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9df2fce07564469c6901b26dabbd52a7ba5d60d1","unresolved":false,"context_lines":[{"line_number":2106,"context_line":"        reason \u003d _(\u0027Destination host:%s must be in the same \u0027"},{"line_number":2107,"context_line":"                   \u0027aggregate as the source server\u0027) % hostname"},{"line_number":2108,"context_line":"        if len(aggregate_list) \u003d\u003d 0:"},{"line_number":2109,"context_line":"            raise exception.MigrationPreCheckError(reason\u003dreason)"},{"line_number":2110,"context_line":"        if hostname not in aggregate_list[0].metadata:"},{"line_number":2111,"context_line":"            raise exception.MigrationPreCheckError(reason\u003dreason)"},{"line_number":2112,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1af94dfe_ba5c41ee","line":2109,"range":{"start_line":2109,"start_character":28,"end_line":2109,"end_character":50},"updated":"2016-03-16 19:20:32.000000000","message":"Why wouldn\u0027t you use AggregateHostNotFound for this? I guess it doesn\u0027t really matter. I guess you want to use MigrationPreCheckError because of L2190?","commit_id":"7bc11f136a133742dd76efc5d9ff66848428fd87"},{"author":{"_account_id":11803,"name":"Ryan Rossiter","email":"rlrossit@us.ibm.com","username":"rlrossiter"},"change_message_id":"8ab209c3eaf1ff6a64d6d45edd9160d045cc8b2b","unresolved":false,"context_lines":[{"line_number":2106,"context_line":"        reason \u003d _(\u0027Destination host:%s must be in the same \u0027"},{"line_number":2107,"context_line":"                   \u0027aggregate as the source server\u0027) % hostname"},{"line_number":2108,"context_line":"        if len(aggregate_list) \u003d\u003d 0:"},{"line_number":2109,"context_line":"            raise exception.MigrationPreCheckError(reason\u003dreason)"},{"line_number":2110,"context_line":"        if hostname not in aggregate_list[0].metadata:"},{"line_number":2111,"context_line":"            raise exception.MigrationPreCheckError(reason\u003dreason)"},{"line_number":2112,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1af94dfe_74eaa9ad","line":2109,"range":{"start_line":2109,"start_character":28,"end_line":2109,"end_character":50},"in_reply_to":"1af94dfe_953ca1e3","updated":"2016-03-17 13:44:46.000000000","message":"Ah, I read the commit message as conductor not catching IndexError.","commit_id":"7bc11f136a133742dd76efc5d9ff66848428fd87"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"91b3b207cb7d0be607113f27e75f1d6355895da5","unresolved":false,"context_lines":[{"line_number":2106,"context_line":"        reason \u003d _(\u0027Destination host:%s must be in the same \u0027"},{"line_number":2107,"context_line":"                   \u0027aggregate as the source server\u0027) % hostname"},{"line_number":2108,"context_line":"        if len(aggregate_list) \u003d\u003d 0:"},{"line_number":2109,"context_line":"            raise exception.MigrationPreCheckError(reason\u003dreason)"},{"line_number":2110,"context_line":"        if hostname not in aggregate_list[0].metadata:"},{"line_number":2111,"context_line":"            raise exception.MigrationPreCheckError(reason\u003dreason)"},{"line_number":2112,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1af94dfe_953ca1e3","line":2109,"range":{"start_line":2109,"start_character":28,"end_line":2109,"end_character":50},"in_reply_to":"1af94dfe_ba5c41ee","updated":"2016-03-17 09:21:20.000000000","message":"This could be more explicit in the commit message, but it is there :) John pointed out that nova conductor does not catch AggregateHostNotFound and as such if that exception was ever raised it would bubble up to the API.\nMigrationPreCheckError is actually the right exception here, since this function is only used in the MigrationPreCheck code.","commit_id":"7bc11f136a133742dd76efc5d9ff66848428fd87"}]}
