)]}'
{"nova/objects/instance.py":[{"author":{"_account_id":14511,"name":"Maciej Szankin","email":"maciej+review@szankin.pl","username":"mszankin"},"change_message_id":"8ac7c3c5c1d1efc48d77a36ca0daa3d8c72a068d","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        simple_cols.append(\u0027extra\u0027)"},{"line_number":88,"context_line":"    simple_cols \u003d [x for x in simple_cols if x not in _INSTANCE_EXTRA_FIELDS]"},{"line_number":89,"context_line":"    expected_cols \u003d simple_cols + complex_cols"},{"line_number":90,"context_line":"    return sorted(set(expected_cols), key\u003dexpected_cols.index)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"_NO_DATA_SENTINEL \u003d object()"}],"source_content_type":"text/x-python","patch_set":1,"id":"dada55a8_baa882dc","line":90,"range":{"start_line":90,"start_character":11,"end_line":90,"end_character":17},"updated":"2016-07-20 14:40:19.000000000","message":"Why do you sort this list? Is it needed? If not, please remove. If yes, please explain and I will remove -1.","commit_id":"2cf4eccd18193c6b209774eabf994a208d125cdf"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"edbb67dc331c08760a8db6d415c388a0724fb3fa","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        simple_cols.append(\u0027extra\u0027)"},{"line_number":88,"context_line":"    simple_cols \u003d [x for x in simple_cols if x not in _INSTANCE_EXTRA_FIELDS]"},{"line_number":89,"context_line":"    expected_cols \u003d simple_cols + complex_cols"},{"line_number":90,"context_line":"    return sorted(set(expected_cols), key\u003dexpected_cols.index)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"_NO_DATA_SENTINEL \u003d object()"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_0d31ee0b","line":90,"range":{"start_line":90,"start_character":11,"end_line":90,"end_character":17},"in_reply_to":"dada55a8_1098411b","updated":"2016-08-03 15:11:34.000000000","message":"We could just raise an exception here if we see duplicates.\n\nAnd then fix all the places where we break that.\n\nReally we need to make sure the callers understand what is happening here.","commit_id":"2cf4eccd18193c6b209774eabf994a208d125cdf"},{"author":{"_account_id":14511,"name":"Maciej Szankin","email":"maciej+review@szankin.pl","username":"mszankin"},"change_message_id":"7dad05fee5732796c296dd31a39e8548183b1c69","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        simple_cols.append(\u0027extra\u0027)"},{"line_number":88,"context_line":"    simple_cols \u003d [x for x in simple_cols if x not in _INSTANCE_EXTRA_FIELDS]"},{"line_number":89,"context_line":"    expected_cols \u003d simple_cols + complex_cols"},{"line_number":90,"context_line":"    return sorted(set(expected_cols), key\u003dexpected_cols.index)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"_NO_DATA_SENTINEL \u003d object()"}],"source_content_type":"text/x-python","patch_set":1,"id":"dada55a8_faa62cbf","line":90,"range":{"start_line":90,"start_character":11,"end_line":90,"end_character":17},"in_reply_to":"dada55a8_752d7d94","updated":"2016-07-21 19:17:38.000000000","message":"But why? Is it needed?","commit_id":"2cf4eccd18193c6b209774eabf994a208d125cdf"},{"author":{"_account_id":18335,"name":"Pushkar Umaranikar","email":"pushkar.umaranikar@intel.com","username":"pushkarumaranikar"},"change_message_id":"54ba53798ed73a137edc6eea5367988c32611b08","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        simple_cols.append(\u0027extra\u0027)"},{"line_number":88,"context_line":"    simple_cols \u003d [x for x in simple_cols if x not in _INSTANCE_EXTRA_FIELDS]"},{"line_number":89,"context_line":"    expected_cols \u003d simple_cols + complex_cols"},{"line_number":90,"context_line":"    return sorted(set(expected_cols), key\u003dexpected_cols.index)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"_NO_DATA_SENTINEL \u003d object()"}],"source_content_type":"text/x-python","patch_set":1,"id":"dada55a8_752d7d94","line":90,"range":{"start_line":90,"start_character":11,"end_line":90,"end_character":17},"in_reply_to":"dada55a8_baa882dc","updated":"2016-07-20 14:54:28.000000000","message":"I have sorted it on list index to maintain original order from the list as set does not maintain insertion order of elements.","commit_id":"2cf4eccd18193c6b209774eabf994a208d125cdf"},{"author":{"_account_id":18335,"name":"Pushkar Umaranikar","email":"pushkar.umaranikar@intel.com","username":"pushkarumaranikar"},"change_message_id":"dd23ae87b607199367161acd3b91411b321aeda8","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        simple_cols.append(\u0027extra\u0027)"},{"line_number":88,"context_line":"    simple_cols \u003d [x for x in simple_cols if x not in _INSTANCE_EXTRA_FIELDS]"},{"line_number":89,"context_line":"    expected_cols \u003d simple_cols + complex_cols"},{"line_number":90,"context_line":"    return sorted(set(expected_cols), key\u003dexpected_cols.index)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"_NO_DATA_SENTINEL \u003d object()"}],"source_content_type":"text/x-python","patch_set":1,"id":"dada55a8_1098411b","line":90,"range":{"start_line":90,"start_character":11,"end_line":90,"end_character":17},"in_reply_to":"dada55a8_faa62cbf","updated":"2016-07-21 20:14:09.000000000","message":"Many unit test cases from test_instance.py like this https://github.com/openstack/nova/blob/master/nova/tests/unit/objects/test_instance.py#L710-L719 uses list for columns_to_join in assert calls. Hence, I maintained insertion order from list to set to work with these cases.","commit_id":"2cf4eccd18193c6b209774eabf994a208d125cdf"},{"author":{"_account_id":18335,"name":"Pushkar Umaranikar","email":"pushkar.umaranikar@intel.com","username":"pushkarumaranikar"},"change_message_id":"3ba0754be9f0903c6e9934a619d44c7dbd2b3a00","unresolved":false,"context_lines":[{"line_number":443,"context_line":"            expected_attrs \u003d [\u0027info_cache\u0027, \u0027security_groups\u0027]"},{"line_number":444,"context_line":"        try:"},{"line_number":445,"context_line":"            columns_to_join \u003d _expected_cols(expected_attrs)"},{"line_number":446,"context_line":"        except exception.DuplicateColumnsToJoin:"},{"line_number":447,"context_line":"            columns_to_join \u003d _expected_cols(sorted(list(set(expected_attrs)),"},{"line_number":448,"context_line":"                                             key\u003dexpected_attrs.index))"},{"line_number":449,"context_line":"        db_inst \u003d cls._db_instance_get_by_uuid(context, uuid, columns_to_join,"},{"line_number":450,"context_line":"                                               use_slave\u003duse_slave)"},{"line_number":451,"context_line":"        return cls._from_db_object(context, cls(), db_inst,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9ad45d7e_022f1bf7","line":448,"range":{"start_line":446,"start_character":8,"end_line":448,"end_character":71},"updated":"2016-08-12 20:21:19.000000000","message":"I am not sure about this. \nLooking at John\u0027s comment on patchset 1 \"Really we need to make sure the callers understand what is happening here.\",  do we have to take exception to API level or this is fine ?","commit_id":"b73071cd997e58cc82252d92ac22a5fbb474b2fa"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"012a3c460b48284b66160c8986c2ee4a76df631b","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    if complex_cols:"},{"line_number":89,"context_line":"        simple_cols.append(\u0027extra\u0027)"},{"line_number":90,"context_line":"    simple_cols \u003d [x for x in simple_cols if x not in _INSTANCE_EXTRA_FIELDS]"},{"line_number":91,"context_line":"    expected_cols \u003d simple_cols + complex_cols"},{"line_number":92,"context_line":"    if len(expected_cols) !\u003d len(set(expected_cols)):"},{"line_number":93,"context_line":"        raise exception.DuplicateColumnsToJoin()"},{"line_number":94,"context_line":"    return expected_cols"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa7ab95a_d1439511","line":91,"range":{"start_line":91,"start_character":20,"end_line":91,"end_character":46},"updated":"2016-09-02 07:20:12.000000000","message":"I think we can just do like this: list(set([simple_cols + complex_cols)).\n\nYou raise an exception then you catch it immediately, that looks like useless.","commit_id":"ae9ab0b020830a66efdea9539ed676086cb3e4a6"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"f42f37dbe9a9097a48273e102bccc035a5ff457a","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    if complex_cols:"},{"line_number":89,"context_line":"        simple_cols.append(\u0027extra\u0027)"},{"line_number":90,"context_line":"    simple_cols \u003d [x for x in simple_cols if x not in _INSTANCE_EXTRA_FIELDS]"},{"line_number":91,"context_line":"    expected_cols \u003d simple_cols + complex_cols"},{"line_number":92,"context_line":"    if len(expected_cols) !\u003d len(set(expected_cols)):"},{"line_number":93,"context_line":"        raise exception.DuplicateColumnsToJoin()"},{"line_number":94,"context_line":"    return expected_cols"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a8ec9b2_d11379b6","line":91,"range":{"start_line":91,"start_character":20,"end_line":91,"end_character":46},"in_reply_to":"9a89bdaa_1ed67cc5","updated":"2016-09-16 16:23:22.000000000","message":"What I meant was, we should make sure everyone that updates expected_attrs is sending in the correct things.\n\nI don\u0027t get why this method adds the extra things into that list in this way, if the calling code doesn\u0027t need those things. And I don\u0027t get why the callers should be adding things that we add anyway.\n\nI don\u0027t like papering over some other bugs this problem is pointing two.","commit_id":"ae9ab0b020830a66efdea9539ed676086cb3e4a6"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"061cdfdd8a458ae6157ea38856cdf9f4f9909112","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    if complex_cols:"},{"line_number":89,"context_line":"        simple_cols.append(\u0027extra\u0027)"},{"line_number":90,"context_line":"    simple_cols \u003d [x for x in simple_cols if x not in _INSTANCE_EXTRA_FIELDS]"},{"line_number":91,"context_line":"    expected_cols \u003d simple_cols + complex_cols"},{"line_number":92,"context_line":"    if len(expected_cols) !\u003d len(set(expected_cols)):"},{"line_number":93,"context_line":"        raise exception.DuplicateColumnsToJoin()"},{"line_number":94,"context_line":"    return expected_cols"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a89bdaa_1ed67cc5","line":91,"range":{"start_line":91,"start_character":20,"end_line":91,"end_character":46},"in_reply_to":"fa7ab95a_76cf067f","updated":"2016-09-03 05:45:08.000000000","message":"After checked John\u0027s comment, I\u0027not sure which caller the John pointed to. This function actually won\u0027t be called in this file. So maybe the caller, John pointed, is instance obj\u0027s caller. Otherwises I still think it is useless raise and handle at here.  If John pointed to handle at instance obj\u0027 caller, I still prefer just handle like your patchset1, this can avoid us forget to handle the exception in the caller side.","commit_id":"ae9ab0b020830a66efdea9539ed676086cb3e4a6"},{"author":{"_account_id":18335,"name":"Pushkar Umaranikar","email":"pushkar.umaranikar@intel.com","username":"pushkarumaranikar"},"change_message_id":"6c2f58af1d3cc0cc29a244da92decbb5f9e713b6","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    if complex_cols:"},{"line_number":89,"context_line":"        simple_cols.append(\u0027extra\u0027)"},{"line_number":90,"context_line":"    simple_cols \u003d [x for x in simple_cols if x not in _INSTANCE_EXTRA_FIELDS]"},{"line_number":91,"context_line":"    expected_cols \u003d simple_cols + complex_cols"},{"line_number":92,"context_line":"    if len(expected_cols) !\u003d len(set(expected_cols)):"},{"line_number":93,"context_line":"        raise exception.DuplicateColumnsToJoin()"},{"line_number":94,"context_line":"    return expected_cols"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa7ab95a_76cf067f","line":91,"range":{"start_line":91,"start_character":20,"end_line":91,"end_character":46},"in_reply_to":"fa7ab95a_d1439511","updated":"2016-09-02 14:28:58.000000000","message":"Yes. I did the same thing in patchset 1. But I got suggestion to raise an exception here.","commit_id":"ae9ab0b020830a66efdea9539ed676086cb3e4a6"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"1fe4f5577f7798c7a4a530a1a0cf7166cfb14b8f","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    simple_cols \u003d [attr for attr in expected_attrs"},{"line_number":83,"context_line":"                   if attr in _INSTANCE_OPTIONAL_JOINED_FIELDS]"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    complex_cols \u003d [\u0027extra.%s\u0027 % field"},{"line_number":86,"context_line":"                    for field in _INSTANCE_EXTRA_FIELDS"},{"line_number":87,"context_line":"                    if field in expected_attrs]"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a8bc5a2_397ab188","side":"PARENT","line":84,"updated":"2016-09-27 02:24:40.000000000","message":"unrelated change.","commit_id":"9adb28bfc5d61d3269bb0b266dafac7ae9628f08"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"ce2ba47400a18b07ecd41264611d2924039f6040","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        simple_cols.append(\u0027extra\u0027)"},{"line_number":90,"context_line":"    simple_cols \u003d [x for x in simple_cols if x not in _INSTANCE_EXTRA_FIELDS]"},{"line_number":91,"context_line":"    expected_cols \u003d simple_cols + complex_cols"},{"line_number":92,"context_line":"    return sorted(list(set(expected_cols)), key\u003dexpected_cols.index)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"_NO_DATA_SENTINEL \u003d object()"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a8bc5a2_4de120d0","line":92,"updated":"2016-09-28 11:16:54.000000000","message":"Nit: this is obscure enough to be worth a comment here.","commit_id":"4f71aafbf4a5e1796c1e75f0c45c43c13b31af62"},{"author":{"_account_id":18335,"name":"Pushkar Umaranikar","email":"pushkar.umaranikar@intel.com","username":"pushkarumaranikar"},"change_message_id":"5ba5fa8403f3f96a072bda387ad6c49262c6f0cc","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        simple_cols.append(\u0027extra\u0027)"},{"line_number":90,"context_line":"    simple_cols \u003d [x for x in simple_cols if x not in _INSTANCE_EXTRA_FIELDS]"},{"line_number":91,"context_line":"    expected_cols \u003d simple_cols + complex_cols"},{"line_number":92,"context_line":"    return sorted(list(set(expected_cols)), key\u003dexpected_cols.index)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"_NO_DATA_SENTINEL \u003d object()"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a98d1f4_0e680df5","line":92,"in_reply_to":"5a8bc5a2_4de120d0","updated":"2016-09-28 16:17:54.000000000","message":"Done","commit_id":"4f71aafbf4a5e1796c1e75f0c45c43c13b31af62"}],"nova/tests/unit/objects/test_instance.py":[{"author":{"_account_id":14511,"name":"Maciej Szankin","email":"maciej+review@szankin.pl","username":"mszankin"},"change_message_id":"21bb2444bdc552c921230cc2f2a97dbb356f4d80","unresolved":false,"context_lines":[{"line_number":1879,"context_line":""},{"line_number":1880,"context_line":"    def test_expected_cols_DuplicateColumnsToJoin_exception(self):"},{"line_number":1881,"context_line":"        expected_attr \u003d [\u0027metadata\u0027, \u0027system_metadata\u0027, \u0027info_cache\u0027,"},{"line_number":1882,"context_line":"                         \u0027security_groups\u0027, \u0027info_cache\u0027, \u0027metadata\u0027,"},{"line_number":1883,"context_line":"                         \u0027pci_devices\u0027, \u0027tags\u0027, \u0027extra\u0027, \u0027extra.flavor\u0027]"},{"line_number":1884,"context_line":"        self.assertRaises(exception.DuplicateColumnsToJoin,"},{"line_number":1885,"context_line":"                          instance._expected_cols, expected_attr)"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa7ab95a_0aa7f44f","line":1882,"range":{"start_line":1882,"start_character":59,"end_line":1882,"end_character":67},"updated":"2016-08-31 14:46:12.000000000","message":"can you put duplicate column names next to each other?","commit_id":"b73071cd997e58cc82252d92ac22a5fbb474b2fa"},{"author":{"_account_id":18335,"name":"Pushkar Umaranikar","email":"pushkar.umaranikar@intel.com","username":"pushkarumaranikar"},"change_message_id":"1c05bec2b0c82a4fd0943335a78d0eec2e0ddcb1","unresolved":false,"context_lines":[{"line_number":1879,"context_line":""},{"line_number":1880,"context_line":"    def test_expected_cols_DuplicateColumnsToJoin_exception(self):"},{"line_number":1881,"context_line":"        expected_attr \u003d [\u0027metadata\u0027, \u0027system_metadata\u0027, \u0027info_cache\u0027,"},{"line_number":1882,"context_line":"                         \u0027security_groups\u0027, \u0027info_cache\u0027, \u0027metadata\u0027,"},{"line_number":1883,"context_line":"                         \u0027pci_devices\u0027, \u0027tags\u0027, \u0027extra\u0027, \u0027extra.flavor\u0027]"},{"line_number":1884,"context_line":"        self.assertRaises(exception.DuplicateColumnsToJoin,"},{"line_number":1885,"context_line":"                          instance._expected_cols, expected_attr)"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa7ab95a_b27d9ee9","line":1882,"range":{"start_line":1882,"start_character":59,"end_line":1882,"end_character":67},"in_reply_to":"fa7ab95a_0aa7f44f","updated":"2016-08-31 15:30:13.000000000","message":"This is how currently expected_attr list looks like. I am trying to create exact copy here.","commit_id":"b73071cd997e58cc82252d92ac22a5fbb474b2fa"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"ce2ba47400a18b07ecd41264611d2924039f6040","unresolved":false,"context_lines":[{"line_number":1882,"context_line":"                         \u0027security_groups\u0027, \u0027info_cache\u0027, \u0027metadata\u0027,"},{"line_number":1883,"context_line":"                         \u0027pci_devices\u0027, \u0027tags\u0027, \u0027extra\u0027, \u0027flavor\u0027]"},{"line_number":1884,"context_line":""},{"line_number":1885,"context_line":"        expected_list \u003d instance._expected_cols(expected_attr)"},{"line_number":1886,"context_line":"        self.assertEqual(len(expected_list), len(set(expected_attr)))"},{"line_number":1887,"context_line":""},{"line_number":1888,"context_line":"    def test_migrate_instance_keypairs(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a8bc5a2_0a553e1c","line":1885,"range":{"start_line":1885,"start_character":8,"end_line":1885,"end_character":21},"updated":"2016-09-28 11:16:54.000000000","message":"Nit: We shouldn\u0027t use the word expected here, this is the result we want to test. Expected is usually used for the thing we test against, there is a nasty clash here.\n\nMaybe call this result_list?","commit_id":"4f71aafbf4a5e1796c1e75f0c45c43c13b31af62"},{"author":{"_account_id":18335,"name":"Pushkar Umaranikar","email":"pushkar.umaranikar@intel.com","username":"pushkarumaranikar"},"change_message_id":"5ba5fa8403f3f96a072bda387ad6c49262c6f0cc","unresolved":false,"context_lines":[{"line_number":1882,"context_line":"                         \u0027security_groups\u0027, \u0027info_cache\u0027, \u0027metadata\u0027,"},{"line_number":1883,"context_line":"                         \u0027pci_devices\u0027, \u0027tags\u0027, \u0027extra\u0027, \u0027flavor\u0027]"},{"line_number":1884,"context_line":""},{"line_number":1885,"context_line":"        expected_list \u003d instance._expected_cols(expected_attr)"},{"line_number":1886,"context_line":"        self.assertEqual(len(expected_list), len(set(expected_attr)))"},{"line_number":1887,"context_line":""},{"line_number":1888,"context_line":"    def test_migrate_instance_keypairs(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a98d1f4_cea7054e","line":1885,"range":{"start_line":1885,"start_character":8,"end_line":1885,"end_character":21},"in_reply_to":"5a8bc5a2_0a553e1c","updated":"2016-09-28 16:17:54.000000000","message":"Done","commit_id":"4f71aafbf4a5e1796c1e75f0c45c43c13b31af62"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"ce2ba47400a18b07ecd41264611d2924039f6040","unresolved":false,"context_lines":[{"line_number":1883,"context_line":"                         \u0027pci_devices\u0027, \u0027tags\u0027, \u0027extra\u0027, \u0027flavor\u0027]"},{"line_number":1884,"context_line":""},{"line_number":1885,"context_line":"        expected_list \u003d instance._expected_cols(expected_attr)"},{"line_number":1886,"context_line":"        self.assertEqual(len(expected_list), len(set(expected_attr)))"},{"line_number":1887,"context_line":""},{"line_number":1888,"context_line":"    def test_migrate_instance_keypairs(self):"},{"line_number":1889,"context_line":"        ctxt \u003d context.RequestContext(\u0027foo\u0027, \u0027bar\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a8bc5a2_aa760ad6","line":1886,"updated":"2016-09-28 11:16:54.000000000","message":"Not sure I like only asserting the length here.\n\nCould we not assert against a real expected list that you create that maintains the order of what we pass in?","commit_id":"4f71aafbf4a5e1796c1e75f0c45c43c13b31af62"},{"author":{"_account_id":18335,"name":"Pushkar Umaranikar","email":"pushkar.umaranikar@intel.com","username":"pushkarumaranikar"},"change_message_id":"5ba5fa8403f3f96a072bda387ad6c49262c6f0cc","unresolved":false,"context_lines":[{"line_number":1883,"context_line":"                         \u0027pci_devices\u0027, \u0027tags\u0027, \u0027extra\u0027, \u0027flavor\u0027]"},{"line_number":1884,"context_line":""},{"line_number":1885,"context_line":"        expected_list \u003d instance._expected_cols(expected_attr)"},{"line_number":1886,"context_line":"        self.assertEqual(len(expected_list), len(set(expected_attr)))"},{"line_number":1887,"context_line":""},{"line_number":1888,"context_line":"    def test_migrate_instance_keypairs(self):"},{"line_number":1889,"context_line":"        ctxt \u003d context.RequestContext(\u0027foo\u0027, \u0027bar\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a98d1f4_ee620116","line":1886,"in_reply_to":"5a8bc5a2_aa760ad6","updated":"2016-09-28 16:17:54.000000000","message":"Done","commit_id":"4f71aafbf4a5e1796c1e75f0c45c43c13b31af62"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"b4d3a225743f3263712356a5b5f7e69e2119be8c","unresolved":false,"context_lines":[{"line_number":1884,"context_line":""},{"line_number":1885,"context_line":"        result_list \u003d instance._expected_cols(expected_attr)"},{"line_number":1886,"context_line":""},{"line_number":1887,"context_line":"        self.assertEqual(len(result_list), len(set(expected_attr)))"},{"line_number":1888,"context_line":"        self.assertEqual([\u0027metadata\u0027, \u0027system_metadata\u0027, \u0027info_cache\u0027,"},{"line_number":1889,"context_line":"                         \u0027security_groups\u0027, \u0027pci_devices\u0027, \u0027tags\u0027, \u0027extra\u0027,"},{"line_number":1890,"context_line":"                         \u0027extra.flavor\u0027], result_list)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a98d1f4_def944ca","line":1887,"updated":"2016-09-29 11:24:03.000000000","message":"super nit, you already compare the whole list at next line, so this assert is useless.","commit_id":"dc7c21f3cfbd5f68e9bc6b88f75e160826fadb82"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"415c636c02d2e2ab53a88d47c27f994b91501095","unresolved":false,"context_lines":[{"line_number":1884,"context_line":""},{"line_number":1885,"context_line":"        result_list \u003d instance._expected_cols(expected_attr)"},{"line_number":1886,"context_line":""},{"line_number":1887,"context_line":"        self.assertEqual(len(result_list), len(set(expected_attr)))"},{"line_number":1888,"context_line":"        self.assertEqual([\u0027metadata\u0027, \u0027system_metadata\u0027, \u0027info_cache\u0027,"},{"line_number":1889,"context_line":"                         \u0027security_groups\u0027, \u0027pci_devices\u0027, \u0027tags\u0027, \u0027extra\u0027,"},{"line_number":1890,"context_line":"                         \u0027extra.flavor\u0027], result_list)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a98d1f4_aa24a10c","line":1887,"in_reply_to":"3a98d1f4_def944ca","updated":"2016-10-03 14:12:46.000000000","message":"Yeah, this line should be removed. Lets do that in a follow up.","commit_id":"dc7c21f3cfbd5f68e9bc6b88f75e160826fadb82"}]}
