)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":14131,"name":"shaohef","email":"shaohe.feng@intel.com","username":"shaohefeng"},"change_message_id":"e96658314ac53deb746b5bc3994f992982286abd","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add validations for volume_size and destination_type of"},{"line_number":10,"context_line":"block device mapping when creating an instance"},{"line_number":11,"context_line":"in orderto avoid HTTP 500 errors."},{"line_number":12,"context_line":"Validations has been added in V2.1 API only."},{"line_number":13,"context_line":"Validations that has been added are as follows:"},{"line_number":14,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"bae84128_df42a267","line":11,"range":{"start_line":11,"start_character":3,"end_line":11,"end_character":10},"updated":"2016-02-23 09:25:18.000000000","message":"order to","commit_id":"c6df1fc31352b9fa1e83ad02ec006ff61d1e3c78"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"2c8a4ad9b0a46749acba312bb4890369599a34e2","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add validations for volume_size and destination_type of"},{"line_number":10,"context_line":"block device mapping when creating an instance"},{"line_number":11,"context_line":"in orderto avoid HTTP 500 errors."},{"line_number":12,"context_line":"Validations has been added in V2.1 API only."},{"line_number":13,"context_line":"Validations that has been added are as follows:"},{"line_number":14,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"bae84128_32765cd7","line":11,"range":{"start_line":11,"start_character":3,"end_line":11,"end_character":10},"in_reply_to":"bae84128_df42a267","updated":"2016-02-23 11:43:12.000000000","message":"Done","commit_id":"c6df1fc31352b9fa1e83ad02ec006ff61d1e3c78"}],"nova/api/openstack/compute/schemas/block_device_mapping.py":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"330465d4f209098f2d85be4355918a1972b793d3","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    # \"block_device_mapping\""},{"line_number":37,"context_line":"    \u0027destination_type\u0027: {"},{"line_number":38,"context_line":"        \u0027type\u0027: \u0027string\u0027,"},{"line_number":39,"context_line":"        \u0027enum\u0027: [\u0027volume\u0027, \u0027local\u0027],"},{"line_number":40,"context_line":"    },"},{"line_number":41,"context_line":"    # Defined as varchar(255) in column \"guest_format\" in table"},{"line_number":42,"context_line":"    # \"block_device_mapping\""}],"source_content_type":"text/x-python","patch_set":16,"id":"ba0121b8_7fcbc71e","line":39,"range":{"start_line":39,"start_character":0,"end_line":39,"end_character":36},"updated":"2016-03-30 08:54:28.000000000","message":"This will work but how about using the accepted value from common place to avoid any schema change in future. \n\nAccepted destination_type are defined below-\n\nhttps://github.com/openstack/nova/blob/master/nova/objects/fields.py#L110","commit_id":"44b56fa03ed8267a1af1e030ff2a441c90520e05"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"b872e5385c16aa8072d53eb00861d579ba1d59ef","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    # \"block_device_mapping\""},{"line_number":37,"context_line":"    \u0027destination_type\u0027: {"},{"line_number":38,"context_line":"        \u0027type\u0027: \u0027string\u0027,"},{"line_number":39,"context_line":"        \u0027enum\u0027: [\u0027volume\u0027, \u0027local\u0027],"},{"line_number":40,"context_line":"    },"},{"line_number":41,"context_line":"    # Defined as varchar(255) in column \"guest_format\" in table"},{"line_number":42,"context_line":"    # \"block_device_mapping\""}],"source_content_type":"text/x-python","patch_set":16,"id":"ba0121b8_ddcd4267","line":39,"range":{"start_line":39,"start_character":0,"end_line":39,"end_character":36},"in_reply_to":"ba0121b8_7fcbc71e","updated":"2016-04-01 05:11:31.000000000","message":"Done","commit_id":"44b56fa03ed8267a1af1e030ff2a441c90520e05"}],"nova/api/openstack/compute/schemas/block_device_mapping_v1.py":[{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"7e8dbe34e4ce989db0c41887d28b48b40921bfb2","unresolved":false,"context_lines":[{"line_number":22,"context_line":"        },"},{"line_number":23,"context_line":"        \u0027volume_id\u0027: parameter_types.volume_id,"},{"line_number":24,"context_line":"        \u0027snapshot_id\u0027: parameter_types.image_id,"},{"line_number":25,"context_line":"        \u0027volume_size\u0027: parameter_types.volume_size,"},{"line_number":26,"context_line":"        # Do not allow empty device names and number values and"},{"line_number":27,"context_line":"        # containing spaces(defined in nova/block_device.py:from_api())"},{"line_number":28,"context_line":"        \u0027device_name\u0027: {"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a061dce_101d9166","line":25,"updated":"2016-04-08 20:11:57.000000000","message":"I\u0027m not sure I understand why non_negative_integer is not appropriate here.","commit_id":"efb6f4c4b85bd36596a2246d98936531c2af2cf3"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"707ed483012644dd6b97e8d276d2a1b3c76b2b04","unresolved":false,"context_lines":[{"line_number":22,"context_line":"        },"},{"line_number":23,"context_line":"        \u0027volume_id\u0027: parameter_types.volume_id,"},{"line_number":24,"context_line":"        \u0027snapshot_id\u0027: parameter_types.image_id,"},{"line_number":25,"context_line":"        \u0027volume_size\u0027: parameter_types.volume_size,"},{"line_number":26,"context_line":"        # Do not allow empty device names and number values and"},{"line_number":27,"context_line":"        # containing spaces(defined in nova/block_device.py:from_api())"},{"line_number":28,"context_line":"        \u0027device_name\u0027: {"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a18252c_b4d0be20","line":25,"in_reply_to":"9a061dce_101d9166","updated":"2016-04-14 05:02:36.000000000","message":"@Sean, Thank you for your comment.\n\n\u0027non_negative_integer\u0027 includes 0.\nIf 0 is specified, 500 error occurs.\n(See the bug report.)\nAnd if trying to create a volume whose size is 0 in cinder,\ncinder returns \"Invalid input received: Volume size \u00270\u0027 must be an integer and greater than 0 (HTTP 400)\".\nSo \u0027non_negative_integer\u0027 is not appropriate.","commit_id":"efb6f4c4b85bd36596a2246d98936531c2af2cf3"}],"nova/block_device.py":[{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"c220c46f6ccd460437d1ea5b36fb2798fae73e0a","unresolved":false,"context_lines":[{"line_number":211,"context_line":""},{"line_number":212,"context_line":"            if (destination_type is not None and"},{"line_number":213,"context_line":"                    (destination_type \u003d\u003d \u0027\u0027 or"},{"line_number":214,"context_line":"                        destination_type not in (\u0027volume\u0027, \u0027local\u0027))):"},{"line_number":215,"context_line":"                raise exception.InvalidBDMFormat("},{"line_number":216,"context_line":"                    details\u003d_(\"Invalid destination_type field.\"))"},{"line_number":217,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_3aa6fb53","line":214,"range":{"start_line":214,"start_character":24,"end_line":214,"end_character":70},"updated":"2016-01-04 01:54:12.000000000","message":"This patch adds the validation on REST API layer. So if doing that, this validation doesn\u0027t work. Why do we need to add here also?\n\nThe purpose of REST API validation is to make the deep code (like here) simple as possible and we are trying to remove this kind of check with REST API validation. So if possible, I\u0027d like to avoid this validation code.","commit_id":"935a859ce255632d55c076b8fcd1ec8b57c2f978"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"047728bbb144ba94e56938858fdf0437a01a4a35","unresolved":false,"context_lines":[{"line_number":211,"context_line":""},{"line_number":212,"context_line":"            if (destination_type is not None and"},{"line_number":213,"context_line":"                    (destination_type \u003d\u003d \u0027\u0027 or"},{"line_number":214,"context_line":"                        destination_type not in (\u0027volume\u0027, \u0027local\u0027))):"},{"line_number":215,"context_line":"                raise exception.InvalidBDMFormat("},{"line_number":216,"context_line":"                    details\u003d_(\"Invalid destination_type field.\"))"},{"line_number":217,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9a68dd71_a4d3d237","line":214,"range":{"start_line":214,"start_character":24,"end_line":214,"end_character":70},"in_reply_to":"ba63e191_33c13381","updated":"2016-01-21 07:17:08.000000000","message":"Ohmichi-san,\n\nThank you for your advice.\nI have fixed them.","commit_id":"935a859ce255632d55c076b8fcd1ec8b57c2f978"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"1687de5c8efd58e0ffba74d8c64ad94336af5ff3","unresolved":false,"context_lines":[{"line_number":211,"context_line":""},{"line_number":212,"context_line":"            if (destination_type is not None and"},{"line_number":213,"context_line":"                    (destination_type \u003d\u003d \u0027\u0027 or"},{"line_number":214,"context_line":"                        destination_type not in (\u0027volume\u0027, \u0027local\u0027))):"},{"line_number":215,"context_line":"                raise exception.InvalidBDMFormat("},{"line_number":216,"context_line":"                    details\u003d_(\"Invalid destination_type field.\"))"},{"line_number":217,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba63e191_33c13381","line":214,"range":{"start_line":214,"start_character":24,"end_line":214,"end_character":70},"in_reply_to":"da6ed579_9b1f9f07","updated":"2016-01-20 08:29:16.000000000","message":"I also faced this kind of problem during implementing unit tests and we can pass the problem by implementing legacy v2.0 unit tests like\n\nclass FooTestV21(..)\n\n def test_bar(self):\n    ...\n\nclass FooTestV2(FooTestV21)\n\n def test_bar(self):\n    pass\n\nhttps://github.com/openstack/nova/blob/master/nova/tests/unit/api/openstack/compute/test_scheduler_hints.py#L154 is a good sample.","commit_id":"935a859ce255632d55c076b8fcd1ec8b57c2f978"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"188ed9a6f8eb5a9522b981c3ce71b36c454c6884","unresolved":false,"context_lines":[{"line_number":211,"context_line":""},{"line_number":212,"context_line":"            if (destination_type is not None and"},{"line_number":213,"context_line":"                    (destination_type \u003d\u003d \u0027\u0027 or"},{"line_number":214,"context_line":"                        destination_type not in (\u0027volume\u0027, \u0027local\u0027))):"},{"line_number":215,"context_line":"                raise exception.InvalidBDMFormat("},{"line_number":216,"context_line":"                    details\u003d_(\"Invalid destination_type field.\"))"},{"line_number":217,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da6ed579_9b1f9f07","line":214,"range":{"start_line":214,"start_character":24,"end_line":214,"end_character":70},"in_reply_to":"fa69d971_3aa6fb53","updated":"2016-01-14 11:40:31.000000000","message":"The reason why I modified this file was to add validations for legacy V2.0 API.\nIf not, unit tests fail.\n(nova.tests.unit.api.openstack.compute.test_block_device_mapping_v1.BlockDeviceMappingTestV2 and nova.tests.unit.api.openstack.compute.test_block_device_mapping.BlockDeviceMappingTestV2)","commit_id":"935a859ce255632d55c076b8fcd1ec8b57c2f978"}],"nova/tests/unit/api/openstack/compute/test_block_device_mapping.py":[{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"828b4ad7d46dc3e7c2aae14ffaf8ba45e99448f6","unresolved":false,"context_lines":[{"line_number":231,"context_line":"        self.assertRaises(self.validation_error,"},{"line_number":232,"context_line":"                          self._test_create, params, no_image\u003dTrue)"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    def test_create_instance_with_destination_type_empty_string(self):"},{"line_number":235,"context_line":"        self.bdm[0][\u0027destination_type\u0027] \u003d \u0027\u0027"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"        old_create \u003d compute_api.API.create"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_2048f22c","line":234,"range":{"start_line":234,"start_character":4,"end_line":234,"end_character":70},"updated":"2016-01-22 05:41:31.000000000","message":"Most codes are duplicated, how about create a private function like:\n\ndef _test_create_instance_with_destination_type(self, dest_type):\n        self.bdm[0][\u0027destination_type\u0027] \u003d dest_tpye\n\n        old_create \u003d compute_api.API.create\n\n        def create(*args, **kwargs):\n            self.assertEqual(kwargs[\u0027block_device_mapping\u0027], self.bdm)\n            return old_create(*args, **kwargs)\n\n        self.stubs.Set(compute_api.API, \u0027create\u0027, create)\n\n        params \u003d {block_device_mapping.ATTRIBUTE_NAME: self.bdm}\n        self.assertRaises(self.validation_error,\n                          self._test_create, params, no_image\u003dTrue)\n\n\ndef test_create_instance_with_destination_type_empty_string(self):\n       self._test_create_instance_with_destination_type(self, \"\"):\n\ndef test_create_instance_with_invalid_destination_type(self):\n      self._test_create_instance_with_destination_type(self, \"fake\"):","commit_id":"442f554a8834d6c16c438273496ed7d0c45dcd6f"},{"author":{"_account_id":14131,"name":"shaohef","email":"shaohe.feng@intel.com","username":"shaohefeng"},"change_message_id":"e96658314ac53deb746b5bc3994f992982286abd","unresolved":false,"context_lines":[{"line_number":237,"context_line":""},{"line_number":238,"context_line":"        old_create \u003d compute_api.API.create"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"        def create(*args, **kwargs):"},{"line_number":241,"context_line":"            self.assertEqual(kwargs[\u0027block_device_mapping\u0027], self.bdm)"},{"line_number":242,"context_line":"            return old_create(*args, **kwargs)"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"        self.stubs.Set(compute_api.API, \u0027create\u0027, create)"},{"line_number":245,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"bae84128_62f01dca","line":242,"range":{"start_line":240,"start_character":7,"end_line":242,"end_character":46},"updated":"2016-02-23 09:25:18.000000000","message":"This is looks strangely, use mock can avoid it?","commit_id":"c6df1fc31352b9fa1e83ad02ec006ff61d1e3c78"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"2c8a4ad9b0a46749acba312bb4890369599a34e2","unresolved":false,"context_lines":[{"line_number":237,"context_line":""},{"line_number":238,"context_line":"        old_create \u003d compute_api.API.create"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"        def create(*args, **kwargs):"},{"line_number":241,"context_line":"            self.assertEqual(kwargs[\u0027block_device_mapping\u0027], self.bdm)"},{"line_number":242,"context_line":"            return old_create(*args, **kwargs)"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"        self.stubs.Set(compute_api.API, \u0027create\u0027, create)"},{"line_number":245,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"bae84128_b269ccfb","line":242,"range":{"start_line":240,"start_character":7,"end_line":242,"end_character":46},"in_reply_to":"bae84128_62f01dca","updated":"2016-02-23 11:43:12.000000000","message":"Done","commit_id":"c6df1fc31352b9fa1e83ad02ec006ff61d1e3c78"},{"author":{"_account_id":14131,"name":"shaohef","email":"shaohe.feng@intel.com","username":"shaohefeng"},"change_message_id":"e96658314ac53deb746b5bc3994f992982286abd","unresolved":false,"context_lines":[{"line_number":241,"context_line":"            self.assertEqual(kwargs[\u0027block_device_mapping\u0027], self.bdm)"},{"line_number":242,"context_line":"            return old_create(*args, **kwargs)"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"        self.stubs.Set(compute_api.API, \u0027create\u0027, create)"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"        params \u003d {block_device_mapping.ATTRIBUTE_NAME: self.bdm}"},{"line_number":247,"context_line":"        self.assertRaises(self.validation_error,"}],"source_content_type":"text/x-python","patch_set":8,"id":"bae84128_a22ea540","line":244,"range":{"start_line":244,"start_character":12,"end_line":244,"end_character":23},"updated":"2016-02-23 09:25:18.000000000","message":"seems stubs is not recommended. \n\nI know you are follow the same way of other tests in this file.","commit_id":"c6df1fc31352b9fa1e83ad02ec006ff61d1e3c78"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"2c8a4ad9b0a46749acba312bb4890369599a34e2","unresolved":false,"context_lines":[{"line_number":241,"context_line":"            self.assertEqual(kwargs[\u0027block_device_mapping\u0027], self.bdm)"},{"line_number":242,"context_line":"            return old_create(*args, **kwargs)"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"        self.stubs.Set(compute_api.API, \u0027create\u0027, create)"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"        params \u003d {block_device_mapping.ATTRIBUTE_NAME: self.bdm}"},{"line_number":247,"context_line":"        self.assertRaises(self.validation_error,"}],"source_content_type":"text/x-python","patch_set":8,"id":"bae84128_126b58f2","line":244,"range":{"start_line":244,"start_character":12,"end_line":244,"end_character":23},"in_reply_to":"bae84128_a22ea540","updated":"2016-02-23 11:43:12.000000000","message":"Done","commit_id":"c6df1fc31352b9fa1e83ad02ec006ff61d1e3c78"}],"nova/tests/unit/api/openstack/compute/test_block_device_mapping_v1.py":[{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"828b4ad7d46dc3e7c2aae14ffaf8ba45e99448f6","unresolved":false,"context_lines":[{"line_number":259,"context_line":"        self.assertRaises(self.validation_error,"},{"line_number":260,"context_line":"                          self._test_create, params)"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"    def test_create_instance_with_size_empty_string(self):"},{"line_number":263,"context_line":"        bdm \u003d [{\u0027delete_on_termination\u0027: True,"},{"line_number":264,"context_line":"                \u0027device_name\u0027: \u0027vda\u0027,"},{"line_number":265,"context_line":"                \u0027volume_size\u0027: \u0027\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_805f5ee4","line":262,"range":{"start_line":262,"start_character":7,"end_line":262,"end_character":58},"updated":"2016-01-22 05:41:31.000000000","message":"Ditto.\nyou can create a private function and pass volume_size as a parameter to do test.","commit_id":"442f554a8834d6c16c438273496ed7d0c45dcd6f"}]}
