)]}'
{"nova/api/openstack/compute/volumes.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f831ca17dca4bcbde6ebd38251d27917cd8a86dd","unresolved":false,"context_lines":[{"line_number":310,"context_line":"            assigned_mountpoint)}"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"    # TODO(mriedem): This API should return a 202 instead of a 200 response."},{"line_number":313,"context_line":"    @wsgi.expected_errors((400, 403, 404, 409))"},{"line_number":314,"context_line":"    @validation.schema(volumes_schema.create_volume_attachment, \u00272.0\u0027, \u00272.48\u0027)"},{"line_number":315,"context_line":"    @validation.schema(volumes_schema.create_volume_attachment_v249, \u00272.49\u0027)"},{"line_number":316,"context_line":"    def create(self, req, server_id, body):"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_f2ea4273","line":313,"range":{"start_line":313,"start_character":32,"end_line":313,"end_character":35},"updated":"2019-01-24 21:11:21.000000000","message":"And this doesn\u0027t require a new microversion because 403 is implied because of policy checks:\n\nhttps://docs.openstack.org/nova/latest/contributor/microversions.html#f2","commit_id":"eb9fa2b2f75243313f6ad4bdb899d6aa68f0a173"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f831ca17dca4bcbde6ebd38251d27917cd8a86dd","unresolved":false,"context_lines":[{"line_number":352,"context_line":"                exception.MultiattachNotSupportedOldMicroversion,"},{"line_number":353,"context_line":"                exception.MultiattachToShelvedNotSupported) as e:"},{"line_number":354,"context_line":"            raise exc.HTTPBadRequest(explanation\u003de.format_message())"},{"line_number":355,"context_line":"        except exception.TooManyDiskDevices as e:"},{"line_number":356,"context_line":"            raise exc.HTTPForbidden(explanation\u003de.format_message())"},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"        # The attach is async"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_7293b2fb","line":355,"range":{"start_line":355,"start_character":25,"end_line":355,"end_character":43},"updated":"2019-01-24 21:11:21.000000000","message":"And we can hit this from compute_api.attach_volume because that calls reserve_block_device_name:\n\nhttps://github.com/openstack/nova/blob/9419c3e05499e55beda93d664197a7b0f0011ff7/nova/compute/api.py#L4034\n\nWhich is an RPC call:\n\nhttps://github.com/openstack/nova/blob/9419c3e05499e55beda93d664197a7b0f0011ff7/nova/compute/rpcapi.py#L914","commit_id":"eb9fa2b2f75243313f6ad4bdb899d6aa68f0a173"}],"nova/exception.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"28be7e64c3c7789c6139c6e1f5fbd10208fa8158","unresolved":false,"context_lines":[{"line_number":247,"context_line":"class TooManyDiskDevices(InvalidBDM):"},{"line_number":248,"context_line":"    msg_fmt \u003d _(\u0027The maximum allowed number of disk devices (%(maximum)d) to \u0027"},{"line_number":249,"context_line":"                \u0027attach to a single instance has been exceeded.\u0027)"},{"line_number":250,"context_line":"    code \u003d 403"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"class InvalidAttribute(Invalid):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_47df8d39","line":250,"updated":"2019-01-29 15:31:35.000000000","message":"403 should be for authorization failures, not bad input or failed preconditions. This is a pretty classic 400 in my opinion, not a 403.","commit_id":"6489f2d2b44827d133dad9a3bb52436ee304a934"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3c8fdcacd850738159f0a92c01c704026e982568","unresolved":false,"context_lines":[{"line_number":247,"context_line":"class TooManyDiskDevices(InvalidBDM):"},{"line_number":248,"context_line":"    msg_fmt \u003d _(\u0027The maximum allowed number of disk devices (%(maximum)d) to \u0027"},{"line_number":249,"context_line":"                \u0027attach to a single instance has been exceeded.\u0027)"},{"line_number":250,"context_line":"    code \u003d 403"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"class InvalidAttribute(Invalid):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_1a7b187b","line":250,"in_reply_to":"9fdfeff1_47df8d39","updated":"2019-01-29 16:07:48.000000000","message":"See the discussion on the original patch before this was split out:\n\nhttps://review.openstack.org/#/c/616777/8//COMMIT_MSG@14\n\nI was going for 409 (the request is fine, it\u0027s the state of the system that is in conflict, so I think 400 is wrong).\n\nThe 403 is for consistency with other quota-type failures like this, which is essentially a kind of quota thing.","commit_id":"6489f2d2b44827d133dad9a3bb52436ee304a934"}],"nova/tests/functional/test_servers.py":[{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"ece91217815c00655d2b3646ff9f8684cd2df6df","unresolved":false,"context_lines":[{"line_number":1213,"context_line":"        self._delete_server(server_id)"},{"line_number":1214,"context_line":""},{"line_number":1215,"context_line":"    @mock.patch(\u0027nova.objects.BlockDeviceMappingList.get_by_instance_uuid\u0027)"},{"line_number":1216,"context_line":"    def test_attach_vol_no_free_disk_device_name(self, mock_get_bdms):"},{"line_number":1217,"context_line":"        self.useFixture(nova_fixtures.CinderFixtureNewAttachFlow(self))"},{"line_number":1218,"context_line":""},{"line_number":1219,"context_line":"        server \u003d self._create_server()[1]"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_ee5a6d4e","line":1216,"range":{"start_line":1216,"start_character":8,"end_line":1216,"end_character":48},"updated":"2019-01-24 07:40:58.000000000","message":"why not just call this maximum allowed exceeded.","commit_id":"81e1fff0b45e09a872abc4eea21b5d605a1af597"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"5746f07e2575bd0ed9ca3cfd28c77dd4df2cac70","unresolved":false,"context_lines":[{"line_number":1213,"context_line":"        self._delete_server(server_id)"},{"line_number":1214,"context_line":""},{"line_number":1215,"context_line":"    @mock.patch(\u0027nova.objects.BlockDeviceMappingList.get_by_instance_uuid\u0027)"},{"line_number":1216,"context_line":"    def test_attach_vol_no_free_disk_device_name(self, mock_get_bdms):"},{"line_number":1217,"context_line":"        self.useFixture(nova_fixtures.CinderFixtureNewAttachFlow(self))"},{"line_number":1218,"context_line":""},{"line_number":1219,"context_line":"        server \u003d self._create_server()[1]"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_034a227f","line":1216,"range":{"start_line":1216,"start_character":8,"end_line":1216,"end_character":48},"in_reply_to":"9fdfeff1_ee5a6d4e","updated":"2019-01-24 16:21:35.000000000","message":"Yeah, that\u0027s probably better. When I first typed this, I mixed up the error log with the exception message, in nova/virt/libvirt/blockinfo.py.","commit_id":"81e1fff0b45e09a872abc4eea21b5d605a1af597"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f831ca17dca4bcbde6ebd38251d27917cd8a86dd","unresolved":false,"context_lines":[{"line_number":1043,"context_line":"        self._rebuild_assertRaisesRegex(server_id, \u0027x\u0027 * 256)"},{"line_number":1044,"context_line":""},{"line_number":1045,"context_line":""},{"line_number":1046,"context_line":"class ServerTestV220(ServersTestBase):"},{"line_number":1047,"context_line":"    api_major_version \u003d \u0027v2.1\u0027"},{"line_number":1048,"context_line":""},{"line_number":1049,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_f2148250","line":1046,"range":{"start_line":1046,"start_character":6,"end_line":1046,"end_character":20},"updated":"2019-01-24 21:11:21.000000000","message":"This seems like kind of a weird place to put this test. I\u0027m assuming you just copied an existing test from in here and tweaked it to show the failure, but we could hit this failure regardless of the 2.20+ microversions.\n\nHaving said that, I don\u0027t have a better suggestion unless you just put it in a new class.","commit_id":"eb9fa2b2f75243313f6ad4bdb899d6aa68f0a173"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"65b1877041b9ac872fdfb1d0afe6751338ade10e","unresolved":false,"context_lines":[{"line_number":1043,"context_line":"        self._rebuild_assertRaisesRegex(server_id, \u0027x\u0027 * 256)"},{"line_number":1044,"context_line":""},{"line_number":1045,"context_line":""},{"line_number":1046,"context_line":"class ServerTestV220(ServersTestBase):"},{"line_number":1047,"context_line":"    api_major_version \u003d \u0027v2.1\u0027"},{"line_number":1048,"context_line":""},{"line_number":1049,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_2fa5c0b5","line":1046,"range":{"start_line":1046,"start_character":6,"end_line":1046,"end_character":20},"in_reply_to":"9fdfeff1_8fddcc71","updated":"2019-01-25 01:09:30.000000000","message":"Looking at it again, I\u0027m thinking to move it to the plain ServersTest class, considering it\u0027s an old, latent thing that makes sense to test with v2 and v2.1. Let me know if you think otherwise.","commit_id":"eb9fa2b2f75243313f6ad4bdb899d6aa68f0a173"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"78b3553dd34abb72c15455572fe65ed788455742","unresolved":false,"context_lines":[{"line_number":1043,"context_line":"        self._rebuild_assertRaisesRegex(server_id, \u0027x\u0027 * 256)"},{"line_number":1044,"context_line":""},{"line_number":1045,"context_line":""},{"line_number":1046,"context_line":"class ServerTestV220(ServersTestBase):"},{"line_number":1047,"context_line":"    api_major_version \u003d \u0027v2.1\u0027"},{"line_number":1048,"context_line":""},{"line_number":1049,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_8fddcc71","line":1046,"range":{"start_line":1046,"start_character":6,"end_line":1046,"end_character":20},"in_reply_to":"9fdfeff1_f2148250","updated":"2019-01-25 00:56:40.000000000","message":"Indeed, I just put the test where all the other related tests are. I can put it in a new class.","commit_id":"eb9fa2b2f75243313f6ad4bdb899d6aa68f0a173"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f831ca17dca4bcbde6ebd38251d27917cd8a86dd","unresolved":false,"context_lines":[{"line_number":1212,"context_line":""},{"line_number":1213,"context_line":"        self._delete_server(server_id)"},{"line_number":1214,"context_line":""},{"line_number":1215,"context_line":"    @mock.patch(\u0027nova.objects.BlockDeviceMappingList.get_by_instance_uuid\u0027)"},{"line_number":1216,"context_line":"    def test_attach_vol_maximum_disk_devices_exceeded(self, mock_get_bdms):"},{"line_number":1217,"context_line":"        self.useFixture(nova_fixtures.CinderFixtureNewAttachFlow(self))"},{"line_number":1218,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_f246c27c","line":1215,"updated":"2019-01-24 21:11:21.000000000","message":"Why do you need this mock?","commit_id":"eb9fa2b2f75243313f6ad4bdb899d6aa68f0a173"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"78b3553dd34abb72c15455572fe65ed788455742","unresolved":false,"context_lines":[{"line_number":1212,"context_line":""},{"line_number":1213,"context_line":"        self._delete_server(server_id)"},{"line_number":1214,"context_line":""},{"line_number":1215,"context_line":"    @mock.patch(\u0027nova.objects.BlockDeviceMappingList.get_by_instance_uuid\u0027)"},{"line_number":1216,"context_line":"    def test_attach_vol_maximum_disk_devices_exceeded(self, mock_get_bdms):"},{"line_number":1217,"context_line":"        self.useFixture(nova_fixtures.CinderFixtureNewAttachFlow(self))"},{"line_number":1218,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_4fc0447c","line":1215,"in_reply_to":"9fdfeff1_f246c27c","updated":"2019-01-25 00:56:40.000000000","message":"That\u0027s residual from my first approach when I tried to mock an instance with 26 devices already attached. But because the fake driver doesn\u0027t implement or pass through get_device_name_for_instance, that approach can\u0027t work. Will remove.","commit_id":"eb9fa2b2f75243313f6ad4bdb899d6aa68f0a173"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f831ca17dca4bcbde6ebd38251d27917cd8a86dd","unresolved":false,"context_lines":[{"line_number":1227,"context_line":"        # we\u0027ll just raise the exception directly here, instead of simuluating"},{"line_number":1228,"context_line":"        # an instance with 26 disk devices already attached."},{"line_number":1229,"context_line":"        with mock.patch.object(self.compute.driver,"},{"line_number":1230,"context_line":"                               \u0027get_device_name_for_instance\u0027) as mock_get:"},{"line_number":1231,"context_line":"            mock_get.side_effect \u003d exception.TooManyDiskDevices(maximum\u003d26)"},{"line_number":1232,"context_line":"            ex \u003d self.assertRaises("},{"line_number":1233,"context_line":"                client.OpenStackApiException, self.api.post_server_volume,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_127106e1","line":1230,"range":{"start_line":1230,"start_character":32,"end_line":1230,"end_character":60},"updated":"2019-01-24 21:11:21.000000000","message":"nit: should probably update the docstrong on this in the ComputeDriver class to note that it can raise TooManyDiskDevices.","commit_id":"eb9fa2b2f75243313f6ad4bdb899d6aa68f0a173"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"78b3553dd34abb72c15455572fe65ed788455742","unresolved":false,"context_lines":[{"line_number":1227,"context_line":"        # we\u0027ll just raise the exception directly here, instead of simuluating"},{"line_number":1228,"context_line":"        # an instance with 26 disk devices already attached."},{"line_number":1229,"context_line":"        with mock.patch.object(self.compute.driver,"},{"line_number":1230,"context_line":"                               \u0027get_device_name_for_instance\u0027) as mock_get:"},{"line_number":1231,"context_line":"            mock_get.side_effect \u003d exception.TooManyDiskDevices(maximum\u003d26)"},{"line_number":1232,"context_line":"            ex \u003d self.assertRaises("},{"line_number":1233,"context_line":"                client.OpenStackApiException, self.api.post_server_volume,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_6fbbc80d","line":1230,"range":{"start_line":1230,"start_character":32,"end_line":1230,"end_character":60},"in_reply_to":"9fdfeff1_127106e1","updated":"2019-01-25 00:56:40.000000000","message":"Can do.","commit_id":"eb9fa2b2f75243313f6ad4bdb899d6aa68f0a173"}],"nova/virt/driver.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"28be7e64c3c7789c6139c6e1f5fbd10208fa8158","unresolved":false,"context_lines":[{"line_number":493,"context_line":"                      disk_bus\u003dNone, device_type\u003dNone, encryption\u003dNone):"},{"line_number":494,"context_line":"        \"\"\"Attach the disk to the instance at mountpoint using info."},{"line_number":495,"context_line":""},{"line_number":496,"context_line":"        :raises TooManyDiskDevices: if the maxmimum allowed devices to attach"},{"line_number":497,"context_line":"                                    to a single instance is exceeded."},{"line_number":498,"context_line":"        \"\"\""},{"line_number":499,"context_line":"        raise NotImplementedError()"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_07e50509","line":496,"range":{"start_line":496,"start_character":43,"end_line":496,"end_character":51},"updated":"2019-01-29 15:31:35.000000000","message":"maximum","commit_id":"6489f2d2b44827d133dad9a3bb52436ee304a934"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"28be7e64c3c7789c6139c6e1f5fbd10208fa8158","unresolved":false,"context_lines":[{"line_number":1018,"context_line":"        :param disk_info: instance disk information"},{"line_number":1019,"context_line":"        :param migrate_data: a LiveMigrateData object"},{"line_number":1020,"context_line":"        :returns: migrate_data modified by the driver"},{"line_number":1021,"context_line":"        :raises TooManyDiskDevices: if the maxmimum allowed devices to attach"},{"line_number":1022,"context_line":"                                    to a single instance is exceeded."},{"line_number":1023,"context_line":"        \"\"\""},{"line_number":1024,"context_line":"        raise NotImplementedError()"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_c7ea9dd6","line":1021,"range":{"start_line":1021,"start_character":43,"end_line":1021,"end_character":51},"updated":"2019-01-29 15:31:35.000000000","message":"maximum","commit_id":"6489f2d2b44827d133dad9a3bb52436ee304a934"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"28be7e64c3c7789c6139c6e1f5fbd10208fa8158","unresolved":false,"context_lines":[{"line_number":1020,"context_line":"        :returns: migrate_data modified by the driver"},{"line_number":1021,"context_line":"        :raises TooManyDiskDevices: if the maxmimum allowed devices to attach"},{"line_number":1022,"context_line":"                                    to a single instance is exceeded."},{"line_number":1023,"context_line":"        \"\"\""},{"line_number":1024,"context_line":"        raise NotImplementedError()"},{"line_number":1025,"context_line":""},{"line_number":1026,"context_line":"    def live_migration(self, context, instance, dest,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_a7c67967","line":1023,"updated":"2019-01-29 15:31:35.000000000","message":"why would detach_volume() ever return TooManyDiskDevices?","commit_id":"6489f2d2b44827d133dad9a3bb52436ee304a934"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3c8fdcacd850738159f0a92c01c704026e982568","unresolved":false,"context_lines":[{"line_number":1020,"context_line":"        :returns: migrate_data modified by the driver"},{"line_number":1021,"context_line":"        :raises TooManyDiskDevices: if the maxmimum allowed devices to attach"},{"line_number":1022,"context_line":"                                    to a single instance is exceeded."},{"line_number":1023,"context_line":"        \"\"\""},{"line_number":1024,"context_line":"        raise NotImplementedError()"},{"line_number":1025,"context_line":""},{"line_number":1026,"context_line":"    def live_migration(self, context, instance, dest,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_ba8bec65","line":1023,"in_reply_to":"9fdfeff1_a7c67967","updated":"2019-01-29 16:07:48.000000000","message":"I\u0027m not sure why you\u0027re asking about detach_volume - this is on the pre_live_migration method which sets up block devices on the dest host during live migration (before the guest transfer starts on the source host).","commit_id":"6489f2d2b44827d133dad9a3bb52436ee304a934"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"7b7517dffef1bf6760fcf2873fcf531b246927e8","unresolved":false,"context_lines":[{"line_number":1020,"context_line":"        :returns: migrate_data modified by the driver"},{"line_number":1021,"context_line":"        :raises TooManyDiskDevices: if the maxmimum allowed devices to attach"},{"line_number":1022,"context_line":"                                    to a single instance is exceeded."},{"line_number":1023,"context_line":"        \"\"\""},{"line_number":1024,"context_line":"        raise NotImplementedError()"},{"line_number":1025,"context_line":""},{"line_number":1026,"context_line":"    def live_migration(self, context, instance, dest,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_dd410a3b","line":1023,"in_reply_to":"9fdfeff1_ba8bec65","updated":"2019-01-29 16:49:57.000000000","message":"gerrit/diff UI fail, sorry...","commit_id":"6489f2d2b44827d133dad9a3bb52436ee304a934"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"28be7e64c3c7789c6139c6e1f5fbd10208fa8158","unresolved":false,"context_lines":[{"line_number":1712,"context_line":"            The metadata of the image of the instance."},{"line_number":1713,"context_line":"        :param nova.objects.BlockDeviceMapping root_bdm:"},{"line_number":1714,"context_line":"            The description of the root device."},{"line_number":1715,"context_line":"        :raises TooManyDiskDevices: if the maxmimum allowed devices to attach"},{"line_number":1716,"context_line":"                                    to a single instance is exceeded."},{"line_number":1717,"context_line":"        \"\"\""},{"line_number":1718,"context_line":"        raise NotImplementedError()"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_a7ed19f1","line":1715,"range":{"start_line":1715,"start_character":43,"end_line":1715,"end_character":51},"updated":"2019-01-29 15:31:35.000000000","message":"maximum","commit_id":"6489f2d2b44827d133dad9a3bb52436ee304a934"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"28be7e64c3c7789c6139c6e1f5fbd10208fa8158","unresolved":false,"context_lines":[{"line_number":1721,"context_line":"                                          *block_device_lists):"},{"line_number":1722,"context_line":"        \"\"\"Default the missing device names in the block device mapping."},{"line_number":1723,"context_line":""},{"line_number":1724,"context_line":"        :raises TooManyDiskDevices: if the maxmimum allowed devices to attach"},{"line_number":1725,"context_line":"                                    to a single instance is exceeded."},{"line_number":1726,"context_line":"        \"\"\""},{"line_number":1727,"context_line":"        raise NotImplementedError()"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_67bdf1d6","line":1724,"range":{"start_line":1724,"start_character":43,"end_line":1724,"end_character":51},"updated":"2019-01-29 15:31:35.000000000","message":"maximum","commit_id":"6489f2d2b44827d133dad9a3bb52436ee304a934"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"28be7e64c3c7789c6139c6e1f5fbd10208fa8158","unresolved":false,"context_lines":[{"line_number":1740,"context_line":"                                 implementation if not set."},{"line_number":1741,"context_line":""},{"line_number":1742,"context_line":"        :returns: The chosen device name."},{"line_number":1743,"context_line":"        :raises TooManyDiskDevices: if the maxmimum allowed devices to attach"},{"line_number":1744,"context_line":"                                    to a single instance is exceeded."},{"line_number":1745,"context_line":"        \"\"\""},{"line_number":1746,"context_line":"        raise NotImplementedError()"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_87c25558","line":1743,"range":{"start_line":1743,"start_character":43,"end_line":1743,"end_character":51},"updated":"2019-01-29 15:31:35.000000000","message":"maximum","commit_id":"6489f2d2b44827d133dad9a3bb52436ee304a934"}],"nova/virt/libvirt/blockinfo.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f831ca17dca4bcbde6ebd38251d27917cd8a86dd","unresolved":false,"context_lines":[{"line_number":193,"context_line":"                return disk_dev"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    msg \u003d _(\"No free disk device names for prefix \u0027%s\u0027\") % dev_prefix"},{"line_number":196,"context_line":"    LOG.error(msg)"},{"line_number":197,"context_line":"    raise exception.TooManyDiskDevices(maximum\u003dmax_dev)"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_9d3187ef","line":196,"updated":"2019-01-24 21:11:21.000000000","message":"Why add this? This is really a user initiated failure to which an operator that reads the error in the log doesn\u0027t really have a solution. If a user hits this on server create, it\u0027s already logged higher up the stack and recorded as a fault. If the user hits this during volume attach, they get the 403 error response from the API and can see why it failed - I don\u0027t really see a reason to log an error here for an operator.","commit_id":"eb9fa2b2f75243313f6ad4bdb899d6aa68f0a173"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"78b3553dd34abb72c15455572fe65ed788455742","unresolved":false,"context_lines":[{"line_number":193,"context_line":"                return disk_dev"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    msg \u003d _(\"No free disk device names for prefix \u0027%s\u0027\") % dev_prefix"},{"line_number":196,"context_line":"    LOG.error(msg)"},{"line_number":197,"context_line":"    raise exception.TooManyDiskDevices(maximum\u003dmax_dev)"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_4f55a4c5","line":196,"in_reply_to":"9fdfeff1_9d3187ef","updated":"2019-01-25 00:56:40.000000000","message":"Yeah, I wasn\u0027t sure what to do. I did it thinking to capture the message \"No free disk device names\" somehow, because otherwise, that disappears. But, I guess that\u0027s OK.","commit_id":"eb9fa2b2f75243313f6ad4bdb899d6aa68f0a173"}]}
