)]}'
{"nova/tests/virt/hyperv/test_hypervapi.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"175a52fd6963b32398ef17f5a7f71b3bcaf08afb","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        self._instance_volume_disks \u003d []"},{"line_number":86,"context_line":"        self._test_vm_name \u003d None"},{"line_number":87,"context_line":"        self._test_instance_dir \u003d \u0027C:\\\\FakeInstancesPath\\\\instance-0000001\u0027"},{"line_number":88,"context_line":"        self._check_min_windows_version \u003d True"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        self._setup_stubs()"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQn%2F%2F4eY%3D","line":88,"updated":"2013-07-19 21:03:29.000000000","message":"Name of this variable is sort of confusing, maybe something like _min_windows_version_satisfied is more clear? Otherwise it sounds like a flag to check something in the tests, rather than the result of a stubbed method.","commit_id":"68c7777feb861214f3761b2aac27dc769822747d"},{"author":{"_account_id":3185,"name":"Alessandro Pilotti","email":"apilotti@cloudbasesolutions.com","username":"alexpilotti"},"change_message_id":"afe1207389bf7c4f259d12ee46d9b62ef0a57c6c","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        self._instance_volume_disks \u003d []"},{"line_number":86,"context_line":"        self._test_vm_name \u003d None"},{"line_number":87,"context_line":"        self._test_instance_dir \u003d \u0027C:\\\\FakeInstancesPath\\\\instance-0000001\u0027"},{"line_number":88,"context_line":"        self._check_min_windows_version \u003d True"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        self._setup_stubs()"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQn%2F%2F4dQ%3D","line":88,"in_reply_to":"AAAAQn%2F%2F4eY%3D","updated":"2013-07-19 21:12:55.000000000","message":"I agree, I was not getting a decent name, so it remained how it is. Going to invent something :-)","commit_id":"68c7777feb861214f3761b2aac27dc769822747d"}],"nova/virt/hyperv/hostutils.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"175a52fd6963b32398ef17f5a7f71b3bcaf08afb","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    def check_min_windows_version(self, major, minor):"},{"line_number":71,"context_line":"        version_str \u003d self.get_windows_version()"},{"line_number":72,"context_line":"        (os_major, os_minor, os_build) \u003d map(int, version_str.split(\u0027.\u0027))"},{"line_number":73,"context_line":"        return (os_major \u003e major or os_major \u003d\u003d major and os_minor \u003e\u003d minor)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def get_windows_version(self):"},{"line_number":76,"context_line":"        return self._conn_cimv2.Win32_OperatingSystem()[0].Version"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQn%2F%2F4fQ%3D","line":73,"updated":"2013-07-19 21:03:29.000000000","message":"Why not also os_major \u003e\u003d major?","commit_id":"68c7777feb861214f3761b2aac27dc769822747d"},{"author":{"_account_id":3185,"name":"Alessandro Pilotti","email":"apilotti@cloudbasesolutions.com","username":"alexpilotti"},"change_message_id":"f0dba7a3bc773e377d2894e9f0340bf9e8564a79","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    def check_min_windows_version(self, major, minor):"},{"line_number":71,"context_line":"        version_str \u003d self.get_windows_version()"},{"line_number":72,"context_line":"        (os_major, os_minor, os_build) \u003d map(int, version_str.split(\u0027.\u0027))"},{"line_number":73,"context_line":"        return (os_major \u003e major or os_major \u003d\u003d major and os_minor \u003e\u003d minor)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def get_windows_version(self):"},{"line_number":76,"context_line":"        return self._conn_cimv2.Win32_OperatingSystem()[0].Version"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQn%2F%2F4UQ%3D","line":73,"in_reply_to":"AAAAQn%2F%2F4VI%3D","updated":"2013-07-19 21:50:20.000000000","message":"version contains the build number as well. But \n(os_major, os_minor) \u003e\u003d (major, minor)\nworks well!","commit_id":"68c7777feb861214f3761b2aac27dc769822747d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ab93383858a35cd4ed9fc1b28808a9bb43ec4a5d","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    def check_min_windows_version(self, major, minor):"},{"line_number":71,"context_line":"        version_str \u003d self.get_windows_version()"},{"line_number":72,"context_line":"        (os_major, os_minor, os_build) \u003d map(int, version_str.split(\u0027.\u0027))"},{"line_number":73,"context_line":"        return (os_major \u003e major or os_major \u003d\u003d major and os_minor \u003e\u003d minor)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def get_windows_version(self):"},{"line_number":76,"context_line":"        return self._conn_cimv2.Win32_OperatingSystem()[0].Version"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQn%2F%2F4VI%3D","line":73,"in_reply_to":"AAAAQn%2F%2F4cs%3D","updated":"2013-07-19 21:43:40.000000000","message":"How about this?\n\nversion \u003d map(int, version_str.split(\u0027.\u0027))\n\nreturn version \u003e\u003d (major,minor)","commit_id":"68c7777feb861214f3761b2aac27dc769822747d"},{"author":{"_account_id":3185,"name":"Alessandro Pilotti","email":"apilotti@cloudbasesolutions.com","username":"alexpilotti"},"change_message_id":"afe1207389bf7c4f259d12ee46d9b62ef0a57c6c","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    def check_min_windows_version(self, major, minor):"},{"line_number":71,"context_line":"        version_str \u003d self.get_windows_version()"},{"line_number":72,"context_line":"        (os_major, os_minor, os_build) \u003d map(int, version_str.split(\u0027.\u0027))"},{"line_number":73,"context_line":"        return (os_major \u003e major or os_major \u003d\u003d major and os_minor \u003e\u003d minor)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def get_windows_version(self):"},{"line_number":76,"context_line":"        return self._conn_cimv2.Win32_OperatingSystem()[0].Version"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQn%2F%2F4cs%3D","line":73,"in_reply_to":"AAAAQn%2F%2F4fQ%3D","updated":"2013-07-19 21:12:55.000000000","message":"example major,minor:\n2008 R2: 6, 1  \n2012: 6, 2\n\nos_major \u003e\u003d major would pass if the actual os is 6.1 and the requirement 6.2","commit_id":"68c7777feb861214f3761b2aac27dc769822747d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"507cb2d83079e833b4c019744ad113f96793f5e7","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    def check_min_windows_version(self, major, minor):"},{"line_number":71,"context_line":"        version_str \u003d self.get_windows_version()"},{"line_number":72,"context_line":"        (os_major, os_minor, os_build) \u003d map(int, version_str.split(\u0027.\u0027))"},{"line_number":73,"context_line":"        return (os_major, os_minor) \u003e\u003d (major, minor)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def get_windows_version(self):"},{"line_number":76,"context_line":"        return self._conn_cimv2.Win32_OperatingSystem()[0].Version"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAQn%2F%2F37Q%3D","line":73,"updated":"2013-07-20 02:13:18.000000000","message":"Looks better, thanks for making the change.","commit_id":"428063ae4d84d1891ccd684732f6ae1de1ca17c2"}],"nova/virt/hyperv/livemigrationops.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"175a52fd6963b32398ef17f5a7f71b3bcaf08afb","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        if hostutils.HostUtils().check_min_windows_version(6, 2):"},{"line_number":40,"context_line":"            self._livemigrutils \u003d livemigrationutils.LiveMigrationUtils()"},{"line_number":41,"context_line":"        else:"},{"line_number":42,"context_line":"            self._livemigrutils \u003d None"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        self._pathutils \u003d pathutils.PathUtils()"},{"line_number":45,"context_line":"        self._volumeops \u003d volumeops.VolumeOps()"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQn%2F%2F4es%3D","line":42,"updated":"2013-07-19 21:03:29.000000000","message":"Could you just fail here rather than have to check in each method?","commit_id":"68c7777feb861214f3761b2aac27dc769822747d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fc412ac96d32dc4a81b1b751c1f3860d73d2c63b","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        if hostutils.HostUtils().check_min_windows_version(6, 2):"},{"line_number":40,"context_line":"            self._livemigrutils \u003d livemigrationutils.LiveMigrationUtils()"},{"line_number":41,"context_line":"        else:"},{"line_number":42,"context_line":"            self._livemigrutils \u003d None"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        self._pathutils \u003d pathutils.PathUtils()"},{"line_number":45,"context_line":"        self._volumeops \u003d volumeops.VolumeOps()"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQn%2F%2F37c%3D","line":42,"in_reply_to":"AAAAQn%2F%2F4UI%3D","updated":"2013-07-20 02:11:41.000000000","message":"Simply moving the _check_supported_os_version() call into a method decorator which you then tie to each of the methods that need the check. Used sort of like this:\n\nhttps://github.com/openstack/nova/blob/master/nova/compute/manager.py#L208\n\nBut rather than handling an exception, you check the OS version as a pre-condition in the decorator.","commit_id":"68c7777feb861214f3761b2aac27dc769822747d"},{"author":{"_account_id":3185,"name":"Alessandro Pilotti","email":"apilotti@cloudbasesolutions.com","username":"alexpilotti"},"change_message_id":"f0dba7a3bc773e377d2894e9f0340bf9e8564a79","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        if hostutils.HostUtils().check_min_windows_version(6, 2):"},{"line_number":40,"context_line":"            self._livemigrutils \u003d livemigrationutils.LiveMigrationUtils()"},{"line_number":41,"context_line":"        else:"},{"line_number":42,"context_line":"            self._livemigrutils \u003d None"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        self._pathutils \u003d pathutils.PathUtils()"},{"line_number":45,"context_line":"        self._volumeops \u003d volumeops.VolumeOps()"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQn%2F%2F4UI%3D","line":42,"in_reply_to":"AAAAQn%2F%2F4Us%3D","updated":"2013-07-19 21:50:20.000000000","message":"Can you please give me some details about what you mean with a wrapper in this context?","commit_id":"68c7777feb861214f3761b2aac27dc769822747d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ab93383858a35cd4ed9fc1b28808a9bb43ec4a5d","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        if hostutils.HostUtils().check_min_windows_version(6, 2):"},{"line_number":40,"context_line":"            self._livemigrutils \u003d livemigrationutils.LiveMigrationUtils()"},{"line_number":41,"context_line":"        else:"},{"line_number":42,"context_line":"            self._livemigrutils \u003d None"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        self._pathutils \u003d pathutils.PathUtils()"},{"line_number":45,"context_line":"        self._volumeops \u003d volumeops.VolumeOps()"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQn%2F%2F4Us%3D","line":42,"in_reply_to":"AAAAQn%2F%2F4bY%3D","updated":"2013-07-19 21:43:40.000000000","message":"OK, how about a wrapper, probably cleaner.","commit_id":"68c7777feb861214f3761b2aac27dc769822747d"},{"author":{"_account_id":3185,"name":"Alessandro Pilotti","email":"apilotti@cloudbasesolutions.com","username":"alexpilotti"},"change_message_id":"afe1207389bf7c4f259d12ee46d9b62ef0a57c6c","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        if hostutils.HostUtils().check_min_windows_version(6, 2):"},{"line_number":40,"context_line":"            self._livemigrutils \u003d livemigrationutils.LiveMigrationUtils()"},{"line_number":41,"context_line":"        else:"},{"line_number":42,"context_line":"            self._livemigrutils \u003d None"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        self._pathutils \u003d pathutils.PathUtils()"},{"line_number":45,"context_line":"        self._volumeops \u003d volumeops.VolumeOps()"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQn%2F%2F4bY%3D","line":42,"in_reply_to":"AAAAQn%2F%2F4es%3D","updated":"2013-07-19 21:12:55.000000000","message":"no, as the idea is to load this class anyway, raising an exception if the user tries to perform a live migration.\n\nThe alternative would be to move this logic to driver.py, but that would break the design which can be summarized as:\n\ndriver: simple delegation to *ops classes, no business logic\n\n*ops classes: business logic\n\n*utils: OS interface, no logic","commit_id":"68c7777feb861214f3761b2aac27dc769822747d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"175a52fd6963b32398ef17f5a7f71b3bcaf08afb","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        self._volumeops.login_storage_targets(block_device_info)"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def post_live_migration_at_destination(self, ctxt, instance_ref,"},{"line_number":92,"context_line":"                                           network_info, block_migration):"},{"line_number":93,"context_line":"        LOG.debug(_(\"post_live_migration_at_destination called\"),"},{"line_number":94,"context_line":"                  instance\u003dinstance_ref)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQn%2F%2F4e0%3D","line":91,"updated":"2013-07-19 21:03:29.000000000","message":"Is the only point of this method to implement an interface method and log the debug message?","commit_id":"68c7777feb861214f3761b2aac27dc769822747d"},{"author":{"_account_id":3185,"name":"Alessandro Pilotti","email":"apilotti@cloudbasesolutions.com","username":"alexpilotti"},"change_message_id":"afe1207389bf7c4f259d12ee46d9b62ef0a57c6c","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        self._volumeops.login_storage_targets(block_device_info)"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def post_live_migration_at_destination(self, ctxt, instance_ref,"},{"line_number":92,"context_line":"                                           network_info, block_migration):"},{"line_number":93,"context_line":"        LOG.debug(_(\"post_live_migration_at_destination called\"),"},{"line_number":94,"context_line":"                  instance\u003dinstance_ref)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQn%2F%2F4bA%3D","line":91,"in_reply_to":"AAAAQn%2F%2F4e0%3D","updated":"2013-07-19 21:12:55.000000000","message":"this method (and similar methods) is delegated from the driver. Live migration would fail without providing a dummy implementation.","commit_id":"68c7777feb861214f3761b2aac27dc769822747d"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"985f9ba51ff6787e1936cf8828ee0cf6e81ef176","unresolved":false,"context_lines":[{"line_number":35,"context_line":"CONF.import_opt(\u0027use_cow_images\u0027, \u0027nova.virt.driver\u0027)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"def check_os_version_requirement(function):"},{"line_number":39,"context_line":"    @functools.wraps(function)"},{"line_number":40,"context_line":"    def wrapper(self, *args, **kwds):"},{"line_number":41,"context_line":"        if not self._livemigrutils:"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQn%2F%2FlGU%3D","line":38,"updated":"2013-07-27 16:52:40.000000000","message":"It really seems like this should be named something else, assuming there will eventually be more than one feature threshold :)","commit_id":"044c380cfe85dcbc93bef739f38f0904270ea84d"}]}
