)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bb3203f687dc861484216f94157da50e036dad96","unresolved":false,"context_lines":[{"line_number":16,"context_line":"This will work similar to the libvirt driver, expecting the same"},{"line_number":17,"context_line":"extra specs."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"DocImpact"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Implements: blueprint hyperv-storage-qos"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"1aa78d24_31616d3a","line":19,"range":{"start_line":19,"start_character":0,"end_line":19,"end_character":9},"updated":"2016-07-05 21:02:46.000000000","message":"What is the specific doc impact? This generates a bug for nova so how would one triage this? Is there something in the openstack manuals that would need to be updated? Or is the only doc impact something in the nova devref or a release note which can be handled in this change?","commit_id":"994df805fdb86f7440dc883ca95f77f54c2c713a"}],"nova/tests/unit/virt/hyperv/test_vmops.py":[{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"0d5805f83a6cbcb84f3bdeda0e9ca02e947c7398","unresolved":false,"context_lines":[{"line_number":1063,"context_line":"                                           mock.sentinel.max_iops]"},{"line_number":1064,"context_line":""},{"line_number":1065,"context_line":"        self._vmops._set_instance_disk_qos_specs(mock_instance)"},{"line_number":1066,"context_line":"        mock_get_local_disks.assert_called_with(mock_instance.name)"},{"line_number":1067,"context_line":"        expected_calls \u003d [mock.call(mock_instance.name, disk_path,"},{"line_number":1068,"context_line":"                                    mock.sentinel.min_iops,"},{"line_number":1069,"context_line":"                                    mock.sentinel.max_iops)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9abe1de1_347989fd","line":1066,"updated":"2015-04-27 13:35:51.000000000","message":"assert_called_once_with?","commit_id":"daa287228a40d83d98ffa955c910fe4436792324"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"ba228aaaa6e1b244033c530b758412696d3b5a21","unresolved":false,"context_lines":[{"line_number":1063,"context_line":"                                           mock.sentinel.max_iops]"},{"line_number":1064,"context_line":""},{"line_number":1065,"context_line":"        self._vmops._set_instance_disk_qos_specs(mock_instance)"},{"line_number":1066,"context_line":"        mock_get_local_disks.assert_called_with(mock_instance.name)"},{"line_number":1067,"context_line":"        expected_calls \u003d [mock.call(mock_instance.name, disk_path,"},{"line_number":1068,"context_line":"                                    mock.sentinel.min_iops,"},{"line_number":1069,"context_line":"                                    mock.sentinel.max_iops)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7ad32947_765ef046","line":1066,"in_reply_to":"9abe1de1_347989fd","updated":"2015-04-27 14:12:37.000000000","message":"Whops, my bad.","commit_id":"daa287228a40d83d98ffa955c910fe4436792324"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"0d5805f83a6cbcb84f3bdeda0e9ca02e947c7398","unresolved":false,"context_lines":[{"line_number":1078,"context_line":"                            \u0027storage_qos:max_bytes_sec\u0027:"},{"line_number":1079,"context_line":"                                mock.sentinel.max_bytes_sec}"},{"line_number":1080,"context_line":""},{"line_number":1081,"context_line":"        mock_instance \u003d mock.Mock(flavor\u003d{\u0027extra_specs\u0027: fake_extra_specs})"},{"line_number":1082,"context_line":"        ret_val \u003d self._vmops._get_storage_qos_specs(mock_instance)"},{"line_number":1083,"context_line":""},{"line_number":1084,"context_line":"        expected_qos_specs_dict \u003d {"}],"source_content_type":"text/x-python","patch_set":1,"id":"9abe1de1_34ee298c","line":1081,"updated":"2015-04-27 13:35:51.000000000","message":"you could use:\n\n    mock_instance \u003d fake_instance.fake_instance_obj(self.context)\n    mock_instance.flavor.extra_specs \u003d fake_extra_specs","commit_id":"daa287228a40d83d98ffa955c910fe4436792324"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"ba228aaaa6e1b244033c530b758412696d3b5a21","unresolved":false,"context_lines":[{"line_number":1078,"context_line":"                            \u0027storage_qos:max_bytes_sec\u0027:"},{"line_number":1079,"context_line":"                                mock.sentinel.max_bytes_sec}"},{"line_number":1080,"context_line":""},{"line_number":1081,"context_line":"        mock_instance \u003d mock.Mock(flavor\u003d{\u0027extra_specs\u0027: fake_extra_specs})"},{"line_number":1082,"context_line":"        ret_val \u003d self._vmops._get_storage_qos_specs(mock_instance)"},{"line_number":1083,"context_line":""},{"line_number":1084,"context_line":"        expected_qos_specs_dict \u003d {"}],"source_content_type":"text/x-python","patch_set":1,"id":"7ad32947_d635c4f7","line":1081,"in_reply_to":"9abe1de1_34ee298c","updated":"2015-04-27 14:12:37.000000000","message":"Done","commit_id":"daa287228a40d83d98ffa955c910fe4436792324"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"eb31c10fbca144e2c8d7afe903e8f0740bdb08ae","unresolved":false,"context_lines":[{"line_number":1208,"context_line":"                          self._vmops.detach_interface,"},{"line_number":1209,"context_line":"                          mock.MagicMock(), mock.sentinel.fake_vif)"},{"line_number":1210,"context_line":""},{"line_number":1211,"context_line":"    def test_get_instance_local_disks(self):"},{"line_number":1212,"context_line":"        fake_instance_dir \u003d \u0027fake_instance_dir\u0027"},{"line_number":1213,"context_line":"        fake_local_disks \u003d [os.path.join(fake_instance_dir, disk_name)"},{"line_number":1214,"context_line":"                            for disk_name in [\u0027root.vhd\u0027, \u0027configdrive.iso\u0027]]"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a061dce_795de3e8","line":1211,"updated":"2016-04-04 17:46:19.000000000","message":"Hm, this should be moved after test_set_instance_disk_qos_specs, so the tests will have the same order as the methods.","commit_id":"960f68aeb5dadc826c4c0f5723e055d61114fd4b"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"54d57be9d65be951ff56a96f47e68eaaa2a44365","unresolved":false,"context_lines":[{"line_number":1208,"context_line":"                          self._vmops.detach_interface,"},{"line_number":1209,"context_line":"                          mock.MagicMock(), mock.sentinel.fake_vif)"},{"line_number":1210,"context_line":""},{"line_number":1211,"context_line":"    def test_get_instance_local_disks(self):"},{"line_number":1212,"context_line":"        fake_instance_dir \u003d \u0027fake_instance_dir\u0027"},{"line_number":1213,"context_line":"        fake_local_disks \u003d [os.path.join(fake_instance_dir, disk_name)"},{"line_number":1214,"context_line":"                            for disk_name in [\u0027root.vhd\u0027, \u0027configdrive.iso\u0027]]"}],"source_content_type":"text/x-python","patch_set":14,"id":"5a18252c_5d6a9d1b","line":1211,"in_reply_to":"9a061dce_795de3e8","updated":"2016-04-12 11:04:53.000000000","message":"Done","commit_id":"960f68aeb5dadc826c4c0f5723e055d61114fd4b"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"35c43d6557946492634b18a0886deca4092a519a","unresolved":false,"context_lines":[{"line_number":1333,"context_line":"        fake_instance_disks \u003d [\u0027fake_remote_disk\u0027] + fake_local_disks"},{"line_number":1334,"context_line":""},{"line_number":1335,"context_line":"        mock_get_storage_paths \u003d self._vmops._vmutils.get_vm_storage_paths"},{"line_number":1336,"context_line":"        mock_get_storage_paths.return_value \u003d [fake_instance_disks, []]"},{"line_number":1337,"context_line":"        mock_get_instance_dir \u003d self._vmops._pathutils.get_instance_dir"},{"line_number":1338,"context_line":"        mock_get_instance_dir.return_value \u003d fake_instance_dir"},{"line_number":1339,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"9abb7d3a_ac29a339","line":1336,"updated":"2016-06-03 15:24:46.000000000","message":"this should be enough:\n\n    mock_get_storage_paths.return_value \u003d [fake_instance_disks]","commit_id":"58b6d8d17c6fd29468af71c079b1d8a493b009b4"}],"nova/tests/unit/virt/hyperv/test_vmutilsv2.py":[{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"0d5805f83a6cbcb84f3bdeda0e9ca02e947c7398","unresolved":false,"context_lines":[{"line_number":274,"context_line":""},{"line_number":275,"context_line":"        mock_get_disk_resource.assert_called_once_with("},{"line_number":276,"context_line":"            mock.sentinel.disk_path, is_physical\u003dFalse)"},{"line_number":277,"context_line":"        self.assertEqual(mock_disk.IOPSLimit, mock.sentinel.max_iops)"},{"line_number":278,"context_line":"        self.assertEqual(mock_disk.IOPSReservation, mock.sentinel.min_iops)"},{"line_number":279,"context_line":"        mock_modify_virt_resource.assert_called_with(mock_disk,"},{"line_number":280,"context_line":"                                                     mock_vm.path_())"}],"source_content_type":"text/x-python","patch_set":1,"id":"9abe1de1_74fca13e","line":277,"updated":"2015-04-27 13:35:51.000000000","message":"expected first.","commit_id":"daa287228a40d83d98ffa955c910fe4436792324"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"ba228aaaa6e1b244033c530b758412696d3b5a21","unresolved":false,"context_lines":[{"line_number":274,"context_line":""},{"line_number":275,"context_line":"        mock_get_disk_resource.assert_called_once_with("},{"line_number":276,"context_line":"            mock.sentinel.disk_path, is_physical\u003dFalse)"},{"line_number":277,"context_line":"        self.assertEqual(mock_disk.IOPSLimit, mock.sentinel.max_iops)"},{"line_number":278,"context_line":"        self.assertEqual(mock_disk.IOPSReservation, mock.sentinel.min_iops)"},{"line_number":279,"context_line":"        mock_modify_virt_resource.assert_called_with(mock_disk,"},{"line_number":280,"context_line":"                                                     mock_vm.path_())"}],"source_content_type":"text/x-python","patch_set":1,"id":"7ad32947_162c5caa","line":277,"in_reply_to":"9abe1de1_74fca13e","updated":"2015-04-27 14:12:37.000000000","message":"Done","commit_id":"daa287228a40d83d98ffa955c910fe4436792324"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"0d5805f83a6cbcb84f3bdeda0e9ca02e947c7398","unresolved":false,"context_lines":[{"line_number":275,"context_line":"        mock_get_disk_resource.assert_called_once_with("},{"line_number":276,"context_line":"            mock.sentinel.disk_path, is_physical\u003dFalse)"},{"line_number":277,"context_line":"        self.assertEqual(mock_disk.IOPSLimit, mock.sentinel.max_iops)"},{"line_number":278,"context_line":"        self.assertEqual(mock_disk.IOPSReservation, mock.sentinel.min_iops)"},{"line_number":279,"context_line":"        mock_modify_virt_resource.assert_called_with(mock_disk,"},{"line_number":280,"context_line":"                                                     mock_vm.path_())"}],"source_content_type":"text/x-python","patch_set":1,"id":"9abe1de1_349509e4","line":278,"updated":"2015-04-27 13:35:51.000000000","message":"ditto","commit_id":"daa287228a40d83d98ffa955c910fe4436792324"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"ba228aaaa6e1b244033c530b758412696d3b5a21","unresolved":false,"context_lines":[{"line_number":275,"context_line":"        mock_get_disk_resource.assert_called_once_with("},{"line_number":276,"context_line":"            mock.sentinel.disk_path, is_physical\u003dFalse)"},{"line_number":277,"context_line":"        self.assertEqual(mock_disk.IOPSLimit, mock.sentinel.max_iops)"},{"line_number":278,"context_line":"        self.assertEqual(mock_disk.IOPSReservation, mock.sentinel.min_iops)"},{"line_number":279,"context_line":"        mock_modify_virt_resource.assert_called_with(mock_disk,"},{"line_number":280,"context_line":"                                                     mock_vm.path_())"}],"source_content_type":"text/x-python","patch_set":1,"id":"7ad32947_f617a052","line":278,"in_reply_to":"9abe1de1_349509e4","updated":"2015-04-27 14:12:37.000000000","message":"Done","commit_id":"daa287228a40d83d98ffa955c910fe4436792324"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"0d5805f83a6cbcb84f3bdeda0e9ca02e947c7398","unresolved":false,"context_lines":[{"line_number":276,"context_line":"            mock.sentinel.disk_path, is_physical\u003dFalse)"},{"line_number":277,"context_line":"        self.assertEqual(mock_disk.IOPSLimit, mock.sentinel.max_iops)"},{"line_number":278,"context_line":"        self.assertEqual(mock_disk.IOPSReservation, mock.sentinel.min_iops)"},{"line_number":279,"context_line":"        mock_modify_virt_resource.assert_called_with(mock_disk,"},{"line_number":280,"context_line":"                                                     mock_vm.path_())"}],"source_content_type":"text/x-python","patch_set":1,"id":"9abe1de1_149a0515","line":279,"updated":"2015-04-27 13:35:51.000000000","message":"assert_called_once_with?","commit_id":"daa287228a40d83d98ffa955c910fe4436792324"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"ba228aaaa6e1b244033c530b758412696d3b5a21","unresolved":false,"context_lines":[{"line_number":276,"context_line":"            mock.sentinel.disk_path, is_physical\u003dFalse)"},{"line_number":277,"context_line":"        self.assertEqual(mock_disk.IOPSLimit, mock.sentinel.max_iops)"},{"line_number":278,"context_line":"        self.assertEqual(mock_disk.IOPSReservation, mock.sentinel.min_iops)"},{"line_number":279,"context_line":"        mock_modify_virt_resource.assert_called_with(mock_disk,"},{"line_number":280,"context_line":"                                                     mock_vm.path_())"}],"source_content_type":"text/x-python","patch_set":1,"id":"7ad32947_b6112860","line":279,"in_reply_to":"9abe1de1_149a0515","updated":"2015-04-27 14:12:37.000000000","message":"Done","commit_id":"daa287228a40d83d98ffa955c910fe4436792324"}],"nova/tests/unit/virt/hyperv/test_volumeops.py":[{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"0d5805f83a6cbcb84f3bdeda0e9ca02e947c7398","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                                      mock.sentinel.instance_name,"},{"line_number":89,"context_line":"                                      mock.sentinel.ebs_root)"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        mock_volume_driver.attach_volume.assert_called_with("},{"line_number":92,"context_line":"            fake_conn_info,"},{"line_number":93,"context_line":"            mock.sentinel.instance_name,"},{"line_number":94,"context_line":"            mock.sentinel.ebs_root)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9abe1de1_948615b8","line":91,"updated":"2015-04-27 13:35:51.000000000","message":"assert_called_once_with?","commit_id":"daa287228a40d83d98ffa955c910fe4436792324"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"ba228aaaa6e1b244033c530b758412696d3b5a21","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                                      mock.sentinel.instance_name,"},{"line_number":89,"context_line":"                                      mock.sentinel.ebs_root)"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        mock_volume_driver.attach_volume.assert_called_with("},{"line_number":92,"context_line":"            fake_conn_info,"},{"line_number":93,"context_line":"            mock.sentinel.instance_name,"},{"line_number":94,"context_line":"            mock.sentinel.ebs_root)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7ad32947_b908fb29","line":91,"in_reply_to":"9abe1de1_948615b8","updated":"2015-04-27 14:12:37.000000000","message":"Done","commit_id":"daa287228a40d83d98ffa955c910fe4436792324"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"35c43d6557946492634b18a0886deca4092a519a","unresolved":false,"context_lines":[{"line_number":134,"context_line":"            mock.sentinel.actual_disk1_path)"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    @mock.patch.object(volumeops.VolumeOps, \u0027_get_volume_driver\u0027)"},{"line_number":137,"context_line":"    def test_attach_volume(self, mock_get_volume_driver):"},{"line_number":138,"context_line":"        fake_conn_info \u003d {"},{"line_number":139,"context_line":"            \u0027data\u0027: {\u0027qos_specs\u0027: mock.sentinel.qos_specs}"},{"line_number":140,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":19,"id":"9abb7d3a_69e04dcd","line":137,"updated":"2016-06-03 15:24:46.000000000","message":"nit: the attach_volume method is defined after disconnect_volumes. This test should be after the test_disconnect_volumes.","commit_id":"58b6d8d17c6fd29468af71c079b1d8a493b009b4"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"c557abe064bc362df27a03d41a64f134b63cc7b6","unresolved":false,"context_lines":[{"line_number":135,"context_line":"            mock.sentinel.actual_disk1_path)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    @mock.patch.object(volumeops.VolumeOps, \u0027_get_volume_driver\u0027)"},{"line_number":138,"context_line":"    def test_attach_volume(self, mock_get_volume_driver):"},{"line_number":139,"context_line":"        fake_conn_info \u003d {"},{"line_number":140,"context_line":"            \u0027data\u0027: {\u0027qos_specs\u0027: mock.sentinel.qos_specs}"},{"line_number":141,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":24,"id":"5a8bc5a2_0c80d145","line":138,"updated":"2016-09-23 10:52:21.000000000","message":"attach_volume method is after disconnect_volumes in vmops. I\u0027d maintain the same order as in there.","commit_id":"4542b27060cb805a913600df786a9c27187411de"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"338be9347cd4a647b1aece3b3b04204b678be23a","unresolved":false,"context_lines":[{"line_number":135,"context_line":"            mock.sentinel.actual_disk1_path)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    @mock.patch.object(volumeops.VolumeOps, \u0027_get_volume_driver\u0027)"},{"line_number":138,"context_line":"    def test_attach_volume(self, mock_get_volume_driver):"},{"line_number":139,"context_line":"        fake_conn_info \u003d {"},{"line_number":140,"context_line":"            \u0027data\u0027: {\u0027qos_specs\u0027: mock.sentinel.qos_specs}"},{"line_number":141,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":24,"id":"5a8bc5a2_65ab23d7","line":138,"in_reply_to":"5a8bc5a2_0c80d145","updated":"2016-09-23 13:18:28.000000000","message":"Done","commit_id":"4542b27060cb805a913600df786a9c27187411de"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f07e6980b2b1f0c9e31d2398f0f01115d845e87","unresolved":false,"context_lines":[{"line_number":245,"context_line":"        requested_qos_specs \u003d {mock.sentinel.spec1: mock.sentinel.val,"},{"line_number":246,"context_line":"                               mock.sentinel.spec3: mock.sentinel.val2}"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"        self._volumeops.validate_qos_specs(requested_qos_specs,"},{"line_number":249,"context_line":"                                           supported_qos_specs)"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"5a8bc5a2_964e9994","line":248,"updated":"2016-09-23 18:13:16.000000000","message":"Since this doesn\u0027t fail anymore, do you want to make sure that you actually logged a warning?","commit_id":"87fe58b1e07ca84090e02d3e1a0e574e209dca53"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"23067f2a476c6ff2e56673fc298cf5659231feb9","unresolved":false,"context_lines":[{"line_number":245,"context_line":"        requested_qos_specs \u003d {mock.sentinel.spec1: mock.sentinel.val,"},{"line_number":246,"context_line":"                               mock.sentinel.spec3: mock.sentinel.val2}"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"        self._volumeops.validate_qos_specs(requested_qos_specs,"},{"line_number":249,"context_line":"                                           supported_qos_specs)"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"5a8bc5a2_1109b331","line":248,"in_reply_to":"5a8bc5a2_964e9994","updated":"2016-09-23 18:34:36.000000000","message":"Done","commit_id":"87fe58b1e07ca84090e02d3e1a0e574e209dca53"}],"nova/virt/hyperv/vmops.py":[{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"4beefe73f6e00b3901879b69ff8dd545d85b37a6","unresolved":false,"context_lines":[{"line_number":782,"context_line":"        instance_path \u003d self._pathutils.get_instance_dir(instance_name)"},{"line_number":783,"context_line":"        instance_disks \u003d self._vmutils.get_vm_storage_paths(instance_name)[0]"},{"line_number":784,"context_line":"        local_disks \u003d [disk_path for disk_path in instance_disks"},{"line_number":785,"context_line":"                       if disk_path.find(instance_path) !\u003d -1]"},{"line_number":786,"context_line":"        return local_disks"},{"line_number":787,"context_line":""},{"line_number":788,"context_line":"    def _get_storage_qos_specs(self, instance):"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a740942_59be0d66","line":785,"updated":"2015-12-08 07:39:29.000000000","message":"as an alternative, if instance_path in disk_path works just as fine, but simpler to read.","commit_id":"c01d1a28d57558cf98a5cbae1988950ec861eaa6"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"2918171f19fd74db3c3f1ee4aeca4549f57a3b2b","unresolved":false,"context_lines":[{"line_number":770,"context_line":"            raise exception.InterfaceDetachFailed(instance_uuid\u003dinstance.uuid)"},{"line_number":771,"context_line":""},{"line_number":772,"context_line":"    def _set_instance_disk_qos_specs(self, instance):"},{"line_number":773,"context_line":"        max_iops \u003d self._get_storage_qos_specs(instance)"},{"line_number":774,"context_line":"        if max_iops:"},{"line_number":775,"context_line":"            local_disks \u003d self._get_instance_local_disks(instance.name)"},{"line_number":776,"context_line":"            for disk_path in local_disks:"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a7e1126_4e2a2c80","line":773,"updated":"2015-12-17 15:26:44.000000000","message":"this returns a dict rather than the max_iops value, I think?\n\nIs storage_qos_specs a better name?","commit_id":"5b1762a07585666b508d2da1752066d79e7c0741"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"1da91f156f27eed987eb1eb37a2d46cd44a64c54","unresolved":false,"context_lines":[{"line_number":770,"context_line":"            raise exception.InterfaceDetachFailed(instance_uuid\u003dinstance.uuid)"},{"line_number":771,"context_line":""},{"line_number":772,"context_line":"    def _set_instance_disk_qos_specs(self, instance):"},{"line_number":773,"context_line":"        max_iops \u003d self._get_storage_qos_specs(instance)"},{"line_number":774,"context_line":"        if max_iops:"},{"line_number":775,"context_line":"            local_disks \u003d self._get_instance_local_disks(instance.name)"},{"line_number":776,"context_line":"            for disk_path in local_disks:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a7b0d38_9517d650","line":773,"in_reply_to":"3a7e1126_4e2a2c80","updated":"2015-12-23 16:04:38.000000000","message":"This method was previously returning a tuple, containing the minimum/maximum iops.\n\nIn this patch we don\u0027t handle the minimum IOPS anymore because we can\u0027t enforce it. Hyper-V just sends events when the IOPS go bellow this threshold. So, out of the tuple, just max_iops remained.\n\nI agree that this should instead be a dict which may later include the minimum IOPS as well, or the method should be renamed to get_total_iops, as you suggested.","commit_id":"5b1762a07585666b508d2da1752066d79e7c0741"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"2918171f19fd74db3c3f1ee4aeca4549f57a3b2b","unresolved":false,"context_lines":[{"line_number":777,"context_line":"                self._vmutils.set_disk_qos_specs(disk_path,"},{"line_number":778,"context_line":"                                                 max_iops)"},{"line_number":779,"context_line":""},{"line_number":780,"context_line":"    def _get_instance_local_disks(self, instance_name):"},{"line_number":781,"context_line":"        instance_path \u003d self._pathutils.get_instance_dir(instance_name)"},{"line_number":782,"context_line":"        instance_disks \u003d self._vmutils.get_vm_storage_paths(instance_name)[0]"},{"line_number":783,"context_line":"        local_disks \u003d [disk_path for disk_path in instance_disks"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a7e1126_eba50a04","line":780,"updated":"2015-12-17 15:26:44.000000000","message":"This should be all non-cinder based disks I assume?\nI guess this does give you that? I am not sure.","commit_id":"5b1762a07585666b508d2da1752066d79e7c0741"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"1da91f156f27eed987eb1eb37a2d46cd44a64c54","unresolved":false,"context_lines":[{"line_number":777,"context_line":"                self._vmutils.set_disk_qos_specs(disk_path,"},{"line_number":778,"context_line":"                                                 max_iops)"},{"line_number":779,"context_line":""},{"line_number":780,"context_line":"    def _get_instance_local_disks(self, instance_name):"},{"line_number":781,"context_line":"        instance_path \u003d self._pathutils.get_instance_dir(instance_name)"},{"line_number":782,"context_line":"        instance_disks \u003d self._vmutils.get_vm_storage_paths(instance_name)[0]"},{"line_number":783,"context_line":"        local_disks \u003d [disk_path for disk_path in instance_disks"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a7b0d38_50665cee","line":780,"in_reply_to":"3a7e1126_eba50a04","updated":"2015-12-23 16:04:38.000000000","message":"Indeed.","commit_id":"5b1762a07585666b508d2da1752066d79e7c0741"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"bc14927584be91ca887cfd0b84b321506a40dddc","unresolved":false,"context_lines":[{"line_number":788,"context_line":"        self._volumeops.validate_qos_specs(storage_qos_specs,"},{"line_number":789,"context_line":"                                           supported_qos_specs)"},{"line_number":790,"context_line":""},{"line_number":791,"context_line":"        max_bytes_sec \u003d storage_qos_specs.get(\u0027max_bytes_sec\u0027) or 0"},{"line_number":792,"context_line":"        max_iops_sec \u003d (storage_qos_specs.get(\u0027max_iops_sec\u0027) or"},{"line_number":793,"context_line":"                        self._volumeops.bytes_per_sec_to_iops(max_bytes_sec))"},{"line_number":794,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"bab6814e_90637441","line":791,"updated":"2016-05-23 19:18:51.000000000","message":"not converting to int?","commit_id":"ac7b885140166ac3af18d2f3fb4afc3b05a6d1b1"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"bc14927584be91ca887cfd0b84b321506a40dddc","unresolved":false,"context_lines":[{"line_number":789,"context_line":"                                           supported_qos_specs)"},{"line_number":790,"context_line":""},{"line_number":791,"context_line":"        max_bytes_sec \u003d storage_qos_specs.get(\u0027max_bytes_sec\u0027) or 0"},{"line_number":792,"context_line":"        max_iops_sec \u003d (storage_qos_specs.get(\u0027max_iops_sec\u0027) or"},{"line_number":793,"context_line":"                        self._volumeops.bytes_per_sec_to_iops(max_bytes_sec))"},{"line_number":794,"context_line":""},{"line_number":795,"context_line":"        if max_iops_sec:"}],"source_content_type":"text/x-python","patch_set":17,"id":"bab6814e_f058008d","line":792,"updated":"2016-05-23 19:18:51.000000000","message":"ditto.","commit_id":"ac7b885140166ac3af18d2f3fb4afc3b05a6d1b1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d47773b8e3b24a321dba4648fb492b4251092e52","unresolved":false,"context_lines":[{"line_number":353,"context_line":"        self._set_instance_disk_qos_specs(instance)"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"    def _configure_remotefx(self, instance, vm_gen):"},{"line_number":356,"context_line":"        extra_specs \u003d instance.flavor.extra_specs"},{"line_number":357,"context_line":"        remotefx_max_resolution \u003d extra_specs.get("},{"line_number":358,"context_line":"            constants.FLAVOR_ESPEC_REMOTEFX_RES)"},{"line_number":359,"context_line":"        if not remotefx_max_resolution:"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a8bc5a2_c4589efd","line":356,"updated":"2016-09-22 21:43:14.000000000","message":"This gets called before _set_instance_disk_qos_specs so flavor.extra_specs must be set, so we don\u0027t need to check for it I don\u0027t think.","commit_id":"6e827522cd42af87920a9102fc0c096dea5836e9"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"68132472e66ac7988733ae411032cb450552409c","unresolved":false,"context_lines":[{"line_number":353,"context_line":"        self._set_instance_disk_qos_specs(instance)"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"    def _configure_remotefx(self, instance, vm_gen):"},{"line_number":356,"context_line":"        extra_specs \u003d instance.flavor.extra_specs"},{"line_number":357,"context_line":"        remotefx_max_resolution \u003d extra_specs.get("},{"line_number":358,"context_line":"            constants.FLAVOR_ESPEC_REMOTEFX_RES)"},{"line_number":359,"context_line":"        if not remotefx_max_resolution:"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a8bc5a2_81faf5bb","line":356,"in_reply_to":"5a8bc5a2_c4589efd","updated":"2016-09-23 09:15:47.000000000","message":"Indeed.","commit_id":"6e827522cd42af87920a9102fc0c096dea5836e9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d47773b8e3b24a321dba4648fb492b4251092e52","unresolved":false,"context_lines":[{"line_number":877,"context_line":""},{"line_number":878,"context_line":"        disk_total_bytes_sec \u003d int("},{"line_number":879,"context_line":"            quota_specs.get(\u0027disk_total_bytes_sec\u0027) or 0)"},{"line_number":880,"context_line":"        disk_total_iops_sec \u003d int("},{"line_number":881,"context_line":"            quota_specs.get(\u0027disk_total_iops_sec\u0027) or"},{"line_number":882,"context_line":"            self._volumeops.bytes_per_sec_to_iops(disk_total_bytes_sec))"},{"line_number":883,"context_line":""},{"line_number":884,"context_line":"        if disk_total_iops_sec:"},{"line_number":885,"context_line":"            local_disks \u003d self._get_instance_local_disks(instance.name)"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a8bc5a2_c4e89e7f","line":882,"range":{"start_line":880,"start_character":8,"end_line":882,"end_character":72},"updated":"2016-09-22 21:43:14.000000000","message":"Should this be calculated if disk_total_bytes_sec is 0 and disk_total_iops_sec isn\u0027t specified?","commit_id":"6e827522cd42af87920a9102fc0c096dea5836e9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c460404c5a7eeb05959237cb4a790be3a4e77455","unresolved":false,"context_lines":[{"line_number":877,"context_line":""},{"line_number":878,"context_line":"        disk_total_bytes_sec \u003d int("},{"line_number":879,"context_line":"            quota_specs.get(\u0027disk_total_bytes_sec\u0027) or 0)"},{"line_number":880,"context_line":"        disk_total_iops_sec \u003d int("},{"line_number":881,"context_line":"            quota_specs.get(\u0027disk_total_iops_sec\u0027) or"},{"line_number":882,"context_line":"            self._volumeops.bytes_per_sec_to_iops(disk_total_bytes_sec))"},{"line_number":883,"context_line":""},{"line_number":884,"context_line":"        if disk_total_iops_sec:"},{"line_number":885,"context_line":"            local_disks \u003d self._get_instance_local_disks(instance.name)"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a8bc5a2_6c5a3052","line":882,"range":{"start_line":880,"start_character":8,"end_line":882,"end_character":72},"in_reply_to":"5a8bc5a2_2164c147","updated":"2016-09-23 12:39:01.000000000","message":"My concern though is you\u0027ll be setting a garbage value because disk_total_iops_sec isn\u0027t what you wanted, and it wasn\u0027t specified at all to begin with.","commit_id":"6e827522cd42af87920a9102fc0c096dea5836e9"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"68132472e66ac7988733ae411032cb450552409c","unresolved":false,"context_lines":[{"line_number":877,"context_line":""},{"line_number":878,"context_line":"        disk_total_bytes_sec \u003d int("},{"line_number":879,"context_line":"            quota_specs.get(\u0027disk_total_bytes_sec\u0027) or 0)"},{"line_number":880,"context_line":"        disk_total_iops_sec \u003d int("},{"line_number":881,"context_line":"            quota_specs.get(\u0027disk_total_iops_sec\u0027) or"},{"line_number":882,"context_line":"            self._volumeops.bytes_per_sec_to_iops(disk_total_bytes_sec))"},{"line_number":883,"context_line":""},{"line_number":884,"context_line":"        if disk_total_iops_sec:"},{"line_number":885,"context_line":"            local_disks \u003d self._get_instance_local_disks(instance.name)"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a8bc5a2_2164c147","line":882,"range":{"start_line":880,"start_character":8,"end_line":882,"end_character":72},"in_reply_to":"5a8bc5a2_c4e89e7f","updated":"2016-09-23 09:15:47.000000000","message":"We\u0027re basically converting total_bytes_sec to normalized IOPS, but indeed, if disk_total_bytes_sec is 0 and disk_total_bytes_sec is not specified, we don\u0027t need to do this.\n\nAnyway, I\u0027d leave it this way so that we keep the code simple","commit_id":"6e827522cd42af87920a9102fc0c096dea5836e9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d47773b8e3b24a321dba4648fb492b4251092e52","unresolved":false,"context_lines":[{"line_number":881,"context_line":"            quota_specs.get(\u0027disk_total_iops_sec\u0027) or"},{"line_number":882,"context_line":"            self._volumeops.bytes_per_sec_to_iops(disk_total_bytes_sec))"},{"line_number":883,"context_line":""},{"line_number":884,"context_line":"        if disk_total_iops_sec:"},{"line_number":885,"context_line":"            local_disks \u003d self._get_instance_local_disks(instance.name)"},{"line_number":886,"context_line":"            for disk_path in local_disks:"},{"line_number":887,"context_line":"                self._vmutils.set_disk_qos_specs(disk_path,"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a8bc5a2_e4a4ba58","line":884,"range":{"start_line":884,"start_character":11,"end_line":884,"end_character":30},"updated":"2016-09-22 21:43:14.000000000","message":"I think you\u0027re going to always get a value for this even if nothing is specified, because of how \"quota_specs.get(\u0027disk_total_bytes_sec\u0027) or 0\" works and how bytes_per_sec_to_iops works.","commit_id":"6e827522cd42af87920a9102fc0c096dea5836e9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c460404c5a7eeb05959237cb4a790be3a4e77455","unresolved":false,"context_lines":[{"line_number":881,"context_line":"            quota_specs.get(\u0027disk_total_iops_sec\u0027) or"},{"line_number":882,"context_line":"            self._volumeops.bytes_per_sec_to_iops(disk_total_bytes_sec))"},{"line_number":883,"context_line":""},{"line_number":884,"context_line":"        if disk_total_iops_sec:"},{"line_number":885,"context_line":"            local_disks \u003d self._get_instance_local_disks(instance.name)"},{"line_number":886,"context_line":"            for disk_path in local_disks:"},{"line_number":887,"context_line":"                self._vmutils.set_disk_qos_specs(disk_path,"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a8bc5a2_ef02b208","line":884,"range":{"start_line":884,"start_character":11,"end_line":884,"end_character":30},"in_reply_to":"5a8bc5a2_e1e1f99b","updated":"2016-09-23 12:39:01.000000000","message":"It\u0027s not going to be 0 in some cases is my point.\n\nConsider that neither extra spec are set, disk_total_bytes_sec is going to be 0 disk_total_iops_sec isn\u0027t in the extra specs so that\u0027s going to be None, which triggers the call to self._volumeops.bytes_per_sec_to_iops(disk_total_bytes_sec)) which is passing in 0, and it\u0027s going to multiply that by your size factor and return it, which means you\u0027ll always get a non-0 value back and set the qos specs.","commit_id":"6e827522cd42af87920a9102fc0c096dea5836e9"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"68132472e66ac7988733ae411032cb450552409c","unresolved":false,"context_lines":[{"line_number":881,"context_line":"            quota_specs.get(\u0027disk_total_iops_sec\u0027) or"},{"line_number":882,"context_line":"            self._volumeops.bytes_per_sec_to_iops(disk_total_bytes_sec))"},{"line_number":883,"context_line":""},{"line_number":884,"context_line":"        if disk_total_iops_sec:"},{"line_number":885,"context_line":"            local_disks \u003d self._get_instance_local_disks(instance.name)"},{"line_number":886,"context_line":"            for disk_path in local_disks:"},{"line_number":887,"context_line":"                self._vmutils.set_disk_qos_specs(disk_path,"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a8bc5a2_e1e1f99b","line":884,"range":{"start_line":884,"start_character":11,"end_line":884,"end_character":30},"in_reply_to":"5a8bc5a2_e4a4ba58","updated":"2016-09-23 09:15:47.000000000","message":"Yep, but if this is 0, we don\u0027t need to apply it.","commit_id":"6e827522cd42af87920a9102fc0c096dea5836e9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ad6ee82abf0239e09c9d3a3104f58518af4ff433","unresolved":false,"context_lines":[{"line_number":881,"context_line":"            quota_specs.get(\u0027disk_total_iops_sec\u0027) or"},{"line_number":882,"context_line":"            self._volumeops.bytes_per_sec_to_iops(disk_total_bytes_sec))"},{"line_number":883,"context_line":""},{"line_number":884,"context_line":"        if disk_total_iops_sec:"},{"line_number":885,"context_line":"            local_disks \u003d self._get_instance_local_disks(instance.name)"},{"line_number":886,"context_line":"            for disk_path in local_disks:"},{"line_number":887,"context_line":"                self._vmutils.set_disk_qos_specs(disk_path,"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a8bc5a2_2faf3a95","line":884,"range":{"start_line":884,"start_character":11,"end_line":884,"end_character":30},"in_reply_to":"5a8bc5a2_ef02b208","updated":"2016-09-23 12:45:14.000000000","message":"Nevermind, I did the math now and I see it will be 0.","commit_id":"6e827522cd42af87920a9102fc0c096dea5836e9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7e87ae7babf396439179b21d247588bc7d5f82a8","unresolved":false,"context_lines":[{"line_number":895,"context_line":"        return local_disks"},{"line_number":896,"context_line":""},{"line_number":897,"context_line":"    def _get_scoped_flavor_extra_specs(self, instance, scope):"},{"line_number":898,"context_line":"        extra_specs \u003d instance.flavor.get(\u0027extra_specs\u0027) or {}"},{"line_number":899,"context_line":"        filtered_specs \u003d {}"},{"line_number":900,"context_line":"        for spec, value in extra_specs.items():"},{"line_number":901,"context_line":"            if \u0027:\u0027 in spec:"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a8bc5a2_69efa3e8","line":898,"range":{"start_line":898,"start_character":22,"end_line":898,"end_character":56},"updated":"2016-09-22 21:05:59.000000000","message":"This will blow up if extra_specs isn\u0027t set on the instance.flavor object, so if you\u0027re worried about this being empty, you should probably do this instead:\n\n  if \u0027extra_specs\u0027 in instance.flavor:","commit_id":"6e827522cd42af87920a9102fc0c096dea5836e9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d47773b8e3b24a321dba4648fb492b4251092e52","unresolved":false,"context_lines":[{"line_number":895,"context_line":"        return local_disks"},{"line_number":896,"context_line":""},{"line_number":897,"context_line":"    def _get_scoped_flavor_extra_specs(self, instance, scope):"},{"line_number":898,"context_line":"        extra_specs \u003d instance.flavor.get(\u0027extra_specs\u0027) or {}"},{"line_number":899,"context_line":"        filtered_specs \u003d {}"},{"line_number":900,"context_line":"        for spec, value in extra_specs.items():"},{"line_number":901,"context_line":"            if \u0027:\u0027 in spec:"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a8bc5a2_842cd64b","line":898,"range":{"start_line":898,"start_character":22,"end_line":898,"end_character":56},"in_reply_to":"5a8bc5a2_69efa3e8","updated":"2016-09-22 21:43:14.000000000","message":"As noted above, I don\u0027t think we have to worry about flavor.extra_specs being set, and we shouldn\u0027t use the get(\u0027\u0027) since that\u0027s for the dict compat stuff we want to get rid of.\n\nSo I think just:\n\nextra_specs \u003d instance.flavor.extra_specs or {}","commit_id":"6e827522cd42af87920a9102fc0c096dea5836e9"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"68132472e66ac7988733ae411032cb450552409c","unresolved":false,"context_lines":[{"line_number":895,"context_line":"        return local_disks"},{"line_number":896,"context_line":""},{"line_number":897,"context_line":"    def _get_scoped_flavor_extra_specs(self, instance, scope):"},{"line_number":898,"context_line":"        extra_specs \u003d instance.flavor.get(\u0027extra_specs\u0027) or {}"},{"line_number":899,"context_line":"        filtered_specs \u003d {}"},{"line_number":900,"context_line":"        for spec, value in extra_specs.items():"},{"line_number":901,"context_line":"            if \u0027:\u0027 in spec:"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a8bc5a2_c1fddd3b","line":898,"range":{"start_line":898,"start_character":22,"end_line":898,"end_character":56},"in_reply_to":"5a8bc5a2_842cd64b","updated":"2016-09-23 09:15:47.000000000","message":"Makes sense.","commit_id":"6e827522cd42af87920a9102fc0c096dea5836e9"}],"nova/virt/hyperv/vmutils.py":[{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"0d5805f83a6cbcb84f3bdeda0e9ca02e947c7398","unresolved":false,"context_lines":[{"line_number":765,"context_line":"        return active_vm_names"},{"line_number":766,"context_line":""},{"line_number":767,"context_line":"    def set_disk_qos_specs(self, vm_name, disk_path, min_iops, max_iops):"},{"line_number":768,"context_line":"        LOG.warn(_LW(r\"The root/virtualization WMI namespace does not \""},{"line_number":769,"context_line":"                      \"support QoS. Ignoring QoS specs.\"))"}],"source_content_type":"text/x-python","patch_set":1,"id":"9abe1de1_cf5bd82d","line":768,"updated":"2015-04-27 13:35:51.000000000","message":"why the r? You don\u0027t have any backslashes.","commit_id":"daa287228a40d83d98ffa955c910fe4436792324"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"ba228aaaa6e1b244033c530b758412696d3b5a21","unresolved":false,"context_lines":[{"line_number":765,"context_line":"        return active_vm_names"},{"line_number":766,"context_line":""},{"line_number":767,"context_line":"    def set_disk_qos_specs(self, vm_name, disk_path, min_iops, max_iops):"},{"line_number":768,"context_line":"        LOG.warn(_LW(r\"The root/virtualization WMI namespace does not \""},{"line_number":769,"context_line":"                      \"support QoS. Ignoring QoS specs.\"))"}],"source_content_type":"text/x-python","patch_set":1,"id":"7ad32947_391d0b67","line":768,"in_reply_to":"9abe1de1_cf5bd82d","updated":"2015-04-27 14:12:37.000000000","message":"Just habit I guess, I\u0027ll remove that.","commit_id":"daa287228a40d83d98ffa955c910fe4436792324"}],"nova/virt/hyperv/vmutilsv2.py":[{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"0d5805f83a6cbcb84f3bdeda0e9ca02e947c7398","unresolved":false,"context_lines":[{"line_number":327,"context_line":"            disk_path, is_physical\u003dFalse)"},{"line_number":328,"context_line":"        disk_resource.IOPSLimit \u003d max_iops"},{"line_number":329,"context_line":"        disk_resource.IOPSReservation \u003d min_iops"},{"line_number":330,"context_line":"        self._modify_virt_resource(disk_resource, vm.path_())"}],"source_content_type":"text/x-python","patch_set":1,"id":"9abe1de1_ef40dc09","line":330,"updated":"2015-04-27 13:35:51.000000000","message":"QOS specs is a V2 feature, which means V1 modify_virt_resource method is not usable.\n\nV2 modify_virt_resource does not use vm.path_(), so it is an useless argument. pass None instead. Also, you will not have to lookup the vm (also better performance), also, you do not need vm_name as an argument.\n\nAlso include a comment with something similar to what I\u0027ve written here, so it will be clear why we pass None instead of vm.path_()","commit_id":"daa287228a40d83d98ffa955c910fe4436792324"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"ba228aaaa6e1b244033c530b758412696d3b5a21","unresolved":false,"context_lines":[{"line_number":327,"context_line":"            disk_path, is_physical\u003dFalse)"},{"line_number":328,"context_line":"        disk_resource.IOPSLimit \u003d max_iops"},{"line_number":329,"context_line":"        disk_resource.IOPSReservation \u003d min_iops"},{"line_number":330,"context_line":"        self._modify_virt_resource(disk_resource, vm.path_())"}],"source_content_type":"text/x-python","patch_set":1,"id":"7ad32947_f97313b3","line":330,"in_reply_to":"9abe1de1_ef40dc09","updated":"2015-04-27 14:12:37.000000000","message":"Makes sense, thanks for the suggestion!","commit_id":"daa287228a40d83d98ffa955c910fe4436792324"}],"nova/virt/hyperv/volumeops.py":[{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"0d5805f83a6cbcb84f3bdeda0e9ca02e947c7398","unresolved":false,"context_lines":[{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    def parse_disk_qos_specs(self, qos_specs):"},{"line_number":163,"context_line":"        total_bytes_sec \u003d qos_specs.get(\u0027total_bytes_sec\u0027)"},{"line_number":164,"context_line":"        min_bytes_sec \u003d qos_specs.get(\u0027min_bytes_sec\u0027)"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"        total_iops \u003d qos_specs.get(\u0027total_iops_sec\u0027,"},{"line_number":167,"context_line":"                                   self._bytes_per_sec_to_iops("}],"source_content_type":"text/x-python","patch_set":1,"id":"7ad32947_7696f095","line":164,"updated":"2015-04-27 13:35:51.000000000","message":"how do you know that total_bytes_sec or min_bytes_sec are ints?","commit_id":"daa287228a40d83d98ffa955c910fe4436792324"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"ba228aaaa6e1b244033c530b758412696d3b5a21","unresolved":false,"context_lines":[{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    def parse_disk_qos_specs(self, qos_specs):"},{"line_number":163,"context_line":"        total_bytes_sec \u003d qos_specs.get(\u0027total_bytes_sec\u0027)"},{"line_number":164,"context_line":"        min_bytes_sec \u003d qos_specs.get(\u0027min_bytes_sec\u0027)"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"        total_iops \u003d qos_specs.get(\u0027total_iops_sec\u0027,"},{"line_number":167,"context_line":"                                   self._bytes_per_sec_to_iops("}],"source_content_type":"text/x-python","patch_set":1,"id":"7ad32947_1c5fdd0f","line":164,"in_reply_to":"7ad32947_7696f095","updated":"2015-04-27 14:12:37.000000000","message":"I\u0027ll add a cast to int. I was so sure I already did that.","commit_id":"daa287228a40d83d98ffa955c910fe4436792324"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"0d5805f83a6cbcb84f3bdeda0e9ca02e947c7398","unresolved":false,"context_lines":[{"line_number":167,"context_line":"                                   self._bytes_per_sec_to_iops("},{"line_number":168,"context_line":"                                       total_bytes_sec))"},{"line_number":169,"context_line":"        min_iops \u003d qos_specs.get(\u0027min_iops_sec\u0027,"},{"line_number":170,"context_line":"                                 self._bytes_per_sec_to_iops(min_bytes_sec))"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        if total_iops and min_iops and total_iops \u003c min_iops:"},{"line_number":173,"context_line":"            err_msg \u003d (_(\"Invalid QoS specs: minimum IOPS cannot be greater \""}],"source_content_type":"text/x-python","patch_set":1,"id":"7ad32947_36907895","line":170,"updated":"2015-04-27 13:35:51.000000000","message":"ditto for total_ios and min_iops","commit_id":"daa287228a40d83d98ffa955c910fe4436792324"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"4beefe73f6e00b3901879b69ff8dd545d85b37a6","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        if unsupported_specs:"},{"line_number":173,"context_line":"            LOG.warn(_LW(\u0027Ignoring unsupported qos specs: \u0027"},{"line_number":174,"context_line":"                         \u0027%(unsupported_specs)s. \u0027"},{"line_number":175,"context_line":"                         \u0027Supported qos specs: %(supported_qos_speces)s\u0027),"},{"line_number":176,"context_line":"                     {\u0027unsupported_specs\u0027: unsupported_specs,"},{"line_number":177,"context_line":"                      \u0027supported_qos_speces\u0027: self._SUPPORTED_QOS_SPECS})"},{"line_number":178,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"7a740942_99047518","line":175,"updated":"2015-12-08 07:39:29.000000000","message":"supported_qos_specs","commit_id":"c01d1a28d57558cf98a5cbae1988950ec861eaa6"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"4beefe73f6e00b3901879b69ff8dd545d85b37a6","unresolved":false,"context_lines":[{"line_number":181,"context_line":"    def _bytes_per_sec_to_iops(self, no_bytes):"},{"line_number":182,"context_line":"        # Hyper-v uses normalized IOPS (8 KB increments)"},{"line_number":183,"context_line":"        # as IOPS allocation units."},{"line_number":184,"context_line":"        return (no_bytes + self._IOPS_BASE_SIZE - 1) / self._IOPS_BASE_SIZE"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    def _group_block_devices_by_type(self, block_device_mapping):"},{"line_number":187,"context_line":"        block_devices \u003d collections.defaultdict(list)"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a740942_247194a8","line":184,"updated":"2015-12-08 07:39:29.000000000","message":"i think this should be // self._IOPS_BASE_SIZE, otherwise it might not be an int in py3.","commit_id":"c01d1a28d57558cf98a5cbae1988950ec861eaa6"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"2918171f19fd74db3c3f1ee4aeca4549f57a3b2b","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        volume_driver.attach_volume(connection_info, instance_name, ebs_root)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        qos_specs \u003d connection_info[\u0027data\u0027].get(\u0027qos_specs\u0027) or {}"},{"line_number":110,"context_line":"        max_iops \u003d self.parse_disk_qos_specs(qos_specs)"},{"line_number":111,"context_line":"        if max_iops:"},{"line_number":112,"context_line":"            volume_driver.set_disk_qos_specs(connection_info,"},{"line_number":113,"context_line":"                                             max_iops)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a7e1126_6e77e83a","line":110,"updated":"2015-12-17 15:26:44.000000000","message":"Is it not total_iops_sec right?","commit_id":"5b1762a07585666b508d2da1752066d79e7c0741"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"1da91f156f27eed987eb1eb37a2d46cd44a64c54","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        volume_driver.attach_volume(connection_info, instance_name, ebs_root)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        qos_specs \u003d connection_info[\u0027data\u0027].get(\u0027qos_specs\u0027) or {}"},{"line_number":110,"context_line":"        max_iops \u003d self.parse_disk_qos_specs(qos_specs)"},{"line_number":111,"context_line":"        if max_iops:"},{"line_number":112,"context_line":"            volume_driver.set_disk_qos_specs(connection_info,"},{"line_number":113,"context_line":"                                             max_iops)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a7b0d38_b0822051","line":110,"in_reply_to":"3a7e1126_6e77e83a","updated":"2015-12-23 16:04:38.000000000","message":"Indeed, I should rename this variable.","commit_id":"5b1762a07585666b508d2da1752066d79e7c0741"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"2918171f19fd74db3c3f1ee4aeca4549f57a3b2b","unresolved":false,"context_lines":[{"line_number":160,"context_line":"                connection_info\u003dconnection_info)"},{"line_number":161,"context_line":"            volume_driver.initialize_volume_connection(connection_info)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    def parse_disk_qos_specs(self, qos_specs):"},{"line_number":164,"context_line":"        total_bytes_sec \u003d int(qos_specs.get(\u0027total_bytes_sec\u0027, 0))"},{"line_number":165,"context_line":"        total_iops \u003d int(qos_specs.get(\u0027total_iops_sec\u0027,"},{"line_number":166,"context_line":"                                       self._bytes_per_sec_to_iops("}],"source_content_type":"text/x-python","patch_set":12,"id":"3a7e1126_ce913c54","line":163,"updated":"2015-12-17 15:26:44.000000000","message":"would get_total_iops or similar be a better name here?","commit_id":"5b1762a07585666b508d2da1752066d79e7c0741"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"2918171f19fd74db3c3f1ee4aeca4549f57a3b2b","unresolved":false,"context_lines":[{"line_number":376,"context_line":"        self.login_storage_target(connection_info)"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"    def set_disk_qos_specs(self, connection_info, max_iops):"},{"line_number":379,"context_line":"        LOG.warn(_LW(\"The iSCSI Hyper-V volume driver does not support QoS. \""},{"line_number":380,"context_line":"                     \"Ignoring QoS specs.\"))"},{"line_number":381,"context_line":""},{"line_number":382,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"3a7e1126_c1cd8d5e","line":379,"updated":"2015-12-17 15:26:44.000000000","message":"Trying to think if warn is correct. I guess it is really.","commit_id":"5b1762a07585666b508d2da1752066d79e7c0741"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"eb31c10fbca144e2c8d7afe903e8f0740bdb08ae","unresolved":false,"context_lines":[{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def parse_disk_qos_specs(self, qos_specs):"},{"line_number":175,"context_line":"        disk_qos_specs \u003d {}"},{"line_number":176,"context_line":"        total_bytes_sec \u003d int(qos_specs.get(\u0027total_bytes_sec\u0027, 0))"},{"line_number":177,"context_line":"        total_iops_sec \u003d int(qos_specs.get(\u0027total_iops_sec\u0027,"},{"line_number":178,"context_line":"                                           self._bytes_per_sec_to_iops("},{"line_number":179,"context_line":"                                               total_bytes_sec)))"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a061dce_97cec581","line":176,"updated":"2016-04-04 17:46:19.000000000","message":"be careful, this field might be None, causing this to generate a TypeError.","commit_id":"960f68aeb5dadc826c4c0f5723e055d61114fd4b"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"54d57be9d65be951ff56a96f47e68eaaa2a44365","unresolved":false,"context_lines":[{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def parse_disk_qos_specs(self, qos_specs):"},{"line_number":175,"context_line":"        disk_qos_specs \u003d {}"},{"line_number":176,"context_line":"        total_bytes_sec \u003d int(qos_specs.get(\u0027total_bytes_sec\u0027, 0))"},{"line_number":177,"context_line":"        total_iops_sec \u003d int(qos_specs.get(\u0027total_iops_sec\u0027,"},{"line_number":178,"context_line":"                                           self._bytes_per_sec_to_iops("},{"line_number":179,"context_line":"                                               total_bytes_sec)))"}],"source_content_type":"text/x-python","patch_set":14,"id":"5a18252c_d8cb5b1d","line":176,"in_reply_to":"9a061dce_97cec581","updated":"2016-04-12 11:04:53.000000000","message":"Done","commit_id":"960f68aeb5dadc826c4c0f5723e055d61114fd4b"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"eb31c10fbca144e2c8d7afe903e8f0740bdb08ae","unresolved":false,"context_lines":[{"line_number":174,"context_line":"    def parse_disk_qos_specs(self, qos_specs):"},{"line_number":175,"context_line":"        disk_qos_specs \u003d {}"},{"line_number":176,"context_line":"        total_bytes_sec \u003d int(qos_specs.get(\u0027total_bytes_sec\u0027, 0))"},{"line_number":177,"context_line":"        total_iops_sec \u003d int(qos_specs.get(\u0027total_iops_sec\u0027,"},{"line_number":178,"context_line":"                                           self._bytes_per_sec_to_iops("},{"line_number":179,"context_line":"                                               total_bytes_sec)))"},{"line_number":180,"context_line":"        if total_iops_sec:"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a061dce_b7f94950","line":177,"updated":"2016-04-04 17:46:19.000000000","message":"ditto.","commit_id":"960f68aeb5dadc826c4c0f5723e055d61114fd4b"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"54d57be9d65be951ff56a96f47e68eaaa2a44365","unresolved":false,"context_lines":[{"line_number":174,"context_line":"    def parse_disk_qos_specs(self, qos_specs):"},{"line_number":175,"context_line":"        disk_qos_specs \u003d {}"},{"line_number":176,"context_line":"        total_bytes_sec \u003d int(qos_specs.get(\u0027total_bytes_sec\u0027, 0))"},{"line_number":177,"context_line":"        total_iops_sec \u003d int(qos_specs.get(\u0027total_iops_sec\u0027,"},{"line_number":178,"context_line":"                                           self._bytes_per_sec_to_iops("},{"line_number":179,"context_line":"                                               total_bytes_sec)))"},{"line_number":180,"context_line":"        if total_iops_sec:"}],"source_content_type":"text/x-python","patch_set":14,"id":"5a18252c_38d1afce","line":177,"in_reply_to":"9a061dce_b7f94950","updated":"2016-04-12 11:04:53.000000000","message":"Done","commit_id":"960f68aeb5dadc826c4c0f5723e055d61114fd4b"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"59c52edc10c78d03ebf4ac203e7b6c72b26c82c7","unresolved":false,"context_lines":[{"line_number":482,"context_line":"        unmount_synchronized()"},{"line_number":483,"context_line":""},{"line_number":484,"context_line":"    def set_disk_qos_specs(self, connection_info, qos_specs):"},{"line_number":485,"context_line":"        supported_qos_specs \u003d [\u0027total_iops_sec\u0027, \u0027total_bytes_sec\u0027]"},{"line_number":486,"context_line":"        VolumeOps.validate_qos_specs(qos_specs, supported_qos_specs)"},{"line_number":487,"context_line":""},{"line_number":488,"context_line":"        total_bytes_sec \u003d qos_specs.get(\u0027total_bytes_sec\u0027) or 0"}],"source_content_type":"text/x-python","patch_set":17,"id":"bab6814e_f042c067","line":485,"updated":"2016-05-23 19:21:19.000000000","message":"question: why is it here total_iops_sec, total_bytes_sec, while in vmops it is max_iops_sec, max_bytes_sec? Why not the same?","commit_id":"ac7b885140166ac3af18d2f3fb4afc3b05a6d1b1"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"4762d2e8f4e04342e4e11f45e61af0f2c7600295","unresolved":false,"context_lines":[{"line_number":482,"context_line":"        unmount_synchronized()"},{"line_number":483,"context_line":""},{"line_number":484,"context_line":"    def set_disk_qos_specs(self, connection_info, qos_specs):"},{"line_number":485,"context_line":"        supported_qos_specs \u003d [\u0027total_iops_sec\u0027, \u0027total_bytes_sec\u0027]"},{"line_number":486,"context_line":"        VolumeOps.validate_qos_specs(qos_specs, supported_qos_specs)"},{"line_number":487,"context_line":""},{"line_number":488,"context_line":"        total_bytes_sec \u003d qos_specs.get(\u0027total_bytes_sec\u0027) or 0"}],"source_content_type":"text/x-python","patch_set":17,"id":"bab6814e_79acfb8c","line":485,"in_reply_to":"bab6814e_f042c067","updated":"2016-05-23 20:17:19.000000000","message":"total_bytes_sec/total_iops_sec seemed to be the \u0027standard\u0027 names for the according Cinder qos specs so I wanted to remain consistent.\n\nAs pointed out by John, using total_bytes_sec as an image extra spec regarding disk IO thresholds may be a bit confusing as one may assume that it applies to all the instance disks as a whole, not individually.\n\nIt seems that libvirt already uses disk_total_bytes_sec/disk_total_iops_sec with exactly the same meaning, so I think I\u0027m just going to stick with that.","commit_id":"ac7b885140166ac3af18d2f3fb4afc3b05a6d1b1"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"bc14927584be91ca887cfd0b84b321506a40dddc","unresolved":false,"context_lines":[{"line_number":485,"context_line":"        supported_qos_specs \u003d [\u0027total_iops_sec\u0027, \u0027total_bytes_sec\u0027]"},{"line_number":486,"context_line":"        VolumeOps.validate_qos_specs(qos_specs, supported_qos_specs)"},{"line_number":487,"context_line":""},{"line_number":488,"context_line":"        total_bytes_sec \u003d qos_specs.get(\u0027total_bytes_sec\u0027) or 0"},{"line_number":489,"context_line":"        total_iops_sec \u003d (qos_specs.get(\u0027total_iops_sec\u0027) or"},{"line_number":490,"context_line":"                          self._volumeops.bytes_per_sec_to_iops("},{"line_number":491,"context_line":"                              total_bytes_sec))"}],"source_content_type":"text/x-python","patch_set":17,"id":"bab6814e_30f7288e","line":488,"updated":"2016-05-23 19:18:51.000000000","message":"not converting to int?","commit_id":"ac7b885140166ac3af18d2f3fb4afc3b05a6d1b1"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"bc14927584be91ca887cfd0b84b321506a40dddc","unresolved":false,"context_lines":[{"line_number":486,"context_line":"        VolumeOps.validate_qos_specs(qos_specs, supported_qos_specs)"},{"line_number":487,"context_line":""},{"line_number":488,"context_line":"        total_bytes_sec \u003d qos_specs.get(\u0027total_bytes_sec\u0027) or 0"},{"line_number":489,"context_line":"        total_iops_sec \u003d (qos_specs.get(\u0027total_iops_sec\u0027) or"},{"line_number":490,"context_line":"                          self._volumeops.bytes_per_sec_to_iops("},{"line_number":491,"context_line":"                              total_bytes_sec))"},{"line_number":492,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"bab6814e_70f1b095","line":489,"updated":"2016-05-23 19:18:51.000000000","message":"ditto.","commit_id":"ac7b885140166ac3af18d2f3fb4afc3b05a6d1b1"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"bc14927584be91ca887cfd0b84b321506a40dddc","unresolved":false,"context_lines":[{"line_number":491,"context_line":"                              total_bytes_sec))"},{"line_number":492,"context_line":""},{"line_number":493,"context_line":"        disk_path \u003d self._get_disk_path(connection_info)"},{"line_number":494,"context_line":"        self._vmutils.set_disk_qos_specs(disk_path, total_iops_sec)"}],"source_content_type":"text/x-python","patch_set":17,"id":"bab6814e_70fb7048","line":494,"updated":"2016-05-23 19:18:51.000000000","message":"this should be set only if total_iops_sec has a value, right?","commit_id":"ac7b885140166ac3af18d2f3fb4afc3b05a6d1b1"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"4762d2e8f4e04342e4e11f45e61af0f2c7600295","unresolved":false,"context_lines":[{"line_number":491,"context_line":"                              total_bytes_sec))"},{"line_number":492,"context_line":""},{"line_number":493,"context_line":"        disk_path \u003d self._get_disk_path(connection_info)"},{"line_number":494,"context_line":"        self._vmutils.set_disk_qos_specs(disk_path, total_iops_sec)"}],"source_content_type":"text/x-python","patch_set":17,"id":"bab6814e_f9e58bdc","line":494,"in_reply_to":"bab6814e_70fb7048","updated":"2016-05-23 20:17:19.000000000","message":"Indeed.","commit_id":"ac7b885140166ac3af18d2f3fb4afc3b05a6d1b1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d47773b8e3b24a321dba4648fb492b4251092e52","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        volume_driver.attach_volume(connection_info, instance_name,"},{"line_number":79,"context_line":"                                    disk_bus\u003ddisk_bus)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        qos_specs \u003d connection_info[\u0027data\u0027].get(\u0027qos_specs\u0027) or {}"},{"line_number":82,"context_line":"        if qos_specs:"},{"line_number":83,"context_line":"            volume_driver.set_disk_qos_specs(connection_info,"},{"line_number":84,"context_line":"                                             qos_specs)"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a8bc5a2_64c6ea68","line":81,"updated":"2016-09-22 21:43:14.000000000","message":"The windows smbfs volume driver doesn\u0027t return this, does it need to?","commit_id":"6e827522cd42af87920a9102fc0c096dea5836e9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ad6ee82abf0239e09c9d3a3104f58518af4ff433","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        volume_driver.attach_volume(connection_info, instance_name,"},{"line_number":79,"context_line":"                                    disk_bus\u003ddisk_bus)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        qos_specs \u003d connection_info[\u0027data\u0027].get(\u0027qos_specs\u0027) or {}"},{"line_number":82,"context_line":"        if qos_specs:"},{"line_number":83,"context_line":"            volume_driver.set_disk_qos_specs(connection_info,"},{"line_number":84,"context_line":"                                             qos_specs)"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a8bc5a2_0fa6fe0f","line":81,"in_reply_to":"5a8bc5a2_142aa57e","updated":"2016-09-23 12:45:14.000000000","message":"Ahhh OK, thanks.","commit_id":"6e827522cd42af87920a9102fc0c096dea5836e9"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"68132472e66ac7988733ae411032cb450552409c","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        volume_driver.attach_volume(connection_info, instance_name,"},{"line_number":79,"context_line":"                                    disk_bus\u003ddisk_bus)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        qos_specs \u003d connection_info[\u0027data\u0027].get(\u0027qos_specs\u0027) or {}"},{"line_number":82,"context_line":"        if qos_specs:"},{"line_number":83,"context_line":"            volume_driver.set_disk_qos_specs(connection_info,"},{"line_number":84,"context_line":"                                             qos_specs)"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a8bc5a2_142aa57e","line":81,"in_reply_to":"5a8bc5a2_64c6ea68","updated":"2016-09-23 09:15:47.000000000","message":"Nope, \u0027front-end\u0027 qos specs (applied by Nova in this case) are set by the Cinder volume manager:\nhttps://github.com/openstack/cinder/blob/051ff39a9c2e32a5fb43610baadada813296b763/cinder/volume/manager.py#L1439-L1451","commit_id":"6e827522cd42af87920a9102fc0c096dea5836e9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d47773b8e3b24a321dba4648fb492b4251092e52","unresolved":false,"context_lines":[{"line_number":157,"context_line":"        # Hyper-v uses normalized IOPS (8 KB increments)"},{"line_number":158,"context_line":"        # as IOPS allocation units."},{"line_number":159,"context_line":"        return ("},{"line_number":160,"context_line":"            (no_bytes + constants.IOPS_BASE_SIZE - 1) //"},{"line_number":161,"context_line":"            constants.IOPS_BASE_SIZE)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a8bc5a2_e4875a0d","line":160,"range":{"start_line":160,"start_character":13,"end_line":160,"end_character":21},"updated":"2016-09-22 21:43:14.000000000","message":"What if this is 0?","commit_id":"6e827522cd42af87920a9102fc0c096dea5836e9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ad6ee82abf0239e09c9d3a3104f58518af4ff433","unresolved":false,"context_lines":[{"line_number":157,"context_line":"        # Hyper-v uses normalized IOPS (8 KB increments)"},{"line_number":158,"context_line":"        # as IOPS allocation units."},{"line_number":159,"context_line":"        return ("},{"line_number":160,"context_line":"            (no_bytes + constants.IOPS_BASE_SIZE - 1) //"},{"line_number":161,"context_line":"            constants.IOPS_BASE_SIZE)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a8bc5a2_2fb81ae5","line":160,"range":{"start_line":160,"start_character":13,"end_line":160,"end_character":21},"in_reply_to":"5a8bc5a2_a15a914e","updated":"2016-09-23 12:45:14.000000000","message":"Oh yeah I guess it would, nevermind then.","commit_id":"6e827522cd42af87920a9102fc0c096dea5836e9"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"68132472e66ac7988733ae411032cb450552409c","unresolved":false,"context_lines":[{"line_number":157,"context_line":"        # Hyper-v uses normalized IOPS (8 KB increments)"},{"line_number":158,"context_line":"        # as IOPS allocation units."},{"line_number":159,"context_line":"        return ("},{"line_number":160,"context_line":"            (no_bytes + constants.IOPS_BASE_SIZE - 1) //"},{"line_number":161,"context_line":"            constants.IOPS_BASE_SIZE)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a8bc5a2_a15a914e","line":160,"range":{"start_line":160,"start_character":13,"end_line":160,"end_character":21},"in_reply_to":"5a8bc5a2_e4875a0d","updated":"2016-09-23 09:15:47.000000000","message":"This would simply return 0 so no need to worry about it.","commit_id":"6e827522cd42af87920a9102fc0c096dea5836e9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3183ffc02d1784b284a88cfd8118f0134e7166ba","unresolved":false,"context_lines":[{"line_number":161,"context_line":"            constants.IOPS_BASE_SIZE)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    @staticmethod"},{"line_number":164,"context_line":"    def validate_qos_specs(qos_specs, supported_qos_specs, force\u003dFalse):"},{"line_number":165,"context_line":"        unsupported_specs \u003d set(qos_specs.keys()).difference("},{"line_number":166,"context_line":"            supported_qos_specs)"},{"line_number":167,"context_line":"        if unsupported_specs:"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a8bc5a2_2f02da6f","line":164,"range":{"start_line":164,"start_character":59,"end_line":164,"end_character":70},"updated":"2016-09-23 12:48:02.000000000","message":"This is never used.","commit_id":"6e827522cd42af87920a9102fc0c096dea5836e9"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"2ea613cb711e6e25c472cb4082dd004c0634b234","unresolved":false,"context_lines":[{"line_number":161,"context_line":"            constants.IOPS_BASE_SIZE)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    @staticmethod"},{"line_number":164,"context_line":"    def validate_qos_specs(qos_specs, supported_qos_specs, force\u003dFalse):"},{"line_number":165,"context_line":"        unsupported_specs \u003d set(qos_specs.keys()).difference("},{"line_number":166,"context_line":"            supported_qos_specs)"},{"line_number":167,"context_line":"        if unsupported_specs:"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a8bc5a2_c24dcd73","line":164,"range":{"start_line":164,"start_character":59,"end_line":164,"end_character":70},"in_reply_to":"5a8bc5a2_2f02da6f","updated":"2016-09-23 12:55:44.000000000","message":"Indeed, that \u0027force\u0027 argument can be dropped.","commit_id":"6e827522cd42af87920a9102fc0c096dea5836e9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3183ffc02d1784b284a88cfd8118f0134e7166ba","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        unsupported_specs \u003d set(qos_specs.keys()).difference("},{"line_number":166,"context_line":"            supported_qos_specs)"},{"line_number":167,"context_line":"        if unsupported_specs:"},{"line_number":168,"context_line":"            msg \u003d (_LE(\u0027Got unsupported QoS specs: \u0027"},{"line_number":169,"context_line":"                       \u0027%(unsupported_specs)s. \u0027"},{"line_number":170,"context_line":"                       \u0027Supported qos specs: %(supported_qos_specs)s\u0027) %"},{"line_number":171,"context_line":"                   {\u0027unsupported_specs\u0027: unsupported_specs,"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a8bc5a2_0fe8beb3","line":168,"range":{"start_line":168,"start_character":19,"end_line":168,"end_character":22},"updated":"2016-09-23 12:48:02.000000000","message":"This doesn\u0027t match the LOG.warning below.\n\nAlso, you\u0027re not supposed to use a message object when raising an exception, you should just use _() if you\u0027re going to re-use the msg variable. See:\n\nhttp://docs.openstack.org/developer/oslo.i18n/guidelines.html#choosing-a-marker-function","commit_id":"6e827522cd42af87920a9102fc0c096dea5836e9"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"2ea613cb711e6e25c472cb4082dd004c0634b234","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        unsupported_specs \u003d set(qos_specs.keys()).difference("},{"line_number":166,"context_line":"            supported_qos_specs)"},{"line_number":167,"context_line":"        if unsupported_specs:"},{"line_number":168,"context_line":"            msg \u003d (_LE(\u0027Got unsupported QoS specs: \u0027"},{"line_number":169,"context_line":"                       \u0027%(unsupported_specs)s. \u0027"},{"line_number":170,"context_line":"                       \u0027Supported qos specs: %(supported_qos_specs)s\u0027) %"},{"line_number":171,"context_line":"                   {\u0027unsupported_specs\u0027: unsupported_specs,"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a8bc5a2_af7d0ab3","line":168,"range":{"start_line":168,"start_character":19,"end_line":168,"end_character":22},"in_reply_to":"5a8bc5a2_0fe8beb3","updated":"2016-09-23 12:55:44.000000000","message":"Makes sense.","commit_id":"6e827522cd42af87920a9102fc0c096dea5836e9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d47773b8e3b24a321dba4648fb492b4251092e52","unresolved":false,"context_lines":[{"line_number":353,"context_line":"        self.login_storage_target(connection_info)"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"    def set_disk_qos_specs(self, connection_info, disk_qos_specs):"},{"line_number":356,"context_line":"        LOG.warning(_LW(\"The iSCSI Hyper-V volume driver does not support \""},{"line_number":357,"context_line":"                        \"QoS. Ignoring QoS specs.\"))"},{"line_number":358,"context_line":""},{"line_number":359,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"5a8bc5a2_84ddb616","line":356,"updated":"2016-09-22 21:43:14.000000000","message":"Do we really need to warn for this? INFO seems more appropriate unless the operator needs to fix something.","commit_id":"6e827522cd42af87920a9102fc0c096dea5836e9"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"a66d0e3556db920c806382b2e3381b04e590ab57","unresolved":false,"context_lines":[{"line_number":353,"context_line":"        self.login_storage_target(connection_info)"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"    def set_disk_qos_specs(self, connection_info, disk_qos_specs):"},{"line_number":356,"context_line":"        LOG.warning(_LW(\"The iSCSI Hyper-V volume driver does not support \""},{"line_number":357,"context_line":"                        \"QoS. Ignoring QoS specs.\"))"},{"line_number":358,"context_line":""},{"line_number":359,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"5a8bc5a2_e3b018e0","line":356,"in_reply_to":"5a8bc5a2_84ddb616","updated":"2016-09-23 10:00:35.000000000","message":"Makes sense. I\u0027ll switch to an info message.","commit_id":"6e827522cd42af87920a9102fc0c096dea5836e9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d47773b8e3b24a321dba4648fb492b4251092e52","unresolved":false,"context_lines":[{"line_number":472,"context_line":"        unmount_synchronized()"},{"line_number":473,"context_line":""},{"line_number":474,"context_line":"    def set_disk_qos_specs(self, connection_info, qos_specs):"},{"line_number":475,"context_line":"        supported_qos_specs \u003d [\u0027total_iops_sec\u0027, \u0027total_bytes_sec\u0027]"},{"line_number":476,"context_line":"        VolumeOps.validate_qos_specs(qos_specs, supported_qos_specs)"},{"line_number":477,"context_line":""},{"line_number":478,"context_line":"        total_bytes_sec \u003d int(qos_specs.get(\u0027total_bytes_sec\u0027) or 0)"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a8bc5a2_a4bb92c3","line":475,"range":{"start_line":475,"start_character":8,"end_line":475,"end_character":67},"updated":"2016-09-22 21:43:14.000000000","message":"You could probably throw this into constants, but maybe it\u0027s specific to this volume driver?","commit_id":"6e827522cd42af87920a9102fc0c096dea5836e9"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"68132472e66ac7988733ae411032cb450552409c","unresolved":false,"context_lines":[{"line_number":472,"context_line":"        unmount_synchronized()"},{"line_number":473,"context_line":""},{"line_number":474,"context_line":"    def set_disk_qos_specs(self, connection_info, qos_specs):"},{"line_number":475,"context_line":"        supported_qos_specs \u003d [\u0027total_iops_sec\u0027, \u0027total_bytes_sec\u0027]"},{"line_number":476,"context_line":"        VolumeOps.validate_qos_specs(qos_specs, supported_qos_specs)"},{"line_number":477,"context_line":""},{"line_number":478,"context_line":"        total_bytes_sec \u003d int(qos_specs.get(\u0027total_bytes_sec\u0027) or 0)"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a8bc5a2_f22b8992","line":475,"range":{"start_line":475,"start_character":8,"end_line":475,"end_character":67},"in_reply_to":"5a8bc5a2_a4bb92c3","updated":"2016-09-23 09:15:47.000000000","message":"Front-end qos specs seem to be arbitrary, however I wanted to remain consistent with the spec names used by the libvirt driver:\nhttps://github.com/openstack/nova/blob/master/nova/virt/libvirt/volume/volume.py#L70-L72\n\nI can define some constants, but it may be better if we do this in a separate patch, ensuring that all Nova drivers are using the same qos spec names.","commit_id":"6e827522cd42af87920a9102fc0c096dea5836e9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d47773b8e3b24a321dba4648fb492b4251092e52","unresolved":false,"context_lines":[{"line_number":476,"context_line":"        VolumeOps.validate_qos_specs(qos_specs, supported_qos_specs)"},{"line_number":477,"context_line":""},{"line_number":478,"context_line":"        total_bytes_sec \u003d int(qos_specs.get(\u0027total_bytes_sec\u0027) or 0)"},{"line_number":479,"context_line":"        total_iops_sec \u003d int(qos_specs.get(\u0027total_iops_sec\u0027) or"},{"line_number":480,"context_line":"                             VolumeOps.bytes_per_sec_to_iops("},{"line_number":481,"context_line":"                                total_bytes_sec))"},{"line_number":482,"context_line":""},{"line_number":483,"context_line":"        if total_iops_sec:"},{"line_number":484,"context_line":"            disk_path \u003d self._get_disk_path(connection_info)"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a8bc5a2_04f9a680","line":481,"range":{"start_line":479,"start_character":8,"end_line":481,"end_character":49},"updated":"2016-09-22 21:43:14.000000000","message":"Is this worth calculating if total_bytes_sec is 0?","commit_id":"6e827522cd42af87920a9102fc0c096dea5836e9"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"68132472e66ac7988733ae411032cb450552409c","unresolved":false,"context_lines":[{"line_number":476,"context_line":"        VolumeOps.validate_qos_specs(qos_specs, supported_qos_specs)"},{"line_number":477,"context_line":""},{"line_number":478,"context_line":"        total_bytes_sec \u003d int(qos_specs.get(\u0027total_bytes_sec\u0027) or 0)"},{"line_number":479,"context_line":"        total_iops_sec \u003d int(qos_specs.get(\u0027total_iops_sec\u0027) or"},{"line_number":480,"context_line":"                             VolumeOps.bytes_per_sec_to_iops("},{"line_number":481,"context_line":"                                total_bytes_sec))"},{"line_number":482,"context_line":""},{"line_number":483,"context_line":"        if total_iops_sec:"},{"line_number":484,"context_line":"            disk_path \u003d self._get_disk_path(connection_info)"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a8bc5a2_cd634cdb","line":481,"range":{"start_line":479,"start_character":8,"end_line":481,"end_character":49},"in_reply_to":"5a8bc5a2_04f9a680","updated":"2016-09-23 09:15:47.000000000","message":"It\u0027s not needed, but since this is a trivial operation, I wanted to keep the code simple.","commit_id":"6e827522cd42af87920a9102fc0c096dea5836e9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"aa3bf183ab51c8af70471aa0b31e4e09f1c80da1","unresolved":false,"context_lines":[{"line_number":161,"context_line":"            constants.IOPS_BASE_SIZE)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    @staticmethod"},{"line_number":164,"context_line":"    def validate_qos_specs(qos_specs, supported_qos_specs, force\u003dFalse):"},{"line_number":165,"context_line":"        unsupported_specs \u003d set(qos_specs.keys()).difference("},{"line_number":166,"context_line":"            supported_qos_specs)"},{"line_number":167,"context_line":"        if unsupported_specs:"}],"source_content_type":"text/x-python","patch_set":24,"id":"5a8bc5a2_af734a14","line":164,"range":{"start_line":164,"start_character":59,"end_line":164,"end_character":70},"updated":"2016-09-23 12:50:53.000000000","message":"This is never used.","commit_id":"4542b27060cb805a913600df786a9c27187411de"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"aa3bf183ab51c8af70471aa0b31e4e09f1c80da1","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        unsupported_specs \u003d set(qos_specs.keys()).difference("},{"line_number":166,"context_line":"            supported_qos_specs)"},{"line_number":167,"context_line":"        if unsupported_specs:"},{"line_number":168,"context_line":"            msg \u003d (_LE(\u0027Got unsupported QoS specs: \u0027"},{"line_number":169,"context_line":"                       \u0027%(unsupported_specs)s. \u0027"},{"line_number":170,"context_line":"                       \u0027Supported qos specs: %(supported_qos_specs)s\u0027) %"},{"line_number":171,"context_line":"                   {\u0027unsupported_specs\u0027: unsupported_specs,"}],"source_content_type":"text/x-python","patch_set":24,"id":"5a8bc5a2_8f4f6ebc","line":168,"range":{"start_line":168,"start_character":19,"end_line":168,"end_character":22},"updated":"2016-09-23 12:50:53.000000000","message":"This doesn\u0027t match the LOG.warning below.\n\nAlso, you\u0027re not supposed to use a message object when raising an exception, you should just use _() if you\u0027re going to re-use the msg variable. See:\n\nhttp://docs.openstack.org/developer/oslo.i18n/guidelines.html#choosing-a-marker-function","commit_id":"4542b27060cb805a913600df786a9c27187411de"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f1ba938159a18844ab54d993723d864d0a4e0488","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        volume_driver.attach_volume(connection_info, instance_name,"},{"line_number":79,"context_line":"                                    disk_bus\u003ddisk_bus)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        qos_specs \u003d connection_info[\u0027data\u0027].get(\u0027qos_specs\u0027) or {}"},{"line_number":82,"context_line":"        if qos_specs:"},{"line_number":83,"context_line":"            volume_driver.set_disk_qos_specs(connection_info,"},{"line_number":84,"context_line":"                                             qos_specs)"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a8bc5a2_91514311","line":81,"range":{"start_line":81,"start_character":60,"end_line":81,"end_character":66},"updated":"2016-09-23 18:17:05.000000000","message":"nit: this isn\u0027t really necessary as you\u0027ll get None back anyway.","commit_id":"87fe58b1e07ca84090e02d3e1a0e574e209dca53"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f1ba938159a18844ab54d993723d864d0a4e0488","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        # as IOPS allocation units."},{"line_number":159,"context_line":"        return ("},{"line_number":160,"context_line":"            (no_bytes + constants.IOPS_BASE_SIZE - 1) //"},{"line_number":161,"context_line":"            constants.IOPS_BASE_SIZE)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    @staticmethod"},{"line_number":164,"context_line":"    def validate_qos_specs(qos_specs, supported_qos_specs):"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a8bc5a2_113e13b8","line":161,"updated":"2016-09-23 18:17:05.000000000","message":"alignment nit here","commit_id":"87fe58b1e07ca84090e02d3e1a0e574e209dca53"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f07e6980b2b1f0c9e31d2398f0f01115d845e87","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        unsupported_specs \u003d set(qos_specs.keys()).difference("},{"line_number":166,"context_line":"            supported_qos_specs)"},{"line_number":167,"context_line":"        if unsupported_specs:"},{"line_number":168,"context_line":"            msg \u003d (_LE(\u0027Got unsupported QoS specs: \u0027"},{"line_number":169,"context_line":"                       \u0027%(unsupported_specs)s. \u0027"},{"line_number":170,"context_line":"                       \u0027Supported qos specs: %(supported_qos_specs)s\u0027) %"},{"line_number":171,"context_line":"                   {\u0027unsupported_specs\u0027: unsupported_specs,"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a8bc5a2_d648218a","line":168,"range":{"start_line":168,"start_character":19,"end_line":168,"end_character":22},"updated":"2016-09-23 18:13:16.000000000","message":"This needs to be _LW.","commit_id":"87fe58b1e07ca84090e02d3e1a0e574e209dca53"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"23067f2a476c6ff2e56673fc298cf5659231feb9","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        unsupported_specs \u003d set(qos_specs.keys()).difference("},{"line_number":166,"context_line":"            supported_qos_specs)"},{"line_number":167,"context_line":"        if unsupported_specs:"},{"line_number":168,"context_line":"            msg \u003d (_LE(\u0027Got unsupported QoS specs: \u0027"},{"line_number":169,"context_line":"                       \u0027%(unsupported_specs)s. \u0027"},{"line_number":170,"context_line":"                       \u0027Supported qos specs: %(supported_qos_specs)s\u0027) %"},{"line_number":171,"context_line":"                   {\u0027unsupported_specs\u0027: unsupported_specs,"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a8bc5a2_71eaf710","line":168,"range":{"start_line":168,"start_character":19,"end_line":168,"end_character":22},"in_reply_to":"5a8bc5a2_d648218a","updated":"2016-09-23 18:34:36.000000000","message":"Done","commit_id":"87fe58b1e07ca84090e02d3e1a0e574e209dca53"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f1ba938159a18844ab54d993723d864d0a4e0488","unresolved":false,"context_lines":[{"line_number":350,"context_line":"    def initialize_volume_connection(self, connection_info):"},{"line_number":351,"context_line":"        self.login_storage_target(connection_info)"},{"line_number":352,"context_line":""},{"line_number":353,"context_line":"    def set_disk_qos_specs(self, connection_info, disk_qos_specs):"},{"line_number":354,"context_line":"        LOG.info(_LI(\"The iSCSI Hyper-V volume driver does not support QoS. \""},{"line_number":355,"context_line":"                     \"Ignoring QoS specs.\"))"},{"line_number":356,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"5a8bc5a2_b1a63f0e","line":353,"updated":"2016-09-23 18:17:05.000000000","message":"Should we have a unit test to make sure this method is implemented as is basically a no-op? Just wondering since it\u0027s not an abstract method or anything.","commit_id":"87fe58b1e07ca84090e02d3e1a0e574e209dca53"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"001c5aa74f97c9270e3773c45ca5ae9965e32ee3","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        # as IOPS allocation units."},{"line_number":159,"context_line":"        return ("},{"line_number":160,"context_line":"            (no_bytes + constants.IOPS_BASE_SIZE - 1) //"},{"line_number":161,"context_line":"            constants.IOPS_BASE_SIZE)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    @staticmethod"},{"line_number":164,"context_line":"    def validate_qos_specs(qos_specs, supported_qos_specs):"}],"source_content_type":"text/x-python","patch_set":27,"id":"5a8bc5a2_cdcfa77d","line":161,"updated":"2016-09-23 20:40:57.000000000","message":"nit: alignment in case you need to respin","commit_id":"802a0afa57fed3a098743abe7c0208416ad32a00"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"001c5aa74f97c9270e3773c45ca5ae9965e32ee3","unresolved":false,"context_lines":[{"line_number":350,"context_line":"    def initialize_volume_connection(self, connection_info):"},{"line_number":351,"context_line":"        self.login_storage_target(connection_info)"},{"line_number":352,"context_line":""},{"line_number":353,"context_line":"    def set_disk_qos_specs(self, connection_info, disk_qos_specs):"},{"line_number":354,"context_line":"        LOG.info(_LI(\"The iSCSI Hyper-V volume driver does not support QoS. \""},{"line_number":355,"context_line":"                     \"Ignoring QoS specs.\"))"},{"line_number":356,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"5a8bc5a2_8dacbfa1","line":353,"updated":"2016-09-23 20:40:57.000000000","message":"Do we want a test for this to make sure we don\u0027t blow up if this is called?","commit_id":"802a0afa57fed3a098743abe7c0208416ad32a00"}],"releasenotes/notes/bp-hyperv-storage-qos-d559634e5df0f1d4.yaml":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d47773b8e3b24a321dba4648fb492b4251092e52","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    specs, allowing to specify IO limits applied for each of the"},{"line_number":6,"context_line":"    instance local disks, individually."},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"    - quota:disk_max_bytes_sec"},{"line_number":9,"context_line":"    - quota:disk_max_iops_sec - those are normalized IOPS, thus each"},{"line_number":10,"context_line":"      IO request is accounted for as 1 normalized IO if the size of the"},{"line_number":11,"context_line":"      request is less than or equal to a predefined base size (8KB)."}],"source_content_type":"text/x-yaml","patch_set":23,"id":"5a8bc5a2_246b0220","line":8,"range":{"start_line":8,"start_character":12,"end_line":8,"end_character":30},"updated":"2016-09-22 21:43:14.000000000","message":"Should be disk_total_bytes_sec","commit_id":"6e827522cd42af87920a9102fc0c096dea5836e9"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"68132472e66ac7988733ae411032cb450552409c","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    specs, allowing to specify IO limits applied for each of the"},{"line_number":6,"context_line":"    instance local disks, individually."},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"    - quota:disk_max_bytes_sec"},{"line_number":9,"context_line":"    - quota:disk_max_iops_sec - those are normalized IOPS, thus each"},{"line_number":10,"context_line":"      IO request is accounted for as 1 normalized IO if the size of the"},{"line_number":11,"context_line":"      request is less than or equal to a predefined base size (8KB)."}],"source_content_type":"text/x-yaml","patch_set":23,"id":"5a8bc5a2_edb56831","line":8,"range":{"start_line":8,"start_character":12,"end_line":8,"end_character":30},"in_reply_to":"5a8bc5a2_246b0220","updated":"2016-09-23 09:15:47.000000000","message":"Done","commit_id":"6e827522cd42af87920a9102fc0c096dea5836e9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d47773b8e3b24a321dba4648fb492b4251092e52","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    instance local disks, individually."},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"    - quota:disk_max_bytes_sec"},{"line_number":9,"context_line":"    - quota:disk_max_iops_sec - those are normalized IOPS, thus each"},{"line_number":10,"context_line":"      IO request is accounted for as 1 normalized IO if the size of the"},{"line_number":11,"context_line":"      request is less than or equal to a predefined base size (8KB)."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":23,"id":"5a8bc5a2_64750af8","line":9,"range":{"start_line":9,"start_character":12,"end_line":9,"end_character":29},"updated":"2016-09-22 21:43:14.000000000","message":"Should be disk_total_iops_sec","commit_id":"6e827522cd42af87920a9102fc0c096dea5836e9"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"68132472e66ac7988733ae411032cb450552409c","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    instance local disks, individually."},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"    - quota:disk_max_bytes_sec"},{"line_number":9,"context_line":"    - quota:disk_max_iops_sec - those are normalized IOPS, thus each"},{"line_number":10,"context_line":"      IO request is accounted for as 1 normalized IO if the size of the"},{"line_number":11,"context_line":"      request is less than or equal to a predefined base size (8KB)."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":23,"id":"5a8bc5a2_cdba6c23","line":9,"range":{"start_line":9,"start_character":12,"end_line":9,"end_character":29},"in_reply_to":"5a8bc5a2_64750af8","updated":"2016-09-23 09:15:47.000000000","message":"Done","commit_id":"6e827522cd42af87920a9102fc0c096dea5836e9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d47773b8e3b24a321dba4648fb492b4251092e52","unresolved":false,"context_lines":[{"line_number":10,"context_line":"      IO request is accounted for as 1 normalized IO if the size of the"},{"line_number":11,"context_line":"      request is less than or equal to a predefined base size (8KB)."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"    Also, the following Cinder front-end QoS specs are now supported:"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"    - total_bytes_sec"},{"line_number":16,"context_line":"    - total_iops_sec - normalized IOPS"}],"source_content_type":"text/x-yaml","patch_set":23,"id":"5a8bc5a2_24d942f4","line":13,"updated":"2016-09-22 21:43:14.000000000","message":"Shouldn\u0027t this say something about it only being supported for SMB and not iscsi?","commit_id":"6e827522cd42af87920a9102fc0c096dea5836e9"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"68132472e66ac7988733ae411032cb450552409c","unresolved":false,"context_lines":[{"line_number":10,"context_line":"      IO request is accounted for as 1 normalized IO if the size of the"},{"line_number":11,"context_line":"      request is less than or equal to a predefined base size (8KB)."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"    Also, the following Cinder front-end QoS specs are now supported:"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"    - total_bytes_sec"},{"line_number":16,"context_line":"    - total_iops_sec - normalized IOPS"}],"source_content_type":"text/x-yaml","patch_set":23,"id":"5a8bc5a2_adab60d5","line":13,"in_reply_to":"5a8bc5a2_24d942f4","updated":"2016-09-23 09:15:47.000000000","message":"Done","commit_id":"6e827522cd42af87920a9102fc0c096dea5836e9"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"c557abe064bc362df27a03d41a64f134b63cc7b6","unresolved":false,"context_lines":[{"line_number":11,"context_line":"      request is less than or equal to a predefined base size (8KB)."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"    Also, the following Cinder front-end QoS specs are now supported in"},{"line_number":14,"context_line":"    case of SMB Cinder backends:"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"    - total_bytes_sec"},{"line_number":17,"context_line":"    - total_iops_sec - normalized IOPS"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"5a8bc5a2_2c42ed3e","line":14,"updated":"2016-09-23 10:52:21.000000000","message":"hm, \"for SMV Cinder backends\" sounds a bit more right.","commit_id":"4542b27060cb805a913600df786a9c27187411de"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"338be9347cd4a647b1aece3b3b04204b678be23a","unresolved":false,"context_lines":[{"line_number":11,"context_line":"      request is less than or equal to a predefined base size (8KB)."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"    Also, the following Cinder front-end QoS specs are now supported in"},{"line_number":14,"context_line":"    case of SMB Cinder backends:"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"    - total_bytes_sec"},{"line_number":17,"context_line":"    - total_iops_sec - normalized IOPS"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"5a8bc5a2_45de276e","line":14,"in_reply_to":"5a8bc5a2_2c42ed3e","updated":"2016-09-23 13:18:28.000000000","message":"Done","commit_id":"4542b27060cb805a913600df786a9c27187411de"}]}
