)]}'
{"nova/block_device.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2727b1260a8854f44e8ef2f054853c25754d0947","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        validate_and_default_volume_size(bdm_dict)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        if bdm_dict.get(\u0027boot_index\u0027):"},{"line_number":125,"context_line":"            try:"},{"line_number":126,"context_line":"                bdm_dict[\u0027boot_index\u0027] \u003d int(bdm_dict[\u0027boot_index\u0027])"},{"line_number":127,"context_line":"            except ValueError:"},{"line_number":128,"context_line":"                raise exception.InvalidBDMFormat("}],"source_content_type":"text/x-python","patch_set":4,"id":"fa32b979_73b8aa75","line":125,"updated":"2015-06-18 03:15:04.000000000","message":"I guess we have the same thing here so nevermind on the comment below.","commit_id":"aa9ef318b505cc062ddc4fe15359b0ca4e9e1d19"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f45382c4772e61e8c3cfa2f4112059077120a92","unresolved":false,"context_lines":[{"line_number":201,"context_line":"                    boot_index \u003d int(api_dict.get(\u0027boot_index\u0027, -1))"},{"line_number":202,"context_line":"                except ValueError:"},{"line_number":203,"context_line":"                    raise exception.InvalidBDMFormat("},{"line_number":204,"context_line":"                        details\u003d_(\"Boot index is invalid.\"))"},{"line_number":205,"context_line":"                # if this bdm is generated from --image ,then"},{"line_number":206,"context_line":"                # source_type \u003d image and destination_type \u003d local is allowed"},{"line_number":207,"context_line":"                if not (image_uuid_specified and boot_index \u003d\u003d 0):"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa32b979_530b267d","line":204,"updated":"2015-06-18 03:00:14.000000000","message":"This should say what a valid boot index is.","commit_id":"aa9ef318b505cc062ddc4fe15359b0ca4e9e1d19"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"da7b33e4e8326415bca5267b293670ab9a85d513","unresolved":false,"context_lines":[{"line_number":201,"context_line":"                    boot_index \u003d int(api_dict.get(\u0027boot_index\u0027, -1))"},{"line_number":202,"context_line":"                except ValueError:"},{"line_number":203,"context_line":"                    raise exception.InvalidBDMFormat("},{"line_number":204,"context_line":"                        details\u003d_(\"Boot index is invalid.\"))"},{"line_number":205,"context_line":"                # if this bdm is generated from --image ,then"},{"line_number":206,"context_line":"                # source_type \u003d image and destination_type \u003d local is allowed"},{"line_number":207,"context_line":"                if not (image_uuid_specified and boot_index \u003d\u003d 0):"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa32b979_53e7a6ab","line":204,"in_reply_to":"fa32b979_530b267d","updated":"2015-06-18 03:05:59.000000000","message":"Unfortunately，My English is not good.Need your help.Thanks.","commit_id":"aa9ef318b505cc062ddc4fe15359b0ca4e9e1d19"}],"nova/tests/unit/test_block_device.py":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"c0164212a1d675bb04b8a16cc2dae7b20d0f7ea8","unresolved":false,"context_lines":[{"line_number":572,"context_line":"                    \u0027destination_type\u0027: \u0027local\u0027,"},{"line_number":573,"context_line":"                    \u0027volume_id\u0027: \u0027fake-volume-id-1\u0027,"},{"line_number":574,"context_line":"                    \u0027uuid\u0027: 1,"},{"line_number":575,"context_line":"                    \u0027boot_index\u0027: \u00270\u0027}"},{"line_number":576,"context_line":""},{"line_number":577,"context_line":"        retexp \u003d block_device.BlockDeviceDict("},{"line_number":578,"context_line":"            {\u0027id\u0027: 1,"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa32b979_66d5861a","line":575,"updated":"2015-06-16 22:46:53.000000000","message":"I think this is too subtle a way to test that a string \u00270\u0027 will pass the validation and it takes away testing of the integer 0 (I think we should test both). So I suggest adding a new test that tests the input \u00270\u0027 -- you can add an arg for the boot_index to avoid duplicating the function body.","commit_id":"cc6d53db2637188c890fdcc476c1999b9c3e6b2e"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"01bccce0e6a0bf8893e4d331106cbc9624a1ca27","unresolved":false,"context_lines":[{"line_number":572,"context_line":"                    \u0027destination_type\u0027: \u0027local\u0027,"},{"line_number":573,"context_line":"                    \u0027volume_id\u0027: \u0027fake-volume-id-1\u0027,"},{"line_number":574,"context_line":"                    \u0027uuid\u0027: 1,"},{"line_number":575,"context_line":"                    \u0027boot_index\u0027: \u00270\u0027}"},{"line_number":576,"context_line":""},{"line_number":577,"context_line":"        retexp \u003d block_device.BlockDeviceDict("},{"line_number":578,"context_line":"            {\u0027id\u0027: 1,"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa32b979_6614a69f","line":575,"in_reply_to":"fa32b979_66d5861a","updated":"2015-06-16 22:55:09.000000000","message":"To clarify, I meant make it a private helper function and have two tests call it with boot_index arg, one is int, one is string.","commit_id":"cc6d53db2637188c890fdcc476c1999b9c3e6b2e"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"bd9868851e82859ffca41dfd8b407adc6b8ecf5e","unresolved":false,"context_lines":[{"line_number":603,"context_line":"                    \u0027boot_index\u0027: \u0027aaaa0\u0027}"},{"line_number":604,"context_line":"        self.assertRaises(exception.InvalidBDMFormat,"},{"line_number":605,"context_line":"                          block_device.BlockDeviceDict.from_api, api_dict,"},{"line_number":606,"context_line":"                          False)"},{"line_number":607,"context_line":""},{"line_number":608,"context_line":"    def test_legacy(self):"},{"line_number":609,"context_line":"        for legacy, new in zip(self.legacy_mapping, self.new_mapping):"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa32b979_92fbefc0","line":606,"updated":"2015-06-17 22:36:10.000000000","message":"Sorry, I didn\u0027t mean to move the invalid case (L599 - L606). I think you had it correctly in test_from_api_invalid_source_to_local_mapping in the last patch set.\n\nThis test is about checking \"...valid_source_to_local_mapping_with_string_bi\" so the invalid check shouldn\u0027t be in here. The rest of this test (L581 - L597) looks good to me.","commit_id":"81ff7be330377847b99cd7d8cfc76c1d0f243ba4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2727b1260a8854f44e8ef2f054853c25754d0947","unresolved":false,"context_lines":[{"line_number":557,"context_line":"        self.assertRaises(exception.InvalidBDMFormat,"},{"line_number":558,"context_line":"                          block_device.BlockDeviceDict.from_api, api_dict,"},{"line_number":559,"context_line":"                          False)"},{"line_number":560,"context_line":"        api_dict \u003d {\u0027id\u0027: 1,"},{"line_number":561,"context_line":"                    \u0027source_type\u0027: \u0027image\u0027,"},{"line_number":562,"context_line":"                    \u0027destination_type\u0027: \u0027local\u0027,"},{"line_number":563,"context_line":"                    \u0027uuid\u0027: \u0027fake-volume-id-1\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa32b979_5311e65b","line":560,"updated":"2015-06-18 03:15:04.000000000","message":"Let\u0027s move this into it\u0027s own test case please, especially since the breaking change is in stable/kilo so we\u0027re going to have to backport this change, so we want the backport to be as clean as possible.\n\nhttps://review.openstack.org/#/c/174060/","commit_id":"aa9ef318b505cc062ddc4fe15359b0ca4e9e1d19"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2727b1260a8854f44e8ef2f054853c25754d0947","unresolved":false,"context_lines":[{"line_number":600,"context_line":"             \u0027destination_type\u0027: \u0027local\u0027,"},{"line_number":601,"context_line":"             \u0027volume_id\u0027: \u0027fake-volume-id-1\u0027,"},{"line_number":602,"context_line":"             \u0027boot_index\u0027: 0})"},{"line_number":603,"context_line":"        self.assertEqual("},{"line_number":604,"context_line":"            block_device.BlockDeviceDict.from_api(api_dict, True),"},{"line_number":605,"context_line":"            retexp)"},{"line_number":606,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"fa32b979_13627e0a","line":603,"updated":"2015-06-18 03:15:04.000000000","message":"nit: the args for assertEqual are (expected, observed) so you should actually swap the order of the args passed in here.  The result is the same but the MismatchError output would be wrong, so it kind of matters to have this correct.","commit_id":"aa9ef318b505cc062ddc4fe15359b0ca4e9e1d19"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"1f125ec56d7154046e2799597cdcaabdc6e04001","unresolved":false,"context_lines":[{"line_number":600,"context_line":"             \u0027destination_type\u0027: \u0027local\u0027,"},{"line_number":601,"context_line":"             \u0027volume_id\u0027: \u0027fake-volume-id-1\u0027,"},{"line_number":602,"context_line":"             \u0027boot_index\u0027: 0})"},{"line_number":603,"context_line":"        self.assertEqual("},{"line_number":604,"context_line":"            block_device.BlockDeviceDict.from_api(api_dict, True),"},{"line_number":605,"context_line":"            retexp)"},{"line_number":606,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"fa32b979_5e980d6a","line":603,"in_reply_to":"fa32b979_13627e0a","updated":"2015-06-18 03:51:16.000000000","message":"Thanks","commit_id":"aa9ef318b505cc062ddc4fe15359b0ca4e9e1d19"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"1f297258ba0c519a9d9ff429d997fd91291eab9f","unresolved":false,"context_lines":[{"line_number":582,"context_line":"                    \u0027boot_index\u0027: \u0027aaaa0\u0027}"},{"line_number":583,"context_line":"        self.assertRaises(exception.InvalidBDMFormat,"},{"line_number":584,"context_line":"                          block_device.BlockDeviceDict.from_api, api_dict,"},{"line_number":585,"context_line":"                          False)"},{"line_number":586,"context_line":""},{"line_number":587,"context_line":"    def test_from_api_valid_source_to_local_mapping_with_string_bi(self):"},{"line_number":588,"context_line":"        api_dict \u003d {\u0027id\u0027: 1,"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa32b979_9f076f81","line":585,"updated":"2015-06-18 06:46:57.000000000","message":"I think Matt meant that this test (L578 - L585) should be in its own separate test, for the backport. Originally, you had added it to test_from_api_invalid_source_to_local_mapping. Now you have it in test_from_api_valid_source_to_local_mapping (note, \"valid\") and this is a test for \"invalid\" mapping.\n\nSo what you want to do is leave test_from_api_valid_source_to_local_mapping unchanged and add this code (L578 - L585) to a new test for example \"test_from_api_invalid_source_to_local_mapping_with_string_bi\" that way you end up with two new tests only:\n\n test_from_api_valid_source_to_local_mapping_with_string_bi\n test_from_api_invalid_source_to_local_mapping_with_string_bi\n\nand no changes to the already existing tests. Does it make sense?","commit_id":"ee542105cb71fd4ba0e1141f7fd4306eca7f8ddb"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"a4d26adc3dd6fe34840c97d8dac2f3cd1569d7ce","unresolved":false,"context_lines":[{"line_number":582,"context_line":"                    \u0027boot_index\u0027: \u0027aaaa0\u0027}"},{"line_number":583,"context_line":"        self.assertRaises(exception.InvalidBDMFormat,"},{"line_number":584,"context_line":"                          block_device.BlockDeviceDict.from_api, api_dict,"},{"line_number":585,"context_line":"                          False)"},{"line_number":586,"context_line":""},{"line_number":587,"context_line":"    def test_from_api_valid_source_to_local_mapping_with_string_bi(self):"},{"line_number":588,"context_line":"        api_dict \u003d {\u0027id\u0027: 1,"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa32b979_bfcd9332","line":585,"in_reply_to":"fa32b979_9f076f81","updated":"2015-06-18 06:53:19.000000000","message":"Right,I misread Matt.Thanks,melanie","commit_id":"ee542105cb71fd4ba0e1141f7fd4306eca7f8ddb"},{"author":{"_account_id":12898,"name":"Tony Breeds","email":"tony@bakeyournoodle.com","username":"tonyb"},"change_message_id":"8a176bf90991b2fcebf5f17cc2de83f96161ee8d","unresolved":false,"context_lines":[{"line_number":581,"context_line":"        api_dict \u003d {\u0027id\u0027: 1,"},{"line_number":582,"context_line":"            \u0027source_type\u0027: \u0027image\u0027,"},{"line_number":583,"context_line":"            \u0027destination_type\u0027: \u0027local\u0027,"},{"line_number":584,"context_line":"            \u0027uuid\u0027: \u0027fake-volume-id-1\u0027,"},{"line_number":585,"context_line":"            \u0027boot_index\u0027: \u0027aaaa0\u0027}"},{"line_number":586,"context_line":"        self.assertRaises(exception.InvalidBDMFormat,"},{"line_number":587,"context_line":"                          block_device.BlockDeviceDict.from_api, api_dict,"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa32b979_dd6f15c2","line":584,"updated":"2015-06-18 21:59:56.000000000","message":"I know this has merged and doesn\u0027t really change anything BUT ...\n\u0027uuid\u0027: \u0027fake-volume-id\u0027\nseems strange and doesn\u0027t match the api_dict at L590","commit_id":"1ae7d453e59f483f7a90fcd60aa51870ca11af92"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"31e7a415865ebf35c9599d80e4515757ad272595","unresolved":false,"context_lines":[{"line_number":581,"context_line":"        api_dict \u003d {\u0027id\u0027: 1,"},{"line_number":582,"context_line":"            \u0027source_type\u0027: \u0027image\u0027,"},{"line_number":583,"context_line":"            \u0027destination_type\u0027: \u0027local\u0027,"},{"line_number":584,"context_line":"            \u0027uuid\u0027: \u0027fake-volume-id-1\u0027,"},{"line_number":585,"context_line":"            \u0027boot_index\u0027: \u0027aaaa0\u0027}"},{"line_number":586,"context_line":"        self.assertRaises(exception.InvalidBDMFormat,"},{"line_number":587,"context_line":"                          block_device.BlockDeviceDict.from_api, api_dict,"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa32b979_0831b959","line":584,"in_reply_to":"fa32b979_dd6f15c2","updated":"2015-06-18 22:45:29.000000000","message":"Yes,uuid here should be \"fake-image-id\" better.And at L594  it  could be removed,because source_type + uuid is enough.","commit_id":"1ae7d453e59f483f7a90fcd60aa51870ca11af92"}]}
