)]}'
{"nova/tests/unit/virt/hyperv/test_base.py":[{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"35e1aa7cfbbdf71259cc27a31bfcdf3771a32aea","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        platform_patcher \u003d mock.patch(\u0027sys.platform\u0027, \u0027win32\u0027)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"        hostutils_patcher \u003d mock.patch.multiple(utilsfactory,"},{"line_number":33,"context_line":"                                                _get_class\u003dmock.DEFAULT)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        platform_patcher.start()"},{"line_number":36,"context_line":"        wmi_patcher.start()"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_10d19ffb","line":33,"updated":"2015-08-24 11:40:15.000000000","message":"Since _get_class is mocked and it ultimately return the utils class, we may not need to mock these utils classes in the ops tests. For example in test_vmops in setUp we have something like: self._vmops._vmutils \u003d mock.MagicMock(). This will no longer be necessary. Is this change in the scope of this patch? What do you say? @cbelu?","commit_id":"f42f91cae216f59374029a3f78f97ac3a6862326"},{"author":{"_account_id":12582,"name":"Simona Iuliana Toader","email":"itoader@cloudbasesolutions.com","username":"itoader"},"change_message_id":"e6570ace6ba0bd616624020291463de66b630783","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        platform_patcher \u003d mock.patch(\u0027sys.platform\u0027, \u0027win32\u0027)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"        hostutils_patcher \u003d mock.patch.multiple(utilsfactory,"},{"line_number":33,"context_line":"                                                _get_class\u003dmock.DEFAULT)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        platform_patcher.start()"},{"line_number":36,"context_line":"        wmi_patcher.start()"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_c2c4af93","line":33,"in_reply_to":"fa1b9901_10d19ffb","updated":"2015-08-24 15:21:18.000000000","message":"Done","commit_id":"f42f91cae216f59374029a3f78f97ac3a6862326"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"0d2487490c0a906b4459189da4893c69567ee4f7","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        platform_patcher \u003d mock.patch(\u0027sys.platform\u0027, \u0027win32\u0027)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"        hostutils_patcher \u003d mock.patch.multiple(utilsfactory,"},{"line_number":33,"context_line":"                                                _get_class\u003dmock.DEFAULT)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        platform_patcher.start()"},{"line_number":36,"context_line":"        wmi_patcher.start()"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_e5f22806","line":33,"in_reply_to":"fa1b9901_10d19ffb","updated":"2015-08-24 14:21:57.000000000","message":"well, that is true, since almost all the ops are using utilsfactory to get their utils instances. We could remove the parts in the setUps Adelina mentions, but I think there are a few cases where utilsfactory isn\u0027t used.\n\nAnd yeah, we can do that in this patch..","commit_id":"f42f91cae216f59374029a3f78f97ac3a6862326"},{"author":{"_account_id":12582,"name":"Simona Iuliana Toader","email":"itoader@cloudbasesolutions.com","username":"itoader"},"change_message_id":"e6570ace6ba0bd616624020291463de66b630783","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        platform_patcher \u003d mock.patch(\u0027sys.platform\u0027, \u0027win32\u0027)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"        hostutils_patcher \u003d mock.patch.multiple(utilsfactory,"},{"line_number":33,"context_line":"                                                _get_class\u003dmock.DEFAULT)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        platform_patcher.start()"},{"line_number":36,"context_line":"        wmi_patcher.start()"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_e2bf73fa","line":33,"in_reply_to":"fa1b9901_e5f22806","updated":"2015-08-24 15:21:18.000000000","message":"Done","commit_id":"f42f91cae216f59374029a3f78f97ac3a6862326"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"782240c45d5bf1322450e77bc1171d996c7d472e","unresolved":false,"context_lines":[{"line_number":29,"context_line":"                                 new\u003dself._mock_wmi)"},{"line_number":30,"context_line":"        platform_patcher \u003d mock.patch(\u0027sys.platform\u0027, \u0027win32\u0027)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"        hostutils_patcher \u003d mock.patch.multiple(utilsfactory,"},{"line_number":33,"context_line":"                                                _get_class\u003dmock.DEFAULT)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        platform_patcher.start()"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa1b9901_e16746b5","line":32,"updated":"2015-08-25 10:55:24.000000000","message":"Why patch.multiple ? patch.object should do.","commit_id":"e75ad012e0428fd3204459ff7ca1e60aa32cfb8e"}],"nova/tests/unit/virt/hyperv/test_volumeops.py":[{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"f10cc8d17d87bb65c2a6516a12ee4f40170e4b7b","unresolved":false,"context_lines":[{"line_number":415,"context_line":"        super(SMBFSVolumeDriverTestCase, self).setUp()"},{"line_number":416,"context_line":"        self._volume_driver \u003d volumeops.SMBFSVolumeDriver()"},{"line_number":417,"context_line":"        self._volume_driver._vmutils \u003d mock.MagicMock()"},{"line_number":418,"context_line":"        self._volume_driver._pathutils \u003d mock.MagicMock()"},{"line_number":419,"context_line":""},{"line_number":420,"context_line":"    @mock.patch.object(volumeops.SMBFSVolumeDriver, \u0027ensure_share_mounted\u0027)"},{"line_number":421,"context_line":"    @mock.patch.object(volumeops.SMBFSVolumeDriver, \u0027_get_disk_path\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa1b9901_8961d0aa","line":418,"updated":"2015-08-25 12:07:43.000000000","message":"SMBFSVolumeDriverTestCase inherits from HyperVBaseTestCase, so mocking the *utils here is pointless. And since you\u0027ve removed *utils mocks from other tests, you could also do it here.\n\nAlso true for ISCSIVolumeDriverTestCase above. And also true for the other *Ops classes, I think, that inherits HyperVBaseTestCase.","commit_id":"e75ad012e0428fd3204459ff7ca1e60aa32cfb8e"}],"nova/virt/hyperv/utilsfactory.py":[{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"b397ec6a81b682dff308a48a967d57f19028ac3c","unresolved":false,"context_lines":[{"line_number":86,"context_line":"    found_class \u003d None"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    if current_class not in class_utils:"},{"line_number":89,"context_line":"        raise vmutils.HyperVException(_(\u0027Class does not exist.\u0027))"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    existing_classes \u003d class_utils.get(current_class)"},{"line_number":92,"context_line":"    for class_variant in existing_classes.keys():"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_e0542422","line":89,"updated":"2015-08-19 11:34:28.000000000","message":"You could specify the class name here, something like:\n\n_(\"class %(class)s does not exist\") % current_class","commit_id":"c1a373dc8b5cea60420d6707b377f2396f0e8046"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"b397ec6a81b682dff308a48a967d57f19028ac3c","unresolved":false,"context_lines":[{"line_number":98,"context_line":"            break"},{"line_number":99,"context_line":"    if found_class is None:"},{"line_number":100,"context_line":"        raise vmutils.HyperVException(_(\u0027Class is not found for windows \u0027"},{"line_number":101,"context_line":"                                        \u0027version: %s\u0027) % windows_version)"},{"line_number":102,"context_line":"        return"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    module_name \u003d found_class.lower()"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_bb3501db","line":101,"updated":"2015-08-19 11:34:28.000000000","message":"Same here, it\u0027s easier to debug the problem if we know what class we are talking about.","commit_id":"c1a373dc8b5cea60420d6707b377f2396f0e8046"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"3ca45a83cc045f0c9a65803e6e2ca2bc457f3bd2","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    windows_version \u003d utils.get_windows_version()"},{"line_number":88,"context_line":"    build \u003d map(int, windows_version.split(\u0027.\u0027))"},{"line_number":89,"context_line":"    windows_version \u003d float(\"%i.%i\" % (build[0], build[1]))"},{"line_number":90,"context_line":"    found_class \u003d None"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    existing_classes \u003d class_utils.get(current_class)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa1b9901_4d6ab6b4","line":89,"updated":"2015-08-20 08:17:33.000000000","message":"Tests fail because this method (_get_class) was changed.\n\nThe problem lies in the hyperv.test_base.HyperVBaseTestCase class. The utils.get_windows_version is not mocked.","commit_id":"01ea363415befab884a80e1da70c5207ddf8ad57"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"d7fddd3752e661c585e366e0a3e4ae64ae8045d0","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"# #  noqa is used in order to not issue warnings during flake8 tests."},{"line_number":17,"context_line":"# Modules are imported and used in _get_class method which returns an"},{"line_number":18,"context_line":"# instance of a class from one of this modules."},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"fa1b9901_321b19cc","line":16,"updated":"2015-08-20 11:17:31.000000000","message":"how about rephrasing this to \"in order to avoid flake8 warnings\", maybe even specify what kind of warnings.\n\nAnyway, this can be avoided by simply using oslo_utils.import_class. Please check out my inline comment at line 106.","commit_id":"049b13309ba3a8f2f39af56e46862455511de37f"},{"author":{"_account_id":12582,"name":"Simona Iuliana Toader","email":"itoader@cloudbasesolutions.com","username":"itoader"},"change_message_id":"cb11f5227d8d6d7a7aa372a2df5186a6527e75c8","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"# #  noqa is used in order to not issue warnings during flake8 tests."},{"line_number":17,"context_line":"# Modules are imported and used in _get_class method which returns an"},{"line_number":18,"context_line":"# instance of a class from one of this modules."},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"fa1b9901_22124b0a","line":16,"in_reply_to":"fa1b9901_321b19cc","updated":"2015-08-24 15:19:36.000000000","message":"Done","commit_id":"049b13309ba3a8f2f39af56e46862455511de37f"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"d7fddd3752e661c585e366e0a3e4ae64ae8045d0","unresolved":false,"context_lines":[{"line_number":79,"context_line":"}"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"def _get_class(current_class):"},{"line_number":83,"context_line":"    if current_class not in class_utils:"},{"line_number":84,"context_line":"        raise vmutils.HyperVException(_(\"Class %(class)s does not exist\")"},{"line_number":85,"context_line":"                                      % current_class)"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa1b9901_748e5e7a","line":82,"updated":"2015-08-20 11:17:31.000000000","message":"How about replacing \"current_class\" with \"utils_class_type\" or something similar?","commit_id":"049b13309ba3a8f2f39af56e46862455511de37f"},{"author":{"_account_id":12582,"name":"Simona Iuliana Toader","email":"itoader@cloudbasesolutions.com","username":"itoader"},"change_message_id":"cb11f5227d8d6d7a7aa372a2df5186a6527e75c8","unresolved":false,"context_lines":[{"line_number":79,"context_line":"}"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"def _get_class(current_class):"},{"line_number":83,"context_line":"    if current_class not in class_utils:"},{"line_number":84,"context_line":"        raise vmutils.HyperVException(_(\"Class %(class)s does not exist\")"},{"line_number":85,"context_line":"                                      % current_class)"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa1b9901_820317b8","line":82,"in_reply_to":"fa1b9901_748e5e7a","updated":"2015-08-24 15:19:36.000000000","message":"Done","commit_id":"049b13309ba3a8f2f39af56e46862455511de37f"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"d7fddd3752e661c585e366e0a3e4ae64ae8045d0","unresolved":false,"context_lines":[{"line_number":103,"context_line":"            % {\u0027class\u0027: current_class, \u0027win_version\u0027: windows_version})"},{"line_number":104,"context_line":"        return"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    module_name \u003d found_class.lower()"},{"line_number":107,"context_line":"    module \u003d globals()[module_name]"},{"line_number":108,"context_line":"    instance \u003d getattr(module, found_class)()"},{"line_number":109,"context_line":"    return instance"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa1b9901_d4408a36","line":106,"updated":"2015-08-20 11:17:31.000000000","message":"You could move this to line 100 and drop the \"if found_class\" check.\n\nAlso, you should use oslo_utils.import_class.","commit_id":"049b13309ba3a8f2f39af56e46862455511de37f"},{"author":{"_account_id":12582,"name":"Simona Iuliana Toader","email":"itoader@cloudbasesolutions.com","username":"itoader"},"change_message_id":"cb11f5227d8d6d7a7aa372a2df5186a6527e75c8","unresolved":false,"context_lines":[{"line_number":103,"context_line":"            % {\u0027class\u0027: current_class, \u0027win_version\u0027: windows_version})"},{"line_number":104,"context_line":"        return"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    module_name \u003d found_class.lower()"},{"line_number":107,"context_line":"    module \u003d globals()[module_name]"},{"line_number":108,"context_line":"    instance \u003d getattr(module, found_class)()"},{"line_number":109,"context_line":"    return instance"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa1b9901_a2fe5bac","line":106,"in_reply_to":"fa1b9901_d4408a36","updated":"2015-08-24 15:19:36.000000000","message":"Done","commit_id":"049b13309ba3a8f2f39af56e46862455511de37f"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"312f26e28f44d66ffe755185d3c28fa1b04a0a8d","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from oslo_config import cfg"},{"line_number":18,"context_line":"from oslo_log import log as logging"},{"line_number":19,"context_line":"from oslo_utils import importutils"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_f573bd13","line":16,"updated":"2015-08-24 11:33:17.000000000","message":"unrelated change.","commit_id":"f42f91cae216f59374029a3f78f97ac3a6862326"},{"author":{"_account_id":12582,"name":"Simona Iuliana Toader","email":"itoader@cloudbasesolutions.com","username":"itoader"},"change_message_id":"e6570ace6ba0bd616624020291463de66b630783","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from oslo_config import cfg"},{"line_number":18,"context_line":"from oslo_log import log as logging"},{"line_number":19,"context_line":"from oslo_utils import importutils"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_a2e2db2d","line":16,"in_reply_to":"fa1b9901_f573bd13","updated":"2015-08-24 15:21:18.000000000","message":"Done","commit_id":"f42f91cae216f59374029a3f78f97ac3a6862326"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"312f26e28f44d66ffe755185d3c28fa1b04a0a8d","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    raise vmutils.HyperVException(_(\u0027Class %(class)s is not found \u0027"},{"line_number":89,"context_line":"        \u0027for windows version: %(win_version)s\u0027)"},{"line_number":90,"context_line":"        % {\u0027class\u0027: utils_class_type, \u0027win_version\u0027: windows_version})"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"def get_vmutils(host\u003d\u0027.\u0027):"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_303e23b9","line":90,"updated":"2015-08-24 11:33:17.000000000","message":"I\u0027d rather have it like this:\n\n    raise vmutils.HyperVException(\n        _(\u0027Class %(class)s is not found for Windows version: %(win_version)s\u0027),\n        % {...}\n\nbut this is just a preference..","commit_id":"f42f91cae216f59374029a3f78f97ac3a6862326"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"f10cc8d17d87bb65c2a6516a12ee4f40170e4b7b","unresolved":false,"context_lines":[{"line_number":67,"context_line":""},{"line_number":68,"context_line":"def _get_class(utils_class_type, preferred_class\u003dNone):"},{"line_number":69,"context_line":"    if preferred_class:"},{"line_number":70,"context_line":"        return volumeutils.VolumeUtils()"},{"line_number":71,"context_line":"    if utils_class_type not in class_utils:"},{"line_number":72,"context_line":"        raise vmutils.HyperVException(_(\"Class %(class)s does not exist\")"},{"line_number":73,"context_line":"                                      % utils_class_type)"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa1b9901_7618db84","line":70,"updated":"2015-08-25 12:07:43.000000000","message":"this is the case only and only for volumeutils. this should be in get_volumeutils. plus, unit test for get_volumeutils.","commit_id":"e75ad012e0428fd3204459ff7ca1e60aa32cfb8e"}]}
